FD.io VPP  v18.07.1-19-g511ce25
Vector Packet Processing
tcp_input.c File Reference
+ Include dependency graph for tcp_input.c:

Go to the source code of this file.

Data Structures

struct  tcp_rx_trace_t
 

Macros

#define tcp_error(n, s)   s,
 
#define foreach_tcp_state_next
 
#define tcp_next_output(is_ip4)
 
#define tcp_next_drop(is_ip4)
 
#define tcp_maybe_inc_counter(node_id, err, count)
 
#define tcp_inc_counter(node_id, err, count)
 
#define tcp_maybe_inc_err_counter(cnts, err)
 
#define tcp_inc_err_counter(cnts, err, val)
 
#define tcp_store_err_counters(node_id, cnts)
 
#define foreach_tcp4_input_next
 
#define foreach_tcp6_input_next
 
#define filter_flags   (TCP_FLAG_SYN|TCP_FLAG_ACK|TCP_FLAG_RST|TCP_FLAG_FIN)
 

Typedefs

typedef enum _tcp_established_next tcp_established_next_t
 
typedef enum _tcp_rcv_process_next tcp_rcv_process_next_t
 
typedef enum _tcp_syn_sent_next tcp_syn_sent_next_t
 
typedef enum _tcp_listen_next tcp_listen_next_t
 
typedef enum _tcp_state_next tcp_state_next_t
 
typedef enum _tcp_input_next tcp_input_next_t
 

Functions

static u8 tcp_segment_in_rcv_wnd (tcp_connection_t *tc, u32 seq, u32 end_seq)
 Validate segment sequence number. More...
 
static int tcp_options_parse (tcp_header_t *th, tcp_options_t *to)
 Parse TCP header options. More...
 
static int tcp_segment_check_paws (tcp_connection_t *tc)
 RFC1323: Check against wrapped sequence numbers (PAWS). More...
 
static void tcp_update_timestamp (tcp_connection_t *tc, u32 seq, u32 seq_end)
 Update tsval recent. More...
 
static int tcp_segment_validate (vlib_main_t *vm, tcp_connection_t *tc0, vlib_buffer_t *b0, tcp_header_t *th0, u32 *next0, u32 *error0)
 Validate incoming segment as per RFC793 p. More...
 
static int tcp_rcv_ack_is_acceptable (tcp_connection_t *tc0, vlib_buffer_t *tb0)
 
static void tcp_estimate_rtt (tcp_connection_t *tc, u32 mrtt)
 Compute smoothed RTT as per VJ's '88 SIGCOMM and RFC6298. More...
 
void tcp_update_rto (tcp_connection_t *tc)
 
static int tcp_update_rtt (tcp_connection_t *tc, u32 ack)
 Update RTT estimate and RTO timer. More...
 
static void tcp_dequeue_acked (tcp_connection_t *tc, u32 ack)
 Dequeue bytes that have been acked and while at it update RTT estimates. More...
 
static u8 tcp_ack_is_dupack (tcp_connection_t *tc, vlib_buffer_t *b, u32 prev_snd_wnd, u32 prev_snd_una)
 Check if duplicate ack as per RFC5681 Sec. More...
 
static u8 tcp_ack_is_cc_event (tcp_connection_t *tc, vlib_buffer_t *b, u32 prev_snd_wnd, u32 prev_snd_una, u8 *is_dack)
 Checks if ack is a congestion control event. More...
 
static u32 scoreboard_hole_index (sack_scoreboard_t *sb, sack_scoreboard_hole_t *hole)
 
static u32 scoreboard_hole_bytes (sack_scoreboard_hole_t *hole)
 
sack_scoreboard_hole_tscoreboard_get_hole (sack_scoreboard_t *sb, u32 index)
 
sack_scoreboard_hole_tscoreboard_next_hole (sack_scoreboard_t *sb, sack_scoreboard_hole_t *hole)
 
sack_scoreboard_hole_tscoreboard_prev_hole (sack_scoreboard_t *sb, sack_scoreboard_hole_t *hole)
 
sack_scoreboard_hole_tscoreboard_first_hole (sack_scoreboard_t *sb)
 
sack_scoreboard_hole_tscoreboard_last_hole (sack_scoreboard_t *sb)
 
static void scoreboard_remove_hole (sack_scoreboard_t *sb, sack_scoreboard_hole_t *hole)
 
static sack_scoreboard_hole_tscoreboard_insert_hole (sack_scoreboard_t *sb, u32 prev_index, u32 start, u32 end)
 
static void scoreboard_update_bytes (tcp_connection_t *tc, sack_scoreboard_t *sb)
 
sack_scoreboard_hole_tscoreboard_next_rxt_hole (sack_scoreboard_t *sb, sack_scoreboard_hole_t *start, u8 have_sent_1_smss, u8 *can_rescue, u8 *snd_limited)
 Figure out the next hole to retransmit. More...
 
static void scoreboard_init_high_rxt (sack_scoreboard_t *sb, u32 seq)
 
void scoreboard_init (sack_scoreboard_t *sb)
 
void scoreboard_clear (sack_scoreboard_t *sb)
 
static u8 tcp_scoreboard_is_sane_post_recovery (tcp_connection_t *tc)
 Test that scoreboard is sane after recovery. More...
 
void tcp_rcv_sacks (tcp_connection_t *tc, u32 ack)
 
static void tcp_update_snd_wnd (tcp_connection_t *tc, u32 seq, u32 ack, u32 snd_wnd)
 Try to update snd_wnd based on feedback received from peer. More...
 
void tcp_cc_init_congestion (tcp_connection_t *tc)
 Init loss recovery/fast recovery. More...
 
static void tcp_cc_recovery_exit (tcp_connection_t *tc)
 
void tcp_cc_fastrecovery_exit (tcp_connection_t *tc)
 
