X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Fnat%2Fnat_api.c;fp=src%2Fplugins%2Fnat%2Fnat_api.c;h=201c9d4730d1a8a57b6d756b791bc753e191fc83;hb=219fbb228f5274d2db740139a0d3258902370165;hp=37af77d11c1126b99727f1782a1e22906f3fa98f;hpb=4ab5190eb4167ac4c06cd649ec8a860784ab1d41;p=vpp.git diff --git a/src/plugins/nat/nat_api.c b/src/plugins/nat/nat_api.c index 37af77d11c1..201c9d4730d 100644 --- a/src/plugins/nat/nat_api.c +++ b/src/plugins/nat/nat_api.c @@ -1585,6 +1585,62 @@ send_nat44_user_details (snat_user_t * u, vl_api_registration_t * reg, vl_api_send_msg (reg, (u8 *) rmp); } +static void +nat_ed_user_create_helper (snat_main_per_thread_data_t * tsm, + snat_session_t * s) +{ + snat_user_key_t k; + k.addr = s->in2out.addr; + k.fib_index = s->in2out.fib_index; + clib_bihash_kv_8_8_t key, value; + key.key = k.as_u64; + snat_user_t *u; + if (clib_bihash_search_8_8 (&tsm->user_hash, &key, &value)) + { + pool_get (tsm->users, u); + u->addr = k.addr; + u->fib_index = k.fib_index; + u->nsessions = 0; + u->nstaticsessions = 0; + key.value = u - tsm->users; + clib_bihash_add_del_8_8 (&tsm->user_hash, &key, 1); + } + else + { + u = pool_elt_at_index (tsm->users, value.value); + } + if (snat_is_session_static (s)) + { + ++u->nstaticsessions; + } + else + { + ++u->nsessions; + } +} + +static void +nat_ed_users_create (snat_main_per_thread_data_t * tsm) +{ + snat_session_t *s; + /* *INDENT-OFF* */ + pool_foreach (s, tsm->sessions, { nat_ed_user_create_helper (tsm, s); }); + /* *INDENT-ON* */ +} + +static void +nat_ed_users_destroy (snat_main_per_thread_data_t * tsm) +{ + snat_user_t *u; + /* *INDENT-OFF* */ + pool_flush (u, tsm->users, { }); + /* *INDENT-ON* */ + clib_bihash_free_8_8 (&tsm->user_hash); + clib_bihash_init_8_8 (&tsm->user_hash, "users", snat_main.user_buckets, + snat_main.user_memory_size); + clib_bihash_set_kvp_format_fn_8_8 (&tsm->user_hash, format_user_kvp); +} + static void vl_api_nat44_user_dump_t_handler (vl_api_nat44_user_dump_t * mp) { @@ -1603,10 +1659,18 @@ vl_api_nat44_user_dump_t_handler (vl_api_nat44_user_dump_t * mp) /* *INDENT-OFF* */ vec_foreach (tsm, sm->per_thread_data) { + if (sm->endpoint_dependent) + { + nat_ed_users_create (tsm); + } pool_foreach (u, tsm->users, ({ send_nat44_user_details (u, reg, mp->context); })); + if (sm->endpoint_dependent) + { + nat_ed_users_destroy (tsm); + } } /* *INDENT-ON* */ }