reassembly: fix internal buffer count accounting 64/16464/2
authorKlement Sekera <ksekera@cisco.com>
Thu, 13 Dec 2018 13:35:48 +0000 (14:35 +0100)
committerDave Barach <openvpp@barachs.net>
Thu, 13 Dec 2018 14:42:50 +0000 (14:42 +0000)
Change-Id: I6af2c8552aeafe0abc8b8c3e5af1a05640e95919
Signed-off-by: Klement Sekera <ksekera@cisco.com>
src/vnet/ip/ip4_reassembly.c
test/test_reassembly.py

index 9bcc20a..346b223 100644 (file)
@@ -504,7 +504,10 @@ ip4_reass_finalize (vlib_main_t * vm, vlib_node_runtime_t * node,
   ip->flags_and_fragment_offset = 0;
   ip->length = clib_host_to_net_u16 (first_b->current_length + total_length);
   ip->checksum = ip4_header_checksum (ip);
+  u32 before = vec_len (*vec_drop_compress);
   vlib_buffer_chain_compress (vm, first_b, vec_drop_compress);
+  rt->buffers_n += vec_len (*vec_drop_compress) - before;
+
   if (PREDICT_FALSE (first_b->flags & VLIB_BUFFER_IS_TRACED))
     {
       ip4_reass_add_trace (vm, node, rm, reass, reass->first_bi, FINALIZE, 0);
index 65a5eb0..1fa05a4 100644 (file)
@@ -203,6 +203,37 @@ class TestIPv4Reassembly(VppTestCase):
         self.assert_packet_counter_equal(
             "/err/ip4-reassembly-feature/malformed packets", 1)
 
+    def test_44924(self):
+        """ compress tiny fragments """
+        packets = [(Ether(dst=self.src_if.local_mac,
+                          src=self.src_if.remote_mac) /
+                    IP(id=24339, flags="MF", frag=0, ttl=64,
+                       src=self.src_if.remote_ip4,
+                       dst=self.dst_if.remote_ip4) /
+                    ICMP(type="echo-request", code=0, id=0x1fe6, seq=0x2407) /
+                    Raw(load='Test-group: IPv4')),
+                   (Ether(dst=self.src_if.local_mac,
+                          src=self.src_if.remote_mac) /
+                    IP(id=24339, flags="MF", frag=3, ttl=64,
+                       src=self.src_if.remote_ip4,
+                       dst=self.dst_if.remote_ip4) /
+                    ICMP(type="echo-request", code=0, id=0x1fe6, seq=0x2407) /
+                    Raw(load='.IPv4.Fragmentation.vali')),
+                   (Ether(dst=self.src_if.local_mac,
+                          src=self.src_if.remote_mac) /
+                    IP(id=24339, frag=6, ttl=64,
+                       src=self.src_if.remote_ip4,
+                       dst=self.dst_if.remote_ip4) /
+                    ICMP(type="echo-request", code=0, id=0x1fe6, seq=0x2407) /
+                    Raw(load='d; Test-case: 44924'))
+                   ]
+
+        self.pg_enable_capture()
+        self.src_if.add_stream(packets)
+        self.pg_start()
+
+        self.dst_if.get_capture(1)
+
     @unittest.skipIf(is_skip_aarch64_set() and is_platform_aarch64(),
                      "test doesn't work on aarch64")
     def test_random(self):