lwip-users
[Top][All Lists]
Advanced

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

Re: [lwip-users] How do I handle the ETHERNET cable unplug/replug on the


From: Trampas Stern
Subject: Re: [lwip-users] How do I handle the ETHERNET cable unplug/replug on the server side using LWIP in a correct way?
Date: Mon, 29 Aug 2022 14:26:39 -0400

What I have done in the past, several years ago, is when cable is inserted again, I restart everything with LWIP and network stack.   

Note that at the time many of the variables in lwip and applications (modbus,etc) were statically initialized.  For example the code might have int32_t my_data=0;   As such I had to go through and make sure all static initialization was done in the init() routines, such that I could restart all the network services.  This was a bit of a pain but worked.

Trampas

On Mon, Aug 29, 2022 at 12:16 PM Hensel, Christian <Hensel.Christian@vonardenne.biz> wrote:

Hi there,


your help on the following topic is highly appreciated! Thank You for any help!


How can I handle the unplug replug on the server side using LWIP?

SETUP:

currently I try to get a server application on a STM32H7 running using freeRTOS 10.3 and LWIP 2.1.2.

Code skleton is generated using CubeIDE 6.6 and H7 FW 1.10


CODE:

The application consists of the following threads started in this order


1) the MX_LWIP_Init() function generated by CubeIDE (see below for details)

- setting the addresses and call back functions

- starting the Ethernet thread


2) the physLinkTread

- indicating the cable connection by a notification by static void ethernet_link_status_updated(struct netif *netif)


3) the serverThread

calling the following functions in this order


listen_sock = lwip_socket()    // listen_sock will be = 0 if successful


// 
BaseType_t xTrueValue = pdTRUE;
setsockopt( listen_sock , SOL_SOCKET, SO_REUSEADDR , ( void * ) &xTrueValue, sizeof( xTrueValue ))


// wait 10 sec for a client request to come in when accept was succsessful
struct timeval xRcvValue;
xRcvValue.tv_sec = 10U;
xRcvValue.tv_usec = 0U;
setsockopt( listen_sock , SOL_SOCKET, SO_RCVTIMEO , ( void * ) &xRcvValue, sizeof( xRcvValue ))

lwip_bind(listen_sock)

lwip_listen(listen_sock)


for(;;)

{

         // will wait 10 sec for any  connection request

        sock_connection = lwip_accept(listen_sock);


        // will wait 4 sec for any client request to be handled

        read = lwip_read(sock_connection);

            //
            if (read)
            {
                // do somthing to serve the request ...
            }

            //
            lwip_shutdown(sock_connection, SHUT_RDWR);
            lwip_close(sock_connection);
}


MY PROBLEM:


I 've tested the ETHERNET cable unplug and (re)plug at the server side


- works fine when done while server is in lwip_accept()

when continuing the shown for(;;) loop the next call of lwip_accept(listen_sock) will return 0

- fails when done while server is in lwip_read()

when continuing the shown for(;;) loop the next call of lwip_accept(listen_sock) will return -1

when discontinuing the for loop just after read was executed and calling

 

            lwip_shutdown(sock_connection, SHUT_RDWR);
            lwip_close(sock_connection);
            lwip_shutdown(listen_sock, SHUT_RDWR);
            lwip_closesocket(listen_sock);


the next call of listen_socklwip_socket() will return -1


What am I missing?


ATTACHMENT:


MX_LWIP_Init():

/* Initilialize the LwIP stack with RTOS */

  tcpip_init( NULL, NULL );

  /* IP addresses initialization without DHCP (IPv4) */
  IP4_ADDR(&ipaddr, IP_ADDRESS[0], IP_ADDRESS[1], IP_ADDRESS[2], IP_ADDRESS[3]);
  IP4_ADDR(&netmask, NETMASK_ADDRESS[0], NETMASK_ADDRESS[1] , NETMASK_ADDRESS[2], NETMASK_ADDRESS[3]);
  IP4_ADDR(&gw, GATEWAY_ADDRESS[0], GATEWAY_ADDRESS[1], GATEWAY_ADDRESS[2], GATEWAY_ADDRESS[3]);

  /* add the network interface (IPv4/IPv6) with RTOS */
  netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &tcpip_input);

  /* Registers the default network interface */
  netif_set_default(&gnetif);

  if (netif_is_link_up(&gnetif))
  {
    /* When the netif is fully configured this function must be called */
    netif_set_up(&gnetif);
  }
  else
  {
    /* When the netif link is down this function must be called */
    netif_set_down(&gnetif);
  }

  /* Set the link callback function, this function is called on change of link status*/
  netif_set_link_callback(&gnetif, ethernet_link_status_updated);




Christian Hensel
Project Engineer Software Development

PHONE +49 351 2637616
EMAIL Hensel.Christian@vonardenne.biz


VON ARDENNE GmbH
GESCHÄFTSFÜHRUNG/EXECUTIVE MANAGEMENT Pia von Ardenne | SITZ/REGISTERED OFFICE Am Hahnweg 8, 01328 Dresden, Germany
AMTSGERICHT/DISTRICT COURT Dresden | HRB/REGISTERED NUMBER  38159 | Ust. ID-Nr./VAT ID DE 319 86 2441
PHONE +49 351 2637 300, FAX +49 351 2637 308

office@vonardenne.biz
www.vonardenne.biz

           

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

reply via email to

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