FreeBSD kernel IPv4 code
tcp_timer.c File Reference
#include <sys/cdefs.h>
#include "opt_inet.h"
#include "opt_inet6.h"
#include "opt_tcpdebug.h"
#include "opt_rss.h"
#include <sys/param.h>
#include <sys/kernel.h>
#include <sys/lock.h>
#include <sys/mbuf.h>
#include <sys/mutex.h>
#include <sys/protosw.h>
#include <sys/smp.h>
#include <sys/socket.h>
#include <sys/socketvar.h>
#include <sys/sysctl.h>
#include <sys/systm.h>
#include <net/if.h>
#include <net/route.h>
#include <net/rss_config.h>
#include <net/vnet.h>
#include <net/netisr.h>
#include <netinet/in.h>
#include <netinet/in_kdtrace.h>
#include <netinet/in_pcb.h>
#include <netinet/in_rss.h>
#include <netinet/in_systm.h>
#include <netinet/ip_var.h>
#include <netinet/tcp.h>
#include <netinet/tcp_fsm.h>
#include <netinet/tcp_log_buf.h>
#include <netinet/tcp_timer.h>
#include <netinet/tcp_var.h>
#include <netinet/tcp_seq.h>
#include <netinet/cc/cc.h>
#include <netinet/tcpip.h>
Include dependency graph for tcp_timer.c:

Go to the source code of this file.

Functions

 __FBSDID ("$FreeBSD$")
 
 SYSCTL_PROC (_net_inet_tcp, OID_AUTO, persmin, CTLTYPE_INT|CTLFLAG_RW|CTLFLAG_NEEDGIANT, &tcp_persmin, 0, sysctl_msec_to_ticks, "I", "minimum persistence interval")
 
 SYSCTL_PROC (_net_inet_tcp, OID_AUTO, persmax, CTLTYPE_INT|CTLFLAG_RW|CTLFLAG_NEEDGIANT, &tcp_persmax, 0, sysctl_msec_to_ticks, "I", "maximum persistence interval")
 
 SYSCTL_PROC (_net_inet_tcp, TCPCTL_KEEPINIT, keepinit, CTLTYPE_INT|CTLFLAG_RW|CTLFLAG_NEEDGIANT, &tcp_keepinit, 0, sysctl_msec_to_ticks, "I", "time to establish connection")
 
 SYSCTL_PROC (_net_inet_tcp, TCPCTL_KEEPIDLE, keepidle, CTLTYPE_INT|CTLFLAG_RW|CTLFLAG_NEEDGIANT, &tcp_keepidle, 0, sysctl_msec_to_ticks, "I", "time before keepalive probes begin")
 
 SYSCTL_PROC (_net_inet_tcp, TCPCTL_KEEPINTVL, keepintvl, CTLTYPE_INT|CTLFLAG_RW|CTLFLAG_NEEDGIANT, &tcp_keepintvl, 0, sysctl_msec_to_ticks, "I", "time between keepalive probes")
 
 SYSCTL_PROC (_net_inet_tcp, TCPCTL_DELACKTIME, delacktime, CTLTYPE_INT|CTLFLAG_RW|CTLFLAG_NEEDGIANT, &tcp_delacktime, 0, sysctl_msec_to_ticks, "I", "Time before a delayed ACK is sent")
 
 VNET_DEFINE (int, tcp_msl)
 
 SYSCTL_PROC (_net_inet_tcp, OID_AUTO, msl, CTLTYPE_INT|CTLFLAG_RW|CTLFLAG_VNET, &VNET_NAME(tcp_msl), 0, sysctl_msec_to_ticks, "I", "Maximum segment lifetime")
 
 SYSCTL_PROC (_net_inet_tcp, OID_AUTO, rexmit_initial, CTLTYPE_INT|CTLFLAG_RW|CTLFLAG_NEEDGIANT, &tcp_rexmit_initial, 0, sysctl_msec_to_ticks, "I", "Initial Retransmission Timeout")
 
 SYSCTL_PROC (_net_inet_tcp, OID_AUTO, rexmit_min, CTLTYPE_INT|CTLFLAG_RW|CTLFLAG_NEEDGIANT, &tcp_rexmit_min, 0, sysctl_msec_to_ticks, "I", "Minimum Retransmission Timeout")
 
 SYSCTL_PROC (_net_inet_tcp, OID_AUTO, rexmit_slop, CTLTYPE_INT|CTLFLAG_RW|CTLFLAG_NEEDGIANT, &tcp_rexmit_slop, 0, sysctl_msec_to_ticks, "I", "Retransmission Timer Slop")
 
 VNET_DEFINE (int, tcp_always_keepalive)
 
 SYSCTL_INT (_net_inet_tcp, OID_AUTO, always_keepalive, CTLFLAG_VNET|CTLFLAG_RW, &VNET_NAME(tcp_always_keepalive), 0, "Assume SO_KEEPALIVE on all TCP connections")
 
 SYSCTL_INT (_net_inet_tcp, OID_AUTO, fast_finwait2_recycle, CTLFLAG_RW, &tcp_fast_finwait2_recycle, 0, "Recycle closed FIN_WAIT_2 connections faster")
 
 SYSCTL_PROC (_net_inet_tcp, OID_AUTO, finwait2_timeout, CTLTYPE_INT|CTLFLAG_RW|CTLFLAG_NEEDGIANT, &tcp_finwait2_timeout, 0, sysctl_msec_to_ticks, "I", "FIN-WAIT2 timeout")
 
 SYSCTL_INT (_net_inet_tcp, OID_AUTO, keepcnt, CTLFLAG_RW, &tcp_keepcnt, 0, "Number of keepalive probes to send")
 
 SYSCTL_INT (_net_inet_tcp, OID_AUTO, rexmit_drop_options, CTLFLAG_RW, &tcp_rexmit_drop_options, 0, "Drop TCP options from 3rd and later retransmitted SYN")
 
 VNET_DEFINE (int, tcp_pmtud_blackhole_detect)
 
 SYSCTL_INT (_net_inet_tcp, OID_AUTO, pmtud_blackhole_detection, CTLFLAG_RW|CTLFLAG_VNET, &VNET_NAME(tcp_pmtud_blackhole_detect), 0, "Path MTU Discovery Black Hole Detection Enabled")
 
 SYSCTL_INT (_net_inet_tcp, OID_AUTO, per_cpu_timers, CTLFLAG_RW, &per_cpu_timers, 0, "run tcp timers on all cpus")
 
