aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/vnet/buffer.h6
-rw-r--r--src/vnet/tcp/tcp.h3
-rw-r--r--src/vnet/tcp/tcp_output.c6
3 files changed, 12 insertions, 3 deletions
diff --git a/src/vnet/buffer.h b/src/vnet/buffer.h
index 812fe7478c0..324c903db73 100644
--- a/src/vnet/buffer.h
+++ b/src/vnet/buffer.h
@@ -327,7 +327,11 @@ typedef struct
struct
{
u32 connection_index;
- u32 seq_number;
+ union
+ {
+ u32 seq_number;
+ u32 next_node_opaque;
+ };
u32 seq_end;
u32 ack_number;
u16 hdr_offset; /**< offset relative to ip hdr */
diff --git a/src/vnet/tcp/tcp.h b/src/vnet/tcp/tcp.h
index 132ec13892d..bc1e3c0f813 100644
--- a/src/vnet/tcp/tcp.h
+++ b/src/vnet/tcp/tcp.h
@@ -323,7 +323,8 @@ typedef struct _tcp_connection
u32 tx_fifo_size; /**< Tx fifo size. Used to constrain cwnd */
u32 psh_seq; /**< Add psh header for seg that includes this */
- u32 out_next_index; /**< Can be used to control next node in output */
+ u32 next_node_index; /**< Can be used to control next node in output */
+ u32 next_node_opaque; /**< Opaque to pass to next node */
} tcp_connection_t;
/* *INDENT-OFF* */
diff --git a/src/vnet/tcp/tcp_output.c b/src/vnet/tcp/tcp_output.c
index abd674d94be..1adac95731f 100644
--- a/src/vnet/tcp/tcp_output.c
+++ b/src/vnet/tcp/tcp_output.c
@@ -2063,7 +2063,11 @@ tcp_output_handle_packet (tcp_connection_t * tc0, vlib_buffer_t * b0,
}
/* If next_index is not drop use it */
- *next0 = tc0->out_next_index ? tc0->out_next_index : *next0;
+ if (tc0->next_node_index)
+ {
+ *next0 = tc0->next_node_index;
+ vnet_buffer (b0)->tcp.next_node_opaque = tc0->next_node_opaque;
+ }
vnet_buffer (b0)->sw_if_index[VLIB_TX] = tc0->c_fib_index;
vnet_buffer (b0)->sw_if_index[VLIB_RX] = 0;