diff options
Diffstat (limited to 'src/vnet/adj')
-rw-r--r-- | src/vnet/adj/adj.c | 82 | ||||
-rw-r--r-- | src/vnet/adj/adj.h | 6 | ||||
-rw-r--r-- | src/vnet/adj/adj_mcast.c | 4 | ||||
-rw-r--r-- | src/vnet/adj/adj_midchain.c | 4 | ||||
-rw-r--r-- | src/vnet/adj/adj_nbr.c | 4 |
5 files changed, 81 insertions, 19 deletions
diff --git a/src/vnet/adj/adj.c b/src/vnet/adj/adj.c index 4ed4999f516..f3d483ac13f 100644 --- a/src/vnet/adj/adj.c +++ b/src/vnet/adj/adj.c @@ -135,16 +135,6 @@ format_ip_adjacency (u8 * s, va_list * args) vlib_get_combined_counter(&adjacency_counters, adj_index, &counts); s = format (s, "\n counts:[%Ld:%Ld]", counts.packets, counts.bytes); s = format (s, "\n locks:%d", adj->ia_node.fn_locks); - s = format (s, " node:[%d]:%U", - adj->rewrite_header.node_index, - format_vlib_node_name, vlib_get_main(), - adj->rewrite_header.node_index); - s = format (s, " next:[%d]:%U", - adj->rewrite_header.next_index, - format_vlib_next_node_name, - vlib_get_main(), - adj->rewrite_header.node_index, - adj->rewrite_header.next_index); s = format(s, "\n children:\n "); s = fib_node_children_format(adj->ia_node.fn_children, s); } @@ -271,6 +261,78 @@ adj_child_remove (adj_index_t adj_index, sibling_index); } +/* + * Context for the walk to update the cached feture flags. + */ +typedef struct adj_feature_update_t_ +{ + u8 arc; + u8 enable; +} adj_feature_update_ctx_t; + +static adj_walk_rc_t +adj_feature_update_walk_cb (adj_index_t ai, + void *arg) +{ + adj_feature_update_ctx_t *ctx = arg; + ip_adjacency_t *adj; + + adj = adj_get(ai); + + /* + * this ugly mess matches the feature arc that is changing with affected + * adjacencies + */ + if (((ctx->arc == ip6_main.lookup_main.output_feature_arc_index) && + (VNET_LINK_IP6 == adj->ia_link)) || + ((ctx->arc == ip4_main.lookup_main.output_feature_arc_index) && + (VNET_LINK_IP4 == adj->ia_link)) || + ((ctx->arc == mpls_main.output_feature_arc_index) && + (VNET_LINK_MPLS == adj->ia_link))) + { + if (ctx->enable) + adj->rewrite_header.flags |= VNET_REWRITE_HAS_FEATURES; + else + adj->rewrite_header.flags &= ~VNET_REWRITE_HAS_FEATURES; + } + return (ADJ_WALK_RC_CONTINUE); +} + +void +adj_feature_update (u32 sw_if_index, + u8 arc_index, + u8 is_enable) +{ + /* + * Walk all the adjacencies on the interface to update the cached + * 'has-features' flag + */ + adj_feature_update_ctx_t ctx = { + .arc = arc_index, + .enable = is_enable, + }; + adj_walk (sw_if_index, adj_feature_update_walk_cb, &ctx); +} + +/** + * @brief Walk the Adjacencies on a given interface + */ +void +adj_walk (u32 sw_if_index, + adj_walk_cb_t cb, + void *ctx) +{ + /* + * walk all the neighbor adjacencies + */ + fib_protocol_t proto; + + FOR_EACH_FIB_IP_PROTOCOL(proto) + { + adj_nbr_walk(sw_if_index, proto, cb, ctx); + } +} + /** * @brief Return the link type of the adjacency */ diff --git a/src/vnet/adj/adj.h b/src/vnet/adj/adj.h index fcc5890c7d7..271fdbc6114 100644 --- a/src/vnet/adj/adj.h +++ b/src/vnet/adj/adj.h @@ -97,6 +97,12 @@ extern u32 adj_get_sw_if_index (adj_index_t ai); extern const u8* adj_get_rewrite (adj_index_t ai); /** + * @brief Notify the adjacency subsystem that the features settings for + * an interface have changed + */ +extern void adj_feature_update (u32 sw_if_index, u8 arc_index, u8 is_enable); + +/** * @brief * The global adjacnecy pool. Exposed for fast/inline data-plane access */ diff --git a/src/vnet/adj/adj_mcast.c b/src/vnet/adj/adj_mcast.c index 1345aedbad6..a3ba4d6ab18 100644 --- a/src/vnet/adj/adj_mcast.c +++ b/src/vnet/adj/adj_mcast.c @@ -256,15 +256,13 @@ format_adj_mcast (u8* s, va_list *ap) { index_t index = va_arg(*ap, index_t); CLIB_UNUSED(u32 indent) = va_arg(*ap, u32); - vnet_main_t * vnm = vnet_get_main(); ip_adjacency_t * adj = adj_get(index); s = format(s, "%U-mcast: ", format_fib_protocol, adj->ia_nh_proto); s = format (s, "%U", format_vnet_rewrite, - vnm->vlib_main, &adj->rewrite_header, - sizeof (adj->rewrite_data), 0); + &adj->rewrite_header, sizeof (adj->rewrite_data), 0); return (s); } diff --git a/src/vnet/adj/adj_midchain.c b/src/vnet/adj/adj_midchain.c index 7d31565114e..55b5e44bc43 100644 --- a/src/vnet/adj/adj_midchain.c +++ b/src/vnet/adj/adj_midchain.c @@ -501,7 +501,6 @@ format_adj_midchain (u8* s, va_list *ap) { index_t index = va_arg(*ap, index_t); u32 indent = va_arg(*ap, u32); - vnet_main_t * vnm = vnet_get_main(); ip_adjacency_t * adj = adj_get(index); s = format (s, "%U", format_vnet_link, adj->ia_link); @@ -509,8 +508,7 @@ format_adj_midchain (u8* s, va_list *ap) format_ip46_address, &adj->sub_type.nbr.next_hop); s = format (s, " %U", format_vnet_rewrite, - vnm->vlib_main, &adj->rewrite_header, - sizeof (adj->rewrite_data), indent); + &adj->rewrite_header, sizeof (adj->rewrite_data), indent); s = format (s, "\n%Ustacked-on:\n%U%U", format_white_space, indent, format_white_space, indent+2, diff --git a/src/vnet/adj/adj_nbr.c b/src/vnet/adj/adj_nbr.c index 9e8073d3225..9ef3651de66 100644 --- a/src/vnet/adj/adj_nbr.c +++ b/src/vnet/adj/adj_nbr.c @@ -433,7 +433,6 @@ adj_nbr_update_rewrite_internal (ip_adjacency_t *adj, vnet_rewrite_clear_data_internal(&adj->rewrite_header, sizeof(adj->rewrite_data)); } - adj->rewrite_header.node_index = this_node; adj->rewrite_header.next_index = vlib_node_add_next(vlib_get_main(), this_node, next_node); @@ -971,7 +970,6 @@ format_adj_nbr (u8* s, va_list *ap) { index_t index = va_arg(*ap, index_t); CLIB_UNUSED(u32 indent) = va_arg(*ap, u32); - vnet_main_t * vnm = vnet_get_main(); ip_adjacency_t * adj = adj_get(index); s = format (s, "%U", format_vnet_link, adj->ia_link); @@ -980,7 +978,7 @@ format_adj_nbr (u8* s, va_list *ap) adj_proto_to_46(adj->ia_nh_proto)); s = format (s, "%U", format_vnet_rewrite, - vnm->vlib_main, &adj->rewrite_header, sizeof (adj->rewrite_data), 0); + &adj->rewrite_header, sizeof (adj->rewrite_data), 0); return (s); } |