Hi,

I have the following configuration:

H/W
    ATMEL SAM4E ARM Cortex-M4 with KSZ8081MNXRNB Ethernet phy.
LWIP:
    1.4.1
    Config (extract. See attached file for full config):
        #define NO_SYS                          1
        #define MEMP_NUM_TCP_PCB                2
        #define MEMP_NUM_TCP_PCB_LISTEN         1
        #define MEMP_NUM_TCP_SEG                8

Problem:
I am sending HTTP/1.1 packets to server and receiving replies as expected. But 
it seems that the server keeps sending re-transmissions as local hardware 
doesn't seem to send an ACK back (3-way handshake?). After some time the server 
resets the connection and my next http request get's blocked. Should LWIP layer 
send an ACK back as the app has received the packet?
pcap capture is attatched.

Here is the code snippet when packets is received:

err_t tcp_tx_resp_cb(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{
    struct pbuf* temp_p;
    eth_ctx_t* ctx = (eth_ctx_t*)arg;
    uint16_t len;

    if(err < 0)
    {
        DBG_W(EINVAL, "Ignoring response err '%d'. err");
        return err;
    }

    len = 0;
    /*        retrieve data */
    if ((err == ERR_OK) && (p != NULL)) {
        /* get response status value */
        ctx->status = http_get_status(p->payload);

        while (p != NULL) {
            if (ctx->recv_buf != NULL) {
                memcpy(&ctx->recv_buf[len], p->payload, p->len);
            }

            temp_p = p->next;
            len += p->len;
            pbuf_free(p);
            p = temp_p;
        }
        /* Terminate it for parsing it more easily */
        ctx->recv_buf[len] = 0;

        if (ctx->recv_buf != NULL) {
            ctx->recv_size = http_get_data(ctx->recv_buf, ctx->recv_buf);
        }

        DBG_I("TCP RESPONSE:  status:%03d. data_size: %d bytes. err: %d.",
              ctx->status, ctx->recv_size, err);
    }

    return ERR_OK;
}

Tanks in advance,
Inderjit
/*******************************************************************************
 * @file   lwipopts.h
 * @author Inderjit Singh <inderjit.si...@evidente.se>
 * @brief  TODO: TBD
 *
 *                 TBD
 ******************************************************************************/


#ifndef _LWIPOPTS_H_
#define _LWIPOPTS_H_

/* Include Ethernet configuration first */
#include "conf_eth.h"
#include "gmac.h"


/**
 * NO_SYS==1:   NO OS. Provides VERY minimal functionality.  RAW API only
 * NO_SYS==0:   Use lwIP facilities.
 */
#define NO_SYS                                  1
/**
 * LWIP_NETIF_STATUS_CALLBACK==1: Support a callback function whenever an 
interface
 * changes its up/down status (i.e., due to DHCP IP acquisition)
 */
#define LWIP_NETIF_STATUS_CALLBACK              1

/**
 * LWIP_RAW==1: Enable application layer to hook into the IP layer itself.
 * Used to implement custom transport protocol (!= than Raw API).
 */
#define LWIP_RAW                                0

/**
 * SYS_LIGHTWEIGHT_PROT==1: if you want inter-task protection for certain
 * critical regions during buffer allocation, deallocation and memory
 * allocation and deallocation.
 */
#define SYS_LIGHTWEIGHT_PROT                    0

/* These are not available when using "NO_SYS" */
#define LWIP_NETCONN                            0
#define LWIP_SOCKET                             0

/* Uncomment following line to use DHCP instead of fixed IP */
#define DHCP_USED

/*******************************************************************************
 *                                        Memory options
 ******************************************************************************/

/**
 * MEM_ALIGNMENT: should be set to the alignment of the CPU
 *    4 byte alignment -> #define MEM_ALIGNMENT 4
 *    2 byte alignment -> #define MEM_ALIGNMENT 2
 */
#define MEM_ALIGNMENT                           4

/**
 * MEM_SIZE: the size of the heap memory. If the application will send
 * a lot of data that needs to be copied, this should be set high.
 */
#define MEM_SIZE                                (4 * 1024)

/**
 * MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One
 * per active UDP "connection".
 * (requires the LWIP_UDP option)
 */
#define MEMP_NUM_UDP_PCB                2

/**
 * MEMP_NUM_TCP_PCB: the number of simultaneously active TCP connections.
 * (requires the LWIP_TCP option)
 */
#define MEMP_NUM_TCP_PCB                2

/**
 * MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP connections.
 * (requires the LWIP_TCP option)
 */
#define MEMP_NUM_TCP_PCB_LISTEN         1

/**
 * MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP segments.
 * (requires the LWIP_TCP option)
 */
#define MEMP_NUM_TCP_SEG                8

/**
 * MEMP_NUM_REASSDATA: the number of IP packets simultaneously queued for
 * reassembly (whole packets, not fragments!)
 */
#define MEMP_NUM_REASSDATA              2

/**
 * MEMP_NUM_FRAG_PBUF: the number of IP fragments simultaneously sent
 * (fragments, not whole packets!).
 * This is only used with IP_FRAG_USES_STATIC_BUF==0 and
 * LWIP_NETIF_TX_SINGLE_PBUF==0 and only has to be > 1 with DMA-enabled MACs
 * where the packet is not yet sent when netif->output returns.
 */
#define MEMP_NUM_FRAG_PBUF              6

/**
 * MEMP_NUM_PBUF: the number of memp struct pbufs (used for PBUF_ROM and 
PBUF_REF).
 * If the application sends a lot of data out of ROM (or other static memory),
 * this should be set high.
 */
#define MEMP_NUM_PBUF                   2

/**
 * MEMP_NUM_NETBUF: the number of struct netbufs.
 * (only needed if you use the sequential API, like api_lib.c)
 */
#define MEMP_NUM_NETBUF                 0

/**
 * MEMP_NUM_NETCONN: the number of struct netconns.
 * (only needed if you use the sequential API, like api_lib.c)
 */
#define MEMP_NUM_NETCONN                0

/**
 * PBUF_POOL_SIZE: the number of buffers in the pbuf pool.
 */
#define PBUF_POOL_SIZE                  4

/**
 * PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool.
 */
#define PBUF_POOL_BUFSIZE               GMAC_FRAME_LENTGH_MAX


/*******************************************************************************
 *                                                DNS options
 ******************************************************************************/
/**
 * 0: Don't use DNS query
 * 1: Use DNS query
 **/
#define LWIP_DNS                                                1
#define DNS_TABLE_SIZE                                  2       /* number of 
table entries, default 4     */
#define DNS_MAX_NAME_LENGTH                             32      /* max. name 
length, default 256                  */
#define DNS_MAX_SERVERS                                 2       /* number of 
DNS servers, default 2               */
#define DNS_DOES_NAME_CHECK                             1       /* compare 
received name with given,def 0 */
#define DNS_MSG_SIZE                                    512
#define DNS_USES_STATIC_BUF                             2       /* Dynamic 
buffer defined by DNS_MSG_SIZE */

/*******************************************************************************
 *                                                DHCP options
 ******************************************************************************/
#if defined(DHCP_USED)
/**
 * 0: Disable DHCP module.
 * 1: Enable DHCP module.
 */
#define LWIP_DHCP                                               1
#endif


/*******************************************************************************
 *                                                UDP options
 ******************************************************************************/
/**
 * 0: UDP off.
 * 1: UDP on
 */
#define LWIP_UDP                                                1 /* Required 
by DNS and DHCP */


/*******************************************************************************
 *                                                TCP options
 ******************************************************************************/
/**
 * 0: TCP off.
 * 1: TCP on
 */
#define LWIP_TCP                                                1

/**
 * TCP_MSS: The maximum segment size controls the maximum amount of
 * payload bytes per packet. For maximum throughput, set this as
 * high as possible for your network (i.e. 1460 bytes for standard
 * ethernet).
 * For the receive side, this MSS is advertised to the remote side
 * when opening a connection. For the transmit size, this MSS sets
 * an upper limit on the MSS advertised by the remote host.
 */
#define TCP_MSS                                                 1460

/**
 * TCP_WND: The size of a TCP window.  This must be at least
 * (2 * TCP_MSS) for things to work well
 */
#define TCP_WND                                                 (2 * TCP_MSS)

/**
 * TCP_SND_BUF: TCP sender buffer space (bytes).
 * To achieve good performance, this should be at least 2 * TCP_MSS.
 */
#define TCP_SND_BUF                                             (2 * TCP_MSS)

/*******************************************************************************
 *                                                Thread options
 ******************************************************************************/

/** The stack sizes allocated to the netif stack: (256 * 4) = 1048 bytes. */
#define netifINTERFACE_TASK_STACK_SIZE    256

/** The priority of the netif stack. */
#define netifINTERFACE_TASK_PRIORITY      (tskIDLE_PRIORITY + 4)

/** The stack sizes allocated to the TCPIP stack: (256 * 4) = 1048 bytes. */
#define TCPIP_THREAD_STACKSIZE            256

/** The priority of the TCPIP stack. */
#define TCPIP_THREAD_PRIO                 (tskIDLE_PRIORITY + 5)

/** The mailbox size for the tcpip thread messages */
#define TCPIP_MBOX_SIZE                   16
#define DEFAULT_ACCEPTMBOX_SIZE           16
#define DEFAULT_RAW_RECVMBOX_SIZE         16
#define DEFAULT_TCP_RECVMBOX_SIZE         16


/*******************************************************************************
 *                                                Statistics options
 ******************************************************************************/
/**
 * LWIP_STATS==1: Enable statistics collection in lwip_stats.
 */
#define LWIP_STATS                      0

/**
 * LWIP_STATS_DISPLAY==1: Compile in the statistics output functions.
 */
#define LWIP_STATS_DISPLAY              0

/**
 * LWIP_STATS_LARGE==1: Use 32 bits counter instead of 16.
 */
#define LWIP_STATS_LARGE                0

#if LWIP_STATS
#define LINK_STATS                      0
#define IP_STATS                        0
#define IPFRAG_STATS                    0
#define ICMP_STATS                      0
#define IGMP_STATS                      0
#define UDP_STATS                       0
#define TCP_STATS                       0
#define MEM_STATS                       0
#define MEMP_STATS                      0
#define SYS_STATS                       0
#endif
/* Left outside to avoid warning. */
#define ETHARP_STATS                    0

/*******************************************************************************
 *                                                Debugging options
 ******************************************************************************/

//#define LWIP_NOASSERT

#define LWIP_DEBUG                                              1
#define LWIP_DBG_MIN_LEVEL              LWIP_DBG_LEVEL_ALL
#define LWIP_DBG_TYPES_ON               LWIP_DBG_ON

#define ETHARP_DEBUG                    LWIP_DBG_OFF
#define NETIF_DEBUG                     LWIP_DBG_OFF
#define PBUF_DEBUG                      LWIP_DBG_OFF
#define API_LIB_DEBUG                   LWIP_DBG_OFF
#define API_MSG_DEBUG                   LWIP_DBG_OFF
#define SOCKETS_DEBUG                   LWIP_DBG_OFF
#define ICMP_DEBUG                      LWIP_DBG_OFF
#define IGMP_DEBUG                      LWIP_DBG_OFF
#define INET_DEBUG                      LWIP_DBG_OFF
#define IP_DEBUG                        LWIP_DBG_OFF
#define IP_REASS_DEBUG                  LWIP_DBG_OFF
#define RAW_DEBUG                       LWIP_DBG_OFF
#define MEM_DEBUG                       LWIP_DBG_OFF
#define MEMP_DEBUG                      LWIP_DBG_OFF
#define SYS_DEBUG                       LWIP_DBG_OFF
#define TIMERS_DEBUG                    LWIP_DBG_OFF
#define TCP_DEBUG                       LWIP_DBG_OFF
#define TCP_INPUT_DEBUG                 LWIP_DBG_OFF
#define TCP_FR_DEBUG                    LWIP_DBG_OFF
#define TCP_RTO_DEBUG                   LWIP_DBG_OFF
#define TCP_CWND_DEBUG                  LWIP_DBG_OFF
#define TCP_WND_DEBUG                   LWIP_DBG_OFF
#define TCP_OUTPUT_DEBUG                LWIP_DBG_OFF
#define TCP_RST_DEBUG                   LWIP_DBG_OFF
#define TCP_QLEN_DEBUG                  LWIP_DBG_OFF
#define UDP_DEBUG                       LWIP_DBG_OFF
#define TCPIP_DEBUG                     LWIP_DBG_OFF
#define PPP_DEBUG                       LWIP_DBG_OFF
#define SLIP_DEBUG                      LWIP_DBG_OFF
#define DHCP_DEBUG                      LWIP_DBG_OFF
#define AUTOIP_DEBUG                    LWIP_DBG_OFF
#define SNMP_MSG_DEBUG                  LWIP_DBG_OFF
#define SNMP_MIB_DEBUG                  LWIP_DBG_OFF
#define DNS_DEBUG                       LWIP_DBG_OFF


#endif /* LWIPOPTS_H_ */

Attachment: Timout_filtered.pcapng
Description: Timout_filtered.pcapng

_______________________________________________
lwip-users mailing list
lwip-users@nongnu.org
https://lists.nongnu.org/mailman/listinfo/lwip-users

Reply via email to