+ ethernet_header_t *e = (ethernet_header_t *) hb->data;
+
+ if (PREDICT_FALSE (vd->per_interface_next_index != ~0))
+ {
+ next_index = vd->per_interface_next_index;
+ known_next = 1;
+ }
+
+ if (PREDICT_FALSE
+ (vnet_device_input_have_features (vd->sw_if_index)))
+ {
+ vnet_feature_start_device_input_x1 (vd->sw_if_index,
+ &next_index, hb);
+ known_next = 1;
+ }
+
+ if (PREDICT_FALSE (known_next))
+ {
+ next[0] = next_index;
+ }
+ else
+ {
+ if (ethernet_frame_is_tagged (e->type))
+ next[0] = VNET_DEVICE_INPUT_NEXT_ETHERNET_INPUT;
+ else
+ {
+ if (rx_comp->flags & VMXNET3_RXCF_IP4)
+ {
+ next[0] = VNET_DEVICE_INPUT_NEXT_IP4_NCS_INPUT;
+ hb->flags |= VNET_BUFFER_F_IS_IP4;
+ vlib_buffer_advance (hb,
+ device_input_next_node_advance
+ [next[0]]);
+ }
+ else if (rx_comp->flags & VMXNET3_RXCF_IP6)
+ {
+ next[0] = VNET_DEVICE_INPUT_NEXT_IP6_INPUT;
+ hb->flags |= VNET_BUFFER_F_IS_IP6;
+ vlib_buffer_advance (hb,
+ device_input_next_node_advance
+ [next[0]]);
+ }
+ else
+ {
+ next[0] = VNET_DEVICE_INPUT_NEXT_ETHERNET_INPUT;
+ }
+ }
+ }
+