Two changes:
- Reintegrate the ANSI C function declaration change from tcp_timer.c rev 1.92 - Reorganize the tcpcb structure so that it has a single pointer to the "tcp_timer" structure which contains all of the tcp timer callouts. This change means that when the single tcp timer change is reintegrated, tcpcb will not change in size, and therefore the ABI between netstat and the kernel will not change. Neither of these changes should have any functional impact. Reviewed by: bmah, rrs Approved by: re (bmah)
This commit is contained in:
parent
e270652ba3
commit
e2f2059f68
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=172309
@ -214,8 +214,7 @@ static void tcp_isn_tick(void *);
|
||||
*/
|
||||
struct tcpcb_mem {
|
||||
struct tcpcb tcb;
|
||||
struct callout tcpcb_mem_rexmt, tcpcb_mem_persist, tcpcb_mem_keep;
|
||||
struct callout tcpcb_mem_2msl, tcpcb_mem_delack;
|
||||
struct tcp_timer tt;
|
||||
};
|
||||
|
||||
static uma_zone_t tcpcb_zone;
|
||||
@ -590,6 +589,7 @@ tcp_newtcpcb(struct inpcb *inp)
|
||||
if (tm == NULL)
|
||||
return (NULL);
|
||||
tp = &tm->tcb;
|
||||
tp->t_timers = &tm->tt;
|
||||
/* LIST_INIT(&tp->t_segq); */ /* XXX covered by M_ZERO */
|
||||
tp->t_maxseg = tp->t_maxopd =
|
||||
#ifdef INET6
|
||||
@ -598,11 +598,11 @@ tcp_newtcpcb(struct inpcb *inp)
|
||||
tcp_mssdflt;
|
||||
|
||||
/* Set up our timeouts. */
|
||||
callout_init(tp->tt_rexmt = &tm->tcpcb_mem_rexmt, CALLOUT_MPSAFE);
|
||||
callout_init(tp->tt_persist = &tm->tcpcb_mem_persist, CALLOUT_MPSAFE);
|
||||
callout_init(tp->tt_keep = &tm->tcpcb_mem_keep, CALLOUT_MPSAFE);
|
||||
callout_init(tp->tt_2msl = &tm->tcpcb_mem_2msl, CALLOUT_MPSAFE);
|
||||
callout_init(tp->tt_delack = &tm->tcpcb_mem_delack, CALLOUT_MPSAFE);
|
||||
callout_init(&tp->t_timers->tt_rexmt, CALLOUT_MPSAFE);
|
||||
callout_init(&tp->t_timers->tt_persist, CALLOUT_MPSAFE);
|
||||
callout_init(&tp->t_timers->tt_keep, CALLOUT_MPSAFE);
|
||||
callout_init(&tp->t_timers->tt_2msl, CALLOUT_MPSAFE);
|
||||
callout_init(&tp->t_timers->tt_delack, CALLOUT_MPSAFE);
|
||||
|
||||
if (tcp_do_rfc1323)
|
||||
tp->t_flags = (TF_REQ_SCALE|TF_REQ_TSTMP);
|
||||
@ -675,11 +675,11 @@ tcp_discardcb(struct tcpcb *tp)
|
||||
* Make sure that all of our timers are stopped before we
|
||||
* delete the PCB.
|
||||
*/
|
||||
callout_stop(tp->tt_rexmt);
|
||||
callout_stop(tp->tt_persist);
|
||||
callout_stop(tp->tt_keep);
|
||||
callout_stop(tp->tt_2msl);
|
||||
callout_stop(tp->tt_delack);
|
||||
callout_stop(&tp->t_timers->tt_rexmt);
|
||||
callout_stop(&tp->t_timers->tt_persist);
|
||||
callout_stop(&tp->t_timers->tt_keep);
|
||||
callout_stop(&tp->t_timers->tt_2msl);
|
||||
callout_stop(&tp->t_timers->tt_delack);
|
||||
|
||||
/*
|
||||
* If we got enough samples through the srtt filter,
|
||||
|
@ -119,7 +119,7 @@ int tcp_maxidle;
|
||||
* causes finite state machine actions if timers expire.
|
||||
*/
|
||||
void
|
||||
tcp_slowtimo()
|
||||
tcp_slowtimo(void)
|
||||
{
|
||||
|
||||
tcp_maxidle = tcp_keepcnt * tcp_keepintvl;
|
||||
@ -166,12 +166,12 @@ tcp_timer_delack(void *xtp)
|
||||
}
|
||||
INP_LOCK(inp);
|
||||
INP_INFO_RUNLOCK(&tcbinfo);
|
||||
if ((inp->inp_vflag & INP_DROPPED) || callout_pending(tp->tt_delack)
|
||||
|| !callout_active(tp->tt_delack)) {
|
||||
if ((inp->inp_vflag & INP_DROPPED) || callout_pending(&tp->t_timers->tt_delack)
|
||||
|| !callout_active(&tp->t_timers->tt_delack)) {
|
||||
INP_UNLOCK(inp);
|
||||
return;
|
||||
}
|
||||
callout_deactivate(tp->tt_delack);
|
||||
callout_deactivate(&tp->t_timers->tt_delack);
|
||||
|
||||
tp->t_flags |= TF_ACKNOW;
|
||||
tcpstat.tcps_delack++;
|
||||
@ -208,13 +208,13 @@ tcp_timer_2msl(void *xtp)
|
||||
}
|
||||
INP_LOCK(inp);
|
||||
tcp_free_sackholes(tp);
|
||||
if ((inp->inp_vflag & INP_DROPPED) || callout_pending(tp->tt_2msl) ||
|
||||
!callout_active(tp->tt_2msl)) {
|
||||
if ((inp->inp_vflag & INP_DROPPED) || callout_pending(&tp->t_timers->tt_2msl) ||
|
||||
!callout_active(&tp->t_timers->tt_2msl)) {
|
||||
INP_UNLOCK(tp->t_inpcb);
|
||||
INP_INFO_WUNLOCK(&tcbinfo);
|
||||
return;
|
||||
}
|
||||
callout_deactivate(tp->tt_2msl);
|
||||
callout_deactivate(&tp->t_timers->tt_2msl);
|
||||
/*
|
||||
* 2 MSL timeout in shutdown went off. If we're closed but
|
||||
* still waiting for peer to close and connection has been idle
|
||||
@ -233,7 +233,7 @@ tcp_timer_2msl(void *xtp)
|
||||
} else {
|
||||
if (tp->t_state != TCPS_TIME_WAIT &&
|
||||
(ticks - tp->t_rcvtime) <= tcp_maxidle)
|
||||
callout_reset(tp->tt_2msl, tcp_keepintvl,
|
||||
callout_reset(&tp->t_timers->tt_2msl, tcp_keepintvl,
|
||||
tcp_timer_2msl, tp);
|
||||
else
|
||||
tp = tcp_close(tp);
|
||||
@ -275,13 +275,13 @@ tcp_timer_keep(void *xtp)
|
||||
return;
|
||||
}
|
||||
INP_LOCK(inp);
|
||||
if ((inp->inp_vflag & INP_DROPPED) || callout_pending(tp->tt_keep)
|
||||
|| !callout_active(tp->tt_keep)) {
|
||||
if ((inp->inp_vflag & INP_DROPPED) || callout_pending(&tp->t_timers->tt_keep)
|
||||
|| !callout_active(&tp->t_timers->tt_keep)) {
|
||||
INP_UNLOCK(inp);
|
||||
INP_INFO_WUNLOCK(&tcbinfo);
|
||||
return;
|
||||
}
|
||||
callout_deactivate(tp->tt_keep);
|
||||
callout_deactivate(&tp->t_timers->tt_keep);
|
||||
/*
|
||||
* Keep-alive timer went off; send something
|
||||
* or drop connection if idle for too long.
|
||||
@ -313,9 +313,9 @@ tcp_timer_keep(void *xtp)
|
||||
tp->rcv_nxt, tp->snd_una - 1, 0);
|
||||
(void) m_free(dtom(t_template));
|
||||
}
|
||||
callout_reset(tp->tt_keep, tcp_keepintvl, tcp_timer_keep, tp);
|
||||
callout_reset(&tp->t_timers->tt_keep, tcp_keepintvl, tcp_timer_keep, tp);
|
||||
} else
|
||||
callout_reset(tp->tt_keep, tcp_keepidle, tcp_timer_keep, tp);
|
||||
callout_reset(&tp->t_timers->tt_keep, tcp_keepidle, tcp_timer_keep, tp);
|
||||
|
||||
#ifdef TCPDEBUG
|
||||
if (inp->inp_socket->so_options & SO_DEBUG)
|
||||
@ -365,13 +365,13 @@ tcp_timer_persist(void *xtp)
|
||||
return;
|
||||
}
|
||||
INP_LOCK(inp);
|
||||
if ((inp->inp_vflag & INP_DROPPED) || callout_pending(tp->tt_persist)
|
||||
|| !callout_active(tp->tt_persist)) {
|
||||
if ((inp->inp_vflag & INP_DROPPED) || callout_pending(&tp->t_timers->tt_persist)
|
||||
|| !callout_active(&tp->t_timers->tt_persist)) {
|
||||
INP_UNLOCK(inp);
|
||||
INP_INFO_WUNLOCK(&tcbinfo);
|
||||
return;
|
||||
}
|
||||
callout_deactivate(tp->tt_persist);
|
||||
callout_deactivate(&tp->t_timers->tt_persist);
|
||||
/*
|
||||
* Persistance timer into zero window.
|
||||
* Force a byte to be output, if possible.
|
||||
@ -434,13 +434,13 @@ tcp_timer_rexmt(void * xtp)
|
||||
return;
|
||||
}
|
||||
INP_LOCK(inp);
|
||||
if ((inp->inp_vflag & INP_DROPPED) || callout_pending(tp->tt_rexmt)
|
||||
|| !callout_active(tp->tt_rexmt)) {
|
||||
if ((inp->inp_vflag & INP_DROPPED) || callout_pending(&tp->t_timers->tt_rexmt)
|
||||
|| !callout_active(&tp->t_timers->tt_rexmt)) {
|
||||
INP_UNLOCK(inp);
|
||||
INP_INFO_WUNLOCK(&tcbinfo);
|
||||
return;
|
||||
}
|
||||
callout_deactivate(tp->tt_rexmt);
|
||||
callout_deactivate(&tp->t_timers->tt_rexmt);
|
||||
tcp_free_sackholes(tp);
|
||||
/*
|
||||
* Retransmission timer went off. Message has not
|
||||
@ -571,23 +571,23 @@ tcp_timer_activate(struct tcpcb *tp, int timer_type, u_int delta)
|
||||
|
||||
switch (timer_type) {
|
||||
case TT_DELACK:
|
||||
t_callout = tp->tt_delack;
|
||||
t_callout = &tp->t_timers->tt_delack;
|
||||
f_callout = tcp_timer_delack;
|
||||
break;
|
||||
case TT_REXMT:
|
||||
t_callout = tp->tt_rexmt;
|
||||
t_callout = &tp->t_timers->tt_rexmt;
|
||||
f_callout = tcp_timer_rexmt;
|
||||
break;
|
||||
case TT_PERSIST:
|
||||
t_callout = tp->tt_persist;
|
||||
t_callout = &tp->t_timers->tt_persist;
|
||||
f_callout = tcp_timer_persist;
|
||||
break;
|
||||
case TT_KEEP:
|
||||
t_callout = tp->tt_keep;
|
||||
t_callout = &tp->t_timers->tt_keep;
|
||||
f_callout = tcp_timer_keep;
|
||||
break;
|
||||
case TT_2MSL:
|
||||
t_callout = tp->tt_2msl;
|
||||
t_callout = &tp->t_timers->tt_2msl;
|
||||
f_callout = tcp_timer_2msl;
|
||||
break;
|
||||
default:
|
||||
@ -607,19 +607,19 @@ tcp_timer_active(struct tcpcb *tp, int timer_type)
|
||||
|
||||
switch (timer_type) {
|
||||
case TT_DELACK:
|
||||
t_callout = tp->tt_delack;
|
||||
t_callout = &tp->t_timers->tt_delack;
|
||||
break;
|
||||
case TT_REXMT:
|
||||
t_callout = tp->tt_rexmt;
|
||||
t_callout = &tp->t_timers->tt_rexmt;
|
||||
break;
|
||||
case TT_PERSIST:
|
||||
t_callout = tp->tt_persist;
|
||||
t_callout = &tp->t_timers->tt_persist;
|
||||
break;
|
||||
case TT_KEEP:
|
||||
t_callout = tp->tt_keep;
|
||||
t_callout = &tp->t_timers->tt_keep;
|
||||
break;
|
||||
case TT_2MSL:
|
||||
t_callout = tp->tt_2msl;
|
||||
t_callout = &tp->t_timers->tt_2msl;
|
||||
break;
|
||||
default:
|
||||
panic("bad timer_type");
|
||||
|
@ -141,6 +141,13 @@ static const char *tcptimers[] =
|
||||
|
||||
#ifdef _KERNEL
|
||||
|
||||
struct tcp_timer {
|
||||
struct callout tt_rexmt; /* retransmit timer */
|
||||
struct callout tt_persist; /* retransmit persistence */
|
||||
struct callout tt_keep; /* keepalive */
|
||||
struct callout tt_2msl; /* 2*msl TIME_WAIT timer */
|
||||
struct callout tt_delack; /* delayed ACK timer */
|
||||
};
|
||||
#define TT_DELACK 0x01
|
||||
#define TT_REXMT 0x02
|
||||
#define TT_PERSIST 0x04
|
||||
|
@ -1744,11 +1744,11 @@ db_print_tcpcb(struct tcpcb *tp, const char *name, int indent)
|
||||
|
||||
db_print_indent(indent);
|
||||
db_printf("tt_rexmt: %p tt_persist: %p tt_keep: %p\n",
|
||||
tp->tt_rexmt, tp->tt_persist, tp->tt_keep);
|
||||
&tp->t_timers->tt_rexmt, &tp->t_timers->tt_persist, &tp->t_timers->tt_keep);
|
||||
|
||||
db_print_indent(indent);
|
||||
db_printf("tt_2msl: %p tt_delack: %p t_inpcb: %p\n", tp->tt_2msl,
|
||||
tp->tt_delack, tp->t_inpcb);
|
||||
db_printf("tt_2msl: %p tt_delack: %p t_inpcb: %p\n", &tp->t_timers->tt_2msl,
|
||||
&tp->t_timers->tt_delack, tp->t_inpcb);
|
||||
|
||||
db_print_indent(indent);
|
||||
db_printf("t_state: %d (", tp->t_state);
|
||||
|
@ -96,11 +96,7 @@ struct tcpcb {
|
||||
int t_segqlen; /* segment reassembly queue length */
|
||||
int t_dupacks; /* consecutive dup acks recd */
|
||||
|
||||
struct callout *tt_rexmt; /* retransmit timer */
|
||||
struct callout *tt_persist; /* retransmit persistence */
|
||||
struct callout *tt_keep; /* keepalive */
|
||||
struct callout *tt_2msl; /* 2*msl TIME_WAIT timer */
|
||||
struct callout *tt_delack; /* delayed ACK timer */
|
||||
struct tcp_timer *t_timers; /* All the TCP timers in one struct */
|
||||
|
||||
struct inpcb *t_inpcb; /* back pointer to internet pcb */
|
||||
int t_state; /* state of this connection */
|
||||
|
Loading…
Reference in New Issue
Block a user