static void tcp_cc_congestion_undo (tcp_connection_t *tc)
 
static u8 tcp_cc_is_spurious_retransmit (tcp_connection_t *tc)
 
static int tcp_cc_recover (tcp_connection_t *tc)
 
static void tcp_cc_update (tcp_connection_t *tc, vlib_buffer_t *b)
 
static u8 tcp_should_fastrecover_sack (tcp_connection_t *tc)
 
static u8 tcp_should_fastrecover (tcp_connection_t *tc)
 
static void tcp_cc_handle_event (tcp_connection_t *tc, u32 is_dack)
 One function to rule them all ... More...
 
static int tcp_rcv_ack (tcp_connection_t *tc, vlib_buffer_t *b, tcp_header_t *th, u32 *next, u32 *error)
 Process incoming ACK. More...
 
static u8 tcp_sack_vector_is_sane (sack_block_t *sacks)
 
void tcp_update_sack_list (tcp_connection_t *tc, u32 start, u32 end)
 Build SACK list as per RFC2018. More...
 
u32 tcp_sack_list_bytes (tcp_connection_t *tc)
 
static int tcp_session_enqueue_data (tcp_connection_t *tc, vlib_buffer_t *b, u16 data_len)
 Enqueue data for delivery to application. More...
 
static int tcp_session_enqueue_ooo (tcp_connection_t *tc, vlib_buffer_t *b, u16 data_len)
 Enqueue out-of-order data. More...
 
static int tcp_can_delack (tcp_connection_t *tc)
 Check if ACK could be delayed. More...
 
static int tcp_buffer_discard_bytes (vlib_buffer_t *b, u32 n_bytes_to_drop)
 
static int tcp_segment_rcv (tcp_connection_t *tc, vlib_buffer_t *b, u32 *next0)
 Receive buffer for connection and handle acks. More...
 
static u8format_tcp_rx_trace (u8 *s, va_list *args)
 
static u8format_tcp_rx_trace_short (u8 *s, va_list *args)
 
static void tcp_set_rx_trace_data (tcp_rx_trace_t *t0, tcp_connection_t *tc0, tcp_header_t *th0, vlib_buffer_t *b0, u8 is_ip4)
 
static void tcp_established_trace_frame (vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame, u8 is_ip4)
 
static void tcp_node_inc_counter_i (vlib_main_t *vm, u32 tcp4_node, u32 tcp6_node, u8 is_ip4, u32 evt, u32 val)
 
static uword tcp46_established_inline (vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame, int is_ip4)
 
static uword tcp4_established (vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame)
 
static uword tcp6_established (vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame)
 
 VLIB_NODE_FUNCTION_MULTIARCH (tcp4_established_node, tcp4_established)
 
 VLIB_NODE_FUNCTION_MULTIARCH (tcp6_established_node, tcp6_established)
 
static u8 tcp_lookup_is_valid (tcp_connection_t *tc, tcp_header_t *hdr)
 
static tcp_connection_ttcp_lookup_connection (u32 fib_index, vlib_buffer_t *b, u8 thread_index, u8 is_ip4)
 Lookup transport connection. More...
 
static uword tcp46_syn_sent_inline (vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame, int is_ip4)
 
static uword tcp4_syn_sent (vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame)
 
static uword tcp6_syn_sent_rcv (vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame)
 
 VLIB_NODE_FUNCTION_MULTIARCH (tcp4_syn_sent_node, tcp4_syn_sent)
 
 VLIB_NODE_FUNCTION_MULTIARCH (tcp6_syn_sent_node, tcp6_syn_sent_rcv)
 
static uword tcp46_rcv_process_inline (vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame, int is_ip4)
 Handles reception for all states except LISTEN, SYN-SENT and ESTABLISHED as per RFC793 p. More...
 
static uword tcp4_rcv_process (vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame)
 
static uword tcp6_rcv_process (vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame)
 
 VLIB_NODE_FUNCTION_MULTIARCH (tcp4_rcv_process_node, tcp4_rcv_process)
 
 VLIB_NODE_FUNCTION_MULTIARCH (tcp6_rcv_process_node, tcp6_rcv_process)
 
static uword tcp46_listen_inline (vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame, int is_ip4)
 LISTEN state processing as per RFC 793 p. More...
 
static uword tcp4_listen (vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame)
 
static uword tcp6_listen (vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame)
 
 VLIB_NODE_FUNCTION_MULTIARCH (tcp4_listen_node, tcp4_listen)
 
 VLIB_NODE_FUNCTION_MULTIARCH (tcp6_listen_node, tcp6_listen)
 
static void tcp_input_trace_frame (vlib_main_t *vm, vlib_node_runtime_t *node, vlib_buffer_t **bs, u32 n_bufs, u8 is_ip4)
 
static void tcp_input_set_error_next (tcp_main_t *tm, u16 *next, u32 *error, u8 is_ip4)
 
static tcp_connection_ttcp_input_lookup_buffer (vlib_buffer_t *b, u8 thread_index, u32 *error, u8 is_ip4)
 
static void tcp_input_dispatch_buffer (tcp_main_t *tm, tcp_connection_t *tc, vlib_buffer_t *b, u16 *next, u32 *error)
 
static uword tcp46_input_inline (vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame, int is_ip4)
 
static uword tcp4_input (vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame)
 
static uword tcp6_input (vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame)
 
 VLIB_NODE_FUNCTION_MULTIARCH (tcp4_input_node, tcp4_input)
 
 VLIB_NODE_FUNCTION_MULTIARCH (tcp6_input_node, tcp6_input)
 
static void tcp_dispatch_table_init (tcp_main_t *tm)
 
static clib_error_ttcp_input_init (vlib_main_t *vm)
 

Variables

