Expand ethernet-input node speed-path for non-L2 paths 24/4324/2
authorJohn Lo <loj@cisco.com>
Wed, 14 Dec 2016 20:42:45 +0000 (15:42 -0500)
committerDave Barach <openvpp@barachs.net>
Thu, 15 Dec 2016 14:29:10 +0000 (14:29 +0000)
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>
vnet/vnet/ethernet/node.c

index 5a27fd0..c48e3f4 100755 (executable)
@@ -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,