Bugfix by Raimondas Sasnauskas: TCP SYN duplicate receptions in the SYN_RCVD state was not correctly handled
This commit is contained in:
parent
acd40454d7
commit
9bb149ca13
|
@ -41,7 +41,7 @@
|
||||||
*
|
*
|
||||||
* This file is part of the uIP TCP/IP stack.
|
* This file is part of the uIP TCP/IP stack.
|
||||||
*
|
*
|
||||||
* $Id: uip.c,v 1.21 2010/02/04 21:33:51 oliverschmidt Exp $
|
* $Id: uip.c,v 1.22 2010/02/15 18:03:07 adamdunkels Exp $
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -1454,9 +1454,13 @@ uip_process(u8_t flag)
|
||||||
|
|
||||||
/* First, check if the sequence number of the incoming packet is
|
/* First, check if the sequence number of the incoming packet is
|
||||||
what we're expecting next. If not, we send out an ACK with the
|
what we're expecting next. If not, we send out an ACK with the
|
||||||
correct numbers in. */
|
correct numbers in, unless we are in the SYN_RCVD state and
|
||||||
if(!(((uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_SYN_SENT) &&
|
receive a SYN, in which case we should retransmit our SYNACK
|
||||||
((BUF->flags & TCP_CTL) == (TCP_SYN | TCP_ACK)))) {
|
(which is done futher down). */
|
||||||
|
if(!((((uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_SYN_SENT) &&
|
||||||
|
((BUF->flags & TCP_CTL) == (TCP_SYN | TCP_ACK))) ||
|
||||||
|
(((uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_SYN_RCVD) &&
|
||||||
|
((BUF->flags & TCP_CTL) == TCP_SYN)))) {
|
||||||
if((uip_len > 0 || ((BUF->flags & (TCP_SYN | TCP_FIN)) != 0)) &&
|
if((uip_len > 0 || ((BUF->flags & (TCP_SYN | TCP_FIN)) != 0)) &&
|
||||||
(BUF->seqno[0] != uip_connr->rcv_nxt[0] ||
|
(BUF->seqno[0] != uip_connr->rcv_nxt[0] ||
|
||||||
BUF->seqno[1] != uip_connr->rcv_nxt[1] ||
|
BUF->seqno[1] != uip_connr->rcv_nxt[1] ||
|
||||||
|
@ -1532,6 +1536,10 @@ uip_process(u8_t flag)
|
||||||
UIP_APPCALL();
|
UIP_APPCALL();
|
||||||
goto appsend;
|
goto appsend;
|
||||||
}
|
}
|
||||||
|
/* We need to retransmit the SYNACK */
|
||||||
|
if((BUF->flags & TCP_CTL) == TCP_SYN) {
|
||||||
|
goto tcp_send_synack;
|
||||||
|
}
|
||||||
goto drop;
|
goto drop;
|
||||||
#if UIP_ACTIVE_OPEN
|
#if UIP_ACTIVE_OPEN
|
||||||
case UIP_SYN_SENT:
|
case UIP_SYN_SENT:
|
||||||
|
|
|
@ -41,7 +41,7 @@
|
||||||
*
|
*
|
||||||
* This file is part of the uIP TCP/IP stack.
|
* This file is part of the uIP TCP/IP stack.
|
||||||
*
|
*
|
||||||
* $Id: uip6.c,v 1.11 2010/02/04 21:33:51 oliverschmidt Exp $
|
* $Id: uip6.c,v 1.12 2010/02/15 18:03:08 adamdunkels Exp $
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -1678,9 +1678,13 @@ uip_process(u8_t flag)
|
||||||
|
|
||||||
/* First, check if the sequence number of the incoming packet is
|
/* First, check if the sequence number of the incoming packet is
|
||||||
what we're expecting next. If not, we send out an ACK with the
|
what we're expecting next. If not, we send out an ACK with the
|
||||||
correct numbers in. */
|
correct numbers in, unless we are in the SYN_RCVD state and
|
||||||
if(!(((uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_SYN_SENT) &&
|
receive a SYN, in which case we should retransmit our SYNACK
|
||||||
((UIP_TCP_BUF->flags & TCP_CTL) == (TCP_SYN | TCP_ACK)))) {
|
(which is done futher down). */
|
||||||
|
if(!((((uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_SYN_SENT) &&
|
||||||
|
((BUF->flags & TCP_CTL) == (TCP_SYN | TCP_ACK))) ||
|
||||||
|
(((uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_SYN_RCVD) &&
|
||||||
|
((BUF->flags & TCP_CTL) == TCP_SYN)))) {
|
||||||
if((uip_len > 0 || ((UIP_TCP_BUF->flags & (TCP_SYN | TCP_FIN)) != 0)) &&
|
if((uip_len > 0 || ((UIP_TCP_BUF->flags & (TCP_SYN | TCP_FIN)) != 0)) &&
|
||||||
(UIP_TCP_BUF->seqno[0] != uip_connr->rcv_nxt[0] ||
|
(UIP_TCP_BUF->seqno[0] != uip_connr->rcv_nxt[0] ||
|
||||||
UIP_TCP_BUF->seqno[1] != uip_connr->rcv_nxt[1] ||
|
UIP_TCP_BUF->seqno[1] != uip_connr->rcv_nxt[1] ||
|
||||||
|
@ -1756,6 +1760,10 @@ uip_process(u8_t flag)
|
||||||
UIP_APPCALL();
|
UIP_APPCALL();
|
||||||
goto appsend;
|
goto appsend;
|
||||||
}
|
}
|
||||||
|
/* We need to retransmit the SYNACK */
|
||||||
|
if((BUF->flags & TCP_CTL) == TCP_SYN) {
|
||||||
|
goto tcp_send_synack;
|
||||||
|
}
|
||||||
goto drop;
|
goto drop;
|
||||||
#if UIP_ACTIVE_OPEN
|
#if UIP_ACTIVE_OPEN
|
||||||
case UIP_SYN_SENT:
|
case UIP_SYN_SENT:
|
||||||
|
|
Loading…
Reference in a new issue