lwip-users
[Top][All Lists]
Advanced

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

Re: [lwip-users] lwip: Scan through the heap searching for a free block


From: address@hidden
Subject: Re: [lwip-users] lwip: Scan through the heap searching for a free block that is big enough, beginning with the lowest free block.
Date: Wed, 17 Jul 2019 20:22:20 +0200
User-agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0

Am 28.03.2019 um 09:20 schrieb vrnud:
HI,

I am very new to the tcpip world.

   netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init,
&tcpip_input);
is called from MX_LWIP_Init() function.

"But "raw" APIs functions must ONLY be called from TCPIP thread."
I dont know how to do that. can you please provide some example for the
same.

or example for
" tcpip_callback() can be used get called back from TCPIP thread, it is safe
to call any "raw" APIs from there."

"Use LWIP_TCPIP_CORE_LOCKING. All "raw" APIs functions can be called when
lwIP core lock is aquired, see LOCK_TCPIP_CORE() and UNLOCK_TCPIP_CORE().
These macros cannot be used in an interrupt context! Note the OS must
correctly handle priority inversion for this."
LWIP_TCPIP_CORE_LOCKING is set 1 in code.

below is the code
void tcp_echoserver_init(void)
{

   /* create new tcp pcb */
   tcp_echoserver_pcb = tcp_new();

   if (tcp_echoserver_pcb != NULL)
   {
     err_t err;

     /* bind echo_pcb to port 7 (ECHO protocol) ;7 FOR ECHO, 502 FOR MODBUS*/
     err = tcp_bind(tcp_echoserver_pcb, IP_ADDR_ANY, 502);

     if (err == ERR_OK)
     {
       /* start tcp listening for echo_pcb */
       tcp_echoserver_pcb = tcp_listen(tcp_echoserver_pcb);

       /* initialize LwIP tcp_accept callback function */
       tcp_accept(tcp_echoserver_pcb, tcp_echoserver_accept);
     }
     else
     {
       /* deallocate the pcb */
       memp_free(MEMP_TCP_PCB, tcp_echoserver_pcb);
     }
   }

}

/**
   * @brief  This function is the implementation of tcp_accept LwIP callback
   * @param  arg: not used
   * @param  newpcb: pointer on tcp_pcb struct for the newly created tcp
connection
   * @param  err: not used
   * @retval err_t: error status
   */
static err_t tcp_echoserver_accept(void *arg, struct tcp_pcb *newpcb, err_t
err)
{
   err_t ret_err;
   struct tcp_echoserver_struct *es;

   LWIP_UNUSED_ARG(arg);
   LWIP_UNUSED_ARG(err);

   /* set priority for the newly accepted tcp connection newpcb */
   tcp_setprio(newpcb, TCP_PRIO_MIN);

   /* allocate structure es to maintain tcp connection informations */
   es = (struct tcp_echoserver_struct *)mem_malloc(sizeof(struct
tcp_echoserver_struct));
   if (es != NULL)
   {
     es->state = ES_ACCEPTED;
     es->pcb = newpcb;
     es->retries = 0;
     es->p = NULL;

                if(gu8_addrs_chng_Link_break)
                {
                        gu8_addrs_chng_Link_break = 0;
                }


     /* pass newly allocated es structure as argument to newpcb */
     tcp_arg(newpcb, es);

     /* initialize lwip tcp_recv callback function for newpcb  */
     tcp_recv(newpcb, tcp_echoserver_recv);

     /* initialize lwip tcp_err callback function for newpcb  */
     tcp_err(newpcb, tcp_echoserver_error);

     /* initialize lwip tcp_poll callback function for newpcb */
     tcp_poll(newpcb, tcp_echoserver_poll, 0);

     ret_err = ERR_OK;
   }
   else
   {
     /*  close tcp connection */
     tcp_echoserver_connection_close(newpcb, es);
     /* return memory error */
     ret_err = ERR_MEM;
   }
   return ret_err;
}

I am getting problem for particular this line
   /* allocate structure es to maintain tcp connection informations */
   es = (struct tcp_echoserver_struct *)mem_malloc(sizeof(struct
tcp_echoserver_struct));

Sorry for taking so long to respond. If only for the archive, I'll still
reply.

If a simple 'mem_malloc' gets stuck in an endless loop, the heap is
corrupted. One reason can be threading issues (see
https://www.nongnu.org/lwip/2_1_x/pitfalls.html). Another reason could
just be plain memory corruption.

Regards,
Simon



reply via email to

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