diff --git a/.github/workflows/ci-linux.yml b/.github/workflows/ci-linux.yml index 491a330da..1e4b4a0e5 100644 --- a/.github/workflows/ci-linux.yml +++ b/.github/workflows/ci-linux.yml @@ -48,8 +48,9 @@ jobs: run: | cp ${CONTRIB}/examples/example_app/lwipcfg.h.example ${CONTRIB}/examples/example_app/lwipcfg.h cd ${CONTRIB}/ports/unix/example_app - export CFLAGS="-DESP_LWIP=LWIP_NETCONN_FULLDUPLEX -DESP_LWIP_IGMP_TIMERS_ONDEMAND=ESP_LWIP -DESP_LWIP_MLD6_TIMERS_ONDEMAND=ESP_LWIP -DESP_DNS=ESP_LWIP" + export CFLAGS="-DESP_LWIP=LWIP_NETCONN_FULLDUPLEX -DESP_LWIP_IGMP_TIMERS_ONDEMAND=ESP_LWIP -DESP_LWIP_MLD6_TIMERS_ONDEMAND=ESP_LWIP -DESP_DNS=ESP_LWIP -DESP_LWIP_ARP=ESP_LWIP" export LWIPDIR=../../../../src/ + make TESTFLAGS="-Wno-documentation" -j 4 chmod +x iteropts.sh && ./iteropts.sh - name: Build and run unit tests with cmake diff --git a/src/core/ipv4/etharp.c b/src/core/ipv4/etharp.c index c3a5a1078..58d62f41e 100644 --- a/src/core/ipv4/etharp.c +++ b/src/core/ipv4/etharp.c @@ -1037,12 +1037,12 @@ etharp_query(struct netif *netif, const ip4_addr_t *ipaddr, struct pbuf *q) /* allocate a new arp queue entry */ new_entry = (struct etharp_q_entry *)memp_malloc(MEMP_ARP_QUEUE); if (new_entry != NULL) { + struct etharp_q_entry *r; unsigned int qlen = 0; new_entry->next = 0; new_entry->p = p; if (arp_table[i].q != NULL) { /* queue was already existent, append the new entry to the end */ - struct etharp_q_entry *r; r = arp_table[i].q; qlen++; while (r->next != NULL) { @@ -1056,11 +1056,19 @@ etharp_query(struct netif *netif, const ip4_addr_t *ipaddr, struct pbuf *q) } #if ARP_QUEUE_LEN if (qlen >= ARP_QUEUE_LEN) { +#if ESP_LWIP_ARP + r->next = NULL; + pbuf_free(new_entry->p); + memp_free(MEMP_ARP_QUEUE, new_entry); + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: could not queue the packet %p (queue is full)\n", (void *)q)); + return ERR_MEM; +#else struct etharp_q_entry *old; old = arp_table[i].q; arp_table[i].q = arp_table[i].q->next; pbuf_free(old->p); memp_free(MEMP_ARP_QUEUE, old); +#endif } #endif LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: queued packet %p on ARP entry %"U16_F"\n", (void *)q, i));