aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKlement Sekera <ksekera@cisco.com>2020-07-06 09:20:01 +0000
committerMatthew Smith <mgsmith@netgate.com>2020-08-31 21:52:42 +0000
commitedc816355a999df476074881ae8ed927cad88532 (patch)
tree76845b254e8801593a7ca2e53b6bc489b66aa810
parentb59095f830fbacbe2631dbbaa92f8e9606184015 (diff)
nat: fix type in api message
Translation memory size is internally a uword, but in api it was u32, resulting in the returned value being 0 all the time. Fix the "incorrect" API reply to return a u32 capped to 0xffffffff if the u64 is larger than that, introduce the message with the correct type, deprecate the message with the incorrect type. Also, while we are updating the message definition, add the max translations / max users per worker thread into the new message. Type: fix Signed-off-by: Klement Sekera <ksekera@cisco.com> Change-Id: I92e38a6a2bcb70fc8d1b129bbe416bf7f9e54280 Signed-off-by: Andrew Yourtchenko <ayourtch@gmail.com>
-rw-r--r--src/plugins/nat/nat.api61
-rw-r--r--src/plugins/nat/nat_api.c52
-rw-r--r--src/plugins/nat/nat_test.c50
-rw-r--r--src/plugins/nat/test/test_nat.py43
4 files changed, 204 insertions, 2 deletions
diff --git a/src/plugins/nat/nat.api b/src/plugins/nat/nat.api
index 7e6f35968c5..8b263d4001d 100644
--- a/src/plugins/nat/nat.api
+++ b/src/plugins/nat/nat.api
@@ -60,11 +60,12 @@ define nat_control_ping_reply
*/
define nat_show_config
{
+ option deprecated;
u32 client_index;
u32 context;
};
-/** \brief Show NAT plugin startup config reply
+/** \brief DEPRECATED: Show NAT plugin startup config reply
@param context - sender context, to match reply w/ request
@param retval - return code for the request
@param static_mapping_only - if true dynamic translations disabled
@@ -108,6 +109,64 @@ define nat_show_config_reply
u64 nat64_st_memory_size;
};
+/** \brief Show NAT plugin startup config
+ @param client_index - opaque cookie to identify the sender
+ @param context - sender context, to match reply w/ request
+*/
+define nat_show_config_2
+{
+ u32 client_index;
+ u32 context;
+};
+
+/** \brief Show NAT plugin startup config reply
+ @param context - sender context, to match reply w/ request
+ @param retval - return code for the request
+ @param static_mapping_only - if true dynamic translations disabled
+ @param static_mapping_connection_tracking - if true create session data
+ @param deterministic - if true deterministic mapping
+ @param endpoint_dependent - if true endpoint-dependent mode
+ @param out2in_dpo - if true out2in dpo mode
+ @param dslite_ce - if true DS-Lite is CE/B4 element, if false AFTR elemet
+ @param translation_buckets - number of translation hash buckets
+ @param translation_memory_size - translation hash memory size
+ @param user_buckets - number of user hash buckets
+ @param user_memory_size - user hash memory size
+ @param max_translations_per_user - maximum number of translations per user
+ @param outside_vrf_id - outside VRF id
+ @param inside_vrf_id - default inside VRF id
+ @param nat64_bib_buckets - number of NAT64 BIB hash buckets
+ @param nat64_bib_memory_size - memory size of NAT64 BIB hash
+ @param nat64_st_buckets - number of NAT64 session table hash buckets
+ @param nat64_st_memory_size - memory size of NAT64 session table hash
+ @param max_translations_per_thread - max translations per worker thread
+ @param max_users_per_thread - max users per worker thread
+*/
+define nat_show_config_2_reply
+{
+ u32 context;
+ i32 retval;
+ bool static_mapping_only;
+ bool static_mapping_connection_tracking;
+ bool deterministic;
+ bool endpoint_dependent;
+ bool out2in_dpo;
+ bool dslite_ce;
+ u32 translation_buckets;
+ u64 translation_memory_size;
+ u32 user_buckets;
+ u64 user_memory_size;
+ u32 max_translations_per_user;
+ u32 outside_vrf_id;
+ u32 inside_vrf_id;
+ u32 nat64_bib_buckets;
+ u64 nat64_bib_memory_size;
+ u32 nat64_st_buckets;
+ u64 nat64_st_memory_size;
+ u32 max_translations_per_thread;
+ u32 max_users_per_thread;
+};
+
enum nat_log_level : u8
{
NAT_LOG_NONE = 0x00,
diff --git a/src/plugins/nat/nat_api.c b/src/plugins/nat/nat_api.c
index 503143288f8..ad67375fb7a 100644
--- a/src/plugins/nat/nat_api.c
+++ b/src/plugins/nat/nat_api.c
@@ -104,7 +104,10 @@ vl_api_nat_show_config_t_handler (vl_api_nat_show_config_t * mp)
REPLY_MACRO2 (VL_API_NAT_SHOW_CONFIG_REPLY,
({
rmp->translation_buckets = htonl (sm->translation_buckets);
- rmp->translation_memory_size = clib_host_to_net_u64 (sm->translation_memory_size);
+ rmp->translation_memory_size = clib_host_to_net_u32 (
+ sm->translation_memory_size > 0xffffffffULL
+ ? 0xffffffffUL
+ : (u32)sm->translation_memory_size);
rmp->user_buckets = htonl (sm->user_buckets);
rmp->user_memory_size = clib_host_to_net_u64 (sm->user_memory_size);
rmp->max_translations_per_user = htonl (sm->max_translations_per_user);
@@ -136,6 +139,52 @@ vl_api_nat_show_config_t_print (vl_api_nat_show_config_t * mp, void *handle)
}
static void
+vl_api_nat_show_config_2_t_handler (vl_api_nat_show_config_2_t * mp)
+{
+ vl_api_nat_show_config_2_reply_t *rmp;
+ snat_main_t *sm = &snat_main;
+ //dslite_main_t *dm = &dslite_main;
+ nat64_main_t *n64m = &nat64_main;
+ int rv = 0;
+
+ /* *INDENT-OFF* */
+ REPLY_MACRO2 (VL_API_NAT_SHOW_CONFIG_2_REPLY,
+ ({
+ rmp->translation_buckets = htonl (sm->translation_buckets);
+ rmp->translation_memory_size = clib_host_to_net_u64 (sm->translation_memory_size);
+ rmp->user_buckets = htonl (sm->user_buckets);
+ rmp->user_memory_size = clib_host_to_net_u64 (sm->user_memory_size);
+ rmp->max_translations_per_user = htonl (sm->max_translations_per_user);
+ rmp->outside_vrf_id = htonl (sm->outside_vrf_id);
+ rmp->inside_vrf_id = htonl (sm->inside_vrf_id);
+ rmp->static_mapping_only = sm->static_mapping_only;
+ rmp->static_mapping_connection_tracking =
+ sm->static_mapping_connection_tracking;
+ rmp->deterministic = 0;
+ rmp->endpoint_dependent = sm->endpoint_dependent;
+ rmp->out2in_dpo = sm->out2in_dpo;
+ //rmp->dslite_ce = dm->is_ce;
+ rmp->nat64_bib_buckets = clib_net_to_host_u32(n64m->bib_buckets);
+ rmp->nat64_bib_memory_size = clib_net_to_host_u64(n64m->bib_memory_size);
+ rmp->nat64_st_buckets = clib_net_to_host_u32(n64m->st_buckets);
+ rmp->nat64_st_memory_size = clib_net_to_host_u64(n64m->st_memory_size);
+ rmp->max_translations_per_thread = clib_net_to_host_u32(sm->max_translations_per_thread);
+ rmp->max_users_per_thread = clib_net_to_host_u32(sm->max_users_per_thread);
+ }));
+ /* *INDENT-ON* */
+}
+
+static void *
+vl_api_nat_show_config_2_t_print (vl_api_nat_show_config_t * mp, void *handle)
+{
+ u8 *s;
+
+ s = format (0, "SCRIPT: nat_show_config_2 ");
+
+ FINISH;
+}
+
+static void
vl_api_nat_set_workers_t_handler (vl_api_nat_set_workers_t * mp)
{
snat_main_t *sm = &snat_main;
@@ -2592,6 +2641,7 @@ static void *vl_api_nat64_add_del_interface_addr_t_print
#define foreach_snat_plugin_api_msg \
_(NAT_CONTROL_PING, nat_control_ping) \
_(NAT_SHOW_CONFIG, nat_show_config) \
+_(NAT_SHOW_CONFIG_2, nat_show_config_2) \
_(NAT_SET_WORKERS, nat_set_workers) \
_(NAT_WORKER_DUMP, nat_worker_dump) \
_(NAT44_DEL_USER, nat44_del_user) \
diff --git a/src/plugins/nat/nat_test.c b/src/plugins/nat/nat_test.c
index 0cc34f0b3f1..228d5b58157 100644
--- a/src/plugins/nat/nat_test.c
+++ b/src/plugins/nat/nat_test.c
@@ -102,6 +102,7 @@ _(NAT44_ADD_DEL_STATIC_MAPPING_REPLY, \
_(NAT_CONTROL_PING_REPLY, nat_control_ping_reply) \
_(NAT44_STATIC_MAPPING_DETAILS, nat44_static_mapping_details) \
_(NAT_SHOW_CONFIG_REPLY, nat_show_config_reply) \
+_(NAT_SHOW_CONFIG_2_REPLY, nat_show_config_2_reply) \
_(NAT44_ADDRESS_DETAILS, nat44_address_details) \
_(NAT44_INTERFACE_DETAILS, nat44_interface_details) \
_(NAT_SET_WORKERS_REPLY, nat_set_workers_reply) \
@@ -467,6 +468,37 @@ static void vl_api_nat_show_config_reply_t_handler
vam->result_ready = 1;
}
+static void vl_api_nat_show_config_2_reply_t_handler
+ (vl_api_nat_show_config_2_reply_t *mp)
+{
+ snat_test_main_t * sm = &snat_test_main;
+ vat_main_t *vam = sm->vat_main;
+ i32 retval = ntohl (mp->retval);
+
+ if (retval >= 0)
+ {
+ fformat (vam->ofp, "translation hash buckets %d\n",
+ ntohl (mp->translation_buckets));
+ fformat (vam->ofp, "translation hash memory %d\n",
+ ntohl (mp->translation_memory_size));
+ fformat (vam->ofp, "user hash buckets %d\n", ntohl (mp->user_buckets));
+ fformat (vam->ofp, "user hash memory %d\n", ntohl (mp->user_memory_size));
+ fformat (vam->ofp, "max translations per user %d\n",
+ ntohl (mp->max_translations_per_user));
+ fformat (vam->ofp, "outside VRF id %d\n", ntohl (mp->outside_vrf_id));
+ fformat (vam->ofp, "inside VRF id %d\n", ntohl (mp->inside_vrf_id));
+ if (mp->static_mapping_only)
+ {
+ fformat (vam->ofp, "static mapping only");
+ if (mp->static_mapping_connection_tracking)
+ fformat (vam->ofp, " connection tracking");
+ fformat (vam->ofp, "\n");
+ }
+ }
+ vam->retval = retval;
+ vam->result_ready = 1;
+}
+
static int api_nat_show_config(vat_main_t * vam)
{
vl_api_nat_show_config_t * mp;
@@ -484,6 +516,23 @@ static int api_nat_show_config(vat_main_t * vam)
return ret;
}
+static int api_nat_show_config_2(vat_main_t * vam)
+{
+ vl_api_nat_show_config_2_t * mp;
+ int ret;
+
+ if (vam->json_output)
+ {
+ clib_warning ("JSON output not supported for nat_show_config_2");
+ return -99;
+ }
+
+ M(NAT_SHOW_CONFIG_2, mp);
+ S(mp);
+ W (ret);
+ return ret;
+}
+
static void vl_api_nat44_address_details_t_handler
(vl_api_nat44_address_details_t *mp)
{
@@ -904,6 +953,7 @@ _(nat44_add_del_static_mapping, "local_addr <ip>" \
_(nat_set_workers, "<wokrers_bitmap>") \
_(nat44_static_mapping_dump, "") \
_(nat_show_config, "") \
+_(nat_show_config_2, "") \
_(nat44_address_dump, "") \
_(nat44_interface_dump, "") \
_(nat_worker_dump, "") \
diff --git a/src/plugins/nat/test/test_nat.py b/src/plugins/nat/test/test_nat.py
index 6b673b0a143..a305b7aa9f4 100644
--- a/src/plugins/nat/test/test_nat.py
+++ b/src/plugins/nat/test/test_nat.py
@@ -1386,6 +1386,49 @@ class MethodHolder(VppTestCase):
self.assertEqual(data, p[Raw].load)
+class TestNATMisc(MethodHolder):
+ """ NAT misc Test Cases """
+
+ max_translations = 10240
+ max_users = 10240
+
+ @classmethod
+ def setUpConstants(cls):
+ super(TestNATMisc, cls).setUpConstants()
+ cls.vpp_cmdline.extend([
+ "nat", "{",
+ "max translations per thread %d" % cls.max_translations,
+ "max users per thread %d" % cls.max_users,
+ "}"
+ ])
+
+ @classmethod
+ def tearDownClass(cls):
+ super(TestNATMisc, cls).tearDownClass()
+
+ def test_show_config(self):
+ """ NAT config translation memory """
+
+ nat_config = self.vapi.nat_show_config()
+ mem = nat_config.translation_memory_size
+ self.assertTrue(mem > 0)
+ self.logger.info("max translation memory: %d" % mem)
+
+ def test_show_config_2(self):
+ """ NAT config2 translation memory """
+
+ nat_config = self.vapi.nat_show_config_2()
+ mem = nat_config.translation_memory_size
+ self.assertTrue(mem > 0)
+ self.logger.info("max translation memory: %d" % mem)
+
+ def test_show_max_translations(self):
+ """ API test - max translations per thread """
+ nat_config = self.vapi.nat_show_config_2()
+ self.assertEqual(self.max_translations,
+ nat_config.max_translations_per_thread)
+
+
class TestNAT44(MethodHolder):
""" NAT44 Test Cases """