int inp_to_cpuid (struct inpcb *inp)
 
void tcp_slowtimo (void)
 
void tcp_timer_delack (void *xtp)
 
void tcp_inpinfo_lock_del (struct inpcb *inp, struct tcpcb *tp)
 
void tcp_timer_2msl (void *xtp)
 
void tcp_timer_keep (void *xtp)
 
void tcp_timer_persist (void *xtp)
 
void tcp_timer_rexmt (void *xtp)
 
void tcp_timer_activate (struct tcpcb *tp, uint32_t timer_type, u_int delta)
 
int tcp_timer_active (struct tcpcb *tp, uint32_t timer_type)
 
int tcp_timer_suspend (struct tcpcb *tp, uint32_t timer_type)
 
void tcp_timers_unsuspend (struct tcpcb *tp, uint32_t timer_type)
 
static void tcp_timer_discard (void *ptp)
 
void tcp_timer_stop (struct tcpcb *tp, uint32_t timer_type)
 

Variables

int tcp_persmin
 
int tcp_persmax
 
int tcp_keepinit
 
int tcp_keepidle
 
int tcp_keepintvl
 
int tcp_delacktime
 
int tcp_rexmit_initial
 
int tcp_rexmit_min
 
int tcp_rexmit_slop
 
int tcp_fast_finwait2_recycle = 0
 
int tcp_finwait2_timeout
 
int tcp_keepcnt = TCPTV_KEEPCNT
 
int tcp_maxpersistidle
 
int tcp_rexmit_drop_options = 0
 
static int per_cpu_timers = 0
 
int tcp_backoff [TCP_MAXRXTSHIFT+1]
 
int tcp_totbackoff = 2559
 

Function Documentation

◆ __FBSDID()

__FBSDID ( "$FreeBSD$"  )

◆ inp_to_cpuid()

int inp_to_cpuid ( struct inpcb inp)
inline

Definition at line 209 of file tcp_timer.c.

References inpcb::inp_flowid, inpcb::inp_flowtype, and per_cpu_timers.

Referenced by tcp_timer_activate().

Here is the caller graph for this function:

◆ SYSCTL_INT() [1/6]

SYSCTL_INT ( _net_inet_tcp  ,
OID_AUTO  ,
always_keepalive  ,
CTLFLAG_VNET|  CTLFLAG_RW,
VNET_NAMEtcp_always_keepalive,
,
"Assume SO_KEEPALIVE on all TCP connections"   
)

◆ SYSCTL_INT() [2/6]

SYSCTL_INT ( _net_inet_tcp  ,
OID_AUTO  ,
fast_finwait2_recycle  ,
CTLFLAG_RW  ,
tcp_fast_finwait2_recycle,
,
"Recycle closed FIN_WAIT_2 connections faster"   
)

