X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fdevices%2Fpipe%2Fpipe.c;h=ec50f63d9b559929871804410c979248c4457f5c;hb=f16e9a550;hp=aea766a71fd3bce58c81dc733db4e418feab48a5;hpb=a1ff01e5c91cadc3d95060aa1ca4b9faa6fa2f49;p=vpp.git diff --git a/src/vnet/devices/pipe/pipe.c b/src/vnet/devices/pipe/pipe.c index aea766a71fd..ec50f63d9b5 100644 --- a/src/vnet/devices/pipe/pipe.c +++ b/src/vnet/devices/pipe/pipe.c @@ -21,7 +21,7 @@ * @file * @brief Pipe Interfaces. * - * A pipe interface, like the UNIX pipe, is a pair of interfaces + * A pipe interface, like the UNIX pipe, is a pair of vpp interfaces * that are joined. */ const static pipe_t PIPE_INVALID = { @@ -30,7 +30,7 @@ const static pipe_t PIPE_INVALID = { }; /** - * Various 'module' lavel variables + * Various 'module' level variables */ typedef struct pipe_main_t_ { @@ -40,7 +40,7 @@ typedef struct pipe_main_t_ uword *instances; /** - * the per-swif-index array of pipes. Each end of the pipe is stored againt + * the per-swif-index array of pipes. Each end of the pipe is stored against * its respective sw_if_index */ pipe_t *pipes; @@ -51,7 +51,7 @@ static pipe_main_t pipe_main; /* * The pipe rewrite is the same size as an ethernet header (since it * is an ethernet interface and the DP is optimised for writing - * sizeof(ethernet_header_t) rewirtes. Hwoever, there are no MAC addresses + * sizeof(ethernet_header_t) rewrites. However, there are no MAC addresses * since pipes don't have them. */ static u8 * @@ -131,16 +131,12 @@ pipe_tx (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) { u32 n_left_from, n_left_to_next, n_copy, *from, *to_next; u32 next_index = VNET_PIPE_TX_NEXT_ETHERNET_INPUT; - u32 i, sw_if_index = 0; - u32 n_pkts = 0, n_bytes = 0; - u32 thread_index = vm->thread_index; - vnet_main_t *vnm = vnet_get_main (); - vnet_interface_main_t *im = &vnm->interface_main; + u32 i, sw_if_index = 0, n_pkts = 0, n_bytes = 0; vlib_buffer_t *b; pipe_t *pipe; n_left_from = frame->n_vectors; - from = vlib_frame_args (frame); + from = vlib_frame_vector_args (frame); while (n_left_from > 0) { @@ -148,7 +144,7 @@ pipe_tx (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) n_copy = clib_min (n_left_from, n_left_to_next); - clib_memcpy (to_next, from, n_copy * sizeof (from[0])); + clib_memcpy_fast (to_next, from, n_copy * sizeof (from[0])); n_left_to_next -= n_copy; n_left_from -= n_copy; i = 0; @@ -169,15 +165,9 @@ pipe_tx (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) from += n_copy; vlib_put_next_frame (vm, node, next_index, n_left_to_next); - - /* increment TX interface stat */ - vlib_increment_combined_counter (im->combined_sw_if_counters + - VNET_INTERFACE_COUNTER_TX, - thread_index, sw_if_index, n_pkts, - n_bytes); } - return n_left_from; + return frame->n_vectors; } static u8 * @@ -359,38 +349,40 @@ pipe_rx (vlib_main_t * vm, pipe0 = &pipe_main.pipes[sw_if_index0]; pipe1 = &pipe_main.pipes[sw_if_index1]; + vnet_buffer (b0)->l2_hdr_offset = b0->current_data; + vnet_buffer (b1)->l2_hdr_offset = b1->current_data; + vnet_buffer (b0)->l3_hdr_offset = - vnet_buffer (b0)->l2_hdr_offset + vnet_buffer (b0)->l2.l2_len; + vnet_buffer (b0)->l2_hdr_offset + sizeof (ethernet_header_t); vnet_buffer (b1)->l3_hdr_offset = - vnet_buffer (b1)->l2_hdr_offset + vnet_buffer (b1)->l2.l2_len; - b0->flags |= VNET_BUFFER_F_L3_HDR_OFFSET_VALID; - b1->flags |= VNET_BUFFER_F_L3_HDR_OFFSET_VALID; + vnet_buffer (b1)->l2_hdr_offset + sizeof (ethernet_header_t); + b0->flags |= + VNET_BUFFER_F_L2_HDR_OFFSET_VALID | + VNET_BUFFER_F_L3_HDR_OFFSET_VALID; + b1->flags |= + VNET_BUFFER_F_L2_HDR_OFFSET_VALID | + VNET_BUFFER_F_L3_HDR_OFFSET_VALID; is_l20 = pipe0->subint.flags & SUBINT_CONFIG_L2; is_l21 = pipe1->subint.flags & SUBINT_CONFIG_L2; + + /* + * from discussion with Neale - we do not support the tagged traffic. + * So assume a simple ethernet header + */ + vnet_buffer (b0)->l2.l2_len = sizeof (ethernet_header_t); + vnet_buffer (b1)->l2.l2_len = sizeof (ethernet_header_t); + vlib_buffer_advance (b0, is_l20 ? 0 : sizeof (ethernet_header_t)); + vlib_buffer_advance (b1, is_l21 ? 0 : sizeof (ethernet_header_t)); + pipe_determine_next_node (ðernet_main, is_l20, type0, b0, &next0); pipe_determine_next_node (ðernet_main, is_l21, type1, b1, &next1); - if (!is_l20) - vlib_buffer_advance (b0, sizeof (ethernet_header_t)); - else - { - u32 eth_start = vnet_buffer (b0)->l2_hdr_offset; - vnet_buffer (b0)->l2.l2_len = b0->current_data - eth_start; - } - if (!is_l21) - vlib_buffer_advance (b1, sizeof (ethernet_header_t)); - else - { - u32 eth_start = vnet_buffer (b1)->l2_hdr_offset; - vnet_buffer (b1)->l2.l2_len = b1->current_data - eth_start; - } - vlib_validate_buffer_enqueue_x2 (vm, node, next_index, to_next, n_left_to_next, - bi0, bi1, next0, next0); + bi0, bi1, next0, next1); } while (n_left_from > 0 && n_left_to_next > 0) { @@ -416,22 +408,21 @@ pipe_rx (vlib_main_t * vm, type0 = clib_net_to_host_u16 (e0->type); pipe0 = &pipe_main.pipes[sw_if_index0]; + vnet_buffer (b0)->l2_hdr_offset = b0->current_data; vnet_buffer (b0)->l3_hdr_offset = - vnet_buffer (b0)->l2_hdr_offset + vnet_buffer (b0)->l2.l2_len; - b0->flags |= VNET_BUFFER_F_L3_HDR_OFFSET_VALID; + vnet_buffer (b0)->l2_hdr_offset + sizeof (ethernet_header_t); + b0->flags |= + VNET_BUFFER_F_L2_HDR_OFFSET_VALID | + VNET_BUFFER_F_L3_HDR_OFFSET_VALID; is_l20 = pipe0->subint.flags & SUBINT_CONFIG_L2; + + vnet_buffer (b0)->l2.l2_len = sizeof (ethernet_header_t); + vlib_buffer_advance (b0, is_l20 ? 0 : sizeof (ethernet_header_t)); + pipe_determine_next_node (ðernet_main, is_l20, type0, b0, &next0); - if (!is_l20) - vlib_buffer_advance (b0, sizeof (ethernet_header_t)); - else - { - u32 eth_start = vnet_buffer (b0)->l2_hdr_offset; - vnet_buffer (b0)->l2.l2_len = b0->current_data - eth_start; - } - vlib_validate_buffer_enqueue_x1 (vm, node, next_index, to_next, n_left_to_next, bi0, next0); @@ -526,7 +517,7 @@ pipe_create_sub_interface (vnet_hw_interface_t * hi, { vnet_sw_interface_t template; - memset (&template, 0, sizeof (template)); + clib_memset (&template, 0, sizeof (template)); template.type = VNET_SW_INTERFACE_TYPE_PIPE; template.flood_class = VNET_FLOOD_CLASS_NORMAL; template.sup_sw_if_index = hi->sw_if_index; @@ -556,7 +547,7 @@ vnet_create_pipe_interface (u8 is_specified, ASSERT (parent_sw_if_index); - memset (address, 0, sizeof (address)); + clib_memset (address, 0, sizeof (address)); /* * Allocate a pipe instance. Either select one dynamically