59 #if LWIP_ND6_TCP_REACHABILITY_HINTS 64 #define LWIP_TCP_CALC_INITIAL_CWND(mss) LWIP_MIN((4U * (mss)), LWIP_MAX((2U * (mss)), 4380U)); 66 #define LWIP_TCP_INITIAL_SSTHRESH(pcb) ((pcb)->snd_wnd) 71 static struct tcp_seg inseg;
72 static struct tcp_hdr *tcphdr;
73 static u16_t tcphdr_opt1len;
74 static u8_t* tcphdr_opt2;
75 static u16_t tcp_optidx;
76 static u32_t seqno, ackno;
80 static u8_t recv_flags;
81 static struct pbuf *recv_data;
83 struct tcp_pcb *tcp_input_pcb;
86 static err_t tcp_process(
struct tcp_pcb *pcb);
87 static void tcp_receive(
struct tcp_pcb *pcb);
88 static void tcp_parseopt(
struct tcp_pcb *pcb);
90 static err_t tcp_listen_input(
struct tcp_pcb_listen *pcb);
91 static err_t tcp_timewait_input(
struct tcp_pcb *pcb);
103 tcp_input(
struct pbuf *p,
struct netif *inp)
105 struct tcp_pcb *pcb, *prev;
106 struct tcp_pcb_listen *lpcb;
108 struct tcp_pcb *lpcb_prev =
NULL;
109 struct tcp_pcb_listen *lpcb_any =
NULL;
121 tcphdr = (
struct tcp_hdr *)p->
payload;
124 tcp_debug_print(tcphdr);
128 if (p->
len <
sizeof(
struct tcp_hdr)) {
145 #if CHECKSUM_CHECK_TCP 153 tcp_debug_print(tcphdr);
162 hdrlen = TCPH_HDRLEN(tcphdr);
163 tcphdr_opt1len = (hdrlen * 4) - TCP_HLEN;
165 if (p->
len < hdrlen * 4) {
166 if (p->
len >= TCP_HLEN) {
168 u16_t optlen = tcphdr_opt1len;
170 LWIP_ASSERT(
"tcphdr_opt1len >= p->len", tcphdr_opt1len >= p->
len);
172 tcphdr_opt1len = p->
len;
173 if (optlen > tcphdr_opt1len) {
180 opt2len = optlen - tcphdr_opt1len;
199 tcphdr->src =
ntohs(tcphdr->src);
200 tcphdr->dest =
ntohs(tcphdr->dest);
201 seqno = tcphdr->seqno =
ntohl(tcphdr->seqno);
202 ackno = tcphdr->ackno =
ntohl(tcphdr->ackno);
203 tcphdr->wnd =
ntohs(tcphdr->wnd);
205 flags = TCPH_FLAGS(tcphdr);
206 tcplen = p->
tot_len + ((flags & (TCP_FIN | TCP_SYN)) ? 1 : 0);
212 for (pcb = tcp_active_pcbs; pcb !=
NULL; pcb = pcb->next) {
213 LWIP_ASSERT(
"tcp_input: active pcb->state != CLOSED", pcb->state != CLOSED);
214 LWIP_ASSERT(
"tcp_input: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT);
215 LWIP_ASSERT(
"tcp_input: active pcb->state != LISTEN", pcb->state != LISTEN);
216 if (pcb->remote_port == tcphdr->src &&
217 pcb->local_port == tcphdr->dest &&
223 LWIP_ASSERT(
"tcp_input: pcb->next != pcb (before cache)", pcb->next != pcb);
225 prev->next = pcb->next;
226 pcb->next = tcp_active_pcbs;
227 tcp_active_pcbs = pcb;
231 LWIP_ASSERT(
"tcp_input: pcb->next != pcb (after cache)", pcb->next != pcb);
240 for (pcb = tcp_tw_pcbs; pcb !=
NULL; pcb = pcb->next) {
241 LWIP_ASSERT(
"tcp_input: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
242 if (pcb->remote_port == tcphdr->src &&
243 pcb->local_port == tcphdr->dest &&
250 tcp_timewait_input(pcb);
259 for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb !=
NULL; lpcb = lpcb->next) {
260 if (lpcb->local_port == tcphdr->dest) {
261 #if LWIP_IPV4 && LWIP_IPV6 262 if (lpcb->accept_any_ip_version) {
287 prev = (
struct tcp_pcb *)lpcb;
302 ((
struct tcp_pcb_listen *)prev)->next = lpcb->next;
304 lpcb->next = tcp_listen_pcbs.listen_pcbs;
306 tcp_listen_pcbs.listen_pcbs = lpcb;
312 tcp_listen_input(lpcb);
320 tcp_debug_print_flags(TCPH_FLAGS(tcphdr));
328 tcp_debug_print_state(pcb->state);
335 inseg.tcphdr = tcphdr;
340 if (flags & TCP_PSH) {
345 if (pcb->refused_data !=
NULL) {
346 if ((tcp_process_refused_data(pcb) ==
ERR_ABRT) ||
347 ((pcb->refused_data !=
NULL) && (tcplen > 0))) {
356 err = tcp_process(pcb);
360 if (recv_flags & TF_RESET) {
365 TCP_EVENT_ERR(pcb->errf, pcb->callback_arg,
ERR_RST);
366 tcp_pcb_remove(&tcp_active_pcbs, pcb);
373 if (pcb->acked > 0) {
378 u32_t pcb_acked = pcb->acked;
379 while (pcb_acked > 0) {
386 TCP_EVENT_SENT(pcb, (
u16_t)acked, err);
392 if (recv_flags & TF_CLOSED) {
395 if (!(pcb->flags & TF_RXCLOSED)) {
399 TCP_EVENT_ERR(pcb->errf, pcb->callback_arg,
ERR_CLSD);
401 tcp_pcb_remove(&tcp_active_pcbs, pcb);
405 #if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE 406 while (recv_data !=
NULL) {
408 pbuf_split_64k(recv_data, &rest);
410 if (recv_data !=
NULL) {
414 if (pcb->flags & TF_RXCLOSED) {
418 #if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE 428 TCP_EVENT_RECV(pcb, recv_data,
ERR_OK, err);
430 #if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE 440 #if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE 445 pcb->refused_data = recv_data;
447 #if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE 458 if (recv_flags & TF_GOT_FIN) {
459 if (pcb->refused_data !=
NULL) {
465 if (pcb->rcv_wnd != TCP_WND_MAX(pcb)) {
468 TCP_EVENT_CLOSED(pcb, err);
475 tcp_input_pcb =
NULL;
480 tcp_debug_print_state(pcb->state);
488 tcp_input_pcb =
NULL;
502 if (!(TCPH_FLAGS(tcphdr) & TCP_RST)) {
511 LWIP_ASSERT(
"tcp_input: tcp_pcbs_sane()", tcp_pcbs_sane());
533 tcp_listen_input(
struct tcp_pcb_listen *pcb)
535 struct tcp_pcb *npcb;
538 if (flags & TCP_RST) {
545 if (flags & TCP_ACK) {
551 }
else if (flags & TCP_SYN) {
553 #if TCP_LISTEN_BACKLOG 554 if (pcb->accepts_pending >= pcb->backlog) {
559 npcb = tcp_alloc(pcb->prio);
568 #if TCP_LISTEN_BACKLOG 569 pcb->accepts_pending++;
572 #if LWIP_IPV4 && LWIP_IPV6 577 npcb->local_port = pcb->local_port;
578 npcb->remote_port = tcphdr->src;
579 npcb->state = SYN_RCVD;
580 npcb->rcv_nxt = seqno + 1;
581 npcb->rcv_ann_right_edge = npcb->rcv_nxt;
582 npcb->snd_wl1 = seqno - 1;
583 npcb->callback_arg = pcb->callback_arg;
584 #if LWIP_CALLBACK_API 585 npcb->accept = pcb->accept;
591 TCP_REG_ACTIVE(npcb);
595 npcb->snd_wnd = SND_WND_SCALE(npcb, tcphdr->wnd);
596 npcb->snd_wnd_max = npcb->snd_wnd;
597 npcb->ssthresh = LWIP_TCP_INITIAL_SSTHRESH(npcb);
599 #if TCP_CALCULATE_EFF_SEND_MSS 600 npcb->mss = tcp_eff_send_mss(npcb->mss, &npcb->local_ip,
607 rc = tcp_enqueue_flags(npcb, TCP_SYN | TCP_ACK);
609 tcp_abandon(npcb, 0);
612 return tcp_output(npcb);
627 tcp_timewait_input(
struct tcp_pcb *pcb)
634 if (flags & TCP_RST) {
638 if (flags & TCP_SYN) {
641 if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt + pcb->rcv_wnd)) {
647 }
else if (flags & TCP_FIN) {
650 pcb->tmr = tcp_ticks;
655 pcb->flags |= TF_ACK_NOW;
656 return tcp_output(pcb);
673 tcp_process(
struct tcp_pcb *pcb)
675 struct tcp_seg *rseg;
682 if (flags & TCP_RST) {
684 if (pcb->state == SYN_SENT) {
685 if (ackno == pcb->snd_nxt) {
689 if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt,
690 pcb->rcv_nxt + pcb->rcv_wnd)) {
697 LWIP_ASSERT(
"tcp_input: pcb->state != CLOSED", pcb->state != CLOSED);
698 recv_flags |= TF_RESET;
699 pcb->flags &= ~TF_ACK_DELAY;
703 seqno, pcb->rcv_nxt));
705 seqno, pcb->rcv_nxt));
710 if ((flags & TCP_SYN) && (pcb->state != SYN_SENT && pcb->state != SYN_RCVD)) {
716 if ((pcb->flags & TF_RXCLOSED) == 0) {
718 pcb->tmr = tcp_ticks;
720 pcb->keep_cnt_sent = 0;
725 switch (pcb->state) {
728 pcb->snd_nxt,
ntohl(pcb->unacked->tcphdr->seqno)));
730 if ((flags & TCP_ACK) && (flags & TCP_SYN)
731 && ackno ==
ntohl(pcb->unacked->tcphdr->seqno) + 1) {
733 pcb->rcv_nxt = seqno + 1;
734 pcb->rcv_ann_right_edge = pcb->rcv_nxt;
735 pcb->lastack = ackno;
736 pcb->snd_wnd = SND_WND_SCALE(pcb, tcphdr->wnd);
737 pcb->snd_wnd_max = pcb->snd_wnd;
738 pcb->snd_wl1 = seqno - 1;
739 pcb->state = ESTABLISHED;
741 #if TCP_CALCULATE_EFF_SEND_MSS 742 pcb->mss = tcp_eff_send_mss(pcb->mss, &pcb->local_ip, &pcb->remote_ip,
747 pcb->ssthresh = LWIP_TCP_INITIAL_SSTHRESH(pcb);
749 pcb->cwnd = LWIP_TCP_CALC_INITIAL_CWND(pcb->mss);
751 " ssthresh %"TCPWNDSIZE_F
"\n",
752 pcb->cwnd, pcb->ssthresh));
753 LWIP_ASSERT(
"pcb->snd_queuelen > 0", (pcb->snd_queuelen > 0));
757 pcb->unacked = rseg->next;
762 if (pcb->unacked ==
NULL) {
771 TCP_EVENT_CONNECTED(pcb,
ERR_OK, err);
778 else if (flags & TCP_ACK) {
785 if (flags & TCP_ACK) {
787 if (TCP_SEQ_BETWEEN(ackno, pcb->lastack+1, pcb->snd_nxt)) {
788 pcb->state = ESTABLISHED;
790 #if LWIP_CALLBACK_API 794 TCP_EVENT_ACCEPT(pcb,
ERR_OK, err);
811 pcb->ssthresh = LWIP_TCP_INITIAL_SSTHRESH(pcb);
814 if (pcb->acked != 0) {
818 pcb->cwnd = LWIP_TCP_CALC_INITIAL_CWND(pcb->mss);
820 " ssthresh %"TCPWNDSIZE_F
"\n",
821 pcb->cwnd, pcb->ssthresh));
823 if (recv_flags & TF_GOT_FIN) {
825 pcb->state = CLOSE_WAIT;
832 }
else if ((flags & TCP_SYN) && (seqno == pcb->rcv_nxt - 1)) {
841 if (recv_flags & TF_GOT_FIN) {
843 pcb->state = CLOSE_WAIT;
848 if (recv_flags & TF_GOT_FIN) {
849 if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt)) {
851 (
"TCP connection closed: FIN_WAIT_1 %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
855 pcb->state = TIME_WAIT;
856 TCP_REG(&tcp_tw_pcbs, pcb);
859 pcb->state = CLOSING;
861 }
else if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt)) {
862 pcb->state = FIN_WAIT_2;
867 if (recv_flags & TF_GOT_FIN) {
872 pcb->state = TIME_WAIT;
873 TCP_REG(&tcp_tw_pcbs, pcb);
878 if (flags & TCP_ACK && ackno == pcb->snd_nxt) {
882 pcb->state = TIME_WAIT;
883 TCP_REG(&tcp_tw_pcbs, pcb);
888 if (flags & TCP_ACK && ackno == pcb->snd_nxt) {
891 recv_flags |= TF_CLOSED;
907 tcp_oos_insert_segment(
struct tcp_seg *cseg,
struct tcp_seg *next)
909 struct tcp_seg *old_seg;
911 if (TCPH_FLAGS(cseg->tcphdr) & TCP_FIN) {
919 TCP_SEQ_GEQ((seqno + cseg->len),
920 (next->tcphdr->seqno + next->len))) {
922 if (TCPH_FLAGS(next->tcphdr) & TCP_FIN) {
923 TCPH_SET_FLAG(cseg->tcphdr, TCP_FIN);
927 tcp_seg_free(old_seg);
930 TCP_SEQ_GT(seqno + cseg->len, next->tcphdr->seqno)) {
932 cseg->len = (
u16_t)(next->tcphdr->seqno - seqno);
953 tcp_receive(
struct tcp_pcb *pcb)
955 struct tcp_seg *next;
957 struct tcp_seg *prev, *cseg;
962 u32_t right_wnd_edge;
964 int found_dupack = 0;
965 #if TCP_OOSEQ_MAX_BYTES || TCP_OOSEQ_MAX_PBUFS 970 LWIP_ASSERT(
"tcp_receive: wrong state", pcb->state >= ESTABLISHED);
972 if (
flags & TCP_ACK) {
973 right_wnd_edge = pcb->snd_wnd + pcb->snd_wl2;
976 if (TCP_SEQ_LT(pcb->snd_wl1, seqno) ||
977 (pcb->snd_wl1 == seqno && TCP_SEQ_LT(pcb->snd_wl2, ackno)) ||
978 (pcb->snd_wl2 == ackno && (
u32_t)SND_WND_SCALE(pcb, tcphdr->wnd) > pcb->snd_wnd)) {
979 pcb->snd_wnd = SND_WND_SCALE(pcb, tcphdr->wnd);
982 if (pcb->snd_wnd_max < pcb->snd_wnd) {
983 pcb->snd_wnd_max = pcb->snd_wnd;
985 pcb->snd_wl1 = seqno;
986 pcb->snd_wl2 = ackno;
987 if (pcb->snd_wnd == 0) {
988 if (pcb->persist_backoff == 0) {
990 pcb->persist_cnt = 0;
991 pcb->persist_backoff = 1;
993 }
else if (pcb->persist_backoff > 0) {
995 pcb->persist_backoff = 0;
1000 if (pcb->snd_wnd != (tcpwnd_size_t)SND_WND_SCALE(pcb, tcphdr->wnd)) {
1002 (
"tcp_receive: no window update lastack %"U32_F
" ackno %" 1003 U32_F
" wl1 %"U32_F
" seqno %"U32_F
" wl2 %"U32_F
"\n",
1004 pcb->lastack, ackno, pcb->snd_wl1, seqno, pcb->snd_wl2));
1030 if (TCP_SEQ_LEQ(ackno, pcb->lastack)) {
1035 if (pcb->snd_wl2 + pcb->snd_wnd == right_wnd_edge) {
1037 if (pcb->rtime >= 0) {
1039 if (pcb->lastack == ackno) {
1041 if ((
u8_t)(pcb->dupacks + 1) > pcb->dupacks) {
1044 if (pcb->dupacks > 3) {
1047 if ((tcpwnd_size_t)(pcb->cwnd + pcb->mss) > pcb->cwnd) {
1048 pcb->cwnd += pcb->mss;
1050 }
else if (pcb->dupacks == 3) {
1052 tcp_rexmit_fast(pcb);
1060 if (!found_dupack) {
1063 }
else if (TCP_SEQ_BETWEEN(ackno, pcb->lastack+1, pcb->snd_nxt)) {
1069 if (pcb->flags & TF_INFR) {
1070 pcb->flags &= ~TF_INFR;
1071 pcb->cwnd = pcb->ssthresh;
1078 pcb->rto = (pcb->sa >> 3) + pcb->sv;
1082 pcb->acked = (tcpwnd_size_t)(ackno - pcb->lastack);
1084 pcb->snd_buf += pcb->acked;
1088 pcb->lastack = ackno;
1092 if (pcb->state >= ESTABLISHED) {
1093 if (pcb->cwnd < pcb->ssthresh) {
1094 if ((tcpwnd_size_t)(pcb->cwnd + pcb->mss) > pcb->cwnd) {
1095 pcb->cwnd += pcb->mss;
1099 tcpwnd_size_t new_cwnd = (pcb->cwnd + pcb->mss * pcb->mss / pcb->cwnd);
1100 if (new_cwnd > pcb->cwnd) {
1101 pcb->cwnd = new_cwnd;
1108 pcb->unacked !=
NULL?
1109 ntohl(pcb->unacked->tcphdr->seqno): 0,
1110 pcb->unacked !=
NULL?
1111 ntohl(pcb->unacked->tcphdr->seqno) + TCP_TCPLEN(pcb->unacked): 0));
1115 while (pcb->unacked !=
NULL &&
1116 TCP_SEQ_LEQ(
ntohl(pcb->unacked->tcphdr->seqno) +
1117 TCP_TCPLEN(pcb->unacked), ackno)) {
1119 ntohl(pcb->unacked->tcphdr->seqno),
1120 ntohl(pcb->unacked->tcphdr->seqno) +
1121 TCP_TCPLEN(pcb->unacked)));
1123 next = pcb->unacked;
1124 pcb->unacked = pcb->unacked->next;
1127 LWIP_ASSERT(
"pcb->snd_queuelen >= pbuf_clen(next->p)", (pcb->snd_queuelen >=
pbuf_clen(next->p)));
1129 if ((pcb->acked != 0) && ((TCPH_FLAGS(next->tcphdr) & TCP_FIN) != 0)) {
1133 pcb->snd_queuelen -=
pbuf_clen(next->p);
1137 if (pcb->snd_queuelen != 0) {
1138 LWIP_ASSERT(
"tcp_receive: valid queue length", pcb->unacked !=
NULL ||
1139 pcb->unsent !=
NULL);
1145 if (pcb->unacked ==
NULL) {
1153 #if LWIP_IPV6 && LWIP_ND6_TCP_REACHABILITY_HINTS 1156 nd6_reachability_hint(ip6_current_src_addr());
1162 tcp_send_empty_ack(pcb);
1171 while (pcb->unsent !=
NULL &&
1172 TCP_SEQ_BETWEEN(ackno,
ntohl(pcb->unsent->tcphdr->seqno) +
1173 TCP_TCPLEN(pcb->unsent), pcb->snd_nxt)) {
1175 ntohl(pcb->unsent->tcphdr->seqno),
ntohl(pcb->unsent->tcphdr->seqno) +
1176 TCP_TCPLEN(pcb->unsent)));
1179 pcb->unsent = pcb->unsent->next;
1181 if (pcb->unsent ==
NULL) {
1182 pcb->unsent_oversize = 0;
1186 LWIP_ASSERT(
"pcb->snd_queuelen >= pbuf_clen(next->p)", (pcb->snd_queuelen >=
pbuf_clen(next->p)));
1188 if ((pcb->acked != 0) && ((TCPH_FLAGS(next->tcphdr) & TCP_FIN) != 0)) {
1191 pcb->snd_queuelen -=
pbuf_clen(next->p);
1194 if (pcb->snd_queuelen != 0) {
1196 pcb->unacked !=
NULL || pcb->unsent !=
NULL);
1202 pcb->rttest, pcb->rtseq, ackno));
1207 if (pcb->rttest && TCP_SEQ_LT(pcb->rtseq, ackno)) {
1210 m = (
s16_t)(tcp_ticks - pcb->rttest);
1213 m, m * TCP_SLOW_INTERVAL));
1216 m = m - (pcb->sa >> 3);
1221 m = m - (pcb->sv >> 2);
1223 pcb->rto = (pcb->sa >> 3) + pcb->sv;
1226 pcb->rto, pcb->rto * TCP_SLOW_INTERVAL));
1236 if ((tcplen > 0) && (pcb->state < CLOSE_WAIT)) {
1267 if (TCP_SEQ_BETWEEN(pcb->rcv_nxt, seqno + 1, seqno + tcplen - 1)) {
1288 off = pcb->rcv_nxt - seqno;
1292 if (inseg.p->len < off) {
1294 new_tot_len = (
u16_t)(inseg.p->tot_len - off);
1295 while (p->
len < off) {
1314 inseg.len -= (
u16_t)(pcb->rcv_nxt - seqno);
1315 inseg.tcphdr->seqno = seqno = pcb->rcv_nxt;
1318 if (TCP_SEQ_LT(seqno, pcb->rcv_nxt)) {
1330 if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt,
1331 pcb->rcv_nxt + pcb->rcv_wnd - 1)) {
1332 if (pcb->rcv_nxt == seqno) {
1336 tcplen = TCP_TCPLEN(&inseg);
1338 if (tcplen > pcb->rcv_wnd) {
1340 (
"tcp_receive: other end overran receive window" 1341 "seqno %"U32_F
" len %"U16_F" right edge %"U32_F
"\n",
1342 seqno, tcplen, pcb->rcv_nxt + pcb->rcv_wnd));
1343 if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) {
1346 TCPH_FLAGS_SET(inseg.tcphdr, TCPH_FLAGS(inseg.tcphdr) & ~(
unsigned int)TCP_FIN);
1349 TCPWND_CHECK16(pcb->rcv_wnd);
1350 inseg.len = (
u16_t)pcb->rcv_wnd;
1351 if (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) {
1355 tcplen = TCP_TCPLEN(&inseg);
1356 LWIP_ASSERT(
"tcp_receive: segment not trimmed correctly to rcv_wnd\n",
1357 (seqno + tcplen) == (pcb->rcv_nxt + pcb->rcv_wnd));
1363 if (pcb->ooseq !=
NULL) {
1364 if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) {
1366 (
"tcp_receive: received in-order FIN, binning ooseq queue\n"));
1370 while (pcb->ooseq !=
NULL) {
1371 struct tcp_seg *old_ooseq = pcb->ooseq;
1372 pcb->ooseq = pcb->ooseq->next;
1373 tcp_seg_free(old_ooseq);
1380 TCP_SEQ_GEQ(seqno + tcplen,
1381 next->tcphdr->seqno + next->len)) {
1383 if (TCPH_FLAGS(next->tcphdr) & TCP_FIN &&
1384 (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) == 0) {
1385 TCPH_SET_FLAG(inseg.tcphdr, TCP_FIN);
1386 tcplen = TCP_TCPLEN(&inseg);
1395 TCP_SEQ_GT(seqno + tcplen,
1396 next->tcphdr->seqno)) {
1398 inseg.len = (
u16_t)(next->tcphdr->seqno - seqno);
1399 if (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) {
1403 tcplen = TCP_TCPLEN(&inseg);
1404 LWIP_ASSERT(
"tcp_receive: segment not trimmed correctly to ooseq queue\n",
1405 (seqno + tcplen) == next->tcphdr->seqno);
1412 pcb->rcv_nxt = seqno + tcplen;
1415 LWIP_ASSERT(
"tcp_receive: tcplen > rcv_wnd\n", pcb->rcv_wnd >= tcplen);
1416 pcb->rcv_wnd -= tcplen;
1418 tcp_update_rcv_ann_wnd(pcb);
1429 if (inseg.p->tot_len > 0) {
1430 recv_data = inseg.p;
1436 if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) {
1438 recv_flags |= TF_GOT_FIN;
1444 while (pcb->ooseq !=
NULL &&
1445 pcb->ooseq->tcphdr->seqno == pcb->rcv_nxt) {
1448 seqno = pcb->ooseq->tcphdr->seqno;
1450 pcb->rcv_nxt += TCP_TCPLEN(cseg);
1451 LWIP_ASSERT(
"tcp_receive: ooseq tcplen > rcv_wnd\n",
1452 pcb->rcv_wnd >= TCP_TCPLEN(cseg));
1453 pcb->rcv_wnd -= TCP_TCPLEN(cseg);
1455 tcp_update_rcv_ann_wnd(pcb);
1457 if (cseg->p->tot_len > 0) {
1466 recv_data = cseg->p;
1470 if (TCPH_FLAGS(cseg->tcphdr) & TCP_FIN) {
1472 recv_flags |= TF_GOT_FIN;
1473 if (pcb->state == ESTABLISHED) {
1474 pcb->state = CLOSE_WAIT;
1478 pcb->ooseq = cseg->next;
1487 #if LWIP_IPV6 && LWIP_ND6_TCP_REACHABILITY_HINTS 1490 nd6_reachability_hint(ip6_current_src_addr());
1496 tcp_send_empty_ack(pcb);
1499 if (pcb->ooseq ==
NULL) {
1500 pcb->ooseq = tcp_seg_copy(&inseg);
1515 for (next = pcb->ooseq; next !=
NULL; next = next->next) {
1516 if (seqno == next->tcphdr->seqno) {
1521 if (inseg.len > next->len) {
1525 cseg = tcp_seg_copy(&inseg);
1532 tcp_oos_insert_segment(cseg, next);
1543 if (TCP_SEQ_LT(seqno, next->tcphdr->seqno)) {
1548 cseg = tcp_seg_copy(&inseg);
1551 tcp_oos_insert_segment(cseg, next);
1558 if (TCP_SEQ_BETWEEN(seqno, prev->tcphdr->seqno+1, next->tcphdr->seqno-1)) {
1564 cseg = tcp_seg_copy(&inseg);
1566 if (TCP_SEQ_GT(prev->tcphdr->seqno + prev->len, seqno)) {
1568 prev->len = (
u16_t)(seqno - prev->tcphdr->seqno);
1572 tcp_oos_insert_segment(cseg, next);
1580 if (next->next ==
NULL &&
1581 TCP_SEQ_GT(seqno, next->tcphdr->seqno)) {
1582 if (TCPH_FLAGS(next->tcphdr) & TCP_FIN) {
1586 next->next = tcp_seg_copy(&inseg);
1587 if (next->next !=
NULL) {
1588 if (TCP_SEQ_GT(next->tcphdr->seqno + next->len, seqno)) {
1590 next->len = (
u16_t)(seqno - next->tcphdr->seqno);
1594 if (TCP_SEQ_GT((
u32_t)tcplen + seqno, pcb->rcv_nxt + (
u32_t)pcb->rcv_wnd)) {
1596 (
"tcp_receive: other end overran receive window" 1597 "seqno %"U32_F
" len %"U16_F" right edge %"U32_F
"\n",
1598 seqno, tcplen, pcb->rcv_nxt + pcb->rcv_wnd));
1599 if (TCPH_FLAGS(next->next->tcphdr) & TCP_FIN) {
1602 TCPH_FLAGS_SET(next->next->tcphdr, TCPH_FLAGS(next->next->tcphdr) & ~TCP_FIN);
1605 next->next->len = (
u16_t)(pcb->rcv_nxt + pcb->rcv_wnd - seqno);
1607 tcplen = TCP_TCPLEN(next->next);
1608 LWIP_ASSERT(
"tcp_receive: segment not trimmed correctly to rcv_wnd\n",
1609 (seqno + tcplen) == (pcb->rcv_nxt + pcb->rcv_wnd));
1618 #if TCP_OOSEQ_MAX_BYTES || TCP_OOSEQ_MAX_PBUFS 1624 for (next = pcb->ooseq; next !=
NULL; prev = next, next = next->next) {
1625 struct pbuf *p = next->p;
1631 tcp_segs_free(next);
1647 tcp_send_empty_ack(pcb);
1652 if (!TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt + pcb->rcv_wnd - 1)) {
1659 tcp_getoptbyte(
void)
1661 if ((tcphdr_opt2 ==
NULL) || (tcp_optidx < tcphdr_opt1len)) {
1662 u8_t* opts = (
u8_t *)tcphdr + TCP_HLEN;
1663 return opts[tcp_optidx++];
1666 return tcphdr_opt2[
idx];
1679 tcp_parseopt(
struct tcp_pcb *pcb)
1683 #if LWIP_TCP_TIMESTAMPS 1688 if (TCPH_HDRLEN(tcphdr) > 0x5) {
1689 u16_t max_c = (TCPH_HDRLEN(tcphdr) - 5) << 2;
1690 for (tcp_optidx = 0; tcp_optidx < max_c; ) {
1691 u8_t opt = tcp_getoptbyte();
1693 case LWIP_TCP_OPT_EOL:
1697 case LWIP_TCP_OPT_NOP:
1701 case LWIP_TCP_OPT_MSS:
1703 if (tcp_getoptbyte() != LWIP_TCP_OPT_LEN_MSS || (tcp_optidx - 2 + LWIP_TCP_OPT_LEN_MSS) > max_c) {
1709 mss = (tcp_getoptbyte() << 8);
1710 mss |= tcp_getoptbyte();
1715 case LWIP_TCP_OPT_WS:
1717 if (tcp_getoptbyte() != LWIP_TCP_OPT_LEN_WS || (tcp_optidx - 2 + LWIP_TCP_OPT_LEN_WS) > max_c) {
1724 if ((
flags & TCP_SYN) && !(pcb->flags & TF_WND_SCALE)) {
1726 data = tcp_getoptbyte();
1727 pcb->snd_scale = data;
1728 if (pcb->snd_scale > 14U) {
1729 pcb->snd_scale = 14U;
1732 pcb->flags |= TF_WND_SCALE;
1735 LWIP_ASSERT(
"window not at default value", pcb->rcv_ann_wnd == TCPWND_MIN16(
TCP_WND));
1736 pcb->rcv_wnd = pcb->rcv_ann_wnd =
TCP_WND;
1740 #if LWIP_TCP_TIMESTAMPS 1741 case LWIP_TCP_OPT_TS:
1743 if (tcp_getoptbyte() != LWIP_TCP_OPT_LEN_TS || (tcp_optidx - 2 + LWIP_TCP_OPT_LEN_TS) > max_c) {
1749 tsval = tcp_getoptbyte();
1750 tsval |= (tcp_getoptbyte() << 8);
1751 tsval |= (tcp_getoptbyte() << 16);
1752 tsval |= (tcp_getoptbyte() << 24);
1753 if (
flags & TCP_SYN) {
1754 pcb->ts_recent =
ntohl(tsval);
1757 pcb->flags |= TF_TIMESTAMP;
1758 }
else if (TCP_SEQ_BETWEEN(pcb->ts_lastacksent, seqno, seqno+tcplen)) {
1759 pcb->ts_recent =
ntohl(tsval);
1762 tcp_optidx += LWIP_TCP_OPT_LEN_TS - 6;
1767 data = tcp_getoptbyte();
1776 tcp_optidx += data - 2;
1783 tcp_trigger_input_pcb_close(
void)
1785 recv_flags |= TF_CLOSED;
u16_t ip_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len, const ip_addr_t *src, const ip_addr_t *dest)
#define MIB2_STATS_INC(x)
#define ip_current_netif()
#define ip_addr_isany(ipaddr)
#define TCP_OOSEQ_MAX_BYTES
u8_t pbuf_header(struct pbuf *p, s16_t header_size_increment)
void pbuf_realloc(struct pbuf *p, u16_t new_len)
#define IF__NETIF_CHECKSUM_ENABLED(netif, chksumflag)
#define ip_addr_isbroadcast(addr, netif)
void memp_free(memp_t type, void *mem)
#define TCP_OOSEQ_MAX_PBUFS
#define ip_current_dest_addr()
#define ip_addr_ismulticast(ipaddr)
u8_t pbuf_free(struct pbuf *p)
#define ip_addr_copy(dest, src)
#define ip_addr_cmp(addr1, addr2)
#define LWIP_ASSERT(message, assertion)
#define PBUF_FLAG_TCP_FIN
u8_t pbuf_clen(struct pbuf *p)
#define ip_current_src_addr()
void pbuf_cat(struct pbuf *h, struct pbuf *t)
#define IP_PCB_IPVER_INPUT_MATCH(pcb)
#define LWIP_DEBUGF(debug, message)
#define LWIP_UNUSED_ARG(x)