lwip-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[lwip-users] TCP 2.0.2 pcb->snd_nxt is not updated somewhere?


From: Simonas Kazlauskas
Subject: [lwip-users] TCP 2.0.2 pcb->snd_nxt is not updated somewhere?
Date: Mon, 7 Aug 2017 12:43:00 +0300
User-agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.2.1

Hi all,

I've been using lwIP 2.0.2 branch as a base my networking stack. I implemented a device driver and am using a tcpip thread, these are my options:

#define LWIP_SKIP_CONST_CHECK       1
#define LWIP_PROVIDE_ERRNO          1
#define LWIP_TCPIP_CORE_LOCKING     1
#define TCPIP_THREAD_PRIO           LWIP_TASK_PRIO
#define TCPIP_THREAD_STACKSIZE      LWIP_TASK_STK_SZ
#define LWIP_TCPIP_CORE_LOCKING_INPUT   0

#define TCPIP_MBOX_SIZE             16
#define SYS_SEM_MAX                 0xffff
#define SYS_LIGHTWEIGHT_PROT        1

#define LWIP_NETCONN                1
#define DEFAULT_RAW_RECVMBOX_SIZE   8
#define DEFAULT_UDP_RECVMBOX_SIZE   8
#define DEFAULT_TCP_RECVMBOX_SIZE   8
#define DEFAULT_ACCEPTMBOX_SIZE     8

#define LWIP_NETIF_HOSTNAME         0
#define LWIP_DHCP                   1
#define LWIP_IPV6                   1
#define MEM_LIBC_MALLOC             1
#define MEMP_MEM_MALLOC             1

#define CHECKSUM_GEN_IP             0
#define CHECKSUM_GEN_TCP            0
// IPv4 UDP checksum is optional. Hardware does not support checksumming UDP packets, so we will choose to just not checksum the UDP.
#define CHECKSUM_GEN_UDP            0
#define CHECKSUM_GEN_ICMP           0
#define CHECKSUM_GEN_ICMP6          0
#define CHECKSUM_CHECK_IP           0
#define CHECKSUM_CHECK_UDP          0
#define CHECKSUM_CHECK_TCP          0
#define CHECKSUM_CHECK_ICMP         0
#define CHECKSUM_CHECK_ICMP6        0

So far, all of ICMP, UDP, ARP, DHCP work nicely. TCP however, does not.
This is the debugging code I have (in a separate task):

  nc = netconn_new(NETCONN_TCP);
  err_t bind = netconn_bind(nc, NULL, 5005);
  err_t list = netconn_listen(nc);
  while (1) {
      txrx = NULL;
      err = netconn_accept(nc, &txrx);
      DelaySeconds(5);
      netconn_close(txrx);
      netconn_delete(txrx);
  }

I would expect this to be able to handle a connection properly and close it gracefully. Indeed this is exactly what happens on the first connection (< is lwIP, > is client):

> SYN [SEQ=2292262937]
< SYN ACK [SEQ=6510 ACK=2292262938]
> ACK [SEQ=2232262938 ACK=6511]
(some time passes)
< FIN ACK [SEQ=6511 ACK=2292262938]
> ACK [SEQ=2292262938 ACK=6512]
> FIN ACK [SEQ=2292262938 ACK=6512]
< TCP Keep Alive [SEQ=6511]
> TCP Keep Alive ACK [ACK=6512]
< TCP Keep Alive [SEQ=6511]
> TCP Keep Alive Ack [ACK=6512]
< TCP Keep Alive [SEQ=6511]
< TCP Keep Alive [SEQ=6511]
< TCP Keep Alive [SEQ=6511]

This is, however, what happens during the subsequent connections (after the first has closed):

> SYN [SEQ=401742920]
< SYN ACK [SEQ=6710 ACK=401742921]
> ACK [SEQ=401742921 ACK=6711]
< RST ACK [SEQ=6711 ACK=401742921]

Which is not the graceful close I would have expected.

This RST comes from tcp_process function in SYN_RCVD case.
The check which leads to the reset being sent looks like this:

TCP_SEQ_BETWEEN(6711, 6710+1, 6710)

while during the first connection, it looks like this:

TCP_SEQ_BETWEEN(6511, 6510+1, 6511)

So it seems like for some reason the pcb->snd_nxt is one-off.

I would really appreciate any help figuring this out. Is it a bug in my code (even though everything else works fine)? Am I using netconn incorrectly? Is there some option I forgot to flip (or set one of the above wrongly?)

Thanks,
Simonas



reply via email to

[Prev in Thread] Current Thread [Next in Thread]