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 <loj@cisco.com>
This commit is contained in:
@ -369,7 +369,7 @@ ethernet_input_inline (vlib_main_t * vm,
|
|||||||
e1 = vlib_buffer_get_current (b1);
|
e1 = vlib_buffer_get_current (b1);
|
||||||
type1 = clib_net_to_host_u16 (e1->type);
|
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
|
if (PREDICT_TRUE (variant == ETHERNET_INPUT_VARIANT_ETHERNET
|
||||||
&& !ethernet_frame_is_tagged (type0)
|
&& !ethernet_frame_is_tagged (type0)
|
||||||
&& !ethernet_frame_is_tagged (type1)))
|
&& !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)->l2.l2_len = sizeof (ethernet_header_t);
|
||||||
vnet_buffer (b1)->ethernet.start_of_ethernet_header =
|
vnet_buffer (b1)->ethernet.start_of_ethernet_header =
|
||||||
b1->current_data;
|
b1->current_data;
|
||||||
|
}
|
||||||
|
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;
|
goto ship_it01;
|
||||||
}
|
}
|
||||||
/* FALLTHROUGH into the general case */
|
|
||||||
}
|
|
||||||
slowpath:
|
|
||||||
|
|
||||||
|
/* Slow-path for the tagged case */
|
||||||
|
slowpath:
|
||||||
parse_header (variant,
|
parse_header (variant,
|
||||||
b0,
|
b0,
|
||||||
&type0,
|
&type0,
|
||||||
@ -578,7 +587,7 @@ ethernet_input_inline (vlib_main_t * vm,
|
|||||||
e0 = vlib_buffer_get_current (b0);
|
e0 = vlib_buffer_get_current (b0);
|
||||||
type0 = clib_net_to_host_u16 (e0->type);
|
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
|
if (PREDICT_TRUE (variant == ETHERNET_INPUT_VARIANT_ETHERNET
|
||||||
&& !ethernet_frame_is_tagged (type0)))
|
&& !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)->l2.l2_len = sizeof (ethernet_header_t);
|
||||||
vnet_buffer (b0)->ethernet.start_of_ethernet_header =
|
vnet_buffer (b0)->ethernet.start_of_ethernet_header =
|
||||||
b0->current_data;
|
b0->current_data;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
determine_next_node (em, variant, 0, type0, b0,
|
||||||
|
&error0, &next0);
|
||||||
|
vlib_buffer_advance (b0, sizeof (ethernet_header_t));
|
||||||
|
}
|
||||||
goto ship_it0;
|
goto ship_it0;
|
||||||
}
|
}
|
||||||
/* FALLTHROUGH into the general case */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
/* Slow-path for the tagged case */
|
||||||
parse_header (variant,
|
parse_header (variant,
|
||||||
b0,
|
b0,
|
||||||
&type0,
|
&type0,
|
||||||
|
Reference in New Issue
Block a user