From ab9a59c19a2765e001dd24a8f3e51882b6806e2d Mon Sep 17 00:00:00 2001 From: Matus Fabian Date: Wed, 16 Aug 2017 05:37:36 -0700 Subject: 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 --- src/plugins/snat/nat64_cli.c | 24 +++++++--- src/plugins/snat/nat64_db.c | 110 ++++++++++++++++++++++++++++++------------- src/plugins/snat/nat64_db.h | 14 +++++- src/plugins/snat/snat.api | 12 ++++- 4 files changed, 115 insertions(+), 45 deletions(-) (limited to 'src/plugins/snat') 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; -- cgit 1.2.3-korg