FD.io VPP  v17.04-9-g99c0734
Vector Packet Processing
tcp.c File Reference
+ Include dependency graph for tcp.c:

Go to the source code of this file.

Macros

#define PORT_MASK   ((1 << 16)- 1)
 

Functions

static u32 tcp_connection_bind (u32 session_index, ip46_address_t *ip, u16 port_host_byte_order, u8 is_ip4)
 
u32 tcp_session_bind_ip4 (u32 session_index, ip46_address_t *ip, u16 port_host_byte_order)
 
u32 tcp_session_bind_ip6 (u32 session_index, ip46_address_t *ip, u16 port_host_byte_order)
 
static void tcp_connection_unbind (u32 listener_index)
 
u32 tcp_session_unbind (u32 listener_index)
 
transport_connection_ttcp_session_get_listener (u32 listener_index)
 
void tcp_connection_cleanup (tcp_connection_t *tc)
 Cleans up connection state. More...
 
void tcp_connection_del (tcp_connection_t *tc)
 Connection removal. More...
 
void tcp_connection_reset (tcp_connection_t *tc)
 Notify session that connection has been reset. More...
 
void tcp_connection_close (tcp_connection_t *tc)
 Begin connection closing procedure. More...
 
void tcp_session_close (u32 conn_index, u32 thread_index)
 
void tcp_session_cleanup (u32 conn_index, u32 thread_index)
 
void * ip_interface_get_first_ip (u32 sw_if_index, u8 is_ip4)
 
u16 tcp_allocate_local_port (tcp_main_t *tm, ip46_address_t *ip)
 Allocate local port and add if successful add entry to local endpoint table to mark the pair as used. More...
 
void tcp_connection_timers_init (tcp_connection_t *tc)
 Initialize all connection timers as invalid. More...
 
void tcp_connection_timers_reset (tcp_connection_t *tc)
 Stop all connection timers. More...
 
void tcp_connection_init_vars (tcp_connection_t *tc)
 Initialize tcp connection variables. More...
 
int tcp_connection_open (ip46_address_t *rmt_addr, u16 rmt_port, u8 is_ip4)
 
int tcp_session_open_ip4 (ip46_address_t *addr, u16 port)
 
int tcp_session_open_ip6 (ip46_address_t *addr, u16 port)
 
u8format_tcp_state (u8 *s, va_list *args)
 
u8format_tcp_timers (u8 *s, va_list *args)
 
u8format_tcp_connection (u8 *s, va_list *args)
 
u8format_tcp_connection_verbose (u8 *s, va_list *args)
 
u8format_tcp_session (u8 *s, va_list *args)
 
u8format_tcp_listener_session (u8 *s, va_list *args)
 
u8format_tcp_half_open_session (u8 *s, va_list *args)
 
transport_connection_ttcp_session_get_transport (u32 conn_index, u32 thread_index)
 
transport_connection_ttcp_half_open_session_get_transport (u32 conn_index)
 
u16 tcp_session_send_mss (transport_connection_t *trans_conn)
 
u32 tcp_session_send_space (transport_connection_t *trans_conn)
 
u32 tcp_session_tx_fifo_offset (transport_connection_t *trans_conn)
 
void tcp_timer_keep_handler (u32 conn_index)
 
void tcp_timer_establish_handler (u32 conn_index)
 
void tcp_timer_waitclose_handler (u32 conn_index)
 
static void tcp_expired_timers_dispatch (u32 *expired_timers)
 
void tcp_initialize_timer_wheels (tcp_main_t *tm)
 
clib_error_ttcp_main_enable (vlib_main_t *vm)
 
clib_error_tvnet_tcp_enable_disable (vlib_main_t *vm, u8 is_en)
 
clib_error_ttcp_init (vlib_main_t *vm)
 

Variables

tcp_main_t tcp_main
 
const char * tcp_dbg_evt_str []
 
const char * tcp_fsm_states []
 
const char * tcp_conn_timers []
 
static const transport_proto_vft_t tcp4_proto
 
static const transport_proto_vft_t tcp6_proto
 
static timer_expiration_handlertimer_expiration_handlers [TCP_N_TIMERS]
 

Macro Definition Documentation

