diff options
author | Neale Ranns <neale@graphiant.com> | 2021-10-08 07:30:47 +0000 |
---|---|---|
committer | Beno�t Ganne <bganne@cisco.com> | 2021-11-19 14:41:28 +0000 |
commit | 6fdcc3daa40ebfcb793998b6e4527dd6db03cfb7 (patch) | |
tree | 8b8afab4ef1f1d1f8381b388010e92e4d470022b /src/plugins | |
parent | ad80663eb3fd954f42607168ad4babb91cb0edcc (diff) |
fib: Don't use [midchain] adjacencies to change an interface's feature arc
Type: fix
Using the adjacency to modify the interface's feature arc doesn't work, since there are potentially more than one adj per-interface.
Instead have the interface, when it is created, register what the end node of the feature arc is. This end node is then also used as the interface's tx node (i.e. it is used as the adjacency's next-node).
rename adj-midhcain-tx as 'tunnel-output', that's a bit more intuitive.
There's also a fix in config string handling to:
1- prevent false sharing of strings when the end node of the arc is different.
2- call registered listeners when the end node is changed
For IPSec the consequences are that one cannot provide per-adjacency behaviour using different end-nodes - this was previously done for the no-SA and an SA with no protection. These cases are no handled in the esp-encrypt node.
Signed-off-by: Neale Ranns <neale@graphiant.com>
Change-Id: If3a83d03a3000f28820d9a9cb4101d244803d084
Diffstat (limited to 'src/plugins')
-rw-r--r-- | src/plugins/lisp/lisp-gpe/interface.c | 15 | ||||
-rw-r--r-- | src/plugins/lisp/lisp-gpe/lisp_gpe_adjacency.c | 2 | ||||
-rw-r--r-- | src/plugins/lisp/lisp-gpe/lisp_gpe_sub_interface.c | 3 | ||||
-rw-r--r-- | src/plugins/pppoe/pppoe.c | 3 | ||||
-rw-r--r-- | src/plugins/wireguard/wireguard_if.c | 3 |
5 files changed, 19 insertions, 7 deletions
diff --git a/src/plugins/lisp/lisp-gpe/interface.c b/src/plugins/lisp/lisp-gpe/interface.c index d73471d6b3d..f1c49eadda8 100644 --- a/src/plugins/lisp/lisp-gpe/interface.c +++ b/src/plugins/lisp/lisp-gpe/interface.c @@ -88,9 +88,8 @@ format_lisp_gpe_tx_trace (u8 * s, va_list * args) * * @return number of vectors in frame. */ -static uword -lisp_gpe_interface_tx (vlib_main_t * vm, vlib_node_runtime_t * node, - vlib_frame_t * from_frame) +VLIB_NODE_FN (lisp_tunnel_output) +(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame) { u32 n_left_from, next_index, *from, *to_next; lisp_gpe_main_t *lgm = &lisp_gpe_main; @@ -122,6 +121,7 @@ lisp_gpe_interface_tx (vlib_main_t * vm, vlib_node_runtime_t * node, n_left_to_next -= 1; b0 = vlib_get_buffer (vm, bi0); + b0->flags |= VNET_BUFFER_F_LOCALLY_ORIGINATED; /* Fixup the checksum and len fields in the LISP tunnel encap * that was applied at the midchain node */ @@ -151,6 +151,13 @@ lisp_gpe_interface_tx (vlib_main_t * vm, vlib_node_runtime_t * node, return from_frame->n_vectors; } +VLIB_REGISTER_NODE (lisp_tunnel_output) = { + .name = "lisp-tunnel-output", + .vector_size = sizeof (u32), + .format_trace = format_lisp_gpe_tx_trace, + .sibling_of = "tunnel-output", +}; + static u8 * format_lisp_gpe_name (u8 * s, va_list * args) { @@ -162,8 +169,6 @@ format_lisp_gpe_name (u8 * s, va_list * args) VNET_DEVICE_CLASS (lisp_gpe_device_class) = { .name = "LISP_GPE", .format_device_name = format_lisp_gpe_name, - .format_tx_trace = format_lisp_gpe_tx_trace, - .tx_function = lisp_gpe_interface_tx, }; /* *INDENT-ON* */ diff --git a/src/plugins/lisp/lisp-gpe/lisp_gpe_adjacency.c b/src/plugins/lisp/lisp-gpe/lisp_gpe_adjacency.c index 8d20412a1f2..dd8a252f378 100644 --- a/src/plugins/lisp/lisp-gpe/lisp_gpe_adjacency.c +++ b/src/plugins/lisp/lisp-gpe/lisp_gpe_adjacency.c @@ -317,8 +317,6 @@ lisp_gpe_update_adjacency (vnet_main_t * vnm, u32 sw_if_index, adj_index_t ai) lgt = lisp_gpe_tunnel_get (ladj->tunnel_index); linkt = adj_get_link_type (ai); af = ADJ_FLAG_MIDCHAIN_IP_STACK; - if (VNET_LINK_ETHERNET == linkt) - af |= ADJ_FLAG_MIDCHAIN_NO_COUNT; adj_nbr_midchain_update_rewrite (ai, lisp_gpe_fixup, NULL, af, diff --git a/src/plugins/lisp/lisp-gpe/lisp_gpe_sub_interface.c b/src/plugins/lisp/lisp-gpe/lisp_gpe_sub_interface.c index aea84a3fa92..b40ed2e9234 100644 --- a/src/plugins/lisp/lisp-gpe/lisp_gpe_sub_interface.c +++ b/src/plugins/lisp/lisp-gpe/lisp_gpe_sub_interface.c @@ -168,6 +168,8 @@ lisp_gpe_sub_interface_find_or_create_and_lock (const ip_address_t * lrloc, vnet_sw_interface_set_flags (vnet_get_main (), l3s->sw_if_index, VNET_SW_INTERFACE_FLAG_ADMIN_UP); + vnet_set_interface_l3_output_node (vlib_get_main (), l3s->sw_if_index, + (u8 *) "lisp-tunnel-output"); lisp_gpe_sub_interface_db_insert (l3s); } @@ -200,6 +202,7 @@ lisp_gpe_sub_interface_unlock (index_t l3si) lisp_gpe_tenant_l3_iface_unlock (l3s->key->vni); vnet_sw_interface_set_flags (vnet_get_main (), l3s->sw_if_index, 0); + vnet_reset_interface_l3_output_node (vlib_get_main (), l3s->sw_if_index); vnet_delete_sub_interface (l3s->sw_if_index); lisp_gpe_sub_interface_db_remove (l3s); diff --git a/src/plugins/pppoe/pppoe.c b/src/plugins/pppoe/pppoe.c index d073a941cba..182f93b6156 100644 --- a/src/plugins/pppoe/pppoe.c +++ b/src/plugins/pppoe/pppoe.c @@ -413,6 +413,8 @@ int vnet_pppoe_add_del_session si->flags &= ~VNET_SW_INTERFACE_FLAG_HIDDEN; vnet_sw_interface_set_flags (vnm, sw_if_index, VNET_SW_INTERFACE_FLAG_ADMIN_UP); + vnet_set_interface_l3_output_node (vnm->vlib_main, sw_if_index, + (u8 *) "tunnel-output"); /* add reverse route for client ip */ fib_table_entry_path_add (a->decap_fib_index, &pfx, @@ -431,6 +433,7 @@ int vnet_pppoe_add_del_session t = pool_elt_at_index (pem->sessions, result.fields.session_index); sw_if_index = t->sw_if_index; + vnet_reset_interface_l3_output_node (vnm->vlib_main, sw_if_index); vnet_sw_interface_set_flags (vnm, t->sw_if_index, 0 /* down */ ); vnet_sw_interface_t *si = vnet_get_sw_interface (vnm, t->sw_if_index); si->flags |= VNET_SW_INTERFACE_FLAG_HIDDEN; diff --git a/src/plugins/wireguard/wireguard_if.c b/src/plugins/wireguard/wireguard_if.c index ad8f42c1969..64e405608f4 100644 --- a/src/plugins/wireguard/wireguard_if.c +++ b/src/plugins/wireguard/wireguard_if.c @@ -315,6 +315,8 @@ wg_if_create (u32 user_instance, ip_address_copy (&wg_if->src_ip, src_ip); wg_if->sw_if_index = *sw_if_indexp = hi->sw_if_index; + vnet_set_interface_l3_output_node (vnm->vlib_main, hi->sw_if_index, + (u8 *) "tunnel-output"); return 0; } @@ -359,6 +361,7 @@ wg_if_delete (u32 sw_if_index) udp_unregister_dst_port (vlib_get_main (), wg_if->port, 0); } + vnet_reset_interface_l3_output_node (vnm->vlib_main, sw_if_index); vnet_delete_hw_interface (vnm, hw->hw_if_index); pool_put_index (noise_local_pool, wg_if->local_idx); pool_put (wg_if_pool, wg_if); |