509 |
/*if (TCP_SEQ_GEQ(seqno, pcb->rcv_nxt) && |
/*if (TCP_SEQ_GEQ(seqno, pcb->rcv_nxt) && |
510 |
TCP_SEQ_LEQ(seqno, pcb->rcv_nxt + pcb->rcv_wnd)) { |
TCP_SEQ_LEQ(seqno, pcb->rcv_nxt + pcb->rcv_wnd)) { |
511 |
*/ |
*/ |
512 |
if(TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt+pcb->rcv_wnd)){ |
if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt+pcb->rcv_wnd)) { |
513 |
acceptable = 1; |
acceptable = 1; |
514 |
} |
} |
515 |
} |
} |
538 |
case SYN_SENT: |
case SYN_SENT: |
539 |
LWIP_DEBUGF(TCP_INPUT_DEBUG, ("SYN-SENT: ackno %lu pcb->snd_nxt %lu unacked %lu\n", ackno, |
LWIP_DEBUGF(TCP_INPUT_DEBUG, ("SYN-SENT: ackno %lu pcb->snd_nxt %lu unacked %lu\n", ackno, |
540 |
pcb->snd_nxt, ntohl(pcb->unacked->tcphdr->seqno))); |
pcb->snd_nxt, ntohl(pcb->unacked->tcphdr->seqno))); |
541 |
|
/* received SYN ACK with expected sequence number? */ |
542 |
if ((flags & TCP_ACK) && (flags & TCP_SYN) |
if ((flags & TCP_ACK) && (flags & TCP_SYN) |
543 |
&& ackno == ntohl(pcb->unacked->tcphdr->seqno) + 1) { |
&& ackno == ntohl(pcb->unacked->tcphdr->seqno) + 1) { |
544 |
pcb->snd_buf ++; |
pcb->snd_buf++; |
545 |
pcb->rcv_nxt = seqno + 1; |
pcb->rcv_nxt = seqno + 1; |
546 |
pcb->lastack = ackno; |
pcb->lastack = ackno; |
547 |
pcb->snd_wnd = tcphdr->wnd; |
pcb->snd_wnd = tcphdr->wnd; |
562 |
TCP_EVENT_CONNECTED(pcb, ERR_OK, err); |
TCP_EVENT_CONNECTED(pcb, ERR_OK, err); |
563 |
tcp_ack(pcb); |
tcp_ack(pcb); |
564 |
} |
} |
565 |
|
/* received ACK? possibly a half-open connection */ |
566 |
|
else if (flags & TCP_ACK) { |
567 |
|
/* send a RST to bring the other side in a non-synchronized state. */ |
568 |
|
tcp_rst(ackno, seqno + tcplen, &(iphdr->dest), &(iphdr->src), |
569 |
|
tcphdr->dest, tcphdr->src); |
570 |
|
} |
571 |
break; |
break; |
572 |
case SYN_RCVD: |
case SYN_RCVD: |
573 |
if (flags & TCP_ACK && |
if (flags & TCP_ACK && |
574 |
!(flags & TCP_RST)) { |
!(flags & TCP_RST)) { |
575 |
/*if (TCP_SEQ_LT(pcb->lastack, ackno) && |
/* expected ACK number? */ |
576 |
TCP_SEQ_LEQ(ackno, pcb->snd_nxt)) { */ |
if (TCP_SEQ_BETWEEN(ackno, pcb->lastack+1, pcb->snd_nxt)) { |
|
if(TCP_SEQ_BETWEEN(ackno, pcb->lastack+1, pcb->snd_nxt)){ |
|
577 |
pcb->state = ESTABLISHED; |
pcb->state = ESTABLISHED; |
578 |
LWIP_DEBUGF(TCP_DEBUG, ("TCP connection established %u -> %u.\n", inseg.tcphdr->src, inseg.tcphdr->dest)); |
LWIP_DEBUGF(TCP_DEBUG, ("TCP connection established %u -> %u.\n", inseg.tcphdr->src, inseg.tcphdr->dest)); |
579 |
#if LWIP_CALLBACK_API |
#if LWIP_CALLBACK_API |
592 |
tcp_receive(pcb); |
tcp_receive(pcb); |
593 |
pcb->cwnd = pcb->mss; |
pcb->cwnd = pcb->mss; |
594 |
} |
} |
595 |
|
/* incorrect ACK number */ |
596 |
|
else { |
597 |
|
/* send RST */ |
598 |
|
tcp_rst(ackno, seqno + tcplen, &(iphdr->dest), &(iphdr->src), |
599 |
|
tcphdr->dest, tcphdr->src); |
600 |
|
} |
601 |
} |
} |
602 |
break; |
break; |
603 |
case CLOSE_WAIT: |
case CLOSE_WAIT: |
614 |
if (flags & TCP_FIN) { |
if (flags & TCP_FIN) { |
615 |
if (flags & TCP_ACK && ackno == pcb->snd_nxt) { |
if (flags & TCP_ACK && ackno == pcb->snd_nxt) { |
616 |
LWIP_DEBUGF(TCP_DEBUG, |
LWIP_DEBUGF(TCP_DEBUG, |
617 |
("TCP connection closed %d -> %d.\n", inseg.tcphdr->src, inseg.tcphdr->dest)); |
("TCP connection closed %d -> %d.\n", inseg.tcphdr->src, inseg.tcphdr->dest)); |
618 |
tcp_ack_now(pcb); |
tcp_ack_now(pcb); |
619 |
tcp_pcb_purge(pcb); |
tcp_pcb_purge(pcb); |
620 |
TCP_RMV(&tcp_active_pcbs, pcb); |
TCP_RMV(&tcp_active_pcbs, pcb); |
621 |
pcb->state = TIME_WAIT; |
pcb->state = TIME_WAIT; |
622 |
TCP_REG(&tcp_tw_pcbs, pcb); |
TCP_REG(&tcp_tw_pcbs, pcb); |
623 |
} else { |
} else { |
624 |
tcp_ack_now(pcb); |
tcp_ack_now(pcb); |
625 |
pcb->state = CLOSING; |
pcb->state = CLOSING; |
626 |
} |
} |
627 |
} else if (flags & TCP_ACK && ackno == pcb->snd_nxt) { |
} else if (flags & TCP_ACK && ackno == pcb->snd_nxt) { |
628 |
pcb->state = FIN_WAIT_2; |
pcb->state = FIN_WAIT_2; |
661 |
default: |
default: |
662 |
break; |
break; |
663 |
} |
} |
|
|
|
664 |
return ERR_OK; |
return ERR_OK; |
665 |
} |
} |
666 |
|
|