#define PORT_MASK   ((1 << 16)- 1)

Definition at line 241 of file tcp.c.

Function Documentation

u8* format_tcp_connection ( u8 s,
va_list *  args 
)

Definition at line 482 of file tcp.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

u8* format_tcp_connection_verbose ( u8 s,
va_list *  args 
)

Definition at line 505 of file tcp.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

u8* format_tcp_half_open_session ( u8 s,
va_list *  args 
)

Definition at line 533 of file tcp.c.

+ Here is the call graph for this function:

u8* format_tcp_listener_session ( u8 s,
va_list *  args 
)

Definition at line 525 of file tcp.c.

+ Here is the call graph for this function:

u8* format_tcp_session ( u8 s,
va_list *  args 
)

Definition at line 514 of file tcp.c.

+ Here is the call graph for this function:

u8* format_tcp_state ( u8 s,
va_list *  args 
)

Definition at line 438 of file tcp.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

u8* format_tcp_timers ( u8 s,
va_list *  args 
)

Definition at line 457 of file tcp.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void* ip_interface_get_first_ip ( u32  sw_if_index,
u8  is_ip4 
)

Definition at line 213 of file tcp.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

u16 tcp_allocate_local_port ( tcp_main_t tm,
ip46_address_t *  ip 
)

Allocate local port and add if successful add entry to local endpoint table to mark the pair as used.

Definition at line 247 of file tcp.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static u32 tcp_connection_bind ( u32  session_index,
ip46_address_t *  ip,
u16  port_host_byte_order,
u8  is_ip4 
)
static

Definition at line 24 of file tcp.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void tcp_connection_cleanup ( tcp_connection_t tc)

Cleans up connection state.

No notifications.

Definition at line 99 of file tcp.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void tcp_connection_close ( tcp_connection_t tc)

Begin connection closing procedure.

If at the end the connection is not in CLOSED state, it is not removed. Instead, we rely on on TCP to advance through state machine to either 1) LAST_ACK (passive close) whereby when the last ACK is received tcp_connection_del is called. This notifies session of the delete and calls cleanup. 2) TIME_WAIT (active close) whereby after 2MSL the 2MSL timer triggers and cleanup is called.

N.B. Half-close connections are not supported

Definition at line 170 of file tcp.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void tcp_connection_del ( tcp_connection_t tc)

Connection removal.

This should be called only once connection enters CLOSED state. Note that it notifies the session of the removal event, so if the goal is to just remove the connection, call tcp_connection_cleanup instead.

Definition at line 135 of file tcp.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void tcp_connection_init_vars ( tcp_connection_t tc)

Initialize tcp connection variables.

Should be called after having received a msg from the peer, i.e., a SYN or a SYNACK, such that connection options have already been exchanged.

Definition at line 327 of file tcp.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

int tcp_connection_open ( ip46_address_t *  rmt_addr,
u16  rmt_port,
u8  is_ip4 
)

Definition at line 336 of file tcp.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void tcp_connection_reset ( tcp_connection_t tc)

Notify session that connection has been reset.

Switch state to closed and wait for session to call cleanup.

Definition at line 147 of file tcp.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void tcp_connection_timers_init ( tcp_connection_t tc)

Initialize all connection timers as invalid.

Definition at line 296 of file tcp.c.

+ Here is the caller graph for this function:

void tcp_connection_timers_reset ( tcp_connection_t tc)

Stop all connection timers.

Definition at line 313 of file tcp.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void tcp_connection_unbind ( u32  listener_index)
static

Definition at line 69 of file tcp.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void tcp_expired_timers_dispatch ( u32 expired_timers)
static

Definition at line 687 of file tcp.c.

+ Here is the caller graph for this function:

transport_connection_t* tcp_half_open_session_get_transport ( u32  conn_index)

Definition at line 548 of file tcp.c.

+ Here is the call graph for this function:

clib_error_t* tcp_init ( vlib_main_t vm)

Definition at line 798 of file tcp.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void tcp_initialize_timer_wheels ( tcp_main_t tm)

Definition at line 706 of file tcp.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

clib_error_t* tcp_main_enable ( vlib_main_t vm)

