+ def test_long_fragment_chain(self):
+ """ long fragment chain """
+
+ error_cnt_str = \
+ "/err/ip4-reassembly-feature/fragment chain too long (drop)"
+
+ error_cnt = self.statistics.get_err_counter(error_cnt_str)
+
+ self.vapi.ip_reassembly_set(timeout_ms=100, max_reassemblies=1000,
+ max_reassembly_length=3,
+ expire_walk_interval_ms=50)
+
+ p1 = (Ether(dst=self.src_if.local_mac, src=self.src_if.remote_mac) /
+ IP(id=1000, src=self.src_if.remote_ip4,
+ dst=self.dst_if.remote_ip4) /
+ UDP(sport=1234, dport=5678) /
+ Raw("X" * 1000))
+ p2 = (Ether(dst=self.src_if.local_mac, src=self.src_if.remote_mac) /
+ IP(id=1001, src=self.src_if.remote_ip4,
+ dst=self.dst_if.remote_ip4) /
+ UDP(sport=1234, dport=5678) /
+ Raw("X" * 1000))
+ frags = fragment_rfc791(p1, 200) + fragment_rfc791(p2, 500)
+
+ self.pg_enable_capture()
+ self.src_if.add_stream(frags)
+ self.pg_start()
+
+ self.dst_if.get_capture(1)
+ self.assert_error_counter_equal(error_cnt_str, error_cnt + 1)
+