◆ SYSCTL_INT() [3/6]

SYSCTL_INT ( _net_inet_tcp  ,
OID_AUTO  ,
keepcnt  ,
CTLFLAG_RW  ,
tcp_keepcnt,
,
"Number of keepalive probes to send"   
)

◆ SYSCTL_INT() [4/6]

SYSCTL_INT ( _net_inet_tcp  ,
OID_AUTO  ,
per_cpu_timers  ,
CTLFLAG_RW  ,
per_cpu_timers,
,
"run tcp timers on all cpus"   
)

◆ SYSCTL_INT() [5/6]

SYSCTL_INT ( _net_inet_tcp  ,
OID_AUTO  ,
pmtud_blackhole_detection  ,
CTLFLAG_RW|  CTLFLAG_VNET,
VNET_NAMEtcp_pmtud_blackhole_detect,
,
"Path MTU Discovery Black Hole Detection Enabled"   
)

◆ SYSCTL_INT() [6/6]

SYSCTL_INT ( _net_inet_tcp  ,
OID_AUTO  ,
rexmit_drop_options  ,
CTLFLAG_RW  ,
tcp_rexmit_drop_options,
,
"Drop TCP options from 3rd and later retransmitted SYN"   
)

◆ SYSCTL_PROC() [1/11]

SYSCTL_PROC ( _net_inet_tcp  ,
OID_AUTO  ,
finwait2_timeout  ,
CTLTYPE_INT|CTLFLAG_RW|  CTLFLAG_NEEDGIANT,
tcp_finwait2_timeout,
,
sysctl_msec_to_ticks  ,
"I"  ,
"FIN-WAIT2 timeout"   
)

◆ SYSCTL_PROC() [2/11]

SYSCTL_PROC ( _net_inet_tcp  ,
OID_AUTO  ,
msl  ,
CTLTYPE_INT|CTLFLAG_RW|  CTLFLAG_VNET,
VNET_NAMEtcp_msl,
,
sysctl_msec_to_ticks  ,
"I"  ,
"Maximum segment lifetime"   
)

◆ SYSCTL_PROC() [3/11]

SYSCTL_PROC ( _net_inet_tcp  ,
OID_AUTO  ,
persmax  ,
CTLTYPE_INT|CTLFLAG_RW|  CTLFLAG_NEEDGIANT,
tcp_persmax,
,
sysctl_msec_to_ticks  ,
"I"  ,
"maximum persistence interval"   
)

◆ SYSCTL_PROC() [4/11]

SYSCTL_PROC ( _net_inet_tcp  ,
OID_AUTO  ,
persmin  ,
CTLTYPE_INT|CTLFLAG_RW|  CTLFLAG_NEEDGIANT,
tcp_persmin,
,
sysctl_msec_to_ticks  ,
"I"  ,
"minimum persistence interval"   
)

◆ SYSCTL_PROC() [5/11]

SYSCTL_PROC ( _net_inet_tcp  ,
OID_AUTO  ,
rexmit_initial  ,
CTLTYPE_INT|CTLFLAG_RW|  CTLFLAG_NEEDGIANT,
tcp_rexmit_initial,
,
sysctl_msec_to_ticks  ,
"I"  ,
"Initial Retransmission Timeout"   
)

◆ SYSCTL_PROC() [6/11]

SYSCTL_PROC ( _net_inet_tcp  ,
OID_AUTO  ,
rexmit_min  ,
CTLTYPE_INT|CTLFLAG_RW|  CTLFLAG_NEEDGIANT,
tcp_rexmit_min,
,
sysctl_msec_to_ticks  ,
"I"  ,
"Minimum Retransmission Timeout"   
)

◆ SYSCTL_PROC() [7/11]

SYSCTL_PROC ( _net_inet_tcp  ,
OID_AUTO  ,
rexmit_slop  ,
CTLTYPE_INT|CTLFLAG_RW|  CTLFLAG_NEEDGIANT,
tcp_rexmit_slop,
,
sysctl_msec_to_ticks  ,
"I"  ,
"Retransmission Timer Slop"   
)

◆ SYSCTL_PROC() [8/11]

SYSCTL_PROC ( _net_inet_tcp  ,
TCPCTL_DELACKTIME  ,
delacktime  ,
CTLTYPE_INT|CTLFLAG_RW|  CTLFLAG_NEEDGIANT,
tcp_delacktime,
,
sysctl_msec_to_ticks  ,
"I"  ,
"Time before a delayed ACK is sent"   
)

◆ SYSCTL_PROC() [9/11]