Definition at line 718 of file tcp.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

u32 tcp_session_bind_ip4 ( u32  session_index,
ip46_address_t *  ip,
u16  port_host_byte_order 
)

Definition at line 54 of file tcp.c.

+ Here is the call graph for this function:

u32 tcp_session_bind_ip6 ( u32  session_index,
ip46_address_t *  ip,
u16  port_host_byte_order 
)

Definition at line 61 of file tcp.c.

+ Here is the call graph for this function:

void tcp_session_cleanup ( u32  conn_index,
u32  thread_index 
)

Definition at line 202 of file tcp.c.

+ Here is the call graph for this function:

void tcp_session_close ( u32  conn_index,
u32  thread_index 
)

Definition at line 194 of file tcp.c.

+ Here is the call graph for this function:

transport_connection_t* tcp_session_get_listener ( u32  listener_index)

Definition at line 85 of file tcp.c.

+ Here is the call graph for this function:

transport_connection_t* tcp_session_get_transport ( u32  conn_index,
u32  thread_index 
)

Definition at line 541 of file tcp.c.

+ Here is the call graph for this function:

int tcp_session_open_ip4 ( ip46_address_t *  addr,
u16  port 
)

Definition at line 414 of file tcp.c.

+ Here is the call graph for this function:

int tcp_session_open_ip6 ( ip46_address_t *  addr,
u16  port 
)

Definition at line 420 of file tcp.c.

+ Here is the call graph for this function:

u16 tcp_session_send_mss ( transport_connection_t trans_conn)

Definition at line 555 of file tcp.c.

u32 tcp_session_send_space ( transport_connection_t trans_conn)

Definition at line 562 of file tcp.c.

+ Here is the call graph for this function:

u32 tcp_session_tx_fifo_offset ( transport_connection_t trans_conn)

Definition at line 569 of file tcp.c.

u32 tcp_session_unbind ( u32  listener_index)

Definition at line 78 of file tcp.c.

+ Here is the call graph for this function:

void tcp_timer_establish_handler ( u32  conn_index)

Definition at line 626 of file tcp.c.

+ Here is the call graph for this function:

void tcp_timer_keep_handler ( u32  conn_index)

Definition at line 614 of file tcp.c.

+ Here is the call graph for this function:

void tcp_timer_waitclose_handler ( u32  conn_index)

Definition at line 643 of file tcp.c.

+ Here is the call graph for this function:

clib_error_t* vnet_tcp_enable_disable ( vlib_main_t vm,
u8  is_en 
)

Definition at line 780 of file tcp.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

Variable Documentation

const transport_proto_vft_t tcp4_proto
static
Initial value:
= {
.unbind = tcp_session_unbind,
.push_header = tcp_push_header,
.get_connection = tcp_session_get_transport,
.get_listener = tcp_session_get_listener,
.cleanup = tcp_session_cleanup,
.send_mss = tcp_session_send_mss,
.send_space = tcp_session_send_space,
.tx_fifo_offset = tcp_session_tx_fifo_offset,
.format_connection = format_tcp_session,
.format_listener = format_tcp_listener_session,
.format_half_open = format_tcp_half_open_session,
}
u32 tcp_session_unbind(u32 listener_index)
Definition: tcp.c:78
transport_connection_t * tcp_half_open_session_get_transport(u32 conn_index)
Definition: tcp.c:548
u32 tcp_session_tx_fifo_offset(transport_connection_t *trans_conn)
Definition: tcp.c:569
u32 tcp_session_bind_ip4(u32 session_index, ip46_address_t *ip, u16 port_host_byte_order)
Definition: tcp.c:54
transport_connection_t * tcp_session_get_listener(u32 listener_index)
Definition: tcp.c:85
void tcp_session_cleanup(u32 conn_index, u32 thread_index)
Definition: tcp.c:202
u32 tcp_push_header(transport_connection_t *tconn, vlib_buffer_t *b)
Definition: tcp_output.c:1336
void tcp_session_close(u32 conn_index, u32 thread_index)
Definition: tcp.c:194
u8 * format_tcp_half_open_session(u8 *s, va_list *args)
Definition: tcp.c:533
u8 * format_tcp_session(u8 *s, va_list *args)
Definition: tcp.c:514
u16 tcp_session_send_mss(transport_connection_t *trans_conn)
Definition: tcp.c:555
int tcp_session_open_ip4(ip46_address_t *addr, u16 port)
Definition: tcp.c:414
u32 tcp_session_send_space(transport_connection_t *trans_conn)
Definition: tcp.c:562
transport_connection_t * tcp_session_get_transport(u32 conn_index, u32 thread_index)
Definition: tcp.c:541
u8 * format_tcp_listener_session(u8 *s, va_list *args)
Definition: tcp.c:525

