00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057 #include "lwip/def.h"
00058 #include "lwip/opt.h"
00059
00060 #include "lwip/netif.h"
00061 #include "lwip/mem.h"
00062 #include "lwip/memp.h"
00063
00064 #include "lwip/inet.h"
00065 #include "lwip/tcp.h"
00066
00067 #include "lwip/stats.h"
00068
00069 #define htons HTONS
00070 #define htonl HTONL
00071
00072
00073
00074 #if LWIP_TCP
00075
00076
00077
00078 static struct tcp_seg inseg;
00079 static struct tcp_hdr *tcphdr;
00080 static struct ip_hdr *iphdr;
00081 static u32_t seqno, ackno;
00082 static u8_t flags;
00083 static u16_t tcplen;
00084
00085 static u8_t recv_flags;
00086 static struct pbuf *recv_data;
00087
00088 struct tcp_pcb *tcp_input_pcb;
00089
00090
00091 static err_t tcp_process(struct tcp_pcb *pcb);
00092 static void tcp_receive(struct tcp_pcb *pcb);
00093 static void tcp_parseopt(struct tcp_pcb *pcb);
00094
00095 static err_t tcp_listen_input(struct tcp_pcb_listen *pcb);
00096 static err_t tcp_timewait_input(struct tcp_pcb *pcb);
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107 void
00108 tcp_input(struct pbuf *p, struct netif *inp)
00109 {
00110 struct tcp_pcb *pcb, *prev;
00111 struct tcp_pcb_listen *lpcb;
00112 u8_t offset;
00113 err_t err;
00114
00115
00116
00117
00118
00119 #ifdef TCP_STATS
00120 ++lwip_stats.tcp.recv;
00121 #endif
00122
00123 iphdr = p->payload;
00124 tcphdr = (struct tcp_hdr *)((u8_t *)p->payload + IPH_HL(iphdr) * 4);
00125
00126 pbuf_header(p, -((s16_t)(IPH_HL(iphdr) * 4)));
00127
00128
00129 if(ip_addr_isbroadcast(&(iphdr->dest), &(inp->netmask)) ||
00130 ip_addr_ismulticast(&(iphdr->dest))) {
00131 pbuf_free(p);
00132 return;
00133 }
00134
00135
00136 if(inet_chksum_pseudo(p, (struct ip_addr *)&(iphdr->src),
00137 (struct ip_addr *)&(iphdr->dest),
00138 IP_PROTO_TCP, p->tot_len) != 0) {
00139 DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: packet discarded due to failing checksum 0x%04x\n", inet_chksum_pseudo(p, (struct ip_addr *)&(iphdr->src),
00140 (struct ip_addr *)&(iphdr->dest),
00141 IP_PROTO_TCP, p->tot_len)));
00142 #if TCP_DEBUG
00143 tcp_debug_print(tcphdr);
00144 #endif
00145 #ifdef TCP_STATS
00146 ++lwip_stats.tcp.chkerr;
00147 ++lwip_stats.tcp.drop;
00148 #endif
00149
00150 pbuf_free(p);
00151 return;
00152 }
00153
00154
00155
00156
00157 offset = TCPH_OFFSET(tcphdr) >> 4;
00158 pbuf_header(p, -(offset * 4));
00159
00160
00161 tcphdr->src = ntohs(tcphdr->src);
00162 tcphdr->dest = ntohs(tcphdr->dest);
00163 seqno = tcphdr->seqno = ntohl(tcphdr->seqno);
00164 ackno = tcphdr->ackno = ntohl(tcphdr->ackno);
00165 tcphdr->wnd = ntohs(tcphdr->wnd);
00166
00167 flags = TCPH_FLAGS(tcphdr) & TCP_FLAGS;
00168 tcplen = p->tot_len + ((flags & TCP_FIN || flags & TCP_SYN)? 1: 0);
00169
00170
00171
00172 prev = NULL;
00173 for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
00174 LWIP_ASSERT("tcp_input: active pcb->state != CLOSED", pcb->state != CLOSED);
00175 LWIP_ASSERT("tcp_input: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT);
00176 LWIP_ASSERT("tcp_input: active pcb->state != LISTEN", pcb->state != LISTEN);
00177 if(pcb->remote_port == tcphdr->src &&
00178 pcb->local_port == tcphdr->dest &&
00179 ip_addr_cmp(&(pcb->remote_ip), &(iphdr->src)) &&
00180 ip_addr_cmp(&(pcb->local_ip), &(iphdr->dest))) {
00181
00182
00183
00184
00185 LWIP_ASSERT("tcp_input: pcb->next != pcb (before cache)", pcb->next != pcb);
00186 if(prev != NULL) {
00187 prev->next = pcb->next;
00188 pcb->next = tcp_active_pcbs;
00189 tcp_active_pcbs = pcb;
00190 }
00191 LWIP_ASSERT("tcp_input: pcb->next != pcb (after cache)", pcb->next != pcb);
00192 break;
00193 }
00194 prev = pcb;
00195 }
00196
00197 if (pcb == NULL) {
00198
00199
00200
00201 for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
00202 LWIP_ASSERT("tcp_input: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
00203 if(pcb->remote_port == tcphdr->src &&
00204 pcb->local_port == tcphdr->dest &&
00205 ip_addr_cmp(&(pcb->remote_ip), &(iphdr->src)) &&
00206 ip_addr_cmp(&(pcb->local_ip), &(iphdr->dest))) {
00207
00208
00209
00210 DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: packed for TIME_WAITing connection.\n"));
00211 tcp_timewait_input(pcb);
00212 pbuf_free(p);
00213 return;
00214 }
00215 }
00216
00217
00218
00219 prev = NULL;
00220 for(lpcb = tcp_listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {
00221 if((ip_addr_isany(&(lpcb->local_ip)) ||
00222 ip_addr_cmp(&(lpcb->local_ip), &(iphdr->dest))) &&
00223 lpcb->local_port == tcphdr->dest) {
00224
00225
00226
00227 if(prev != NULL) {
00228 ((struct tcp_pcb_listen *)prev)->next = lpcb->next;
00229
00230 lpcb->next = tcp_listen_pcbs;
00231
00232 tcp_listen_pcbs = lpcb;
00233 }
00234
00235 DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: packed for LISTENing connection.\n"));
00236 tcp_listen_input(lpcb);
00237 pbuf_free(p);
00238 return;
00239 }
00240 prev = (struct tcp_pcb *)lpcb;
00241 }
00242 }
00243
00244 #if TCP_INPUT_DEBUG
00245 DEBUGF(TCP_INPUT_DEBUG, ("+-+-+-+-+-+-+-+-+-+-+-+-+-+- tcp_input: flags "));
00246 tcp_debug_print_flags(TCPH_FLAGS(tcphdr));
00247 DEBUGF(TCP_INPUT_DEBUG, ("-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n"));
00248 #endif
00249
00250
00251 if(pcb != NULL) {
00252
00253 #if TCP_INPUT_DEBUG
00254 #if TCP_DEBUG
00255 tcp_debug_print_state(pcb->state);
00256 #endif
00257 #endif
00258
00259
00260 inseg.next = NULL;
00261 inseg.len = p->tot_len;
00262 inseg.dataptr = p->payload;
00263 inseg.p = p;
00264 inseg.tcphdr = tcphdr;
00265
00266 recv_data = NULL;
00267 recv_flags = 0;
00268
00269 tcp_input_pcb = pcb;
00270 err = tcp_process(pcb);
00271 tcp_input_pcb = NULL;
00272
00273
00274 if(err != ERR_ABRT) {
00275 if(recv_flags & TF_RESET) {
00276
00277
00278
00279
00280 TCP_EVENT_ERR(pcb->errf, pcb->callback_arg, ERR_RST);
00281 tcp_pcb_remove(&tcp_active_pcbs, pcb);
00282 memp_free(MEMP_TCP_PCB, pcb);
00283 } else if(recv_flags & TF_CLOSED) {
00284
00285
00286 tcp_pcb_remove(&tcp_active_pcbs, pcb);
00287 memp_free(MEMP_TCP_PCB, pcb);
00288 } else {
00289 err = ERR_OK;
00290
00291
00292
00293 if(pcb->acked > 0) {
00294 TCP_EVENT_SENT(pcb, pcb->acked, err);
00295 }
00296
00297 if(recv_data != NULL) {
00298
00299 TCP_EVENT_RECV(pcb, recv_data, ERR_OK, err);
00300 }
00301
00302
00303
00304 if(recv_flags & TF_GOT_FIN) {
00305 TCP_EVENT_RECV(pcb, NULL, ERR_OK, err);
00306 }
00307
00308 if(err == ERR_OK) {
00309 tcp_output(pcb);
00310 }
00311 }
00312 }
00313
00314
00315
00316
00317
00318
00319
00320 pbuf_free(inseg.p);
00321 #if TCP_INPUT_DEBUG
00322 #if TCP_DEBUG
00323 tcp_debug_print_state(pcb->state);
00324 #endif
00325 #endif
00326
00327 } else {
00328
00329
00330 DEBUGF(TCP_RST_DEBUG, ("tcp_input: no PCB match found, resetting.\n"));
00331 if(!(TCPH_FLAGS(tcphdr) & TCP_RST)) {
00332 #ifdef TCP_STATS
00333 ++lwip_stats.tcp.proterr;
00334 ++lwip_stats.tcp.drop;
00335 #endif
00336 tcp_rst(ackno, seqno + tcplen,
00337 &(iphdr->dest), &(iphdr->src),
00338 tcphdr->dest, tcphdr->src);
00339 }
00340 pbuf_free(p);
00341 }
00342
00343 LWIP_ASSERT("tcp_input: tcp_pcbs_sane()", tcp_pcbs_sane());
00344
00345 }
00346
00347
00348
00349
00350
00351
00352
00353 static err_t
00354 tcp_listen_input(struct tcp_pcb_listen *pcb)
00355 {
00356 struct tcp_pcb *npcb;
00357 u32_t optdata;
00358
00359
00360
00361 if(flags & TCP_ACK) {
00362
00363
00364 DEBUGF(TCP_RST_DEBUG, ("tcp_listen_input: ACK in LISTEN, sending reset\n"));
00365 tcp_rst(ackno + 1, seqno + tcplen,
00366 &(iphdr->dest), &(iphdr->src),
00367 tcphdr->dest, tcphdr->src);
00368 } else if(flags & TCP_SYN) {
00369 DEBUGF(DEMO_DEBUG, ("TCP connection request %d -> %d.\n", tcphdr->src, tcphdr->dest));
00370 npcb = tcp_alloc(pcb->prio);
00371
00372
00373
00374 if(npcb == NULL) {
00375 DEBUGF(TCP_DEBUG, ("tcp_listen_input: could not allocate PCB\n"));
00376 #ifdef TCP_STATS
00377 ++lwip_stats.tcp.memerr;
00378 #endif
00379 return ERR_MEM;
00380 }
00381
00382 ip_addr_set(&(npcb->local_ip), &(iphdr->dest));
00383 npcb->local_port = pcb->local_port;
00384 ip_addr_set(&(npcb->remote_ip), &(iphdr->src));
00385 npcb->remote_port = tcphdr->src;
00386 npcb->state = SYN_RCVD;
00387 npcb->rcv_nxt = seqno + 1;
00388 npcb->snd_wnd = tcphdr->wnd;
00389 npcb->ssthresh = npcb->snd_wnd;
00390 npcb->snd_wl1 = seqno;
00391 npcb->callback_arg = pcb->callback_arg;
00392 #if LWIP_CALLBACK_API
00393 npcb->accept = pcb->accept;
00394 #endif
00395
00396
00397
00398 TCP_REG(&tcp_active_pcbs, npcb);
00399
00400
00401 tcp_parseopt(npcb);
00402
00403
00404 optdata = htonl(((u32_t)2 << 24) |
00405 ((u32_t)4 << 16) |
00406 (((u32_t)npcb->mss / 256) << 8) |
00407 (npcb->mss & 255));
00408
00409 tcp_enqueue(npcb, NULL, 0, TCP_SYN | TCP_ACK, 0, (u8_t *)&optdata, 4);
00410 return tcp_output(npcb);
00411 }
00412 return ERR_OK;
00413 }
00414
00415
00416
00417
00418
00419
00420
00421 static err_t
00422 tcp_timewait_input(struct tcp_pcb *pcb)
00423 {
00424 if(TCP_SEQ_GT(seqno + tcplen, pcb->rcv_nxt)) {
00425 pcb->rcv_nxt = seqno + tcplen;
00426 }
00427 if(tcplen > 0) {
00428 tcp_ack_now(pcb);
00429 }
00430 return tcp_output(pcb);
00431 }
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441 static err_t
00442 tcp_process(struct tcp_pcb *pcb)
00443 {
00444 struct tcp_seg *rseg;
00445 u8_t acceptable = 0;
00446 err_t err;
00447
00448
00449 err = ERR_OK;
00450
00451
00452 if(flags & TCP_RST) {
00453
00454 if(pcb->state == SYN_SENT) {
00455 if(ackno == pcb->snd_nxt) {
00456 acceptable = 1;
00457 }
00458 } else {
00459 if(TCP_SEQ_GEQ(seqno, pcb->rcv_nxt) &&
00460 TCP_SEQ_LEQ(seqno, pcb->rcv_nxt + pcb->rcv_wnd)) {
00461 acceptable = 1;
00462 }
00463 }
00464
00465 if(acceptable) {
00466 DEBUGF(TCP_INPUT_DEBUG, ("tcp_process: Connection RESET\n"));
00467 LWIP_ASSERT("tcp_input: pcb->state != CLOSED", pcb->state != CLOSED);
00468 recv_flags = TF_RESET;
00469 pcb->flags &= ~TF_ACK_DELAY;
00470 return ERR_RST;
00471 } else {
00472 DEBUGF(TCP_INPUT_DEBUG, ("tcp_process: unacceptable reset seqno %lu rcv_nxt %lu\n",
00473 seqno, pcb->rcv_nxt));
00474 DEBUGF(TCP_DEBUG, ("tcp_process: unacceptable reset seqno %lu rcv_nxt %lu\n",
00475 seqno, pcb->rcv_nxt));
00476 return ERR_OK;
00477 }
00478 }
00479
00480
00481 pcb->tmr = tcp_ticks;
00482
00483
00484 switch(pcb->state) {
00485 case SYN_SENT:
00486 DEBUGF(TCP_INPUT_DEBUG, ("SYN-SENT: ackno %lu pcb->snd_nxt %lu unacked %lu\n", ackno,
00487 pcb->snd_nxt, ntohl(pcb->unacked->tcphdr->seqno)));
00488 if(flags & (TCP_ACK | TCP_SYN) &&
00489 ackno == ntohl(pcb->unacked->tcphdr->seqno) + 1) {
00490 pcb->rcv_nxt = seqno + 1;
00491 pcb->lastack = ackno;
00492 pcb->snd_wnd = pcb->snd_wl1 = tcphdr->wnd;
00493 pcb->state = ESTABLISHED;
00494 pcb->cwnd = pcb->mss;
00495 --pcb->snd_queuelen;
00496 DEBUGF(TCP_QLEN_DEBUG, ("tcp_process: SYN-SENT --queuelen %d\n", pcb->snd_queuelen));
00497 rseg = pcb->unacked;
00498 pcb->unacked = rseg->next;
00499 tcp_seg_free(rseg);
00500
00501
00502 tcp_parseopt(pcb);
00503
00504
00505
00506 TCP_EVENT_CONNECTED(pcb, ERR_OK, err);
00507 tcp_ack(pcb);
00508 }
00509 break;
00510 case SYN_RCVD:
00511 if(flags & TCP_ACK &&
00512 !(flags & TCP_RST)) {
00513 if(TCP_SEQ_LT(pcb->lastack, ackno) &&
00514 TCP_SEQ_LEQ(ackno, pcb->snd_nxt)) {
00515 pcb->state = ESTABLISHED;
00516 DEBUGF(DEMO_DEBUG, ("TCP connection established %d -> %d.\n", inseg.tcphdr->src, inseg.tcphdr->dest));
00517 LWIP_ASSERT("pcb->accept != NULL", pcb->accept != NULL);
00518
00519 TCP_EVENT_ACCEPT(pcb, ERR_OK, err);
00520 if(err != ERR_OK) {
00521
00522
00523 tcp_abort(pcb);
00524 return ERR_ABRT;
00525 }
00526
00527
00528 tcp_receive(pcb);
00529 pcb->cwnd = pcb->mss;
00530 }
00531 }
00532 break;
00533 case CLOSE_WAIT:
00534
00535 case ESTABLISHED:
00536 tcp_receive(pcb);
00537 if(flags & TCP_FIN) {
00538 tcp_ack_now(pcb);
00539 pcb->state = CLOSE_WAIT;
00540 }
00541 break;
00542 case FIN_WAIT_1:
00543 tcp_receive(pcb);
00544 if(flags & TCP_FIN) {
00545 if(flags & TCP_ACK && ackno == pcb->snd_nxt) {
00546 DEBUGF(DEMO_DEBUG,
00547 ("TCP connection closed %d -> %d.\n", inseg.tcphdr->src, inseg.tcphdr->dest));
00548 tcp_ack_now(pcb);
00549 tcp_pcb_purge(pcb);
00550 TCP_RMV(&tcp_active_pcbs, pcb);
00551 pcb->state = TIME_WAIT;
00552 TCP_REG(&tcp_tw_pcbs, pcb);
00553 } else {
00554 tcp_ack_now(pcb);
00555 pcb->state = CLOSING;
00556 }
00557 } else if(flags & TCP_ACK && ackno == pcb->snd_nxt) {
00558 pcb->state = FIN_WAIT_2;
00559 }
00560 break;
00561 case FIN_WAIT_2:
00562 tcp_receive(pcb);
00563 if(flags & TCP_FIN) {
00564 DEBUGF(DEMO_DEBUG, ("TCP connection closed %d -> %d.\n", inseg.tcphdr->src, inseg.tcphdr->dest));
00565 tcp_ack_now(pcb);
00566 tcp_pcb_purge(pcb);
00567 TCP_RMV(&tcp_active_pcbs, pcb);
00568 pcb->state = TIME_WAIT;
00569 TCP_REG(&tcp_tw_pcbs, pcb);
00570 }
00571 break;
00572 case CLOSING:
00573 tcp_receive(pcb);
00574 if(flags & TCP_ACK && ackno == pcb->snd_nxt) {
00575 DEBUGF(DEMO_DEBUG, ("TCP connection closed %d -> %d.\n", inseg.tcphdr->src, inseg.tcphdr->dest));
00576 tcp_ack_now(pcb);
00577 tcp_pcb_purge(pcb);
00578 TCP_RMV(&tcp_active_pcbs, pcb);
00579 pcb->state = TIME_WAIT;
00580 TCP_REG(&tcp_tw_pcbs, pcb);
00581 }
00582 break;
00583 case LAST_ACK:
00584 tcp_receive(pcb);
00585 if(flags & TCP_ACK && ackno == pcb->snd_nxt) {
00586 DEBUGF(DEMO_DEBUG, ("TCP connection closed %d -> %d.\n", inseg.tcphdr->src, inseg.tcphdr->dest));
00587 pcb->state = CLOSED;
00588 recv_flags = TF_CLOSED;
00589 }
00590 break;
00591 default:
00592 break;
00593 }
00594
00595 return ERR_OK;
00596 }
00597
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608
00609
00610 static void
00611 tcp_receive(struct tcp_pcb *pcb)
00612 {
00613 struct tcp_seg *next;
00614 #if TCP_QUEUE_OOSEQ
00615 struct tcp_seg *prev, *cseg;
00616 #endif
00617 struct pbuf *p;
00618 s32_t off;
00619 int m;
00620 u32_t right_wnd_edge;
00621
00622
00623 if(flags & TCP_ACK) {
00624 right_wnd_edge = pcb->snd_wnd + pcb->snd_wl1;
00625
00626
00627 if(TCP_SEQ_LT(pcb->snd_wl1, seqno) ||
00628 (pcb->snd_wl1 == seqno && TCP_SEQ_LT(pcb->snd_wl2, ackno)) ||
00629 (pcb->snd_wl2 == ackno && tcphdr->wnd > pcb->snd_wnd)) {
00630 pcb->snd_wnd = tcphdr->wnd;
00631 pcb->snd_wl1 = seqno;
00632 pcb->snd_wl2 = ackno;
00633 DEBUGF(TCP_WND_DEBUG, ("tcp_receive: window update %lu\n", pcb->snd_wnd));
00634 #if TCP_WND_DEBUG
00635 } else {
00636 if(pcb->snd_wnd != tcphdr->wnd) {
00637 DEBUGF(TCP_WND_DEBUG, ("tcp_receive: no window update lastack %lu snd_max %lu ackno %lu wl1 %lu seqno %lu wl2 %lu\n",
00638 pcb->lastack, pcb->snd_max, ackno, pcb->snd_wl1, seqno, pcb->snd_wl2));
00639 }
00640 #endif
00641 }
00642
00643
00644 if(pcb->lastack == ackno) {
00645 pcb->acked = 0;
00646
00647 if(pcb->snd_wl1 + pcb->snd_wnd == right_wnd_edge){
00648 ++pcb->dupacks;
00649 if(pcb->dupacks >= 3 && pcb->unacked != NULL) {
00650 if(!(pcb->flags & TF_INFR)) {
00651
00652 DEBUGF(TCP_FR_DEBUG, ("tcp_receive: dupacks %d (%lu), fast retransmit %lu\n",
00653 pcb->dupacks, pcb->lastack,
00654 ntohl(pcb->unacked->tcphdr->seqno)));
00655 tcp_rexmit(pcb);
00656
00657 pcb->ssthresh = UMAX((pcb->snd_max -
00658 pcb->lastack) / 2,
00659 2 * pcb->mss);
00660
00661 pcb->cwnd = pcb->ssthresh + 3 * pcb->mss;
00662 pcb->flags |= TF_INFR;
00663 } else {
00664
00665
00666 if((u16_t)(pcb->cwnd + pcb->mss) > pcb->cwnd) {
00667 pcb->cwnd += pcb->mss;
00668 }
00669 }
00670 }
00671 } else {
00672 DEBUGF(TCP_FR_DEBUG, ("tcp_receive: dupack averted %lu %lu\n",
00673 pcb->snd_wl1 + pcb->snd_wnd, right_wnd_edge));
00674 }
00675 } else if(TCP_SEQ_LT(pcb->lastack, ackno) &&
00676 TCP_SEQ_LEQ(ackno, pcb->snd_max)) {
00677
00678
00679
00680
00681
00682 if(pcb->flags & TF_INFR) {
00683 pcb->flags &= ~TF_INFR;
00684 pcb->cwnd = pcb->ssthresh;
00685 }
00686
00687
00688 pcb->nrtx = 0;
00689
00690
00691 pcb->rto = (pcb->sa >> 3) + pcb->sv;
00692
00693
00694 pcb->acked = ackno - pcb->lastack;
00695 pcb->snd_buf += pcb->acked;
00696
00697
00698 pcb->dupacks = 0;
00699 pcb->lastack = ackno;
00700
00701
00702
00703 if(pcb->state >= ESTABLISHED) {
00704 if(pcb->cwnd < pcb->ssthresh) {
00705 if((u16_t)(pcb->cwnd + pcb->mss) > pcb->cwnd) {
00706 pcb->cwnd += pcb->mss;
00707 }
00708 DEBUGF(TCP_CWND_DEBUG, ("tcp_receive: slow start cwnd %u\n", pcb->cwnd));
00709 } else {
00710 u16_t new_cwnd = (pcb->cwnd + pcb->mss * pcb->mss / pcb->cwnd);
00711 if(new_cwnd > pcb->cwnd) {
00712 pcb->cwnd = new_cwnd;
00713 }
00714 DEBUGF(TCP_CWND_DEBUG, ("tcp_receive: congestion avoidance cwnd %u\n", pcb->cwnd));
00715 }
00716 }
00717 DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: ACK for %lu, unacked->seqno %lu:%lu\n",
00718 ackno,
00719 pcb->unacked != NULL?
00720 ntohl(pcb->unacked->tcphdr->seqno): 0,
00721 pcb->unacked != NULL?
00722 ntohl(pcb->unacked->tcphdr->seqno) + TCP_TCPLEN(pcb->unacked): 0));
00723
00724
00725
00726 while(pcb->unacked != NULL &&
00727 TCP_SEQ_LEQ(ntohl(pcb->unacked->tcphdr->seqno) +
00728 TCP_TCPLEN(pcb->unacked), ackno)) {
00729 DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: removing %lu:%lu from pcb->unacked\n",
00730 ntohl(pcb->unacked->tcphdr->seqno),
00731 ntohl(pcb->unacked->tcphdr->seqno) +
00732 TCP_TCPLEN(pcb->unacked)));
00733
00734 next = pcb->unacked;
00735 pcb->unacked = pcb->unacked->next;
00736
00737 DEBUGF(TCP_QLEN_DEBUG, ("tcp_receive: queuelen %d ... ", pcb->snd_queuelen));
00738 pcb->snd_queuelen -= pbuf_clen(next->p);
00739 tcp_seg_free(next);
00740
00741 DEBUGF(TCP_QLEN_DEBUG, ("%d (after freeing unacked)\n", pcb->snd_queuelen));
00742 if(pcb->snd_queuelen != 0) {
00743 LWIP_ASSERT("tcp_receive: valid queue length", pcb->unacked != NULL ||
00744 pcb->unsent != NULL);
00745 }
00746 }
00747 pcb->polltmr = 0;
00748 }
00749
00750
00751
00752
00753
00754
00755
00756 while(pcb->unsent != NULL &&
00757 TCP_SEQ_LEQ(ntohl(pcb->unsent->tcphdr->seqno) + TCP_TCPLEN(pcb->unsent),
00758 ackno) &&
00759 TCP_SEQ_LEQ(ackno, pcb->snd_max)) {
00760 DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: removing %lu:%lu from pcb->unsent\n",
00761 ntohl(pcb->unsent->tcphdr->seqno),
00762 ntohl(pcb->unsent->tcphdr->seqno) +
00763 TCP_TCPLEN(pcb->unsent)));
00764
00765 next = pcb->unsent;
00766 pcb->unsent = pcb->unsent->next;
00767 DEBUGF(TCP_QLEN_DEBUG, ("tcp_receive: queuelen %d ... ", pcb->snd_queuelen));
00768 pcb->snd_queuelen -= pbuf_clen(next->p);
00769 tcp_seg_free(next);
00770 DEBUGF(TCP_QLEN_DEBUG, ("%d (after freeing unsent)\n", pcb->snd_queuelen));
00771 if(pcb->snd_queuelen != 0) {
00772 LWIP_ASSERT("tcp_receive: valid queue length", pcb->unacked != NULL ||
00773 pcb->unsent != NULL);
00774 }
00775
00776 if(pcb->unsent != NULL) {
00777 pcb->snd_nxt = htonl(pcb->unsent->tcphdr->seqno);
00778 }
00779 }
00780
00781
00782
00783 DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: pcb->rttest %d rtseq %lu ackno %lu\n",
00784 pcb->rttest, pcb->rtseq, ackno));
00785
00786
00787
00788
00789 if(pcb->rttest && TCP_SEQ_LT(pcb->rtseq, ackno)) {
00790 m = tcp_ticks - pcb->rttest;
00791
00792 DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: experienced rtt %d ticks (%d msec).\n",
00793 m, m * TCP_SLOW_INTERVAL));
00794
00795
00796 m = m - (pcb->sa >> 3);
00797 pcb->sa += m;
00798 if(m < 0) {
00799 m = -m;
00800 }
00801 m = m - (pcb->sv >> 2);
00802 pcb->sv += m;
00803 pcb->rto = (pcb->sa >> 3) + pcb->sv;
00804
00805 DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: RTO %d (%d miliseconds)\n",
00806 pcb->rto, pcb->rto * TCP_SLOW_INTERVAL));
00807
00808 pcb->rttest = 0;
00809 }
00810 }
00811
00812
00813
00814 if(tcplen > 0) {
00815
00816
00817
00818
00819
00820
00821
00822
00823
00824
00825
00826
00827
00828
00829
00830
00831
00832
00833
00834
00835
00836
00837
00838
00839
00840
00841
00842
00843 if(TCP_SEQ_LT(seqno, pcb->rcv_nxt)){
00844 if(TCP_SEQ_LT(pcb->rcv_nxt, seqno + tcplen)) {
00845
00846
00847
00848
00849
00850
00851
00852
00853
00854
00855
00856
00857
00858
00859
00860
00861
00862
00863
00864 off = pcb->rcv_nxt - seqno;
00865 if(inseg.p->len < off) {
00866 p = inseg.p;
00867 while(p->len < off) {
00868 off -= p->len;
00869 inseg.p->tot_len -= p->len;
00870 p->len = 0;
00871 p = p->next;
00872 }
00873 pbuf_header(p, -off);
00874 } else {
00875 pbuf_header(inseg.p, -off);
00876 }
00877 inseg.dataptr = inseg.p->payload;
00878 inseg.len -= pcb->rcv_nxt - seqno;
00879 inseg.tcphdr->seqno = seqno = pcb->rcv_nxt;
00880 }
00881 else{
00882
00883
00884
00885 DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: duplicate seqno %lu\n", seqno));
00886 tcp_ack_now(pcb);
00887 }
00888 }
00889
00890
00891
00892
00893 if(TCP_SEQ_GEQ(seqno, pcb->rcv_nxt) &&
00894 TCP_SEQ_LT(seqno, pcb->rcv_nxt + pcb->rcv_wnd)) {
00895 if(pcb->rcv_nxt == seqno) {
00896
00897
00898
00899 #if TCP_QUEUE_OOSEQ
00900 if(pcb->ooseq != NULL &&
00901 TCP_SEQ_LEQ(pcb->ooseq->tcphdr->seqno, seqno + inseg.len)) {
00902
00903
00904 inseg.len = pcb->ooseq->tcphdr->seqno - seqno;
00905 pbuf_realloc(inseg.p, inseg.len);
00906 }
00907 #endif
00908
00909 tcplen = TCP_TCPLEN(&inseg);
00910
00911 pcb->rcv_nxt += tcplen;
00912
00913
00914 if(pcb->rcv_wnd < tcplen) {
00915 pcb->rcv_wnd = 0;
00916 } else {
00917 pcb->rcv_wnd -= tcplen;
00918 }
00919
00920
00921
00922
00923
00924
00925
00926
00927
00928
00929 if(inseg.p->tot_len > 0) {
00930 recv_data = inseg.p;
00931
00932
00933
00934 inseg.p = NULL;
00935 }
00936 if(TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) {
00937 DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: received FIN."));
00938 recv_flags = TF_GOT_FIN;
00939 }
00940
00941 #if TCP_QUEUE_OOSEQ
00942
00943
00944 while(pcb->ooseq != NULL &&
00945 pcb->ooseq->tcphdr->seqno == pcb->rcv_nxt) {
00946
00947 cseg = pcb->ooseq;
00948 seqno = pcb->ooseq->tcphdr->seqno;
00949
00950 pcb->rcv_nxt += TCP_TCPLEN(cseg);
00951 if(pcb->rcv_wnd < TCP_TCPLEN(cseg)) {
00952 pcb->rcv_wnd = 0;
00953 } else {
00954 pcb->rcv_wnd -= TCP_TCPLEN(cseg);
00955 }
00956 if(cseg->p->tot_len > 0) {
00957
00958
00959 if(recv_data) {
00960 pbuf_chain(recv_data, cseg->p);
00961 } else {
00962 recv_data = cseg->p;
00963 }
00964 cseg->p = NULL;
00965 }
00966 if(flags & TCP_FIN) {
00967 DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: dequeued FIN."));
00968 recv_flags = TF_GOT_FIN;
00969 }
00970
00971
00972 pcb->ooseq = cseg->next;
00973 tcp_seg_free(cseg);
00974 }
00975 #endif
00976
00977
00978
00979 tcp_ack(pcb);
00980
00981 } else {
00982
00983 tcp_ack_now(pcb);
00984 #if TCP_QUEUE_OOSEQ
00985
00986 if(pcb->ooseq == NULL) {
00987 pcb->ooseq = tcp_seg_copy(&inseg);
00988 } else {
00989
00990
00991
00992
00993
00994
00995
00996
00997
00998
00999
01000
01001 prev = NULL;
01002 for(next = pcb->ooseq; next != NULL; next = next->next) {
01003 if(seqno == next->tcphdr->seqno) {
01004
01005
01006
01007
01008 if(inseg.len > next->len) {
01009
01010
01011
01012 cseg = tcp_seg_copy(&inseg);
01013 if(cseg != NULL) {
01014 cseg->next = next->next;
01015 if(prev != NULL) {
01016 prev->next = cseg;
01017 } else {
01018 pcb->ooseq = cseg;
01019 }
01020 }
01021 break;
01022 } else {
01023
01024
01025
01026 break;
01027 }
01028 } else {
01029 if(prev == NULL) {
01030 if(TCP_SEQ_LT(seqno, next->tcphdr->seqno)) {
01031
01032
01033
01034
01035
01036 if(TCP_SEQ_GT(seqno + inseg.len, next->tcphdr->seqno)) {
01037
01038 inseg.len = next->tcphdr->seqno - seqno;
01039 pbuf_realloc(inseg.p, inseg.len);
01040 }
01041 cseg = tcp_seg_copy(&inseg);
01042 if(cseg != NULL) {
01043 cseg->next = next;
01044 pcb->ooseq = cseg;
01045 }
01046 break;
01047 }
01048 } else if(TCP_SEQ_LT(prev->tcphdr->seqno, seqno) &&
01049 TCP_SEQ_LT(seqno, next->tcphdr->seqno)) {
01050
01051
01052
01053
01054
01055 if(TCP_SEQ_GT(seqno + inseg.len, next->tcphdr->seqno)) {
01056
01057 inseg.len = next->tcphdr->seqno - seqno;
01058 pbuf_realloc(inseg.p, inseg.len);
01059 }
01060
01061 cseg = tcp_seg_copy(&inseg);
01062 if(cseg != NULL) {
01063 cseg->next = next;
01064 prev->next = cseg;
01065 if(TCP_SEQ_GT(prev->tcphdr->seqno + prev->len, seqno)) {
01066
01067 prev->len = seqno - prev->tcphdr->seqno;
01068 pbuf_realloc(prev->p, prev->len);
01069 }
01070 }
01071 break;
01072 }
01073
01074
01075
01076 if(next->next == NULL &&
01077 TCP_SEQ_GT(seqno, next->tcphdr->seqno)) {
01078 next->next = tcp_seg_copy(&inseg);
01079 if(next->next != NULL) {
01080 if(TCP_SEQ_GT(next->tcphdr->seqno + next->len, seqno)) {
01081
01082 next->len = seqno - next->tcphdr->seqno;
01083 pbuf_realloc(next->p, next->len);
01084 }
01085 }
01086 break;
01087 }
01088 }
01089 prev = next;
01090 }
01091 }
01092 #endif
01093
01094 }
01095 }
01096 } else {
01097
01098
01099 if(TCP_SEQ_GT(pcb->rcv_nxt, seqno) ||
01100 TCP_SEQ_GEQ(seqno, pcb->rcv_nxt + pcb->rcv_wnd)) {
01101 tcp_ack_now(pcb);
01102 }
01103 }
01104 }
01105
01106
01107
01108
01109
01110
01111
01112
01113
01114 static void
01115 tcp_parseopt(struct tcp_pcb *pcb)
01116 {
01117 u8_t c;
01118 u8_t *opts, opt;
01119 u16_t mss;
01120
01121 opts = (u8_t *)tcphdr + TCP_HLEN;
01122
01123
01124 if((TCPH_OFFSET(tcphdr) & 0xf0) > 0x50) {
01125 for(c = 0; c < ((TCPH_OFFSET(tcphdr) >> 4) - 5) << 2 ;) {
01126 opt = opts[c];
01127 if(opt == 0x00) {
01128
01129 break;
01130 } else if(opt == 0x01) {
01131 ++c;
01132
01133 } else if(opt == 0x02 &&
01134 opts[c + 1] == 0x04) {
01135
01136 mss = (opts[c + 2] << 8) | opts[c + 3];
01137 pcb->mss = mss > TCP_MSS? TCP_MSS: mss;
01138
01139
01140 break;
01141 } else {
01142 if(opts[c + 1] == 0) {
01143
01144
01145 break;
01146 }
01147
01148
01149 c += opts[c + 1];
01150 }
01151 }
01152 }
01153 }
01154 #endif
01155
01156