static char * tcp_error_strings []
 
vlib_node_registration_t tcp4_established_node
 (constructor) VLIB_REGISTER_NODE (tcp4_established_node) More...
 
vlib_node_registration_t tcp6_established_node
 (constructor) VLIB_REGISTER_NODE (tcp6_established_node) More...
 
vlib_node_registration_t tcp4_syn_sent_node
 (constructor) VLIB_REGISTER_NODE (tcp4_syn_sent_node) More...
 
vlib_node_registration_t tcp6_syn_sent_node
 (constructor) VLIB_REGISTER_NODE (tcp6_syn_sent_node) More...
 
vlib_node_registration_t tcp4_rcv_process_node
 (constructor) VLIB_REGISTER_NODE (tcp4_rcv_process_node) More...
 
vlib_node_registration_t tcp6_rcv_process_node
 (constructor) VLIB_REGISTER_NODE (tcp6_rcv_process_node) More...
 
vlib_node_registration_t tcp4_listen_node
 (constructor) VLIB_REGISTER_NODE (tcp4_listen_node) More...
 
vlib_node_registration_t tcp6_listen_node
 (constructor) VLIB_REGISTER_NODE (tcp6_listen_node) More...
 
vlib_node_registration_t tcp4_input_node
 (constructor) VLIB_REGISTER_NODE (tcp4_input_node) More...
 
vlib_node_registration_t tcp6_input_node
 (constructor) VLIB_REGISTER_NODE (tcp6_input_node) More...
 

Macro Definition Documentation

#define filter_flags   (TCP_FLAG_SYN|TCP_FLAG_ACK|TCP_FLAG_RST|TCP_FLAG_FIN)

Definition at line 3112 of file tcp_input.c.

#define foreach_tcp4_input_next
Value:
_ (DROP, "ip4-drop") \
_ (LISTEN, "tcp4-listen") \
_ (RCV_PROCESS, "tcp4-rcv-process") \
_ (SYN_SENT, "tcp4-syn-sent") \
_ (ESTABLISHED, "tcp4-established") \
_ (RESET, "tcp4-reset") \
_ (PUNT, "ip4-punt")
DROP
Definition: error.def:41

Definition at line 3094 of file tcp_input.c.

#define foreach_tcp6_input_next
Value:
_ (DROP, "ip6-drop") \
_ (LISTEN, "tcp6-listen") \
_ (RCV_PROCESS, "tcp6-rcv-process") \
_ (SYN_SENT, "tcp6-syn-sent") \
_ (ESTABLISHED, "tcp6-established") \
_ (RESET, "tcp6-reset") \
_ (PUNT, "ip6-punt")
DROP
Definition: error.def:41

Definition at line 3103 of file tcp_input.c.

#define foreach_tcp_state_next
Value:
_ (DROP4, "ip4-drop") \
_ (DROP6, "ip6-drop") \
_ (TCP4_OUTPUT, "tcp4-output") \
_ (TCP6_OUTPUT, "tcp6-output")

Definition at line 29 of file tcp_input.c.

#define tcp_error (   n,
 
)    s,
#define tcp_inc_counter (   node_id,
  err,
  count 
)
Value:
tcp_node_inc_counter_i (vm, tcp4_##node_id##_node.index, \
tcp6_##node_id##_node.index, is_ip4, \
err, count)
static void tcp_node_inc_counter_i(vlib_main_t *vm, u32 tcp4_node, u32 tcp6_node, u8 is_ip4, u32 evt, u32 val)
Definition: tcp_input.c:1807
vlib_main_t * vm
Definition: buffer.c:294
size_t count
Definition: vapi.c:46

Definition at line 1823 of file tcp_input.c.

#define tcp_inc_err_counter (   cnts,
  err,
  val 
)
Value:
{ \
cnts[err] += val; \
}

Definition at line 1831 of file tcp_input.c.

#define tcp_maybe_inc_counter (   node_id,
  err,
  count 
)
Value:
{ \
if (next0 != tcp_next_drop (is_ip4)) \
tcp_node_inc_counter_i (vm, tcp4_##node_id##_node.index, \
tcp6_##node_id##_node.index, is_ip4, err, \
1); \
}
#define tcp_next_drop(is_ip4)
Definition: tcp_input.c:79
static void tcp_node_inc_counter_i(vlib_main_t *vm, u32 tcp4_node, u32 tcp6_node, u8 is_ip4, u32 evt, u32 val)
Definition: tcp_input.c:1807
vlib_main_t * vm
Definition: buffer.c:294

Definition at line 1816 of file tcp_input.c.

#define tcp_maybe_inc_err_counter (   cnts,
  err 
)
Value:
{ \
cnts[err] += (next0 != tcp_next_drop (is_ip4)); \
}
#define tcp_next_drop(is_ip4)
Definition: tcp_input.c:79

Definition at line 1827 of file tcp_input.c.

#define tcp_next_drop (   is_ip4)
Value:
(is_ip4 ? TCP_NEXT_DROP4 \
: TCP_NEXT_DROP6)

Definition at line 79 of file tcp_input.c.

#define tcp_next_output (   is_ip4)
Value:
(is_ip4 ? TCP_NEXT_TCP4_OUTPUT \
: TCP_NEXT_TCP6_OUTPUT)

Definition at line 76 of file tcp_input.c.

#define tcp_store_err_counters (   node_id,
  cnts 
)
Value:
{ \
int i; \
for (i = 0; i < TCP_N_ERROR; i++) \
if (cnts[i]) \
tcp_inc_counter(node_id, i, cnts[i]); \
}
for(i=1;i<=collision_buckets;i++)
int i
#define tcp_inc_counter(node_id, err, count)
Definition: tcp_input.c:1823

Definition at line 1835 of file tcp_input.c.

Typedef Documentation

