[Bugfix rtems-lwip 4/4] Fix crash due to link_detect_thread

Kinsey Moore kinsey.moore at oarcorp.com
Mon Apr 1 14:39:32 UTC 2024


The intent of this patch is fine, but changes should be purely additive and
properly wrapped in the __rtems__ check. The addition of thread startup at
the end should also be wrapped in !NO_SYS.

Kinsey

On Sun, Mar 31, 2024 at 5:49 PM Bernd Moessner <berndmoessner80 at gmail.com>
wrote:

> Within xemac_add, the link_detect_thread is set up before the ethernet
> interface is configured and all data structures have been set up correctly.
> The steps within xemac_add are basically:
> 1) Set up link_detect_thread
> 2) Initialize the interface
> 3) Set up the link speed / start autonegotiation
> 4) When autonegotiate has completed, set up the data structures
>
> The issue is here that, for example if no cable is connected, the
> autonegotiate sequence will suspend the calling task. As soon as
> this happens, the link_detect_thread gets into running state and
> dereferences the data structures that havent been set up. Unfortunatelly,
> it isnt as easy as checking the pointer to the relevant data structure
> for being NULL within the link_detect_thread. Not going into details,
> the pointer (netif->state) isnt NULL in this moment of time, but it
> has to point to something completely different.
>
> It seems to me that the easiest solution to this problem is to reorder
> the sequence within xemac_add. Initialize the interface and set up the
> data structures, then create the link_detect_thread which requires all of
> this. After applying this patch, the sequence becomes:
>
> 1) Initialize the interface
> 2) Set up the link speed / start autonegotiation
> 3) When autonegotiate has completed, set up the data structures
> 4) Set up link_detect_thread
> ---
>  .../src/contrib/ports/xilinx/netif/xadapter.c | 32 ++++++++++++++-----
>  1 file changed, 24 insertions(+), 8 deletions(-)
>
> diff --git
> a/embeddedsw/ThirdParty/sw_services/lwip211/src/contrib/ports/xilinx/netif/xadapter.c
> b/embeddedsw/ThirdParty/sw_services/lwip211/src/contrib/ports/xilinx/netif/xadapter.c
> index 93ff148..79a10c1 100644
> ---
> a/embeddedsw/ThirdParty/sw_services/lwip211/src/contrib/ports/xilinx/netif/xadapter.c
> +++
> b/embeddedsw/ThirdParty/sw_services/lwip211/src/contrib/ports/xilinx/netif/xadapter.c
> @@ -126,8 +126,9 @@ xemac_add(struct netif *netif,
>         UINTPTR mac_baseaddr)
>  {
>         int i;
> +       struct netif * ret = NULL;
>
> -#if !NO_SYS
> +#if !NO_SYS && !defined(__rtems__)
>         /* Start thread to detect link periodically for Hot Plug
> autodetect */
>         sys_thread_new("link_detect_thread", link_detect_thread, netif,
>                         THREAD_STACKSIZE, tskIDLE_PRIORITY);
> @@ -142,7 +143,7 @@ xemac_add(struct netif *netif,
>                 switch (find_mac_type(mac_baseaddr)) {
>                         case xemac_type_xps_emaclite:
>  #ifdef XLWIP_CONFIG_INCLUDE_EMACLITE
> -                               return netif_add(netif, ipaddr, netmask,
> gw,
> +                               ret = netif_add(netif, ipaddr, netmask, gw,
>                                         (void*)mac_baseaddr,
>                                         xemacliteif_init,
>  #if NO_SYS
> @@ -151,12 +152,14 @@ xemac_add(struct netif *netif,
>                                         tcpip_input
>  #endif
>                                         );
> +                               break;
>  #else
> -                               return NULL;
> +                               ret = NULL;
> +                               break;
>  #endif
>                         case xemac_type_axi_ethernet:
>  #ifdef XLWIP_CONFIG_INCLUDE_AXI_ETHERNET
> -                               return netif_add(netif, ipaddr, netmask,
> gw,
> +                               ret = netif_add(netif, ipaddr, netmask, gw,
>                                         (void*)mac_baseaddr,
>                                         xaxiemacif_init,
>  #if NO_SYS
> @@ -165,16 +168,18 @@ xemac_add(struct netif *netif,
>                                         tcpip_input
>  #endif
>                                         );
> +                               break;
>  #else
> -                               return NULL;
> +                               ret = NULL;
> +                               break;
>  #endif
>  #if defined (__arm__) || defined (__aarch64__)
>                         case xemac_type_emacps:
>  #ifdef XLWIP_CONFIG_INCLUDE_GEM
>  #ifndef __rtems__
> -                               return netif_add(netif, ipaddr, netmask,
> gw,
> +                               ret = netif_add(netif, ipaddr, netmask, gw,
>  #else /* __rtems__ */
> -                               return netif_add( netif,
> +                               ret = netif_add( netif,
>                                                 (const ip4_addr_t *)
> ipaddr,
>                                                 (const ip4_addr_t *)
> netmask,
>                                                 (const ip4_addr_t *) gw,
> @@ -188,7 +193,10 @@ xemac_add(struct netif *netif,
>  #endif
>
>                                                 );
> +                               break;
>  #endif
> +                               ret = NULL;
> +                               break;
>  #endif
>                         default:
>  #ifndef __rtems__
> @@ -199,8 +207,16 @@ xemac_add(struct netif *netif,
>                                                 mac_baseaddr);
>                                 xil_printf("\r\n");
>  #endif
> -                               return NULL;
> +                               ret = NULL;
>         }
> +
> +#if defined(__rtems__)
> +       /* Start thread to detect link periodically for Hot Plug
> autodetect */
> +       sys_thread_new("link_detect_thread", link_detect_thread, netif,
> +                       THREAD_STACKSIZE, tskIDLE_PRIORITY);
> +#endif
> +
> +       return ret;
>  }
>
>  #if !NO_SYS
> --
> 2.34.1
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20240401/e77c9b59/attachment-0001.htm>


More information about the devel mailing list