From: John Lo Date: Wed, 14 Dec 2016 20:42:45 +0000 (-0500) Subject: Expand ethernet-input node speed-path for non-L2 paths X-Git-Tag: v17.01-rc1~35 X-Git-Url: https://gerrit.fd.io/r/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F24%2F4324%2F2;p=vpp.git Expand ethernet-input node speed-path for non-L2 paths Improve ethernet-input speed path for untagged packets to also handle L3 and other forwarding paths. In the IP4 forwarding path for untagged IP4 packets, per packet clock count in ethernet-input node is reduced to ~14 clocks from ~43 clocks. Change-Id: I8e6f121820e056d6085dff3eb95d6913fc422f99 Signed-off-by: John Lo --- diff --git a/vnet/vnet/ethernet/node.c b/vnet/vnet/ethernet/node.c index 5a27fd0c750..c48e3f4237b 100755 --- a/vnet/vnet/ethernet/node.c +++ b/vnet/vnet/ethernet/node.c @@ -369,7 +369,7 @@ ethernet_input_inline (vlib_main_t * vm, e1 = vlib_buffer_get_current (b1); type1 = clib_net_to_host_u16 (e1->type); - /* Speed-path for the untagged L2 case */ + /* Speed-path for the untagged case */ if (PREDICT_TRUE (variant == ETHERNET_INPUT_VARIANT_ETHERNET && !ethernet_frame_is_tagged (type0) && !ethernet_frame_is_tagged (type1))) @@ -404,12 +404,21 @@ ethernet_input_inline (vlib_main_t * vm, vnet_buffer (b1)->l2.l2_len = sizeof (ethernet_header_t); vnet_buffer (b1)->ethernet.start_of_ethernet_header = b1->current_data; - goto ship_it01; } - /* FALLTHROUGH into the general case */ + else + { + determine_next_node (em, variant, 0, type0, b0, + &error0, &next0); + vlib_buffer_advance (b0, sizeof (ethernet_header_t)); + determine_next_node (em, variant, 0, type1, b1, + &error1, &next1); + vlib_buffer_advance (b1, sizeof (ethernet_header_t)); + } + goto ship_it01; } - slowpath: + /* Slow-path for the tagged case */ + slowpath: parse_header (variant, b0, &type0, @@ -578,7 +587,7 @@ ethernet_input_inline (vlib_main_t * vm, e0 = vlib_buffer_get_current (b0); type0 = clib_net_to_host_u16 (e0->type); - /* Speed-path for the untagged L2 case */ + /* Speed-path for the untagged case */ if (PREDICT_TRUE (variant == ETHERNET_INPUT_VARIANT_ETHERNET && !ethernet_frame_is_tagged (type0))) { @@ -603,11 +612,17 @@ ethernet_input_inline (vlib_main_t * vm, vnet_buffer (b0)->l2.l2_len = sizeof (ethernet_header_t); vnet_buffer (b0)->ethernet.start_of_ethernet_header = b0->current_data; - goto ship_it0; } - /* FALLTHROUGH into the general case */ + else + { + determine_next_node (em, variant, 0, type0, b0, + &error0, &next0); + vlib_buffer_advance (b0, sizeof (ethernet_header_t)); + } + goto ship_it0; } + /* Slow-path for the tagged case */ parse_header (variant, b0, &type0,