X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fip%2Fip6_punt_drop.c;h=d1145fbf82e2cbaad24cfa9fbd5ab71651c7e99b;hb=b538dd868665009f9a3737610177342f88e3ba80;hp=4c4240ee7a3475891585b73e0be7def5e6ccc575;hpb=a3611a70347d870ef4d657e010a1fe736a9fdd72;p=vpp.git diff --git a/src/vnet/ip/ip6_punt_drop.c b/src/vnet/ip/ip6_punt_drop.c index 4c4240ee7a3..d1145fbf82e 100644 --- a/src/vnet/ip/ip6_punt_drop.c +++ b/src/vnet/ip/ip6_punt_drop.c @@ -28,11 +28,15 @@ VNET_FEATURE_ARC_INIT (ip6_punt) = VNET_FEATURE_ARC_INIT (ip6_drop) = { .arc_name = "ip6-drop", - .start_nodes = VNET_FEATURES ("ip6-drop"), + .start_nodes = VNET_FEATURES ("ip6-drop", "ip6-not-enabled"), }; /* *INDENT-ON* */ +extern ip_punt_policer_t ip6_punt_policer_cfg; + +#ifndef CLIB_MARCH_VARIANT ip_punt_policer_t ip6_punt_policer_cfg; +#endif /* CLIB_MARCH_VARIANT */ static char *ip6_punt_policer_error_strings[] = { #define _(sym,string) string, @@ -40,9 +44,9 @@ static char *ip6_punt_policer_error_strings[] = { #undef _ }; -static uword -ip6_punt_policer (vlib_main_t * vm, - vlib_node_runtime_t * node, vlib_frame_t * frame) +VLIB_NODE_FN (ip6_punt_policer_node) (vlib_main_t * vm, + vlib_node_runtime_t * node, + vlib_frame_t * frame) { return (ip_punt_policer (vm, node, frame, vnet_feat_arc_ip6_punt.feature_arc_index, @@ -52,8 +56,7 @@ ip6_punt_policer (vlib_main_t * vm, /* *INDENT-OFF* */ -VLIB_REGISTER_NODE (ip6_punt_policer_node, static) = { - .function = ip6_punt_policer, +VLIB_REGISTER_NODE (ip6_punt_policer_node) = { .name = "ip6-punt-policer", .vector_size = sizeof (u32), .n_next_nodes = IP_PUNT_POLICER_N_NEXT, @@ -67,9 +70,6 @@ VLIB_REGISTER_NODE (ip6_punt_policer_node, static) = { }, }; -VLIB_NODE_FUNCTION_MULTIARCH (ip6_punt_policer_node, - ip6_punt_policer); - VNET_FEATURE_INIT (ip6_punt_policer_node, static) = { .arc_name = "ip6-punt", .node_name = "ip6-punt-policer", @@ -77,8 +77,20 @@ VNET_FEATURE_INIT (ip6_punt_policer_node, static) = { }; /* *INDENT-ON* */ -static uword -ip6_drop (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) +VLIB_NODE_FN (ip6_drop_node) (vlib_main_t * vm, vlib_node_runtime_t * node, + vlib_frame_t * frame) +{ + if (node->flags & VLIB_NODE_FLAG_TRACE) + ip6_forward_next_trace (vm, node, frame, VLIB_TX); + + return ip_drop_or_punt (vm, node, frame, + vnet_feat_arc_ip6_drop.feature_arc_index); + +} + +VLIB_NODE_FN (ip6_not_enabled_node) (vlib_main_t * vm, + vlib_node_runtime_t * node, + vlib_frame_t * frame) { if (node->flags & VLIB_NODE_FLAG_TRACE) ip6_forward_next_trace (vm, node, frame, VLIB_TX); @@ -88,8 +100,8 @@ ip6_drop (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) } -static uword -ip6_punt (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) +VLIB_NODE_FN (ip6_punt_node) (vlib_main_t * vm, vlib_node_runtime_t * node, + vlib_frame_t * frame) { if (node->flags & VLIB_NODE_FLAG_TRACE) ip6_forward_next_trace (vm, node, frame, VLIB_TX); @@ -99,9 +111,8 @@ ip6_punt (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) } /* *INDENT-OFF* */ -VLIB_REGISTER_NODE (ip6_drop_node, static) = +VLIB_REGISTER_NODE (ip6_drop_node) = { - .function = ip6_drop, .name = "ip6-drop", .vector_size = sizeof (u32), .format_trace = format_ip6_forward_next_trace, @@ -111,11 +122,19 @@ VLIB_REGISTER_NODE (ip6_drop_node, static) = }, }; -VLIB_NODE_FUNCTION_MULTIARCH (ip6_drop_node, ip6_drop); +VLIB_REGISTER_NODE (ip6_not_enabled_node) = +{ + .name = "ip6-not-enabled", + .vector_size = sizeof (u32), + .format_trace = format_ip6_forward_next_trace, + .n_next_nodes = 1, + .next_nodes = { + [0] = "error-drop", + }, +}; -VLIB_REGISTER_NODE (ip6_punt_node, static) = +VLIB_REGISTER_NODE (ip6_punt_node) = { - .function = ip6_punt, .name = "ip6-punt", .vector_size = sizeof (u32), .format_trace = format_ip6_forward_next_trace, @@ -125,8 +144,6 @@ VLIB_REGISTER_NODE (ip6_punt_node, static) = }, }; -VLIB_NODE_FUNCTION_MULTIARCH (ip6_punt_node, ip6_punt); - VNET_FEATURE_INIT (ip6_punt_end_of_arc, static) = { .arc_name = "ip6-punt", .node_name = "error-punt", @@ -140,6 +157,7 @@ VNET_FEATURE_INIT (ip6_drop_end_of_arc, static) = { }; /* *INDENT-ON */ +#ifndef CLIB_MARCH_VARIANT void ip6_punt_policer_add_del (u8 is_add, u32 policer_index) { @@ -148,6 +166,7 @@ ip6_punt_policer_add_del (u8 is_add, u32 policer_index) vnet_feature_enable_disable ("ip6-punt", "ip6-punt-policer", 0, is_add, 0, 0); } +#endif /* CLIB_MARCH_VARIANT */ static clib_error_t * ip6_punt_police_cmd (vlib_main_t * vm, @@ -207,14 +226,18 @@ VLIB_CLI_COMMAND (ip6_punt_policer_command, static) = .function = ip6_punt_police_cmd, .short_help = "ip6 punt policer [add|del] ", }; -/* *INDENT-ON* */ +extern ip_punt_redirect_t ip6_punt_redirect_cfg; + +#ifndef CLIB_MARCH_VARIANT ip_punt_redirect_t ip6_punt_redirect_cfg = { .any_rx_sw_if_index = { - .tx_sw_if_index = ~0, - } - , + .tx_sw_if_index = ~0, + .adj_index = ADJ_INDEX_INVALID, + }, }; +#endif /* CLIB_MARCH_VARIANT */ +/* *INDENT-ON* */ #define foreach_ip6_punt_redirect_error \ _(DROP, "ip6 punt redirect drop") @@ -233,9 +256,9 @@ static char *ip6_punt_redirect_error_strings[] = { #undef _ }; -static uword -ip6_punt_redirect (vlib_main_t * vm, - vlib_node_runtime_t * node, vlib_frame_t * frame) +VLIB_NODE_FN (ip6_punt_redirect_node) (vlib_main_t * vm, + vlib_node_runtime_t * node, + vlib_frame_t * frame) { return (ip_punt_redirect (vm, node, frame, vnet_feat_arc_ip6_punt.feature_arc_index, @@ -243,8 +266,7 @@ ip6_punt_redirect (vlib_main_t * vm, } /* *INDENT-OFF* */ -VLIB_REGISTER_NODE (ip6_punt_redirect_node, static) = { - .function = ip6_punt_redirect, +VLIB_REGISTER_NODE (ip6_punt_redirect_node) = { .name = "ip6-punt-redirect", .vector_size = sizeof (u32), .n_next_nodes = IP_PUNT_REDIRECT_N_NEXT, @@ -260,9 +282,6 @@ VLIB_REGISTER_NODE (ip6_punt_redirect_node, static) = { }, }; -VLIB_NODE_FUNCTION_MULTIARCH (ip6_punt_redirect_node, - ip6_punt_redirect); - VNET_FEATURE_INIT (ip6_punt_redirect_node, static) = { .arc_name = "ip6-punt", .node_name = "ip6-punt-redirect", @@ -270,6 +289,7 @@ VNET_FEATURE_INIT (ip6_punt_redirect_node, static) = { }; /* *INDENT-ON* */ +#ifndef CLIB_MARCH_VARIANT void ip6_punt_redirect_add (u32 rx_sw_if_index, u32 tx_sw_if_index, ip46_address_t * nh) @@ -292,6 +312,7 @@ ip6_punt_redirect_del (u32 rx_sw_if_index) ip_punt_redirect_del (&ip6_punt_redirect_cfg, rx_sw_if_index); } +#endif /* CLIB_MARCH_VARIANT */ static clib_error_t * ip6_punt_redirect_cmd (vlib_main_t * vm, @@ -300,8 +321,8 @@ ip6_punt_redirect_cmd (vlib_main_t * vm, { unformat_input_t _line_input, *line_input = &_line_input; clib_error_t *error = 0; - u32 rx_sw_if_index; - u32 tx_sw_if_index; + u32 rx_sw_if_index = 0; + u32 tx_sw_if_index = 0; ip46_address_t nh; vnet_main_t *vnm; u8 is_add; @@ -330,7 +351,7 @@ ip6_punt_redirect_cmd (vlib_main_t * vm, ; else if (unformat (line_input, "via %U", unformat_vnet_sw_interface, vnm, &tx_sw_if_index)) - memset (&nh, 0, sizeof (nh)); + clib_memset (&nh, 0, sizeof (nh)); else { error = unformat_parse_error (line_input); @@ -339,9 +360,19 @@ ip6_punt_redirect_cmd (vlib_main_t * vm, } if (is_add) - ip6_punt_redirect_add (rx_sw_if_index, tx_sw_if_index, &nh); + { + if (rx_sw_if_index && tx_sw_if_index) + { + ip6_punt_redirect_add (rx_sw_if_index, tx_sw_if_index, &nh); + } + } else - ip6_punt_redirect_del (rx_sw_if_index); + { + if (rx_sw_if_index) + { + ip6_punt_redirect_del (rx_sw_if_index); + } + } done: unformat_free (line_input); @@ -362,6 +393,48 @@ VLIB_CLI_COMMAND (ip6_punt_redirect_command, static) = }; /* *INDENT-ON* */ +#ifndef CLIB_MARCH_VARIANT +ip_punt_redirect_detail_t * +ip6_punt_redirect_entries (u32 sw_if_index) +{ + ip_punt_redirect_rx_t *pr; + ip_punt_redirect_detail_t *prs = 0; + u32 rx_sw_if_index; + + vec_foreach_index (rx_sw_if_index, + ip6_punt_redirect_cfg.redirect_by_rx_sw_if_index) + { + if (sw_if_index == ~0 || sw_if_index == rx_sw_if_index) + { + pr = + &ip6_punt_redirect_cfg.redirect_by_rx_sw_if_index[rx_sw_if_index]; + if (NULL != pr && ~0 != pr->tx_sw_if_index) + { + ip_punt_redirect_detail_t detail = {.rx_sw_if_index = + rx_sw_if_index, + .punt_redirect = *pr + }; + vec_add1 (prs, detail); + } + } + } + if (~0 != ip6_punt_redirect_cfg.any_rx_sw_if_index.tx_sw_if_index) + { + pr = &ip6_punt_redirect_cfg.any_rx_sw_if_index; + if (NULL != pr) + { + ip_punt_redirect_detail_t detail = {.rx_sw_if_index = + rx_sw_if_index, + .punt_redirect = *pr + }; + vec_add1 (prs, detail); + } + } + + return prs; +} +#endif /* CLIB_MARCH_VARIANT */ + static clib_error_t * ip6_punt_redirect_show_cmd (vlib_main_t * vm, unformat_input_t * main_input,