SYSCTL_PROC ( _net_inet_tcp  ,
TCPCTL_KEEPIDLE  ,
keepidle  ,
CTLTYPE_INT|CTLFLAG_RW|  CTLFLAG_NEEDGIANT,
tcp_keepidle,
,
sysctl_msec_to_ticks  ,
"I"  ,
"time before keepalive probes begin"   
)

◆ SYSCTL_PROC() [10/11]

SYSCTL_PROC ( _net_inet_tcp  ,
TCPCTL_KEEPINIT  ,
keepinit  ,
CTLTYPE_INT|CTLFLAG_RW|  CTLFLAG_NEEDGIANT,
tcp_keepinit,
,
sysctl_msec_to_ticks  ,
"I"  ,
"time to establish connection"   
)

◆ SYSCTL_PROC() [11/11]

SYSCTL_PROC ( _net_inet_tcp  ,
TCPCTL_KEEPINTVL  ,
keepintvl  ,
CTLTYPE_INT|CTLFLAG_RW|  CTLFLAG_NEEDGIANT,
tcp_keepintvl,
,
sysctl_msec_to_ticks  ,
"I"  ,
"time between keepalive probes"   
)

◆ tcp_inpinfo_lock_del()

void tcp_inpinfo_lock_del ( struct inpcb inp,
struct tcpcb tp 
)

Definition at line 295 of file tcp_timer.c.

References INP_WUNLOCK.

Referenced by tcp_timer_2msl(), tcp_timer_keep(), tcp_timer_persist(), and tcp_timer_rexmt().

Here is the caller graph for this function:

◆ tcp_slowtimo()

void tcp_slowtimo ( void  )

Definition at line 241 of file tcp_timer.c.

References tcp_tw_2msl_scan().

Here is the call graph for this function:

◆ tcp_timer_2msl()

◆ tcp_timer_activate()

◆ tcp_timer_active()

◆ tcp_timer_delack()

void tcp_timer_delack ( void *  xtp)

Definition at line 264 of file tcp_timer.c.

References INP_DROPPED, inpcb::inp_flags, INP_WLOCK, INP_WUNLOCK, tcpcb::t_flags, tcpcb::t_inpcb, tcpcb::t_timers, tcpcb::t_vnet, TCPSTAT_INC, TF_ACKNOW, and tcp_timer::tt_delack.

Referenced by tcp_timer_activate().

Here is the caller graph for this function:

◆ tcp_timer_discard()

static void tcp_timer_discard ( void *  ptp)
static

Definition at line 1040 of file tcp_timer.c.

References INP_WLOCK, INP_WUNLOCK, tcpcb::t_inpcb, tcpcb::t_timers, tcpcb::t_vnet, tcp_freecb(), tcp_timer::tt_draincnt, tcp_timer::tt_flags, and TT_STOPPED.

Referenced by tcp_timer_stop().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ tcp_timer_keep()

◆ tcp_timer_persist()

◆ tcp_timer_rexmt()

void tcp_timer_rexmt ( void *  xtp)

Definition at line 575 of file tcp_timer.c.

References CC_ALGO, cc_cong_signal(), CC_RTO, tcpcb::ccv, IN_CONGRECOVERY, IN_FASTRECOVERY, in_losing(), INP_DROPPED, inpcb::inp_flags, INP_IPV6, inpcb::inp_socket, INP_TIMEWAIT, inpcb::inp_vflag, INP_WLOCK, INP_WUNLOCK, tcpcb::snd_cwnd, tcpcb::snd_cwnd_prev, tcpcb::snd_max, tcpcb::snd_nxt, tcpcb::snd_recover, tcpcb::snd_recover_prev, tcpcb::snd_ssthresh, tcpcb::snd_ssthresh_prev, tcpcb::snd_una, tcpcb::t_badrxtwin, tcpcb::t_blackhole_enter, tcpcb::t_blackhole_exit, tcpcb::t_fb, tcpcb::t_flags, tcpcb::t_flags2, tcpcb::t_inpcb, tcpcb::t_maxseg, tcpcb::t_pmtud_saved_maxseg, tcpcb::t_rttmin, tcpcb::t_rtttime, tcpcb::t_rxtcur, tcpcb::t_rxtshift, tcpcb::t_srtt, tcpcb::t_state, tcpcb::t_timers, tcpcb::t_vnet, TA_USER, tcp_backoff, tcp_drop(), tcp_free_sackholes(), tcp_inpinfo_lock_del(), TCP_LOG_EVENT, TCP_LOG_RTO, TCP_MAXRXTSHIFT, TCP_PROBE2, tcp_rexmit_drop_options, tcp_rexmit_initial, TCP_REXMTVAL, TCP_RTT_INVALIDATE, TCP_RTT_SHIFT, tcp_trace(), TCPS_ESTABLISHED, TCPS_FIN_WAIT_1, TCPS_SYN_RECEIVED, TCPS_SYN_SENT, TCPSTAT_INC, TCPT_RANGESET, TCPTV_REXMTMAX, TF2_PLPMTU_BLACKHOLE, TF2_PLPMTU_MAXSEGSNT, TF2_PLPMTU_PMTUD, TF_ACKNOW, TF_PREVVALID, TF_RCVD_TSTMP, TF_REQ_SCALE, TF_REQ_TSTMP, TF_SACK_PERMIT, TF_WASCRECOVERY, TF_WASFRECOVERY, tcp_function_block::tfb_tcp_rexmit_tmr, tcp_timer::tt_flags, tcp_timer::tt_rexmt, TT_STOPPED, V_tcp_mssdflt, V_tcp_pmtud_blackhole_detect, V_tcp_pmtud_blackhole_mss, and V_tcp_v6pmtud_blackhole_mss.

