nat: add/del ed_ext_ports only if the table is instantiated 75/26675/1
authorDave Barach <dave@barachs.net>
Thu, 23 Apr 2020 20:56:15 +0000 (16:56 -0400)
committerDave Barach <dave@barachs.net>
Thu, 23 Apr 2020 20:56:51 +0000 (16:56 -0400)
Add a suitable ASSERT in the bihash template in case this happens again.

Type: fix

Signed-off-by: Dave Barach <dave@barachs.net>
Change-Id: Ib370d4238f6bae2995bc30fd17fad5c41053c3d1

src/plugins/nat/nat.c
src/vppinfra/bihash_template.c

index 8ba276b..30238f9 100755 (executable)
@@ -330,8 +330,9 @@ nat_free_session_data (snat_main_t * sm, snat_session_t * s, u32 thread_index,
   bihash_key.k.src_address = s->out2in.addr.as_u32;
   bihash_key.k.src_port = s->out2in.port;
   bihash_key.k.protocol = s->out2in.protocol;
-  clib_bihash_add_del_16_8 (&sm->ed_ext_ports, &bihash_key.kv,
-                           0 /* is_add */ );
+  if (sm->ed_ext_ports.instantiated)
+    clib_bihash_add_del_16_8 (&sm->ed_ext_ports, &bihash_key.kv,
+                             0 /* is_add */ );
 
   snat_free_outside_address_and_port (sm->addresses, thread_index,
                                      &s->out2in);
@@ -465,8 +466,9 @@ nat44_free_session_data (snat_main_t * sm, snat_session_t * s,
   bihash_key.k.src_address = s->out2in.addr.as_u32;
   bihash_key.k.src_port = s->out2in.port;
   bihash_key.k.protocol = s->out2in.protocol;
-  clib_bihash_add_del_16_8 (&sm->ed_ext_ports, &bihash_key.kv,
-                           0 /* is_add */ );
+  if (sm->ed_ext_ports.instantiated)
+    clib_bihash_add_del_16_8 (&sm->ed_ext_ports, &bihash_key.kv,
+                             0 /* is_add */ );
 
   // should be called for every dynamic session
   snat_free_outside_address_and_port (sm->addresses, thread_index,
index f7d8807..47e9bd0 100644 (file)
@@ -568,6 +568,9 @@ static_always_inline int BV (clib_bihash_add_del_inline_with_hash)
        BV (clib_bihash_instantiate) (h);
       BV (clib_bihash_alloc_unlock) (h);
     }
+#else
+  /* Debug image: make sure the table has been instantiated */
+  ASSERT (h->instantiated != 0);
 #endif
 
   b = BV (clib_bihash_get_bucket) (h, hash);