summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatus Fabian <matfabia@cisco.com>2017-08-16 05:37:36 -0700
committerOle Trøan <otroan@employees.org>2017-08-16 15:56:32 +0000
commitab9a59c19a2765e001dd24a8f3e51882b6806e2d (patch)
tree5b18ac297b7b9f1f7220dd151930156484d66d04
parentd292ab1e0f600c20d380a93180cccb6226c220e3 (diff)
SNAT: Make proto optional in nat64_bib_dump (VPP-942)
make proto optional in nat64_bib_dump and nat64_st_dump Change-Id: Idd102ce2b1555d38783fd22c84e46b4c48570edc Signed-off-by: Matus Fabian <matfabia@cisco.com>
-rw-r--r--src/plugins/snat/nat64_cli.c24
-rw-r--r--src/plugins/snat/nat64_db.c110
-rw-r--r--src/plugins/snat/nat64_db.h14
-rw-r--r--src/plugins/snat/snat.api12
-rw-r--r--test/test_snat.py20
-rw-r--r--test/vpp_papi_provider.py8
6 files changed, 123 insertions, 65 deletions
diff --git a/src/plugins/snat/nat64_cli.c b/src/plugins/snat/nat64_cli.c
index d48cb72496f..ca60b12c189 100644
--- a/src/plugins/snat/nat64_cli.c
+++ b/src/plugins/snat/nat64_cli.c
@@ -433,7 +433,7 @@ nat64_show_bib_command_fn (vlib_main_t * vm,
unformat_input_t _line_input, *line_input = &_line_input;
clib_error_t *error = 0;
u32 proto = ~0;
- u8 p = 0;
+ u8 p = 255;
if (nm->is_disabled)
return clib_error_return (0,
@@ -445,6 +445,8 @@ nat64_show_bib_command_fn (vlib_main_t * vm,
if (unformat (line_input, "%U", unformat_snat_protocol, &proto))
p = snat_proto_to_ip_proto (proto);
else if (unformat (line_input, "unknown"))
+ p = 0;
+ else if (unformat (line_input, "all"))
;
else
{
@@ -453,7 +455,11 @@ nat64_show_bib_command_fn (vlib_main_t * vm,
goto done;
}
- vlib_cli_output (vm, "NAT64 %U BIB:", format_snat_protocol, proto);
+ if (p == 255)
+ vlib_cli_output (vm, "NAT64 BIB entries:");
+ else
+ vlib_cli_output (vm, "NAT64 %U BIB entries:", format_snat_protocol,
+ proto);
nat64_db_bib_walk (&nm->db, p, nat64_cli_bib_walk, vm);
done:
@@ -632,7 +638,7 @@ nat64_show_st_command_fn (vlib_main_t * vm,
unformat_input_t _line_input, *line_input = &_line_input;
clib_error_t *error = 0;
u32 proto = ~0;
- u8 p = 0;
+ u8 p = 255;
if (nm->is_disabled)
return clib_error_return (0,
@@ -644,6 +650,8 @@ nat64_show_st_command_fn (vlib_main_t * vm,
if (unformat (line_input, "%U", unformat_snat_protocol, &proto))
p = snat_proto_to_ip_proto (proto);
else if (unformat (line_input, "unknown"))
+ p = 0;
+ else if (unformat (line_input, "all"))
;
else
{
@@ -652,8 +660,10 @@ nat64_show_st_command_fn (vlib_main_t * vm,
goto done;
}
- vlib_cli_output (vm, "NAT64 %U session table:", format_snat_protocol,
- proto);
+ if (p == 255)
+ vlib_cli_output (vm, "NAT64 sessions:");
+ else
+ vlib_cli_output (vm, "NAT64 %U sessions:", format_snat_protocol, proto);
nat64_db_st_walk (&nm->db, p, nat64_cli_st_walk, vm);
done:
@@ -860,7 +870,7 @@ VLIB_CLI_COMMAND (nat64_add_del_static_bib_command, static) = {
?*/
VLIB_CLI_COMMAND (show_nat64_bib_command, static) = {
.path = "show nat64 bib",
- .short_help = "show nat64 bib tcp|udp|icmp|unknown",
+ .short_help = "show nat64 bib all|tcp|udp|icmp|unknown",
.function = nat64_show_bib_command_fn,
};
@@ -924,7 +934,7 @@ VLIB_CLI_COMMAND (show_nat64_timeouts_command, static) = {
?*/
VLIB_CLI_COMMAND (show_nat64_st_command, static) = {
.path = "show nat64 session table",
- .short_help = "show nat64 session table tcp|udp|icmp|unknown",
+ .short_help = "show nat64 session table all|tcp|udp|icmp|unknown",
.function = nat64_show_st_command_fn,
};
diff --git a/src/plugins/snat/nat64_db.c b/src/plugins/snat/nat64_db.c
index b6e199c69a9..9584827e4da 100644
--- a/src/plugins/snat/nat64_db.c
+++ b/src/plugins/snat/nat64_db.c
@@ -217,28 +217,49 @@ nat64_db_bib_walk (nat64_db_t * db, u8 proto,
{
nat64_db_bib_entry_t *bib, *bibe;
- switch (ip_proto_to_snat_proto (proto))
+ if (proto == 255)
{
-/* *INDENT-OFF* */
-#define _(N, i, n, s) \
- case SNAT_PROTOCOL_##N: \
+ /* *INDENT-OFF* */
+ #define _(N, i, n, s) \
bib = db->bib._##n##_bib; \
- break;
+ pool_foreach (bibe, bib, ({ \
+ if (fn (bibe, ctx)) \
+ return; \
+ }));
foreach_snat_protocol
-#undef _
-/* *INDENT-ON* */
- default:
+ #undef _
bib = db->bib._unk_proto_bib;
- break;
+ pool_foreach (bibe, bib, ({
+ if (fn (bibe, ctx))
+ return;
+ }));
+ /* *INDENT-ON* */
+ }
+ else
+ {
+ switch (ip_proto_to_snat_proto (proto))
+ {
+ /* *INDENT-OFF* */
+ #define _(N, i, n, s) \
+ case SNAT_PROTOCOL_##N: \
+ bib = db->bib._##n##_bib; \
+ break;
+ foreach_snat_protocol
+ #undef _
+ /* *INDENT-ON* */
+ default:
+ bib = db->bib._unk_proto_bib;
+ break;
+ }
+
+ /* *INDENT-OFF* */
+ pool_foreach (bibe, bib,
+ ({
+ if (fn (bibe, ctx))
+ return;
+ }));
+ /* *INDENT-ON* */
}
-
- /* *INDENT-OFF* */
- pool_foreach (bibe, bib,
- ({
- if (fn (bibe, ctx))
- return;
- }));
- /* *INDENT-ON* */
}
nat64_db_bib_entry_t *
@@ -270,28 +291,49 @@ nat64_db_st_walk (nat64_db_t * db, u8 proto,
{
nat64_db_st_entry_t *st, *ste;
- switch (ip_proto_to_snat_proto (proto))
+ if (proto == 255)
{
-/* *INDENT-OFF* */
-#define _(N, i, n, s) \
- case SNAT_PROTOCOL_##N: \
+ /* *INDENT-OFF* */
+ #define _(N, i, n, s) \
st = db->st._##n##_st; \
- break;
+ pool_foreach (ste, st, ({ \
+ if (fn (ste, ctx)) \
+ return; \
+ }));
foreach_snat_protocol
-#undef _
-/* *INDENT-ON* */
- default:
+ #undef _
st = db->st._unk_proto_st;
- break;
+ pool_foreach (ste, st, ({
+ if (fn (ste, ctx))
+ return;
+ }));
+ /* *INDENT-ON* */
+ }
+ else
+ {
+ switch (ip_proto_to_snat_proto (proto))
+ {
+ /* *INDENT-OFF* */
+ #define _(N, i, n, s) \
+ case SNAT_PROTOCOL_##N: \
+ st = db->st._##n##_st; \
+ break;
+ foreach_snat_protocol
+ #undef _
+ /* *INDENT-ON* */
+ default:
+ st = db->st._unk_proto_st;
+ break;
+ }
+
+ /* *INDENT-OFF* */
+ pool_foreach (ste, st,
+ ({
+ if (fn (ste, ctx))
+ return;
+ }));
+ /* *INDENT-ON* */
}
-
- /* *INDENT-OFF* */
- pool_foreach (ste, st,
- ({
- if (fn (ste, ctx))
- return;
- }));
- /* *INDENT-ON* */
}
nat64_db_st_entry_t *
diff --git a/src/plugins/snat/nat64_db.h b/src/plugins/snat/nat64_db.h
index 4511fb26a75..1e2dcc930d8 100644
--- a/src/plugins/snat/nat64_db.h
+++ b/src/plugins/snat/nat64_db.h
@@ -171,7 +171,12 @@ typedef int (*nat64_db_bib_walk_fn_t) (nat64_db_bib_entry_t * bibe,
* @brief Walk NAT64 BIB.
*
* @param db NAT64 DB.
- * @param proto L4 protocol.
+ * @param proto BIB L4 protocol:
+ * - 255 all BIBs
+ * - 6 TCP BIB
+ * - 17 UDP BIB
+ * - 1/58 ICMP BIB
+ * - otherwise "unknown" protocol BIB
* @param fn The function to invoke on each entry visited.
* @param ctx A context passed in the visit function.
*/
@@ -263,7 +268,12 @@ typedef int (*nat64_db_st_walk_fn_t) (nat64_db_st_entry_t * ste, void *ctx);
* @brief Walk NAT64 session table.
*
* @param db NAT64 DB.
- * @param proto L4 protocol.
+ * @param proto L4 protocol:
+ * - 255 all session tables
+ * - 6 TCP session table
+ * - 17 UDP session table
+ * - 1/58 ICMP session table
+ * - otherwise "unknown" protocol session table
* @param fn The function to invoke on each entry visited.
* @param ctx A context passed in the visit function.
*/
diff --git a/src/plugins/snat/snat.api b/src/plugins/snat/snat.api
index f68a5aaa146..3c493ddae5b 100644
--- a/src/plugins/snat/snat.api
+++ b/src/plugins/snat/snat.api
@@ -735,7 +735,11 @@ define nat64_interface_details {
/** \brief Dump NAT64 BIB
@param client_index - opaque cookie to identify the sender
@param context - sender context, to match reply w/ request
- @param proto - protocol of the BIB
+ @param proto - protocol of the BIB: 255 - all BIBs
+ 6 - TCP BIB
+ 17 - UDP BIB
+ 1/58 - ICMP BIB
+ otherwise - "unknown" protocol BIB
*/
define nat64_bib_dump {
u32 client_index;
@@ -816,7 +820,11 @@ define nat64_get_timeouts_reply {
/** \brief Dump NAT64 session table
@param client_index - opaque cookie to identify the sender
@param context - sender context, to match reply w/ request
- @param proto - protocol of the session table
+ @param proto - protocol of the session table: 255 - all STs
+ 6 - TCP ST
+ 17 - UDP ST
+ 1/58 - ICMP ST
+ otherwise - "unknown" proto ST
*/
define nat64_st_dump {
u32 client_index;
diff --git a/test/test_snat.py b/test/test_snat.py
index 8fd05fa8174..eb47bbb81d2 100644
--- a/test/test_snat.py
+++ b/test/test_snat.py
@@ -3642,14 +3642,8 @@ class TestNAT64(MethodHolder):
"""
Return number of active NAT64 sessions.
"""
- ses_num = 0
- st = self.vapi.nat64_st_dump(IP_PROTOS.tcp)
- ses_num += len(st)
- st = self.vapi.nat64_st_dump(IP_PROTOS.udp)
- ses_num += len(st)
- st = self.vapi.nat64_st_dump(IP_PROTOS.icmp)
- ses_num += len(st)
- return ses_num
+ st = self.vapi.nat64_st_dump()
+ return len(st)
def clear_nat64(self):
"""
@@ -3716,14 +3710,8 @@ class TestNAT64(MethodHolder):
self.logger.info(self.vapi.cli("show nat64 pool"))
self.logger.info(self.vapi.cli("show nat64 interfaces"))
self.logger.info(self.vapi.cli("show nat64 prefix"))
- self.logger.info(self.vapi.cli("show nat64 bib tcp"))
- self.logger.info(self.vapi.cli("show nat64 bib udp"))
- self.logger.info(self.vapi.cli("show nat64 bib icmp"))
- self.logger.info(self.vapi.cli("show nat64 bib unknown"))
- self.logger.info(self.vapi.cli("show nat64 session table tcp"))
- self.logger.info(self.vapi.cli("show nat64 session table udp"))
- self.logger.info(self.vapi.cli("show nat64 session table icmp"))
- self.logger.info(self.vapi.cli("show nat64 session table unknown"))
+ self.logger.info(self.vapi.cli("show nat64 bib all"))
+ self.logger.info(self.vapi.cli("show nat64 session table all"))
self.clear_nat64()
if __name__ == '__main__':
diff --git a/test/vpp_papi_provider.py b/test/vpp_papi_provider.py
index c99d4583334..1daa2a9e6f3 100644
--- a/test/vpp_papi_provider.py
+++ b/test/vpp_papi_provider.py
@@ -1466,10 +1466,10 @@ class VppPapiProvider(object):
'proto': protocol,
'is_add': is_add})
- def nat64_bib_dump(self, protocol):
+ def nat64_bib_dump(self, protocol=255):
"""Dump NAT64 BIB
- :param protocol: IP protocol
+ :param protocol: IP protocol (Default value = 255, all BIBs)
:returns: Dictionary of NAT64 BIB entries
"""
return self.api(self.papi.nat64_bib_dump, {'proto': protocol})
@@ -1499,10 +1499,10 @@ class VppPapiProvider(object):
"""
return self.api(self.papi.nat64_get_timeouts, {})
- def nat64_st_dump(self, protocol):
+ def nat64_st_dump(self, protocol=255):
"""Dump NAT64 session table
- :param protocol: IP protocol
+ :param protocol: IP protocol (Default value = 255, all STs)
:returns: Dictionary of NAT64 sesstion table entries
"""
return self.api(self.papi.nat64_st_dump, {'proto': protocol})