From ece39214bcb05c535ba5de9af97b5f84f6911cba Mon Sep 17 00:00:00 2001 From: Nathan Skrzypczak Date: Tue, 8 Sep 2020 15:16:08 +0200 Subject: cnat: Ip ICMP error support Type: feature Add CNAT translation for ICMP 4 & 6 errors inner packet will be translated according to existing sessions. Change-Id: If118751988f44ef96b800878596296d1ab8ab6f8 Signed-off-by: Nathan Skrzypczak --- src/plugins/cnat/cnat_client.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) (limited to 'src/plugins/cnat/cnat_client.c') diff --git a/src/plugins/cnat/cnat_client.c b/src/plugins/cnat/cnat_client.c index 10d9966ad53..314000d785e 100644 --- a/src/plugins/cnat/cnat_client.c +++ b/src/plugins/cnat/cnat_client.c @@ -61,12 +61,10 @@ cnat_client_free_by_ip (ip46_address_t * ip, u8 af) cnat_client_t *cc; cc = (AF_IP4 == af ? cnat_client_ip4_find (&ip->ip4) : cnat_client_ip6_find (&ip->ip6)); - /* This can happen if the translation gets deleted - before the session */ - if (NULL == cc) - return; + ASSERT (NULL != cc); + if ((0 == cnat_client_uncnt_session (cc)) - && (cc->flags & CNAT_FLAG_EXPIRES)) + && (cc->flags & CNAT_FLAG_EXPIRES) && (0 == cc->tr_refcnt)) cnat_client_destroy (cc); } @@ -101,7 +99,6 @@ cnat_client_throttle_pool_process () /* *INDENT-ON* */ vec_foreach (ai, del_vec) { - /* Free session */ addr = pool_elt_at_index (cnat_client_db.throttle_pool[i], *ai); pool_put (cnat_client_db.throttle_pool[i], addr); } @@ -127,7 +124,7 @@ cnat_client_translation_deleted (index_t cci) ASSERT (!(cc->flags & CNAT_FLAG_EXPIRES)); cc->tr_refcnt--; - if (0 == cc->tr_refcnt) + if (0 == cc->tr_refcnt && 0 == cc->session_refcnt) cnat_client_destroy (cc); } @@ -171,6 +168,8 @@ cnat_client_add (const ip_address_t * ip, u8 flags) cci = cc - cnat_client_pool; cc->parent_cci = cci; cc->flags = flags; + cc->tr_refcnt = 0; + cc->session_refcnt = 0; ip_address_copy (&cc->cc_ip, ip); cnat_client_db_add (cc); @@ -238,9 +237,16 @@ cnat_client_dpo_interpose (const dpo_id_t * original, int cnat_client_purge (void) { + vlib_thread_main_t *tm = vlib_get_thread_main (); + int nthreads; + nthreads = tm->n_threads + 1; ASSERT (0 == hash_elts (cnat_client_db.crd_cip6)); ASSERT (0 == hash_elts (cnat_client_db.crd_cip4)); ASSERT (0 == pool_elts (cnat_client_pool)); + for (int i = 0; i < nthreads; i++) + { + ASSERT (0 == pool_elts (cnat_client_db.throttle_pool[i])); + } return (0); } -- cgit 1.2.3-korg