Changeset View
Changeset View
Standalone View
Standalone View
sys/netinet/tcp_stacks/rack.c
- This file is larger than 256 KB, so syntax highlighting is disabled by default.
Show First 20 Lines • Show All 4,936 Lines • ▼ Show 20 Lines | if (th->th_seq == tp->rcv_nxt && | ||||
* theoretically invalid by now. Fortunately | * theoretically invalid by now. Fortunately | ||||
* 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. | ||||
*/ | */ | ||||
tcp_seq temp = save_start; | tcp_seq temp = save_start; | ||||
thflags = tcp_reass(tp, th, &temp, &tlen, m); | thflags = tcp_reass(tp, th, &temp, &tlen, m); | ||||
tp->t_flags |= TF_ACKNOW; | tp->t_flags |= TF_ACKNOW; | ||||
} | } | ||||
if (((tlen == 0) && (save_tlen > 0) && | if ((tp->t_flags & TF_SACK_PERMIT) && (save_tlen > 0)) { | ||||
(SEQ_LT(save_start, save_rnxt)))) { | if ((tlen == 0) && (SEQ_LT(save_start, save_rnxt))) { | ||||
/* | /* | ||||
* DSACK actually handled in the fastpath | * DSACK actually handled in the fastpath | ||||
* above. | * above. | ||||
*/ | */ | ||||
tcp_update_sack_list(tp, save_start, | tcp_update_sack_list(tp, save_start, | ||||
save_start + save_tlen); | save_start + save_tlen); | ||||
} else if ((tlen > 0) && SEQ_GT(tp->rcv_nxt, save_rnxt)) { | } else if ((tlen > 0) && SEQ_GT(tp->rcv_nxt, save_rnxt)) { | ||||
/* | |||||
* Cleaning sackblks by using zero length | |||||
* update. | |||||
*/ | |||||
if ((tp->rcv_numsacks >= 1) && | if ((tp->rcv_numsacks >= 1) && | ||||
(tp->sackblks[0].end == save_start)) { | (tp->sackblks[0].end == save_start)) { | ||||
/* partial overlap, recorded at todrop above */ | /* | ||||
tcp_update_sack_list(tp, tp->sackblks[0].start, | * Partial overlap, recorded at todrop | ||||
* above. | |||||
*/ | |||||
tcp_update_sack_list(tp, | |||||
tp->sackblks[0].start, | |||||
tp->sackblks[0].end); | tp->sackblks[0].end); | ||||
} else { | } else { | ||||
tcp_update_dsack_list(tp, save_start, | tcp_update_dsack_list(tp, save_start, | ||||
save_start + save_tlen); | save_start + save_tlen); | ||||
} | } | ||||
} else if ((tlen > 0) && (tlen >= save_tlen)) { | } else if (tlen >= save_tlen) { | ||||
/* Update of sackblks. */ | /* Update of sackblks. */ | ||||
tcp_update_dsack_list(tp, save_start, | tcp_update_dsack_list(tp, save_start, | ||||
save_start + save_tlen); | save_start + save_tlen); | ||||
} else if (tlen > 0) { | } else if (tlen > 0) { | ||||
tcp_update_dsack_list(tp, save_start, | tcp_update_dsack_list(tp, save_start, | ||||
save_start + tlen); | save_start + tlen); | ||||
} | |||||
} | } | ||||
} else { | } else { | ||||
m_freem(m); | m_freem(m); | ||||
thflags &= ~TH_FIN; | thflags &= ~TH_FIN; | ||||
} | } | ||||
/* | /* | ||||
* If FIN is received ACK the FIN and let the user know that the | * If FIN is received ACK the FIN and let the user know that the | ||||
▲ Show 20 Lines • Show All 4,264 Lines • Show Last 20 Lines |