Prevent premature SACK block transmission during loss recovery
Under specific conditions, a window update can be sent with outdated SACK information. Some clients react to this by subsequently delaying loss recovery, making TCP perform very poorly. Reported by: chengc_netapp.com Reviewed by: rrs, jtl MFC after: 2 weeks Sponsored by: NetApp, Inc. Differential Revision: https://reviews.freebsd.org/D24237
This commit is contained in:
parent
2d39824195
commit
4d0770f172
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=367492
@ -1461,6 +1461,29 @@ tcp_autorcvbuf(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
|||||||
return (newsize);
|
return (newsize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
tcp_handle_wakeup(struct tcpcb *tp, struct socket *so)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Since tp might be gone if the session entered
|
||||||
|
* the TIME_WAIT state before coming here, we need
|
||||||
|
* to check if the socket is still connected.
|
||||||
|
*/
|
||||||
|
if ((so->so_state & SS_ISCONNECTED) == 0)
|
||||||
|
return;
|
||||||
|
INP_LOCK_ASSERT(tp->t_inpcb);
|
||||||
|
if (tp->t_flags & TF_WAKESOR) {
|
||||||
|
tp->t_flags &= ~TF_WAKESOR;
|
||||||
|
SOCKBUF_UNLOCK_ASSERT(&so->so_rcv);
|
||||||
|
sorwakeup(so);
|
||||||
|
}
|
||||||
|
if (tp->t_flags & TF_WAKESOW) {
|
||||||
|
tp->t_flags &= ~TF_WAKESOW;
|
||||||
|
SOCKBUF_UNLOCK_ASSERT(&so->so_snd);
|
||||||
|
sowwakeup(so);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
||||||
struct tcpcb *tp, int drop_hdrlen, int tlen, uint8_t iptos)
|
struct tcpcb *tp, int drop_hdrlen, int tlen, uint8_t iptos)
|
||||||
@ -1811,7 +1834,7 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
|||||||
else if (!tcp_timer_active(tp, TT_PERSIST))
|
else if (!tcp_timer_active(tp, TT_PERSIST))
|
||||||
tcp_timer_activate(tp, TT_REXMT,
|
tcp_timer_activate(tp, TT_REXMT,
|
||||||
tp->t_rxtcur);
|
tp->t_rxtcur);
|
||||||
sowwakeup(so);
|
tp->t_flags |= TF_WAKESOW;
|
||||||
if (sbavail(&so->so_snd))
|
if (sbavail(&so->so_snd))
|
||||||
(void) tp->t_fb->tfb_tcp_output(tp);
|
(void) tp->t_fb->tfb_tcp_output(tp);
|
||||||
goto check_delack;
|
goto check_delack;
|
||||||
@ -1876,8 +1899,8 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
|||||||
m_adj(m, drop_hdrlen); /* delayed header drop */
|
m_adj(m, drop_hdrlen); /* delayed header drop */
|
||||||
sbappendstream_locked(&so->so_rcv, m, 0);
|
sbappendstream_locked(&so->so_rcv, m, 0);
|
||||||
}
|
}
|
||||||
/* NB: sorwakeup_locked() does an implicit unlock. */
|
SOCKBUF_UNLOCK(&so->so_rcv);
|
||||||
sorwakeup_locked(so);
|
tp->t_flags |= TF_WAKESOR;
|
||||||
if (DELAY_ACK(tp, tlen)) {
|
if (DELAY_ACK(tp, tlen)) {
|
||||||
tp->t_flags |= TF_DELACK;
|
tp->t_flags |= TF_DELACK;
|
||||||
} else {
|
} else {
|
||||||
@ -2811,8 +2834,8 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
|||||||
tp->snd_wnd = 0;
|
tp->snd_wnd = 0;
|
||||||
ourfinisacked = 0;
|
ourfinisacked = 0;
|
||||||
}
|
}
|
||||||
/* NB: sowwakeup_locked() does an implicit unlock. */
|
SOCKBUF_UNLOCK(&so->so_snd);
|
||||||
sowwakeup_locked(so);
|
tp->t_flags |= TF_WAKESOW;
|
||||||
m_freem(mfree);
|
m_freem(mfree);
|
||||||
/* Detect una wraparound. */
|
/* Detect una wraparound. */
|
||||||
if (!IN_RECOVERY(tp->t_flags) &&
|
if (!IN_RECOVERY(tp->t_flags) &&
|
||||||
@ -3033,8 +3056,8 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
|||||||
m_freem(m);
|
m_freem(m);
|
||||||
else
|
else
|
||||||
sbappendstream_locked(&so->so_rcv, m, 0);
|
sbappendstream_locked(&so->so_rcv, m, 0);
|
||||||
/* NB: sorwakeup_locked() does an implicit unlock. */
|
SOCKBUF_UNLOCK(&so->so_rcv);
|
||||||
sorwakeup_locked(so);
|
tp->t_flags |= TF_WAKESOR;
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* XXX: Due to the header drop above "th" is
|
* XXX: Due to the header drop above "th" is
|
||||||
@ -3101,6 +3124,8 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
|||||||
if (thflags & TH_FIN) {
|
if (thflags & TH_FIN) {
|
||||||
if (TCPS_HAVERCVDFIN(tp->t_state) == 0) {
|
if (TCPS_HAVERCVDFIN(tp->t_state) == 0) {
|
||||||
socantrcvmore(so);
|
socantrcvmore(so);
|
||||||
|
/* The socket upcall is handled by socantrcvmore. */
|
||||||
|
tp->t_flags &= ~TF_WAKESOR;
|
||||||
/*
|
/*
|
||||||
* If connection is half-synchronized
|
* If connection is half-synchronized
|
||||||
* (ie NEEDSYN flag on) then delay ACK,
|
* (ie NEEDSYN flag on) then delay ACK,
|
||||||
@ -3164,6 +3189,7 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
|||||||
tp->t_flags &= ~TF_DELACK;
|
tp->t_flags &= ~TF_DELACK;
|
||||||
tcp_timer_activate(tp, TT_DELACK, tcp_delacktime);
|
tcp_timer_activate(tp, TT_DELACK, tcp_delacktime);
|
||||||
}
|
}
|
||||||
|
tcp_handle_wakeup(tp, so);
|
||||||
INP_WUNLOCK(tp->t_inpcb);
|
INP_WUNLOCK(tp->t_inpcb);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -3197,6 +3223,7 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
|||||||
TCP_PROBE3(debug__input, tp, th, m);
|
TCP_PROBE3(debug__input, tp, th, m);
|
||||||
tp->t_flags |= TF_ACKNOW;
|
tp->t_flags |= TF_ACKNOW;
|
||||||
(void) tp->t_fb->tfb_tcp_output(tp);
|
(void) tp->t_fb->tfb_tcp_output(tp);
|
||||||
|
tcp_handle_wakeup(tp, so);
|
||||||
INP_WUNLOCK(tp->t_inpcb);
|
INP_WUNLOCK(tp->t_inpcb);
|
||||||
m_freem(m);
|
m_freem(m);
|
||||||
return;
|
return;
|
||||||
@ -3204,6 +3231,7 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
|||||||
dropwithreset:
|
dropwithreset:
|
||||||
if (tp != NULL) {
|
if (tp != NULL) {
|
||||||
tcp_dropwithreset(m, th, tp, tlen, rstreason);
|
tcp_dropwithreset(m, th, tp, tlen, rstreason);
|
||||||
|
tcp_handle_wakeup(tp, so);
|
||||||
INP_WUNLOCK(tp->t_inpcb);
|
INP_WUNLOCK(tp->t_inpcb);
|
||||||
} else
|
} else
|
||||||
tcp_dropwithreset(m, th, NULL, tlen, rstreason);
|
tcp_dropwithreset(m, th, NULL, tlen, rstreason);
|
||||||
@ -3219,8 +3247,10 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
|||||||
&tcp_savetcp, 0);
|
&tcp_savetcp, 0);
|
||||||
#endif
|
#endif
|
||||||
TCP_PROBE3(debug__input, tp, th, m);
|
TCP_PROBE3(debug__input, tp, th, m);
|
||||||
if (tp != NULL)
|
if (tp != NULL) {
|
||||||
|
tcp_handle_wakeup(tp, so);
|
||||||
INP_WUNLOCK(tp->t_inpcb);
|
INP_WUNLOCK(tp->t_inpcb);
|
||||||
|
}
|
||||||
m_freem(m);
|
m_freem(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -959,7 +959,8 @@ tcp_reass(struct tcpcb *tp, struct tcphdr *th, tcp_seq *seq_start,
|
|||||||
} else {
|
} else {
|
||||||
sbappendstream_locked(&so->so_rcv, m, 0);
|
sbappendstream_locked(&so->so_rcv, m, 0);
|
||||||
}
|
}
|
||||||
sorwakeup_locked(so);
|
SOCKBUF_UNLOCK(&so->so_rcv);
|
||||||
|
tp->t_flags |= TF_WAKESOR;
|
||||||
return (flags);
|
return (flags);
|
||||||
}
|
}
|
||||||
if (tcp_new_limits) {
|
if (tcp_new_limits) {
|
||||||
@ -1107,6 +1108,7 @@ tcp_reass(struct tcpcb *tp, struct tcphdr *th, tcp_seq *seq_start,
|
|||||||
#ifdef TCP_REASS_LOGGING
|
#ifdef TCP_REASS_LOGGING
|
||||||
tcp_reass_log_dump(tp);
|
tcp_reass_log_dump(tp);
|
||||||
#endif
|
#endif
|
||||||
sorwakeup_locked(so);
|
SOCKBUF_UNLOCK(&so->so_rcv);
|
||||||
|
tp->t_flags |= TF_WAKESOR;
|
||||||
return (flags);
|
return (flags);
|
||||||
}
|
}
|
||||||
|
@ -7876,8 +7876,8 @@ bbr_process_ack(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
|||||||
acked_amount = min(acked, (int)sbavail(&so->so_snd));
|
acked_amount = min(acked, (int)sbavail(&so->so_snd));
|
||||||
tp->snd_wnd -= acked_amount;
|
tp->snd_wnd -= acked_amount;
|
||||||
mfree = sbcut_locked(&so->so_snd, acked_amount);
|
mfree = sbcut_locked(&so->so_snd, acked_amount);
|
||||||
/* NB: sowwakeup_locked() does an implicit unlock. */
|
SOCKBUF_UNLOCK(&so->so_snd);
|
||||||
sowwakeup_locked(so);
|
tp->t_flags |= TF_WAKESOW;
|
||||||
m_freem(mfree);
|
m_freem(mfree);
|
||||||
if (SEQ_GT(th->th_ack, tp->snd_una)) {
|
if (SEQ_GT(th->th_ack, tp->snd_una)) {
|
||||||
bbr_collapse_rtt(tp, bbr, TCP_REXMTVAL(tp));
|
bbr_collapse_rtt(tp, bbr, TCP_REXMTVAL(tp));
|
||||||
@ -8353,8 +8353,8 @@ bbr_process_data(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
|||||||
appended =
|
appended =
|
||||||
#endif
|
#endif
|
||||||
sbappendstream_locked(&so->so_rcv, m, 0);
|
sbappendstream_locked(&so->so_rcv, m, 0);
|
||||||
/* NB: sorwakeup_locked() does an implicit unlock. */
|
SOCKBUF_UNLOCK(&so->so_rcv);
|
||||||
sorwakeup_locked(so);
|
tp->t_flags |= TF_WAKESOR;
|
||||||
#ifdef NETFLIX_SB_LIMITS
|
#ifdef NETFLIX_SB_LIMITS
|
||||||
if (so->so_rcv.sb_shlim && appended != mcnt)
|
if (so->so_rcv.sb_shlim && appended != mcnt)
|
||||||
counter_fo_release(so->so_rcv.sb_shlim,
|
counter_fo_release(so->so_rcv.sb_shlim,
|
||||||
@ -8414,6 +8414,8 @@ bbr_process_data(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
|||||||
if (thflags & TH_FIN) {
|
if (thflags & TH_FIN) {
|
||||||
if (TCPS_HAVERCVDFIN(tp->t_state) == 0) {
|
if (TCPS_HAVERCVDFIN(tp->t_state) == 0) {
|
||||||
socantrcvmore(so);
|
socantrcvmore(so);
|
||||||
|
/* The socket upcall is handled by socantrcvmore. */
|
||||||
|
tp->t_flags &= ~TF_WAKESOR;
|
||||||
/*
|
/*
|
||||||
* If connection is half-synchronized (ie NEEDSYN
|
* If connection is half-synchronized (ie NEEDSYN
|
||||||
* flag on) then delay ACK, so it may be piggybacked
|
* flag on) then delay ACK, so it may be piggybacked
|
||||||
@ -8604,8 +8606,8 @@ bbr_do_fastnewdata(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
|||||||
sbappendstream_locked(&so->so_rcv, m, 0);
|
sbappendstream_locked(&so->so_rcv, m, 0);
|
||||||
ctf_calc_rwin(so, tp);
|
ctf_calc_rwin(so, tp);
|
||||||
}
|
}
|
||||||
/* NB: sorwakeup_locked() does an implicit unlock. */
|
SOCKBUF_UNLOCK(&so->so_rcv);
|
||||||
sorwakeup_locked(so);
|
tp->t_flags |= TF_WAKESOR;
|
||||||
#ifdef NETFLIX_SB_LIMITS
|
#ifdef NETFLIX_SB_LIMITS
|
||||||
if (so->so_rcv.sb_shlim && mcnt != appended)
|
if (so->so_rcv.sb_shlim && mcnt != appended)
|
||||||
counter_fo_release(so->so_rcv.sb_shlim, mcnt - appended);
|
counter_fo_release(so->so_rcv.sb_shlim, mcnt - appended);
|
||||||
@ -8796,7 +8798,7 @@ bbr_fastack(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
|||||||
&tcp_savetcp, 0);
|
&tcp_savetcp, 0);
|
||||||
#endif
|
#endif
|
||||||
/* Wake up the socket if we have room to write more */
|
/* Wake up the socket if we have room to write more */
|
||||||
sowwakeup(so);
|
tp->t_flags |= TF_WAKESOW;
|
||||||
if (tp->snd_una == tp->snd_max) {
|
if (tp->snd_una == tp->snd_max) {
|
||||||
/* Nothing left outstanding */
|
/* Nothing left outstanding */
|
||||||
bbr_log_progress_event(bbr, tp, ticks, PROGRESS_CLEAR, __LINE__);
|
bbr_log_progress_event(bbr, tp, ticks, PROGRESS_CLEAR, __LINE__);
|
||||||
@ -11740,9 +11742,11 @@ bbr_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
|||||||
}
|
}
|
||||||
retval = bbr_do_segment_nounlock(m, th, so, tp,
|
retval = bbr_do_segment_nounlock(m, th, so, tp,
|
||||||
drop_hdrlen, tlen, iptos, 0, &tv);
|
drop_hdrlen, tlen, iptos, 0, &tv);
|
||||||
if (retval == 0)
|
if (retval == 0) {
|
||||||
|
tcp_handle_wakeup(tp, so);
|
||||||
INP_WUNLOCK(tp->t_inpcb);
|
INP_WUNLOCK(tp->t_inpcb);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return how much data can be sent without violating the
|
* Return how much data can be sent without violating the
|
||||||
|
@ -8344,8 +8344,8 @@ rack_process_ack(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
|||||||
*/
|
*/
|
||||||
ourfinisacked = 1;
|
ourfinisacked = 1;
|
||||||
}
|
}
|
||||||
/* NB: sowwakeup_locked() does an implicit unlock. */
|
SOCKBUF_UNLOCK(&so->so_snd);
|
||||||
sowwakeup_locked(so);
|
tp->t_flags |= TF_WAKESOW;
|
||||||
m_freem(mfree);
|
m_freem(mfree);
|
||||||
if (rack->r_ctl.rc_early_recovery == 0) {
|
if (rack->r_ctl.rc_early_recovery == 0) {
|
||||||
if (IN_RECOVERY(tp->t_flags)) {
|
if (IN_RECOVERY(tp->t_flags)) {
|
||||||
@ -8665,8 +8665,8 @@ rack_process_data(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
|||||||
appended =
|
appended =
|
||||||
#endif
|
#endif
|
||||||
sbappendstream_locked(&so->so_rcv, m, 0);
|
sbappendstream_locked(&so->so_rcv, m, 0);
|
||||||
/* NB: sorwakeup_locked() does an implicit unlock. */
|
SOCKBUF_UNLOCK(&so->so_rcv);
|
||||||
sorwakeup_locked(so);
|
tp->t_flags |= TF_WAKESOR;
|
||||||
#ifdef NETFLIX_SB_LIMITS
|
#ifdef NETFLIX_SB_LIMITS
|
||||||
if (so->so_rcv.sb_shlim && appended != mcnt)
|
if (so->so_rcv.sb_shlim && appended != mcnt)
|
||||||
counter_fo_release(so->so_rcv.sb_shlim,
|
counter_fo_release(so->so_rcv.sb_shlim,
|
||||||
@ -8731,6 +8731,8 @@ rack_process_data(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
|||||||
if (thflags & TH_FIN) {
|
if (thflags & TH_FIN) {
|
||||||
if (TCPS_HAVERCVDFIN(tp->t_state) == 0) {
|
if (TCPS_HAVERCVDFIN(tp->t_state) == 0) {
|
||||||
socantrcvmore(so);
|
socantrcvmore(so);
|
||||||
|
/* The socket upcall is handled by socantrcvmore. */
|
||||||
|
tp->t_flags &= ~TF_WAKESOR;
|
||||||
/*
|
/*
|
||||||
* If connection is half-synchronized (ie NEEDSYN
|
* If connection is half-synchronized (ie NEEDSYN
|
||||||
* flag on) then delay ACK, so it may be piggybacked
|
* flag on) then delay ACK, so it may be piggybacked
|
||||||
@ -8922,8 +8924,8 @@ rack_do_fastnewdata(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
|||||||
sbappendstream_locked(&so->so_rcv, m, 0);
|
sbappendstream_locked(&so->so_rcv, m, 0);
|
||||||
ctf_calc_rwin(so, tp);
|
ctf_calc_rwin(so, tp);
|
||||||
}
|
}
|
||||||
/* NB: sorwakeup_locked() does an implicit unlock. */
|
SOCKBUF_UNLOCK(&so->so_rcv);
|
||||||
sorwakeup_locked(so);
|
tp->t_flags |= TF_WAKESOR;
|
||||||
#ifdef NETFLIX_SB_LIMITS
|
#ifdef NETFLIX_SB_LIMITS
|
||||||
if (so->so_rcv.sb_shlim && mcnt != appended)
|
if (so->so_rcv.sb_shlim && mcnt != appended)
|
||||||
counter_fo_release(so->so_rcv.sb_shlim, mcnt - appended);
|
counter_fo_release(so->so_rcv.sb_shlim, mcnt - appended);
|
||||||
@ -9140,7 +9142,7 @@ rack_fastack(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
|||||||
rack_timer_cancel(tp, rack, rack->r_ctl.rc_rcvtime, __LINE__);
|
rack_timer_cancel(tp, rack, rack->r_ctl.rc_rcvtime, __LINE__);
|
||||||
}
|
}
|
||||||
/* Wake up the socket if we have room to write more */
|
/* Wake up the socket if we have room to write more */
|
||||||
sowwakeup(so);
|
tp->t_flags |= TF_WAKESOW;
|
||||||
if (sbavail(&so->so_snd)) {
|
if (sbavail(&so->so_snd)) {
|
||||||
rack->r_wanted_output = 1;
|
rack->r_wanted_output = 1;
|
||||||
}
|
}
|
||||||
@ -11188,9 +11190,11 @@ rack_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
|||||||
tcp_get_usecs(&tv);
|
tcp_get_usecs(&tv);
|
||||||
}
|
}
|
||||||
if(rack_do_segment_nounlock(m, th, so, tp,
|
if(rack_do_segment_nounlock(m, th, so, tp,
|
||||||
drop_hdrlen, tlen, iptos, 0, &tv) == 0)
|
drop_hdrlen, tlen, iptos, 0, &tv) == 0) {
|
||||||
|
tcp_handle_wakeup(tp, so);
|
||||||
INP_WUNLOCK(tp->t_inpcb);
|
INP_WUNLOCK(tp->t_inpcb);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct rack_sendmap *
|
struct rack_sendmap *
|
||||||
tcp_rack_output(struct tcpcb *tp, struct tcp_rack *rack, uint32_t tsused)
|
tcp_rack_output(struct tcpcb *tp, struct tcp_rack *rack, uint32_t tsused)
|
||||||
|
@ -458,6 +458,7 @@ ctf_do_queued_segments(struct socket *so, struct tcpcb *tp, int have_pkt)
|
|||||||
/* We lost the tcpcb (maybe a RST came in)? */
|
/* We lost the tcpcb (maybe a RST came in)? */
|
||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
|
tcp_handle_wakeup(tp, so);
|
||||||
}
|
}
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
@ -381,7 +381,7 @@ TAILQ_HEAD(tcp_funchead, tcp_function);
|
|||||||
#define TF_NEEDFIN 0x00000800 /* send FIN (implicit state) */
|
#define TF_NEEDFIN 0x00000800 /* send FIN (implicit state) */
|
||||||
#define TF_NOPUSH 0x00001000 /* don't push */
|
#define TF_NOPUSH 0x00001000 /* don't push */
|
||||||
#define TF_PREVVALID 0x00002000 /* saved values for bad rxmit valid */
|
#define TF_PREVVALID 0x00002000 /* saved values for bad rxmit valid */
|
||||||
#define TF_UNUSED1 0x00004000 /* unused */
|
#define TF_WAKESOR 0x00004000 /* wake up receive socket */
|
||||||
#define TF_GPUTINPROG 0x00008000 /* Goodput measurement in progress */
|
#define TF_GPUTINPROG 0x00008000 /* Goodput measurement in progress */
|
||||||
#define TF_MORETOCOME 0x00010000 /* More data to be appended to sock */
|
#define TF_MORETOCOME 0x00010000 /* More data to be appended to sock */
|
||||||
#define TF_LQ_OVERFLOW 0x00020000 /* listen queue overflow */
|
#define TF_LQ_OVERFLOW 0x00020000 /* listen queue overflow */
|
||||||
@ -393,9 +393,9 @@ TAILQ_HEAD(tcp_funchead, tcp_function);
|
|||||||
#define TF_FORCEDATA 0x00800000 /* force out a byte */
|
#define TF_FORCEDATA 0x00800000 /* force out a byte */
|
||||||
#define TF_TSO 0x01000000 /* TSO enabled on this connection */
|
#define TF_TSO 0x01000000 /* TSO enabled on this connection */
|
||||||
#define TF_TOE 0x02000000 /* this connection is offloaded */
|
#define TF_TOE 0x02000000 /* this connection is offloaded */
|
||||||
#define TF_UNUSED3 0x04000000 /* unused */
|
#define TF_WAKESOW 0x04000000 /* wake up send socket */
|
||||||
#define TF_UNUSED4 0x08000000 /* unused */
|
#define TF_UNUSED1 0x08000000 /* unused */
|
||||||
#define TF_UNUSED5 0x10000000 /* unused */
|
#define TF_UNUSED2 0x10000000 /* unused */
|
||||||
#define TF_CONGRECOVERY 0x20000000 /* congestion recovery mode */
|
#define TF_CONGRECOVERY 0x20000000 /* congestion recovery mode */
|
||||||
#define TF_WASCRECOVERY 0x40000000 /* was in congestion recovery */
|
#define TF_WASCRECOVERY 0x40000000 /* was in congestion recovery */
|
||||||
#define TF_FASTOPEN 0x80000000 /* TCP Fast Open indication */
|
#define TF_FASTOPEN 0x80000000 /* TCP Fast Open indication */
|
||||||
@ -931,7 +931,8 @@ char *tcp_log_addrs(struct in_conninfo *, struct tcphdr *, void *,
|
|||||||
const void *);
|
const void *);
|
||||||
char *tcp_log_vain(struct in_conninfo *, struct tcphdr *, void *,
|
char *tcp_log_vain(struct in_conninfo *, struct tcphdr *, void *,
|
||||||
const void *);
|
const void *);
|
||||||
int tcp_reass(struct tcpcb *, struct tcphdr *, tcp_seq *, int *, struct mbuf *);
|
int tcp_reass(struct tcpcb *, struct tcphdr *, tcp_seq *, int *,
|
||||||
|
struct mbuf *);
|
||||||
void tcp_reass_global_init(void);
|
void tcp_reass_global_init(void);
|
||||||
void tcp_reass_flush(struct tcpcb *);
|
void tcp_reass_flush(struct tcpcb *);
|
||||||
void tcp_dooptions(struct tcpopt *, u_char *, int, int);
|
void tcp_dooptions(struct tcpopt *, u_char *, int, int);
|
||||||
@ -955,6 +956,7 @@ void hhook_run_tcp_est_in(struct tcpcb *tp,
|
|||||||
int tcp_input(struct mbuf **, int *, int);
|
int tcp_input(struct mbuf **, int *, int);
|
||||||
int tcp_autorcvbuf(struct mbuf *, struct tcphdr *, struct socket *,
|
int tcp_autorcvbuf(struct mbuf *, struct tcphdr *, struct socket *,
|
||||||
struct tcpcb *, int);
|
struct tcpcb *, int);
|
||||||
|
void tcp_handle_wakeup(struct tcpcb *, struct socket *);
|
||||||
void tcp_do_segment(struct mbuf *, struct tcphdr *,
|
void tcp_do_segment(struct mbuf *, struct tcphdr *,
|
||||||
struct socket *, struct tcpcb *, int, int, uint8_t);
|
struct socket *, struct tcpcb *, int, int, uint8_t);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user