Referenced by tcp_timer_activate().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ tcp_timer_stop()

void tcp_timer_stop ( struct tcpcb tp,
uint32_t  timer_type 
)

◆ tcp_timer_suspend()

int tcp_timer_suspend ( struct tcpcb tp,
uint32_t  timer_type 
)

◆ tcp_timers_unsuspend()

◆ VNET_DEFINE() [1/3]

VNET_DEFINE ( int  ,
tcp_always_keepalive   
)

◆ VNET_DEFINE() [2/3]

VNET_DEFINE ( int  ,
tcp_msl   
)

◆ VNET_DEFINE() [3/3]

VNET_DEFINE ( int  ,
tcp_pmtud_blackhole_detect   
)

Variable Documentation

◆ per_cpu_timers

int per_cpu_timers = 0
static

Definition at line 197 of file tcp_timer.c.

Referenced by inp_to_cpuid().

◆ tcp_backoff

int tcp_backoff[TCP_MAXRXTSHIFT+1]
Initial value:
=
{ 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 512, 512, 512 }

Definition at line 254 of file tcp_timer.c.

Referenced by bbr_get_persists_timer_val(), bbr_timeout_rxt(), bbr_timer_start(), rack_get_persists_timer_val(), rack_timeout_rxt(), syncache_timeout(), tcp_setpersist(), and tcp_timer_rexmt().

◆ tcp_delacktime

int tcp_delacktime

◆ tcp_fast_finwait2_recycle

◆ tcp_finwait2_timeout

◆ tcp_keepcnt

int tcp_keepcnt = TCPTV_KEEPCNT

Definition at line 160 of file tcp_timer.c.

◆ tcp_keepidle

int tcp_keepidle

Definition at line 102 of file tcp_timer.c.

Referenced by tcp_init().

◆ tcp_keepinit

int tcp_keepinit

Definition at line 96 of file tcp_timer.c.

Referenced by tcp_init().

◆ tcp_keepintvl

int tcp_keepintvl

Definition at line 108 of file tcp_timer.c.

Referenced by tcp_init().

◆ tcp_maxpersistidle

int tcp_maxpersistidle

◆ tcp_persmax

int tcp_persmax

Definition at line 90 of file tcp_timer.c.

Referenced by tcp_init(), and tcp_setpersist().

◆ tcp_persmin

int tcp_persmin

Definition at line 84 of file tcp_timer.c.

Referenced by tcp_init(), and tcp_setpersist().

◆ tcp_rexmit_drop_options

int tcp_rexmit_drop_options = 0

Definition at line 167 of file tcp_timer.c.

Referenced by bbr_timeout_rxt(), rack_timeout_rxt(), and tcp_timer_rexmt().

◆ tcp_rexmit_initial

int tcp_rexmit_initial

Definition at line 126 of file tcp_timer.c.

Referenced by syncache_timeout(), tcp_init(), tcp_newtcpcb(), and tcp_timer_rexmt().

◆ tcp_rexmit_min

int tcp_rexmit_min

Definition at line 132 of file tcp_timer.c.

Referenced by syncache_timeout(), tcp_init(), and tcp_newtcpcb().

◆ tcp_rexmit_slop

int tcp_rexmit_slop

Definition at line 138 of file tcp_timer.c.

Referenced by rack_convert_rtts(), rack_init(), rack_log_rtt_sample(), and tcp_init().

◆ tcp_totbackoff

int tcp_totbackoff = 2559

Definition at line 257 of file tcp_timer.c.

Referenced by bbr_timeout_persist(), rack_timeout_persist(), and tcp_timer_persist().