@@ -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