typedef enum _tcp_established_next tcp_established_next_t
typedef enum _tcp_input_next tcp_input_next_t
typedef enum _tcp_listen_next tcp_listen_next_t
typedef enum _tcp_rcv_process_next tcp_rcv_process_next_t
typedef enum _tcp_state_next tcp_state_next_t
typedef enum _tcp_syn_sent_next tcp_syn_sent_next_t

Function Documentation

static u8* format_tcp_rx_trace ( u8 s,
va_list *  args 
)
static

Definition at line 1727 of file tcp_input.c.

+ Here is the call graph for this function:

static u8* format_tcp_rx_trace_short ( u8 s,
va_list *  args 
)
static

Definition at line 1743 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void scoreboard_clear ( sack_scoreboard_t sb)

Definition at line 783 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

sack_scoreboard_hole_t* scoreboard_first_hole ( sack_scoreboard_t sb)

Definition at line 575 of file tcp_input.c.

+ Here is the caller graph for this function:

sack_scoreboard_hole_t* scoreboard_get_hole ( sack_scoreboard_t sb,
u32  index 
)

Definition at line 551 of file tcp_input.c.

+ Here is the caller graph for this function:

static u32 scoreboard_hole_bytes ( sack_scoreboard_hole_t hole)
static

Definition at line 545 of file tcp_input.c.

+ Here is the caller graph for this function:

static u32 scoreboard_hole_index ( sack_scoreboard_t sb,
sack_scoreboard_hole_t hole 
)
static

Definition at line 538 of file tcp_input.c.

+ Here is the caller graph for this function:

void scoreboard_init ( sack_scoreboard_t sb)

Definition at line 775 of file tcp_input.c.

+ Here is the caller graph for this function:

static void scoreboard_init_high_rxt ( sack_scoreboard_t sb,
u32  seq 
)
static

Definition at line 762 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static sack_scoreboard_hole_t* scoreboard_insert_hole ( sack_scoreboard_t sb,
u32  prev_index,
u32  start,
u32  end 
)
static

Definition at line 626 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

sack_scoreboard_hole_t* scoreboard_last_hole ( sack_scoreboard_t sb)

Definition at line 583 of file tcp_input.c.

+ Here is the caller graph for this function:

sack_scoreboard_hole_t* scoreboard_next_hole ( sack_scoreboard_t sb,
sack_scoreboard_hole_t hole 
)

Definition at line 559 of file tcp_input.c.

+ Here is the caller graph for this function:

sack_scoreboard_hole_t* scoreboard_next_rxt_hole ( sack_scoreboard_t sb,
sack_scoreboard_hole_t start,
u8  have_sent_1_smss,
u8 can_rescue,
u8 snd_limited 
)

Figure out the next hole to retransmit.

Follows logic proposed in RFC6675 Sec. 4, NextSeg()

Definition at line 707 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

sack_scoreboard_hole_t* scoreboard_prev_hole ( sack_scoreboard_t sb,
sack_scoreboard_hole_t hole 
)

Definition at line 567 of file tcp_input.c.

+ Here is the caller graph for this function:

static void scoreboard_remove_hole ( sack_scoreboard_t sb,
sack_scoreboard_hole_t hole 
)
static

Definition at line 591 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void scoreboard_update_bytes ( tcp_connection_t tc,
sack_scoreboard_t sb 
)
static

Definition at line 663 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static uword tcp46_established_inline ( vlib_main_t vm,
vlib_node_runtime_t node,
vlib_frame_t frame,
int  is_ip4 
)
inlinestatic

Definition at line 1845 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static uword tcp46_input_inline ( vlib_main_t vm,
vlib_node_runtime_t node,
vlib_frame_t frame,
int  is_ip4 
)
inlinestatic

Definition at line 3244 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static uword tcp46_listen_inline ( vlib_main_t vm,
vlib_node_runtime_t node,
vlib_frame_t from_frame,
int  is_ip4 
)
inlinestatic

LISTEN state processing as per RFC 793 p.

65

Definition at line 2859 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static uword tcp46_rcv_process_inline ( vlib_main_t vm,
vlib_node_runtime_t node,
vlib_frame_t from_frame,
int  is_ip4 
)
inlinestatic

Handles reception for all states except LISTEN, SYN-SENT and ESTABLISHED as per RFC793 p.

64

Definition at line 2440 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static uword tcp46_syn_sent_inline ( vlib_main_t vm,
vlib_node_runtime_t node,
vlib_frame_t from_frame,
int  is_ip4 
)
inlinestatic

Definition at line 2111 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static uword tcp4_established ( vlib_main_t vm,
vlib_node_runtime_t node,
vlib_frame_t from_frame 
)
static

Definition at line 1970 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static uword tcp4_input ( vlib_main_t vm,
vlib_node_runtime_t node,
vlib_frame_t from_frame 
)
static

Definition at line 3350 of file tcp_input.c.

+ Here is the call graph for this function:

static uword tcp4_listen ( vlib_main_t vm,
vlib_node_runtime_t node,
vlib_frame_t from_frame 
)
static

Definition at line 3022 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static uword tcp4_rcv_process ( vlib_main_t vm,
vlib_node_runtime_t node,
vlib_frame_t from_frame 
)
static

Definition at line 2795 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static uword tcp4_syn_sent ( vlib_main_t vm,
vlib_node_runtime_t node,
vlib_frame_t from_frame 
)
static

Definition at line 2375 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static uword tcp6_established ( vlib_main_t vm,
vlib_node_runtime_t node,
vlib_frame_t from_frame 
)
static

Definition at line 1977 of file tcp_input.c.

+ Here is the call graph for this function:

static uword tcp6_input ( vlib_main_t vm,
vlib_node_runtime_t node,
vlib_frame_t from_frame 
)
static

