cnat: Fix session with deleted tr 73/30273/5
authorNathan Skrzypczak <nathan.skrzypczak@gmail.com>
Fri, 4 Dec 2020 09:23:34 +0000 (10:23 +0100)
committerBeno�t Ganne <bganne@cisco.com>
Thu, 28 Jan 2021 13:35:49 +0000 (13:35 +0000)
Type: fix

When a translation gets deleted, hiting a
session pointing to it sefaults. We're better
off directly storing the next node index.

Change-Id: I4f0716d775202b4ecf54d6cdb827bbeebd23056c
Signed-off-by: Nathan Skrzypczak <nathan.skrzypczak@gmail.com>
src/plugins/cnat/cnat_node_vip.c
src/plugins/cnat/cnat_session.h
src/plugins/cnat/test/test_cnat.py

index ffe5899..02e6da4 100644 (file)
@@ -114,8 +114,7 @@ cnat_vip_node_fn (vlib_main_t * vm,
       if (INDEX_INVALID != session->value.cs_lbi)
        {
          /* Translate & follow the translation given LB */
-         ct = cnat_translation_get (session->value.ct_index);
-         next0 = ct->ct_lb.dpoi_next_node;
+         next0 = session->value.dpoi_next_node;
          vnet_buffer (b)->ip.adj_index[VLIB_TX] = session->value.cs_lbi;
        }
       else if (session->value.flags & CNAT_SESSION_FLAG_HAS_SNAT)
@@ -193,7 +192,7 @@ cnat_vip_node_fn (vlib_main_t * vm,
       session->value.cs_port[VLIB_RX] =
        clib_host_to_net_u16 (trk0->ct_ep[VLIB_RX].ce_port);
 
-      session->value.ct_index = ct - cnat_translation_pool;
+      session->value.dpoi_next_node = ct->ct_lb.dpoi_next_node;
       session->value.cs_lbi = dpo0->dpoi_index;
 
       rv = cspm->vip_policy (vm, b, session, &rsession_flags, ct, ctx);
index e352fe6..fba28e5 100644 (file)
@@ -102,7 +102,7 @@ typedef struct cnat_session_t_
         * Persist translation->ct_lb.dpoi_next_node
         * when cs_lbi != INDEX_INVALID
         */
-      u32 ct_index;
+      u32 dpoi_next_node;
     };
   } value;
 } cnat_session_t;
index d46d047..271f507 100644 (file)
@@ -271,11 +271,6 @@ class TestCNatTranslation(VppTestCase):
                                            p1 * N_PKTS,
                                            self.pg0)
 
-        self.assertEqual(t1.get_stats()['packets'],
-                         N_PKTS *
-                         len(sports) *
-                         len(self.pg0.remote_hosts))
-
     def cnat_test_translation_update(self, t1, sports, isV6=False):
         ip_v = "ip6" if isV6 else "ip4"
         ip_class = IPv6 if isV6 else IP