aboutsummaryrefslogtreecommitdiffstats
path: root/router/router/tap_inject_node.c
diff options
context:
space:
mode:
Diffstat (limited to 'router/router/tap_inject_node.c')
-rw-r--r--router/router/tap_inject_node.c46
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);