Changeset View
Changeset View
Standalone View
Standalone View
sys/netinet/tcp_stacks/rack.c
Context not available. | |||||
* segments are out of order (so fast retransmit can work). | * segments are out of order (so fast retransmit can work). | ||||
*/ | */ | ||||
if (th->th_seq == tp->rcv_nxt && | if (th->th_seq == tp->rcv_nxt && | ||||
LIST_EMPTY(&tp->t_segq) && | SEGQ_EMPTY(tp) && | ||||
(TCPS_HAVEESTABLISHED(tp->t_state) || | (TCPS_HAVEESTABLISHED(tp->t_state) || | ||||
tfo_syn)) { | tfo_syn)) { | ||||
if (DELAY_ACK(tp, tlen) || tfo_syn) { | if (DELAY_ACK(tp, tlen) || tfo_syn) { | ||||
Context not available. | |||||
* m_adj() doesn't actually frees any mbufs when | * m_adj() doesn't actually frees any mbufs when | ||||
* trimming from the head. | * trimming from the head. | ||||
*/ | */ | ||||
thflags = tcp_reass(tp, th, &tlen, m); | thflags = tcp_reass(tp, th, &save_start, &tlen, m); | ||||
tp->t_flags |= TF_ACKNOW; | tp->t_flags |= TF_ACKNOW; | ||||
} | } | ||||
if (tlen > 0) | if (tlen > 0) | ||||
Context not available. | |||||
* not, do so now to pass queued data to user. | * not, do so now to pass queued data to user. | ||||
*/ | */ | ||||
if (tlen == 0 && (thflags & TH_FIN) == 0) | if (tlen == 0 && (thflags & TH_FIN) == 0) | ||||
(void)tcp_reass(tp, (struct tcphdr *)0, 0, | (void) tcp_reass(tp, (struct tcphdr *)0, NULL, 0, | ||||
(struct mbuf *)0); | (struct mbuf *)0); | ||||
tp->snd_wl1 = th->th_seq - 1; | tp->snd_wl1 = th->th_seq - 1; | ||||
if (rack_process_ack(m, th, so, tp, to, tiwin, tlen, &ourfinisacked, thflags, &ret_val)) { | if (rack_process_ack(m, th, so, tp, to, tiwin, tlen, &ourfinisacked, thflags, &ret_val)) { | ||||
Context not available. | |||||
*/ | */ | ||||
if (__predict_true(((to->to_flags & TOF_SACK) == 0)) && | if (__predict_true(((to->to_flags & TOF_SACK) == 0)) && | ||||
__predict_true((thflags & (TH_SYN | TH_FIN | TH_RST | TH_URG | TH_ACK)) == TH_ACK) && | __predict_true((thflags & (TH_SYN | TH_FIN | TH_RST | TH_URG | TH_ACK)) == TH_ACK) && | ||||
__predict_true(LIST_EMPTY(&tp->t_segq)) && | __predict_true(SEGQ_EMPTY(tp)) && | ||||
__predict_true(th->th_seq == tp->rcv_nxt)) { | __predict_true(th->th_seq == tp->rcv_nxt)) { | ||||
struct tcp_rack *rack; | struct tcp_rack *rack; | ||||
Context not available. |