diff options
Diffstat (limited to 'router/router/tap_inject_node.c')
-rw-r--r-- | router/router/tap_inject_node.c | 46 |
1 files changed, 43 insertions, 3 deletions
diff --git a/router/router/tap_inject_node.c b/router/router/tap_inject_node.c index fe108dc..32c1ab1 100644 --- a/router/router/tap_inject_node.c +++ b/router/router/tap_inject_node.c @@ -28,6 +28,10 @@ enum { NEXT_NEIGHBOR_ICMP6, }; +/** + * @brief Dynamically added tap_inject DPO type + */ +dpo_type_t tap_inject_dpo_type; static inline void tap_inject_tap_send_buffer (int fd, vlib_buffer_t * b) @@ -233,7 +237,7 @@ tap_rx (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * f, int fd) b = vlib_get_buffer (vm, bi[0]); - vnet_buffer (b)->sw_if_index[VLIB_RX] = ~0; + vnet_buffer (b)->sw_if_index[VLIB_RX] = sw_if_index; vnet_buffer (b)->sw_if_index[VLIB_TX] = sw_if_index; n_bytes_left = n_bytes - VLIB_BUFFER_DATA_SIZE; @@ -260,8 +264,6 @@ tap_rx (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * f, int fd) _vec_len (im->rx_buffers) -= i; - vlib_buffer_chain_validate (vm, vlib_get_buffer (vm, bi[0])); - /* Get the packet to the output node. */ { vnet_hw_interface_t * hw; @@ -312,6 +314,42 @@ VLIB_REGISTER_NODE (tap_inject_rx_node) = { .vector_size = sizeof (u32), }; +/** + * @brief no-op lock function. + */ +static void +tap_inject_dpo_lock (dpo_id_t * dpo) +{ +} + +/** + * @brief no-op unlock function. + */ +static void +tap_inject_dpo_unlock (dpo_id_t * dpo) +{ +} + +u8 * +format_tap_inject_dpo (u8 * s, va_list * args) +{ + return (format (s, "tap-inject:[%d]", 0)); +} + +const static dpo_vft_t tap_inject_vft = { + .dv_lock = tap_inject_dpo_lock, + .dv_unlock = tap_inject_dpo_unlock, + .dv_format = format_tap_inject_dpo, +}; + +const static char *const tap_inject_tx_nodes[] = { + "tap-inject-tx", + NULL, +}; + +const static char *const *const tap_inject_nodes[DPO_PROTO_NUM] = { + [DPO_PROTO_IP6] = tap_inject_tx_nodes, +}; static clib_error_t * tap_inject_init (vlib_main_t * vm) @@ -322,6 +360,8 @@ tap_inject_init (vlib_main_t * vm) im->tx_node_index = tap_inject_tx_node.index; im->neighbor_node_index = tap_inject_neighbor_node.index; + tap_inject_dpo_type = dpo_register_new_type (&tap_inject_vft, tap_inject_nodes); + vec_alloc (im->rx_buffers, NUM_BUFFERS_TO_ALLOC); vec_reset_length (im->rx_buffers); |