]> granicus.if.org Git - esp-idf/commitdiff
components/lwip/arp: change the arp dropping packet function
authortianzhongxing <tianzhongxing@espressif.com>
Mon, 21 Nov 2016 06:09:52 +0000 (14:09 +0800)
committertianzhongxing <tianzhongxing@espressif.com>
Tue, 22 Nov 2016 02:11:52 +0000 (10:11 +0800)
LWIP will drop the oldest package at the arp packet cache queue and return "ERR_OK"
We change it that ARP level will drop the current packet and return "ERR_MEM" to tell user that you should send the packet again latter.

components/lwip/include/lwip/port/lwipopts.h
components/lwip/netif/etharp.c

index 26bdc3a4e90d7ffb99660e8960272ab5c50201cd..487aff323a145c981b88d4962e95839044c6d09a 100755 (executable)
@@ -515,6 +515,7 @@ extern unsigned long os_random(void);
 /* Enable all Espressif-only options */
 
 #define ESP_LWIP                        1
+#define ESP_LWIP_ARP                    1
 #define ESP_PER_SOC_TCP_WND             1
 #define ESP_THREAD_SAFE                 1
 #define ESP_THREAD_SAFE_DEBUG           LWIP_DBG_OFF
index 776e949f754c50b32bcbd1a99a7d8408fbe978b2..b51a20222202865ff5b276c5c3405d4ff15adf4b 100755 (executable)
@@ -1192,11 +1192,28 @@ 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
+          int l;
+          struct etharp_q_entry *r;
+
+          l = qlen - 1;
+          r = arp_table[i].q;
+          while (l--)
+            r = r->next;
+          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 %"S16_F"\n", (void *)q, (s16_t)i));