Definition at line 3357 of file tcp_input.c.

+ Here is the call graph for this function:

static uword tcp6_listen ( vlib_main_t vm,
vlib_node_runtime_t node,
vlib_frame_t from_frame 
)
static

Definition at line 3029 of file tcp_input.c.

+ Here is the call graph for this function:

static uword tcp6_rcv_process ( vlib_main_t vm,
vlib_node_runtime_t node,
vlib_frame_t from_frame 
)
static

Definition at line 2802 of file tcp_input.c.

+ Here is the call graph for this function:

static uword tcp6_syn_sent_rcv ( vlib_main_t vm,
vlib_node_runtime_t node,
vlib_frame_t from_frame 
)
static

Definition at line 2382 of file tcp_input.c.

+ Here is the call graph for this function:

static u8 tcp_ack_is_cc_event ( tcp_connection_t tc,
vlib_buffer_t b,
u32  prev_snd_wnd,
u32  prev_snd_una,
u8 is_dack 
)
static

Checks if ack is a congestion control event.

Definition at line 526 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static u8 tcp_ack_is_dupack ( tcp_connection_t tc,
vlib_buffer_t b,
u32  prev_snd_wnd,
u32  prev_snd_una 
)
static

Check if duplicate ack as per RFC5681 Sec.

2

Definition at line 513 of file tcp_input.c.

+ Here is the caller graph for this function:

static int tcp_buffer_discard_bytes ( vlib_buffer_t b,
u32  n_bytes_to_drop 
)
static

Definition at line 1619 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static int tcp_can_delack ( tcp_connection_t tc)
inlinestatic

Check if ACK could be delayed.

If ack can be delayed, it should return true for a full frame. If we're always acking return 0.

Definition at line 1603 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void tcp_cc_congestion_undo ( tcp_connection_t tc)
static

Definition at line 1063 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void tcp_cc_fastrecovery_exit ( tcp_connection_t tc)

Definition at line 1051 of file tcp_input.c.

+ Here is the caller graph for this function:

static void tcp_cc_handle_event ( tcp_connection_t tc,
u32  is_dack 
)
static

One function to rule them all ...

and in the darkness bind them

Definition at line 1145 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void tcp_cc_init_congestion ( tcp_connection_t tc)

Init loss recovery/fast recovery.

Triggered by dup acks as opposed to timer timeout. Note that cwnd is updated in tcp_cc_handle_event after fast retransmit

Definition at line 1030 of file tcp_input.c.

+ Here is the caller graph for this function:

static u8 tcp_cc_is_spurious_retransmit ( tcp_connection_t tc)
static

Definition at line 1077 of file tcp_input.c.

+ Here is the caller graph for this function:

static int tcp_cc_recover ( tcp_connection_t tc)
static

Definition at line 1086 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void tcp_cc_recovery_exit ( tcp_connection_t tc)
static

Definition at line 1040 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void tcp_cc_update ( tcp_connection_t tc,
vlib_buffer_t b 
)
static

Definition at line 1107 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void tcp_dequeue_acked ( tcp_connection_t tc,
u32  ack 
)
static

Dequeue bytes that have been acked and while at it update RTT estimates.

Definition at line 493 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void tcp_dispatch_table_init ( tcp_main_t tm)
static

Definition at line 3410 of file tcp_input.c.

+ Here is the caller graph for this function:

static void tcp_established_trace_frame ( vlib_main_t vm,
vlib_node_runtime_t node,
vlib_frame_t frame,
u8  is_ip4 
)
static

Definition at line 1773 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void tcp_estimate_rtt ( tcp_connection_t tc,
u32  mrtt 
)
static

Compute smoothed RTT as per VJ's '88 SIGCOMM and RFC6298.

Note that although the original article, srtt and rttvar are scaled to minimize round-off errors, here we don't. Instead, we rely on better precision time measurements.

TODO support us rtt resolution

Definition at line 408 of file tcp_input.c.

+ Here is the caller graph for this function:

static void tcp_input_dispatch_buffer ( tcp_main_t tm,
tcp_connection_t tc,
vlib_buffer_t b,
u16 next,
u32 error 
)
inlinestatic

Definition at line 3219 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static clib_error_t* tcp_input_init ( vlib_main_t vm)
static

Definition at line 3489 of file tcp_input.c.

+ Here is the call graph for this function:

static tcp_connection_t* tcp_input_lookup_buffer ( vlib_buffer_t b,
u8  thread_index,
u32 error,
u8  is_ip4 
)
inlinestatic

Definition at line 3156 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void tcp_input_set_error_next ( tcp_main_t tm,
u16 next,
u32 error,
u8  is_ip4 
)
static

Definition at line 3137 of file tcp_input.c.

+ Here is the caller graph for this function:

static void tcp_input_trace_frame ( vlib_main_t vm,
vlib_node_runtime_t node,
vlib_buffer_t **  bs,
u32  n_bufs,
u8  is_ip4 
)
static

Definition at line 3115 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static tcp_connection_t* tcp_lookup_connection ( u32  fib_index,
vlib_buffer_t b,
u8  thread_index,
u8  is_ip4 
)
static

Lookup transport connection.

Definition at line 2070 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static u8 tcp_lookup_is_valid ( tcp_connection_t tc,
tcp_header_t hdr 
)
static

Definition at line 2032 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void tcp_node_inc_counter_i ( vlib_main_t vm,
u32  tcp4_node,
u32  tcp6_node,
u8  is_ip4,
u32  evt,
u32  val 
)
inlinestatic

Definition at line 1807 of file tcp_input.c.

+ Here is the call graph for this function:

static int tcp_options_parse ( tcp_header_t th,
tcp_options_t to 
)
static

Parse TCP header options.

Parameters
thTCP header
toTCP options data structure to be populated
Returns
-1 if parsing failed

