![]() |
FD.io VPP
v17.04-9-g99c0734
Vector Packet Processing
|
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 | 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 |
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... | |
| #define filter_flags (TCP_FLAG_SYN|TCP_FLAG_ACK|TCP_FLAG_RST|TCP_FLAG_FIN) |
Definition at line 2090 of file tcp_input.c.
| #define foreach_tcp4_input_next |
Definition at line 2053 of file tcp_input.c.
| #define foreach_tcp6_input_next |
Definition at line 2061 of file tcp_input.c.
| #define foreach_tcp_state_next |
Definition at line 29 of file tcp_input.c.
| #define tcp_error | ( | n, | |
| s | |||
| ) | s, |
| #define tcp_next_output | ( | is_ip4 | ) |
Definition at line 75 of file tcp_input.c.
| 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 |
| void delack_timers_init | ( | tcp_main_t * | tm, |
| u32 | thread_index | ||
| ) |
| sack_scoreboard_hole_t* scoreboard_insert_hole | ( | sack_scoreboard_t * | sb, |
| sack_scoreboard_hole_t * | prev, | ||
| u32 | start, | ||
| u32 | end | ||
| ) |
Definition at line 432 of file tcp_input.c.
Here is the call graph for this function:
Here is the caller graph for this function:| void scoreboard_remove_hole | ( | sack_scoreboard_t * | sb, |
| sack_scoreboard_hole_t * | hole | ||
| ) |
|
inlinestatic |
Definition at line 987 of file tcp_input.c.
Here is the call graph for this function:
Here is the caller graph for this function:
|
inlinestatic |
Definition at line 2093 of file tcp_input.c.
Here is the call graph for this function:
Here is the caller graph for this function:
|
inlinestatic |
LISTEN state processing as per RFC 793 p.
65
Definition at line 1840 of file tcp_input.c.
Here is the call graph for this function:
Here is the caller graph for this function:
|
inlinestatic |
Handles reception for all states except LISTEN, SYN-SENT and ESTABLISHED as per RFC793 p.
64
Definition at line 1484 of file tcp_input.c.
Here is the call graph for this function:
Here is the caller graph for this function:
|
inlinestatic |
Definition at line 1182 of file tcp_input.c.
Here is the call graph for this function:
Here is the caller graph for this function:
|
static |
Definition at line 1122 of file tcp_input.c.
Here is the call graph for this function:
Here is the caller graph for this function:
|
static |
|
static |
Definition at line 1984 of file tcp_input.c.
Here is the call graph for this function:
Here is the caller graph for this function:
|
static |
|
static |
Definition at line 1425 of file tcp_input.c.
Here is the call graph for this function:
Here is the caller graph for this function:
|
static |
|
static |
|
static |
|
static |
|
static |
|
inlinestatic |
Check if dupack as per RFC5681 Sec.
2
Definition at line 399 of file tcp_input.c.
Here is the caller graph for this function:
|
inlinestatic |
Check if ACK could be delayed.
DELACK timer is set only after frame is processed so this can return true for a full bursts of packets.
Definition at line 882 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_init | ( | tcp_connection_t * | tc | ) |
Definition at line 679 of file tcp_input.c.
Here is the call graph for this function:
Here is the caller graph for this function:
|
static |
Definition at line 610 of file tcp_input.c.
Here is the call graph for this function:
Here is the caller graph for this function:
|
static |
Definition at line 643 of file tcp_input.c.
Here is the call graph for this function:
Here is the caller graph for this function:
|
static |
Definition at line 595 of file tcp_input.c.
Here is the call graph for this function:
Here is the caller graph for this function:
|
static |
Dequeue bytes that have been acked and while at it update RTT estimates.
Definition at line 384 of file tcp_input.c.
Here is the call graph for this function:
Here is the caller graph for this function:
|
static |
|
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 318 of file tcp_input.c.
Here is the caller graph for this function:| clib_error_t* tcp_input_init | ( | vlib_main_t * | vm | ) |
| void tcp_options_parse | ( | tcp_header_t * | th, |
| tcp_options_t * | to | ||
| ) |
|
static |
Definition at line 686 of file tcp_input.c.
Here is the call graph for this function:
Here is the caller graph for this function:
|
inlinestatic |
|
static |
Definition at line 466 of file tcp_input.c.
Here is the call graph for this function:
Here is the caller graph for this function:
|
inlinestatic |
|
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 accepts only segments within the window.
Definition at line 101 of file tcp_input.c.
Here is the caller graph for this function:
|
static |
Definition at line 895 of file tcp_input.c.
Here is the call graph for this function:
Here is the caller graph for this function:
|
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.
Definition at line 222 of file tcp_input.c.
Here is the call graph for this function:
Here is the caller graph for this function:
|
inlinestatic |
Enqueue data for delivery to application.
Definition at line 799 of file tcp_input.c.
Here is the call graph for this function:
Here is the caller graph for this function:
|
inlinestatic |
Enqueue out-of-order data.
Definition at line 846 of file tcp_input.c.
Here is the call graph for this function:
Here is the caller graph for this function:
|
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.
return 1 if valid rtt 0 otherwise
Definition at line 348 of file tcp_input.c.
Here is the call graph for this function:
Here is the caller graph for this function:
|
static |
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.
| tc | TCP connection for which the SACK list is updated |
| start | Start sequence number of the newest SACK block |
| end | End sequence of the newest SACK block |
Definition at line 757 of file tcp_input.c.
Here is the caller graph for this function:
|
static |
Update snd_wnd.
If (SND.WL1 < SEG.SEQ or (SND.WL1 = SEG.SEQ and SND.WL2 =< SEG.ACK)), set SND.WND <- SEG.WND, set SND.WL1 <- SEG.SEQ, and set SND.WL2 <- SEG.ACK
Definition at line 578 of file tcp_input.c.
Here is the caller graph for this function:Definition at line 2265 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 | |||
| ) |
| vlib_node_registration_t tcp4_established_node |
(constructor) VLIB_REGISTER_NODE (tcp4_established_node)
Definition at line 78 of file tcp_input.c.
| vlib_node_registration_t tcp4_input_node |
(constructor) VLIB_REGISTER_NODE (tcp4_input_node)
Definition at line 2039 of file tcp_input.c.
| vlib_node_registration_t tcp4_listen_node |
(constructor) VLIB_REGISTER_NODE (tcp4_listen_node)
Definition at line 1833 of file tcp_input.c.
| vlib_node_registration_t tcp4_rcv_process_node |
(constructor) VLIB_REGISTER_NODE (tcp4_rcv_process_node)
Definition at line 1792 of file tcp_input.c.
| vlib_node_registration_t tcp4_syn_sent_node |
(constructor) VLIB_REGISTER_NODE (tcp4_syn_sent_node)
Definition at line 1178 of file tcp_input.c.
| vlib_node_registration_t tcp6_established_node |
(constructor) VLIB_REGISTER_NODE (tcp6_established_node)
Definition at line 79 of file tcp_input.c.
| vlib_node_registration_t tcp6_input_node |
(constructor) VLIB_REGISTER_NODE (tcp6_input_node)
Definition at line 2040 of file tcp_input.c.
| vlib_node_registration_t tcp6_listen_node |
(constructor) VLIB_REGISTER_NODE (tcp6_listen_node)
Definition at line 1834 of file tcp_input.c.
| vlib_node_registration_t tcp6_rcv_process_node |
(constructor) VLIB_REGISTER_NODE (tcp6_rcv_process_node)
Definition at line 1813 of file tcp_input.c.
| vlib_node_registration_t tcp6_syn_sent_node |
(constructor) VLIB_REGISTER_NODE (tcp6_syn_sent_node)
Definition at line 1179 of file tcp_input.c.
|
static |
Definition at line 22 of file tcp_input.c.