From d723161e038d00e59766aa67a6a0dcc350227e4b Mon Sep 17 00:00:00 2001 From: Ole Troan Date: Thu, 7 Jun 2018 10:17:57 +0200 Subject: MTU: Software interface / Per-protocol MTU support This patch separates setting of hardware interfaec and software interface MTU. Software MTU is L2 payload MTU (i.e. not including L2 header). Per-protocol MTU for IPv4, IPv6 and MPLS can also be set. Currently only IP4, IP6 are enabled in adjacency / rewrite code. Documentation in src/vnet/MTU.md Change-Id: Iee2fd6f0bbc8210748dd8e073ab9fab87d323690 Signed-off-by: Ole Troan --- src/vnet/adj/adj.c | 27 +++++---------------------- src/vnet/adj/adj.h | 6 ------ src/vnet/adj/adj_glean.c | 4 ++-- src/vnet/adj/adj_mcast.c | 2 +- src/vnet/adj/adj_nbr.c | 2 +- src/vnet/adj/rewrite.c | 11 +++++++---- src/vnet/adj/rewrite.h | 3 ++- 7 files changed, 18 insertions(+), 37 deletions(-) (limited to 'src/vnet/adj') diff --git a/src/vnet/adj/adj.c b/src/vnet/adj/adj.c index abfe8729b39..0de3fc8b775 100644 --- a/src/vnet/adj/adj.c +++ b/src/vnet/adj/adj.c @@ -347,36 +347,19 @@ adj_mtu_update_walk_cb (adj_index_t ai, adj = adj_get(ai); - vnet_rewrite_update_mtu (vnet_get_main(), + vnet_rewrite_update_mtu (vnet_get_main(), adj->ia_link, &adj->rewrite_header); return (ADJ_WALK_RC_CONTINUE); } -static walk_rc_t -adj_sw_mtu_update (vnet_main_t * vnm, - u32 sw_if_index, - void *ctx) +static void +adj_mtu_update (vnet_main_t * vnm, u32 sw_if_index, u32 flags) { - /* - * Walk all the adjacencies on the interface to update the cached MTU - */ - adj_walk (sw_if_index, adj_mtu_update_walk_cb, NULL); - - return (WALK_CONTINUE); + adj_walk (sw_if_index, adj_mtu_update_walk_cb, NULL); } -void -adj_mtu_update (u32 hw_if_index) -{ - /* - * Walk all the SW interfaces on the HW interface to update the cached MTU - */ - vnet_hw_interface_walk_sw(vnet_get_main(), - hw_if_index, - adj_sw_mtu_update, - NULL); -} +VNET_SW_INTERFACE_MTU_CHANGE_FUNCTION(adj_mtu_update); /** * @brief Walk the Adjacencies on a given interface diff --git a/src/vnet/adj/adj.h b/src/vnet/adj/adj.h index bcf6c041209..fe77d1634e0 100644 --- a/src/vnet/adj/adj.h +++ b/src/vnet/adj/adj.h @@ -344,12 +344,6 @@ extern const u8* adj_get_rewrite (adj_index_t ai); */ extern void adj_feature_update (u32 sw_if_index, u8 arc_index, u8 is_enable); -/** - * @brief Notify the adjacency subsystem that the MTU settings for - * an HW interface have changed - */ -extern void adj_mtu_update (u32 hw_if_index); - /** * @brief * The global adjacnecy pool. Exposed for fast/inline data-plane access diff --git a/src/vnet/adj/adj_glean.c b/src/vnet/adj/adj_glean.c index 74881d7f67c..92369116532 100644 --- a/src/vnet/adj/adj_glean.c +++ b/src/vnet/adj/adj_glean.c @@ -77,8 +77,8 @@ adj_glean_add_or_lock (fib_protocol_t proto, adj->rewrite_header.sw_if_index = sw_if_index; adj->rewrite_header.data_bytes = 0; adj->rewrite_header.max_l3_packet_bytes = - vnet_sw_interface_get_mtu(vnet_get_main(), sw_if_index, VLIB_TX); - + vnet_sw_interface_get_mtu(vnet_get_main(), sw_if_index, + vnet_link_to_mtu(linkt)); adj_lock(adj_get_index(adj)); vnet_update_adjacency_for_sw_interface(vnet_get_main(), diff --git a/src/vnet/adj/adj_mcast.c b/src/vnet/adj/adj_mcast.c index 593c1b66a8a..9fbad482600 100644 --- a/src/vnet/adj/adj_mcast.c +++ b/src/vnet/adj/adj_mcast.c @@ -69,7 +69,7 @@ adj_mcast_add_or_lock (fib_protocol_t proto, adj_mcasts[proto][sw_if_index] = adj_get_index(adj); adj_lock(adj_get_index(adj)); - vnet_rewrite_init(vnm, sw_if_index, + vnet_rewrite_init(vnm, sw_if_index, link_type, adj_get_mcast_node(proto), vnet_tx_node_index_for_sw_interface(vnm, sw_if_index), &adj->rewrite_header); diff --git a/src/vnet/adj/adj_nbr.c b/src/vnet/adj/adj_nbr.c index 6fd9b40efc3..3f66acbb5c5 100644 --- a/src/vnet/adj/adj_nbr.c +++ b/src/vnet/adj/adj_nbr.c @@ -230,7 +230,7 @@ adj_nbr_add_or_lock (fib_protocol_t nh_proto, adj_index = adj_get_index(adj); adj_lock(adj_index); - vnet_rewrite_init(vnm, sw_if_index, + vnet_rewrite_init(vnm, sw_if_index, link_type, adj_get_nd_node(nh_proto), vnet_tx_node_index_for_sw_interface(vnm, sw_if_index), &adj->rewrite_header); diff --git a/src/vnet/adj/rewrite.c b/src/vnet/adj/rewrite.c index f4b26a9d0dd..1a87793eb1c 100644 --- a/src/vnet/adj/rewrite.c +++ b/src/vnet/adj/rewrite.c @@ -103,19 +103,22 @@ vnet_tx_node_index_for_sw_interface (vnet_main_t * vnm, u32 sw_if_index) void vnet_rewrite_init (vnet_main_t * vnm, u32 sw_if_index, + vnet_link_t linkt, u32 this_node, u32 next_node, vnet_rewrite_header_t * rw) { rw->sw_if_index = sw_if_index; rw->next_index = vlib_node_add_next (vnm->vlib_main, this_node, next_node); rw->max_l3_packet_bytes = - vnet_sw_interface_get_mtu (vnm, sw_if_index, VLIB_TX); + vnet_sw_interface_get_mtu (vnm, sw_if_index, vnet_link_to_mtu (linkt)); } void -vnet_rewrite_update_mtu (vnet_main_t * vnm, vnet_rewrite_header_t * rw) +vnet_rewrite_update_mtu (vnet_main_t * vnm, vnet_link_t linkt, + vnet_rewrite_header_t * rw) { rw->max_l3_packet_bytes = - vnet_sw_interface_get_mtu (vnm, rw->sw_if_index, VLIB_TX); + vnet_sw_interface_get_mtu (vnm, rw->sw_if_index, + vnet_link_to_mtu (linkt)); } void @@ -133,7 +136,7 @@ vnet_rewrite_for_sw_interface (vnet_main_t * vnm, vnet_get_hw_interface_class (vnm, hw->hw_class_index); u8 *rewrite = NULL; - vnet_rewrite_init (vnm, sw_if_index, node_index, + vnet_rewrite_init (vnm, sw_if_index, link_type, node_index, vnet_tx_node_index_for_sw_interface (vnm, sw_if_index), rw); diff --git a/src/vnet/adj/rewrite.h b/src/vnet/adj/rewrite.h index 712f686f4ae..0d4b0b9fd28 100644 --- a/src/vnet/adj/rewrite.h +++ b/src/vnet/adj/rewrite.h @@ -314,11 +314,12 @@ u32 vnet_tx_node_index_for_sw_interface (struct vnet_main_t *vnm, void vnet_rewrite_init (struct vnet_main_t *vnm, u32 sw_if_index, + vnet_link_t linkt, u32 this_node, u32 next_node, vnet_rewrite_header_t * rw); void vnet_rewrite_update_mtu (struct vnet_main_t *vnm, - vnet_rewrite_header_t * rw); + vnet_link_t linkt, vnet_rewrite_header_t * rw); u8 *vnet_build_rewrite_for_sw_interface (struct vnet_main_t *vnm, u32 sw_if_index, -- cgit 1.2.3-korg