Definition at line 127 of file tcp_input.c.

+ Here is the caller graph for this function:

static int tcp_rcv_ack ( tcp_connection_t tc,
vlib_buffer_t b,
tcp_header_t th,
u32 next,
u32 error 
)
static

Process incoming ACK.

Definition at line 1311 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static int tcp_rcv_ack_is_acceptable ( tcp_connection_t tc0,
vlib_buffer_t tb0 
)
inlinestatic

Definition at line 391 of file tcp_input.c.

+ Here is the caller graph for this function:

void tcp_rcv_sacks ( tcp_connection_t tc,
u32  ack 
)

Definition at line 817 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

u32 tcp_sack_list_bytes ( tcp_connection_t tc)

Definition at line 1484 of file tcp_input.c.

+ Here is the caller graph for this function:

static u8 tcp_sack_vector_is_sane ( sack_block_t sacks)
static

Definition at line 1407 of file tcp_input.c.

+ Here is the caller graph for this function:

static u8 tcp_scoreboard_is_sane_post_recovery ( tcp_connection_t tc)
static

Test that scoreboard is sane after recovery.

Returns 1 if scoreboard is empty or if first hole beyond snd_una.

Definition at line 809 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static int tcp_segment_check_paws ( tcp_connection_t tc)
inlinestatic

RFC1323: Check against wrapped sequence numbers (PAWS).

If we have timestamp to echo and it's less than tsval_recent, drop segment but still send an ACK in order to retain TCP's mechanism for detecting and recovering from half-open connections

Or at least that's what the theory says. It seems that this might not work very well with packet reordering and fast retransmit. XXX

Definition at line 236 of file tcp_input.c.

+ Here is the caller graph for this function:

static u8 tcp_segment_in_rcv_wnd ( tcp_connection_t tc,
u32  seq,
u32  end_seq 
)
inlinestatic

Validate segment sequence number.

As per RFC793:

Segment Receive Test Length Window


0 0 SEG.SEQ = RCV.NXT 0 >0 RCV.NXT =< SEG.SEQ < RCV.NXT+RCV.WND >0 0 not acceptable >0 >0 RCV.NXT =< SEG.SEQ < RCV.NXT+RCV.WND or RCV.NXT =< SEG.SEQ+SEG.LEN-1 < RCV.NXT+RCV.WND

This ultimately consists in checking if segment falls within the window. The one important difference compared to RFC793 is that we use rcv_las, or the rcv_nxt at last ack sent instead of rcv_nxt since that's the peer's reference when computing our receive window.

This: seq_leq (end_seq, tc->rcv_las + tc->rcv_wnd) && seq_geq (seq, tc->rcv_las) however, is too strict when we have retransmits. Instead we just check that the seq is not beyond the right edge and that the end of the segment is not less than the left edge.

N.B. rcv_nxt and rcv_wnd are both updated in this node if acks are sent, so use rcv_nxt in the right edge window test instead of rcv_las.

Definition at line 113 of file tcp_input.c.

+ Here is the caller graph for this function:

static int tcp_segment_rcv ( tcp_connection_t tc,
vlib_buffer_t b,
u32 next0 
)
static

Receive buffer for connection and handle acks.

It handles both in order or out-of-order data.

Definition at line 1652 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static int tcp_segment_validate ( vlib_main_t vm,
tcp_connection_t tc0,
vlib_buffer_t b0,
tcp_header_t th0,
u32 next0,
u32 error0 
)
static

Validate incoming segment as per RFC793 p.

69 and RFC1323 p. 19

It first verifies if segment has a wrapped sequence number (PAWS) and then does the processing associated to the first four steps (ignoring security and precedence): sequence number, rst bit and syn bit checks.

Returns
0 if segments passes validation.

Definition at line 274 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static int tcp_session_enqueue_data ( tcp_connection_t tc,
vlib_buffer_t b,
u16  data_len 
)
static

Enqueue data for delivery to application.

Definition at line 1494 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static int tcp_session_enqueue_ooo ( tcp_connection_t tc,
vlib_buffer_t b,
u16  data_len 
)
static

Enqueue out-of-order data.

Definition at line 1549 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void tcp_set_rx_trace_data ( tcp_rx_trace_t t0,
tcp_connection_t tc0,
tcp_header_t th0,
vlib_buffer_t b0,
u8  is_ip4 
)
static

Definition at line 1758 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static u8 tcp_should_fastrecover ( tcp_connection_t tc)
static

Definition at line 1135 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static u8 tcp_should_fastrecover_sack ( tcp_connection_t tc)
static

Definition at line 1129 of file tcp_input.c.

+ Here is the caller graph for this function:

void tcp_update_rto ( tcp_connection_t tc)

Definition at line 431 of file tcp_input.c.

+ Here is the caller graph for this function:

static int tcp_update_rtt ( tcp_connection_t tc,
u32  ack 
)
static

Update RTT estimate and RTO timer.

Measure RTT: We have two sources of RTT measurements: TSOPT and ACK timing. Middle boxes are known to fiddle with TCP options so we should give higher priority to ACK timing.

This should be called only if previously sent bytes have been acked.

return 1 if valid rtt 0 otherwise

Definition at line 449 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void tcp_update_sack_list ( tcp_connection_t tc,
u32  start,
u32  end 
)

Build SACK list as per RFC2018.

Makes sure the first block contains the segment that generated the current ACK and the following ones are the ones most recently reported in SACK blocks.

Parameters
tcTCP connection for which the SACK list is updated
startStart sequence number of the newest SACK block
endEnd sequence of the newest SACK block

Definition at line 1430 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void tcp_update_snd_wnd ( tcp_connection_t tc,
u32  seq,
u32  ack,
u32  snd_wnd 
)
static

Try to update snd_wnd based on feedback received from peer.

