Skip to content

Commit 32780c0

Browse files
committed
[BPF] reassemble the IP fragments
1 parent 302c978 commit 32780c0

File tree

1 file changed

+52
-7
lines changed

1 file changed

+52
-7
lines changed

felix/bpf/ut/ip4_defrag_test.go

Lines changed: 52 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,22 +37,32 @@ func TestIP4Defrag(t *testing.T) {
3737
}
3838

3939
ip := *ipv4Default
40+
ip.Id = 0x1234
41+
ip.Length = 20 + 8 + 2000
42+
ip.Flags = 0
4043
udp := *udpDefault
4144
udp.Length = 8 + 2000
4245

46+
// compute ull packet
47+
payload := gopacket.Payload(data)
48+
udp.SetNetworkLayerForChecksum(&ip)
49+
50+
pktFull := gopacket.NewSerializeBuffer()
51+
err := gopacket.SerializeLayers(pktFull, gopacket.SerializeOptions{ComputeChecksums: true}, ethDefault, &ip, &udp, payload)
52+
Expect(err).NotTo(HaveOccurred())
53+
4354
dataLen := 1600
4455
dataOffset := 0
4556

46-
ip.Id = 0x1234
4757
ip.Flags = layers.IPv4MoreFragments
4858
ip.FragOffset = 0
4959
ip.Length = 20 + 8 + 1596
5060

51-
payload := gopacket.Payload(data[dataOffset : dataOffset+dataLen])
61+
payload = gopacket.Payload(data[dataOffset : dataOffset+dataLen])
5262
udp.SetNetworkLayerForChecksum(&ip)
5363

5464
pkt0 := gopacket.NewSerializeBuffer()
55-
err := gopacket.SerializeLayers(pkt0, gopacket.SerializeOptions{ComputeChecksums: true}, ethDefault, &ip, &udp, payload)
65+
err = gopacket.SerializeLayers(pkt0, gopacket.SerializeOptions{ComputeChecksums: true}, ethDefault, &ip, &udp, payload)
5666
Expect(err).NotTo(HaveOccurred())
5767

5868
dataOffset = dataLen
@@ -67,9 +77,9 @@ func TestIP4Defrag(t *testing.T) {
6777
Expect(err).NotTo(HaveOccurred())
6878

6979
dataOffset += dataLen
70-
dataLen = 2000 - dataOffset
80+
dataLen = 80
7181

72-
ip.Flags = 0
82+
ip.Flags = layers.IPv4MoreFragments
7383
ip.FragOffset = uint16((8 + dataOffset) / 8)
7484
ip.Length = uint16(20 + dataLen)
7585
payload = gopacket.Payload(data[dataOffset : dataOffset+dataLen])
@@ -78,8 +88,24 @@ func TestIP4Defrag(t *testing.T) {
7888
err = gopacket.SerializeLayers(pkt2, gopacket.SerializeOptions{ComputeChecksums: true}, ethDefault, &ip, payload)
7989
Expect(err).NotTo(HaveOccurred())
8090

91+
dataOffset += dataLen
92+
dataLen = 2000 - dataOffset
93+
94+
ip.Flags = 0
95+
ip.FragOffset = uint16((8 + dataOffset) / 8)
96+
ip.Length = uint16(20 + dataLen)
97+
payload = gopacket.Payload(data[dataOffset : dataOffset+dataLen])
98+
99+
pkt3 := gopacket.NewSerializeBuffer()
100+
err = gopacket.SerializeLayers(pkt3, gopacket.SerializeOptions{ComputeChecksums: true}, ethDefault, &ip, payload)
101+
Expect(err).NotTo(HaveOccurred())
102+
103+
pktFullR := gopacket.NewPacket(pktFull.Bytes(), layers.LayerTypeEthernet, gopacket.Default)
104+
81105
runBpfTest(t, "calico_from_host_ep", nil, func(bpfrun bpfProgRunFn) {
82-
res, err := bpfrun(pkt0.Bytes())
106+
bytes := pkt0.Bytes()
107+
copy(bytes[40:42], pktFull.Bytes()[40:42]) // patch in the udp csum for the entire packet
108+
res, err := bpfrun(bytes)
83109
Expect(err).NotTo(HaveOccurred())
84110
pktR := gopacket.NewPacket(res.dataOut, layers.LayerTypeEthernet, gopacket.Default)
85111
fmt.Printf("pktR = %+v\n", pktR)
@@ -95,10 +121,29 @@ func TestIP4Defrag(t *testing.T) {
95121
})
96122

97123
runBpfTest(t, "calico_from_host_ep", nil, func(bpfrun bpfProgRunFn) {
98-
res, err := bpfrun(pkt2.Bytes())
124+
res, err := bpfrun(pkt3.Bytes())
99125
Expect(err).NotTo(HaveOccurred())
100126
pktR := gopacket.NewPacket(res.dataOut, layers.LayerTypeEthernet, gopacket.Default)
101127
fmt.Printf("pktR = %+v\n", pktR)
102128
Expect(res.Retval).To(Equal(resTC_ACT_SHOT))
103129
})
130+
131+
runBpfTest(t, "calico_from_host_ep", nil, func(bpfrun bpfProgRunFn) {
132+
res, err := bpfrun(pkt2.Bytes())
133+
Expect(err).NotTo(HaveOccurred())
134+
pktR := gopacket.NewPacket(res.dataOut, layers.LayerTypeEthernet, gopacket.Default)
135+
fmt.Printf("pktR = %+v\n", pktR)
136+
fmt.Printf("pktFullR = %+v\n", pktFullR)
137+
Expect(res.Retval).To(Equal(resTC_ACT_UNSPEC))
138+
139+
payloadL := pktR.ApplicationLayer()
140+
data := payloadL.Payload()
141+
142+
for i := 0; i < 1000; i++ {
143+
Expect(data[i*2]).To(Equal(byte(uint16(i)>>8)), fmt.Sprintf("wrong at index %d", i*2))
144+
Expect(data[i*2+1]).To(Equal(byte(uint16(i)&0xff)), fmt.Sprintf("wrong at index %d", i*2+1))
145+
}
146+
147+
Expect(pktFull.Bytes()).To(Equal(res.dataOut))
148+
})
104149
}

0 commit comments

Comments
 (0)