Definition at line 576 of file tcp.c.

const transport_proto_vft_t tcp6_proto
static
Initial value:
= {
.unbind = tcp_session_unbind,
.push_header = tcp_push_header,
.get_connection = tcp_session_get_transport,
.get_listener = tcp_session_get_listener,
.cleanup = tcp_session_cleanup,
.send_mss = tcp_session_send_mss,
.send_space = tcp_session_send_space,
.tx_fifo_offset = tcp_session_tx_fifo_offset,
.format_connection = format_tcp_session,
.format_listener = format_tcp_listener_session,
.format_half_open = format_tcp_half_open_session,
}
u32 tcp_session_unbind(u32 listener_index)
Definition: tcp.c:78
transport_connection_t * tcp_half_open_session_get_transport(u32 conn_index)
Definition: tcp.c:548
u32 tcp_session_tx_fifo_offset(transport_connection_t *trans_conn)
Definition: tcp.c:569
transport_connection_t * tcp_session_get_listener(u32 listener_index)
Definition: tcp.c:85
void tcp_session_cleanup(u32 conn_index, u32 thread_index)
Definition: tcp.c:202
u32 tcp_push_header(transport_connection_t *tconn, vlib_buffer_t *b)
Definition: tcp_output.c:1336
void tcp_session_close(u32 conn_index, u32 thread_index)
Definition: tcp.c:194
u8 * format_tcp_half_open_session(u8 *s, va_list *args)
Definition: tcp.c:533
u8 * format_tcp_session(u8 *s, va_list *args)
Definition: tcp.c:514
int tcp_session_open_ip6(ip46_address_t *addr, u16 port)
Definition: tcp.c:420
u16 tcp_session_send_mss(transport_connection_t *trans_conn)
Definition: tcp.c:555
u32 tcp_session_send_space(transport_connection_t *trans_conn)
Definition: tcp.c:562
u32 tcp_session_bind_ip6(u32 session_index, ip46_address_t *ip, u16 port_host_byte_order)
Definition: tcp.c:61
transport_connection_t * tcp_session_get_transport(u32 conn_index, u32 thread_index)
Definition: tcp.c:541
u8 * format_tcp_listener_session(u8 *s, va_list *args)
Definition: tcp.c:525

Definition at line 594 of file tcp.c.

const char* tcp_conn_timers[]
Initial value:
= {
#define _(sym, str)
}
#define foreach_tcp_timer
TCP timers.
Definition: tcp.h:62

Definition at line 450 of file tcp.c.

const char* tcp_dbg_evt_str[]
Initial value:
= {
#define _(sym, str)
}

Definition at line 425 of file tcp.c.

const char* tcp_fsm_states[]
Initial value:
= {
#define _(sym, str)
}
#define foreach_tcp_fsm_state
TCP FSM state definitions as per RFC793.
Definition: tcp.h:38

Definition at line 431 of file tcp.c.

tcp_main_t tcp_main

Definition at line 21 of file tcp.c.

timer_expiration_handler* timer_expiration_handlers[TCP_N_TIMERS]
static
Initial value:
=
{
0,
}
void tcp_timer_keep_handler(u32 conn_index)
Definition: tcp.c:614
timer_expiration_handler tcp_timer_retransmit_handler
void tcp_timer_establish_handler(u32 conn_index)
Definition: tcp.c:626
timer_expiration_handler tcp_timer_retransmit_syn_handler
void tcp_timer_waitclose_handler(u32 conn_index)
Definition: tcp.c:643
timer_expiration_handler tcp_timer_delack_handler

Definition at line 674 of file tcp.c.