If successful, and new window is 'effectively' 0, activate persist timer.

Definition at line 992 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void tcp_update_timestamp ( tcp_connection_t tc,
u32  seq,
u32  seq_end 
)
inlinestatic

Update tsval recent.

Definition at line 246 of file tcp_input.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

VLIB_NODE_FUNCTION_MULTIARCH ( tcp4_established_node  ,
tcp4_established   
)

+ Here is the caller graph for this function:

VLIB_NODE_FUNCTION_MULTIARCH ( tcp6_established_node  ,
tcp6_established   
)
VLIB_NODE_FUNCTION_MULTIARCH ( tcp4_syn_sent_node  ,
tcp4_syn_sent   
)
VLIB_NODE_FUNCTION_MULTIARCH ( tcp6_syn_sent_node  ,
tcp6_syn_sent_rcv   
)
VLIB_NODE_FUNCTION_MULTIARCH ( tcp4_rcv_process_node  ,
tcp4_rcv_process   
)
VLIB_NODE_FUNCTION_MULTIARCH ( tcp6_rcv_process_node  ,
tcp6_rcv_process   
)
VLIB_NODE_FUNCTION_MULTIARCH ( tcp4_listen_node  ,
tcp4_listen   
)
VLIB_NODE_FUNCTION_MULTIARCH ( tcp6_listen_node  ,
tcp6_listen   
)
VLIB_NODE_FUNCTION_MULTIARCH ( tcp4_input_node  ,
tcp4_input   
)
VLIB_NODE_FUNCTION_MULTIARCH ( tcp6_input_node  ,
tcp6_input   
)

Variable Documentation

vlib_node_registration_t tcp4_established_node
Initial value:
=
{
.function = tcp4_established,
.name = "tcp4-established",
.vector_size = sizeof (u32),
.n_errors = TCP_N_ERROR,
.error_strings = tcp_error_strings,
.n_next_nodes = TCP_ESTABLISHED_N_NEXT,
.next_nodes =
{
#define _(s,n)
},
.format_trace = format_tcp_rx_trace_short,
}
static u8 * format_tcp_rx_trace_short(u8 *s, va_list *args)
Definition: tcp_input.c:1743
unsigned int u32
Definition: types.h:88
static uword tcp4_established(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame)
Definition: tcp_input.c:1970
#define foreach_tcp_state_next
Definition: tcp_input.c:29
static char * tcp_error_strings[]
Definition: tcp_input.c:22

(constructor) VLIB_REGISTER_NODE (tcp4_established_node)

Definition at line 82 of file tcp_input.c.

vlib_node_registration_t tcp4_input_node
Initial value:
=
{
.function = tcp4_input,
.name = "tcp4-input",
.vector_size = sizeof (u32),
.n_errors = TCP_N_ERROR,
.error_strings = tcp_error_strings,
.n_next_nodes = TCP_INPUT_N_NEXT,
.next_nodes =
{
#define _(s,n)
},
.format_buffer = format_tcp_header,
.format_trace = format_tcp_rx_trace,
}
static u8 * format_tcp_rx_trace(u8 *s, va_list *args)
Definition: tcp_input.c:1727
unsigned int u32
Definition: types.h:88
#define foreach_tcp4_input_next
Definition: tcp_input.c:3094
format_function_t format_tcp_header
Definition: format.h:107
static uword tcp4_input(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame)
Definition: tcp_input.c:3350
static char * tcp_error_strings[]
Definition: tcp_input.c:22

(constructor) VLIB_REGISTER_NODE (tcp4_input_node)

Definition at line 3079 of file tcp_input.c.

vlib_node_registration_t tcp4_listen_node
Initial value:
=
{
.function = tcp4_listen,
.name = "tcp4-listen",
.vector_size = sizeof (u32),
.n_errors = TCP_N_ERROR,
.error_strings = tcp_error_strings,
.n_next_nodes = TCP_LISTEN_N_NEXT,
.next_nodes =
{
#define _(s,n)
},
.format_trace = format_tcp_rx_trace_short,
}
static u8 * format_tcp_rx_trace_short(u8 *s, va_list *args)
Definition: tcp_input.c:1743
static uword tcp4_listen(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame)
Definition: tcp_input.c:3022
unsigned int u32
Definition: types.h:88
#define foreach_tcp_state_next
Definition: tcp_input.c:29
static char * tcp_error_strings[]
Definition: tcp_input.c:22

(constructor) VLIB_REGISTER_NODE (tcp4_listen_node)

Definition at line 2852 of file tcp_input.c.

vlib_node_registration_t tcp4_rcv_process_node
Initial value:
=
{
.function = tcp4_rcv_process,
.name = "tcp4-rcv-process",
.vector_size = sizeof (u32),
.n_errors = TCP_N_ERROR,
.error_strings = tcp_error_strings,
.n_next_nodes = TCP_RCV_PROCESS_N_NEXT,
.next_nodes =
{
#define _(s,n)
},
.format_trace = format_tcp_rx_trace_short,
}
static u8 * format_tcp_rx_trace_short(u8 *s, va_list *args)
Definition: tcp_input.c:1743
unsigned int u32
Definition: types.h:88
#define foreach_tcp_state_next
Definition: tcp_input.c:29
static uword tcp4_rcv_process(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame)
Definition: tcp_input.c:2795
static char * tcp_error_strings[]
Definition: tcp_input.c:22

(constructor) VLIB_REGISTER_NODE (tcp4_rcv_process_node)

Definition at line 2432 of file tcp_input.c.

