+ err = self.statistics.get_err_counter(
+ '/err/ipip4-input/packets decapsulated')
+ self.assertEqual(err, 1020)
+
+ f = []
+ r = []
+ for i in range(1, 90):
+ frags, p4_reply = self.generate_ip4_frags(i * 100, 1000)
+ f.extend(frags)
+ r.extend(p4_reply)
+ self.pg_enable_capture()
+ self.pg1.add_stream(f)
+ self.pg_start()
+ rx = self.pg0.get_capture(89)
+ i = 0
+ for p in rx:
+ self.validate(p[1], r[i])
+ i += 1
+
+ # Now try with re-fragmentation
+ #
+ # Send fragments to tunnel head-end, for the tunnel head end
+ # to reassemble and then refragment
+ #
+ self.vapi.sw_interface_set_mtu(self.pg0.sw_if_index, [576, 0, 0, 0])
+ frags, p4_reply = self.generate_ip4_frags(3123, 1200)
+ self.pg_enable_capture()
+ self.pg1.add_stream(frags)
+ self.pg_start()
+ rx = self.pg0.get_capture(6)
+ reass_pkt = reassemble4(rx)
+ p4_reply.id = 256
+ self.validate(reass_pkt, p4_reply)
+
+ self.vapi.sw_interface_set_mtu(self.pg0.sw_if_index, [1600, 0, 0, 0])
+ frags, p4_reply = self.generate_ip4_frags(3123, 1200)
+ self.pg_enable_capture()
+ self.pg1.add_stream(frags)
+ self.pg_start()
+ rx = self.pg0.get_capture(2)
+ reass_pkt = reassemble4(rx)
+ p4_reply.id = 512
+ self.validate(reass_pkt, p4_reply)
+
+ # send large packets through the tunnel, expect them to be fragmented
+ self.vapi.sw_interface_set_mtu(sw_if_index, [600, 0, 0, 0])
+
+ p4 = (Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) /
+ IP(src="1.2.3.4", dst="130.67.0.1", tos=42) /
+ UDP(sport=1234, dport=1234) / Raw(b'Q' * 1000))
+ rx = self.send_and_expect(self.pg0, p4 * 15, self.pg1, 30)
+ inners = []
+ for p in rx:
+ inners.append(p[IP].payload)
+ reass_pkt = reassemble4(inners)
+ for p in reass_pkt:
+ self.assert_packet_checksums_valid(p)
+ self.assertEqual(p[IP].ttl, 63)
+
+ def test_ipip_create(self):
+ """ ipip create / delete interface test """
+ rv = ipip_add_tunnel(self, '1.2.3.4', '2.3.4.5')
+ sw_if_index = rv.sw_if_index
+ self.vapi.ipip_del_tunnel(sw_if_index)