vlib_node_registration_t tcp4_syn_sent_node
Initial value:
=
{
.function = tcp4_syn_sent,
.name = "tcp4-syn-sent",
.vector_size = sizeof (u32),
.n_errors = TCP_N_ERROR,
.error_strings = tcp_error_strings,
.n_next_nodes = TCP_SYN_SENT_N_NEXT,
.next_nodes =
{
#define _(s,n)
},
.format_trace = format_tcp_rx_trace_short,
}
static u8 * format_tcp_rx_trace_short(u8 *s, va_list *args)
Definition: tcp_input.c:1743
static uword tcp4_syn_sent(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame)
Definition: tcp_input.c:2375
unsigned int u32
Definition: types.h:88
#define foreach_tcp_state_next
Definition: tcp_input.c:29
static char * tcp_error_strings[]
Definition: tcp_input.c:22

(constructor) VLIB_REGISTER_NODE (tcp4_syn_sent_node)

Definition at line 2028 of file tcp_input.c.

vlib_node_registration_t tcp6_established_node
Initial value:
=
{
.function = tcp6_established,
.name = "tcp6-established",
.vector_size = sizeof (u32),
.n_errors = TCP_N_ERROR,
.error_strings = tcp_error_strings,
.n_next_nodes = TCP_ESTABLISHED_N_NEXT,
.next_nodes =
{
#define _(s,n)
},
.format_trace = format_tcp_rx_trace_short,
}
static u8 * format_tcp_rx_trace_short(u8 *s, va_list *args)
Definition: tcp_input.c:1743
unsigned int u32
Definition: types.h:88
static uword tcp6_established(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame)
Definition: tcp_input.c:1977
#define foreach_tcp_state_next
Definition: tcp_input.c:29
static char * tcp_error_strings[]
Definition: tcp_input.c:22

(constructor) VLIB_REGISTER_NODE (tcp6_established_node)

Definition at line 83 of file tcp_input.c.

vlib_node_registration_t tcp6_input_node
Initial value:
=
{
.function = tcp6_input,
.name = "tcp6-input",
.vector_size = sizeof (u32),
.n_errors = TCP_N_ERROR,
.error_strings = tcp_error_strings,
.n_next_nodes = TCP_INPUT_N_NEXT,
.next_nodes =
{
#define _(s,n)
},
.format_buffer = format_tcp_header,
.format_trace = format_tcp_rx_trace,
}
static uword tcp6_input(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame)
Definition: tcp_input.c:3357
static u8 * format_tcp_rx_trace(u8 *s, va_list *args)
Definition: tcp_input.c:1727
unsigned int u32
Definition: types.h:88
#define foreach_tcp6_input_next
Definition: tcp_input.c:3103
format_function_t format_tcp_header
Definition: format.h:107
static char * tcp_error_strings[]
Definition: tcp_input.c:22

(constructor) VLIB_REGISTER_NODE (tcp6_input_node)

Definition at line 3080 of file tcp_input.c.

vlib_node_registration_t tcp6_listen_node
Initial value:
=
{
.function = tcp6_listen,
.name = "tcp6-listen",
.vector_size = sizeof (u32),
.n_errors = TCP_N_ERROR,
.error_strings = tcp_error_strings,
.n_next_nodes = TCP_LISTEN_N_NEXT,
.next_nodes =
{
#define _(s,n)
},
.format_trace = format_tcp_rx_trace_short,
}
static u8 * format_tcp_rx_trace_short(u8 *s, va_list *args)
Definition: tcp_input.c:1743
static uword tcp6_listen(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame)
Definition: tcp_input.c:3029
unsigned int u32
Definition: types.h:88
#define foreach_tcp_state_next
Definition: tcp_input.c:29
static char * tcp_error_strings[]
Definition: tcp_input.c:22

(constructor) VLIB_REGISTER_NODE (tcp6_listen_node)

Definition at line 2853 of file tcp_input.c.

vlib_node_registration_t tcp6_rcv_process_node
Initial value:
=
{
.function = tcp6_rcv_process,
.name = "tcp6-rcv-process",
.vector_size = sizeof (u32),
.n_errors = TCP_N_ERROR,
.error_strings = tcp_error_strings,
.n_next_nodes = TCP_RCV_PROCESS_N_NEXT,
.next_nodes =
{
#define _(s,n)
},
.format_trace = format_tcp_rx_trace_short,
}
static u8 * format_tcp_rx_trace_short(u8 *s, va_list *args)
Definition: tcp_input.c:1743
static uword tcp6_rcv_process(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame)
Definition: tcp_input.c:2802
unsigned int u32
Definition: types.h:88
#define foreach_tcp_state_next
Definition: tcp_input.c:29
static char * tcp_error_strings[]
Definition: tcp_input.c:22

(constructor) VLIB_REGISTER_NODE (tcp6_rcv_process_node)

Definition at line 2433 of file tcp_input.c.

vlib_node_registration_t tcp6_syn_sent_node
Initial value:
=
{
.function = tcp6_syn_sent_rcv,
.name = "tcp6-syn-sent",
.vector_size = sizeof (u32),
.n_errors = TCP_N_ERROR,
.error_strings = tcp_error_strings,
.n_next_nodes = TCP_SYN_SENT_N_NEXT,
.next_nodes =
{
#define _(s,n)
},
.format_trace = format_tcp_rx_trace_short,
}
static u8 * format_tcp_rx_trace_short(u8 *s, va_list *args)
Definition: tcp_input.c:1743
unsigned int u32
Definition: types.h:88
static uword tcp6_syn_sent_rcv(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame)
Definition: tcp_input.c:2382
#define foreach_tcp_state_next
Definition: tcp_input.c:29
static char * tcp_error_strings[]
Definition: tcp_input.c:22

(constructor) VLIB_REGISTER_NODE (tcp6_syn_sent_node)

Definition at line 2029 of file tcp_input.c.

char* tcp_error_strings[]
static
Initial value:
= {
#define tcp_error(n,s)
}

Definition at line 22 of file tcp_input.c.