Makes it easier to handle different drivers enabled at compile/link time.
#include <string.h>
-#if ESP_LWIP
-#include "esp_wifi_internal.h"
-#include "esp_eth.h"
-#endif
-
#define SIZEOF_STRUCT_PBUF LWIP_MEM_ALIGN_SIZE(sizeof(struct pbuf))
/* Since the pool is created in memp, PBUF_POOL_BUFSIZE will be automatically
aligned there. Therefore, PBUF_POOL_BUFSIZE_ALIGNED can be used here. */
p->ref = 1;
/* set flags */
p->flags = 0;
-
+
#if ESP_LWIP
- p->user_buf = NULL;
- p->user_flag = PBUF_USER_FLAG_OWNER_NULL;
+ p->l2_owner = NULL;
+ p->l2_buf = NULL;
#endif
LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc(length=%"U16_F") == %p\n", length, (void *)p));
memp_free(MEMP_PBUF_POOL, p);
/* is this a ROM or RAM referencing pbuf? */
} else if (type == PBUF_ROM || type == PBUF_REF) {
-
+
#if ESP_LWIP
- if (type == PBUF_REF && p->user_flag == PBUF_USER_FLAG_OWNER_WIFI ) {
- esp_wifi_internal_free_rx_buffer(p->user_buf);
- }
- if (type == PBUF_REF && p->user_flag == PBUF_USER_FLAG_OWNER_ETH ) {
- esp_eth_free_rx_buf(p->user_buf);
- }
+ if (p->l2_owner != NULL
+ && p->l2_buf != NULL
+ && p->l2_owner->l2_buffer_free_notify != NULL) {
+ p->l2_owner->l2_buffer_free_notify(p->l2_buf);
+ }
#endif
memp_free(MEMP_PBUF, p);
/* type == PBUF_RAM */
u16_t loop_cnt_current;
#endif /* LWIP_LOOPBACK_MAX_PBUFS */
#endif /* ENABLE_LOOPBACK */
+
+#if ESP_LWIP
+ void (*l2_buffer_free_notify)(void *user_buf); /* Allows LWIP to notify driver when a L2-supplied pbuf can be freed */
+#endif
};
#if LWIP_CHECKSUM_CTRL_PER_NETIF
/** indicates this pbuf includes a TCP FIN flag */
#define PBUF_FLAG_TCP_FIN 0x20U
-#if ESP_LWIP
-#define PBUF_USER_FLAG_OWNER_NULL 0
-#define PBUF_USER_FLAG_OWNER_WIFI 1
-#define PBUF_USER_FLAG_OWNER_ETH 2
-#endif
-
struct pbuf {
/** next pbuf in singly linked pbuf chain */
struct pbuf *next;
* the stack itself, or pbuf->next pointers from a chain.
*/
u16_t ref;
-
+
#if ESP_LWIP
- void *user_buf;
- u8_t user_flag;
+ struct netif *l2_owner;
+ void *l2_buf;
#endif
};
netif->flags |= NETIF_FLAG_IGMP;
#endif
#endif
- /* Do whatever else is needed to initialize interface. */
+
+#ifndef CONFIG_EMAC_L2_TO_L3_RX_BUF_MODE
+ netif->l2_buffer_free_notify = esp_eth_free_rx_buf;
+#endif
}
/**
if(buffer== NULL || netif == NULL)
goto _exit;
-#if CONFIG_EMAC_L2_TO_L3_RX_BUF_MODE
+#ifdef CONFIG_EMAC_L2_TO_L3_RX_BUF_MODE
p = pbuf_alloc(PBUF_RAW, len, PBUF_RAM);
if (p == NULL) {
return;
}
+ p->l2_owner = NULL;
memcpy(p->payload, buffer, len);
/* full packet send to tcpip_thread to process */
return;
}
p->payload = buffer;
- p->user_flag = PBUF_USER_FLAG_OWNER_ETH;
- p->user_buf = buffer;
+ p->l2_owner = netif;
+ p->l2_buf = buffer;
/* full packet send to tcpip_thread to process */
if (netif->input(p, netif) != ERR_OK) {
LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n"));
- p->user_flag = PBUF_USER_FLAG_OWNER_NULL;
+ p->l2_owner = NULL;
pbuf_free(p);
}
#endif
#endif
#endif
- /* Do whatever else is needed to initialize interface. */
+#if !ESP_L2_TO_L3_COPY
+ netif->l2_buffer_free_notify = esp_wifi_internal_free_rx_buffer;
+#endif
}
/**
LWIP_DEBUGF(PBUF_DEBUG, ("low_level_output: pbuf is a list, application may has bug"));
q = pbuf_alloc(PBUF_RAW_TX, p->tot_len, PBUF_RAM);
if (q != NULL) {
+ q->l2_owner = NULL;
pbuf_copy(q, p);
} else {
return ERR_MEM;
esp_wifi_internal_free_rx_buffer(eb);
return;
}
+ p->l2_owner = NULL;
memcpy(p->payload, buffer, len);
esp_wifi_internal_free_rx_buffer(eb);
#else
return;
}
p->payload = buffer;
- p->user_buf = eb;
- p->user_flag = PBUF_USER_FLAG_OWNER_WIFI;
+ p->l2_owner = netif;
+ p->l2_buf = eb;
#endif
/* full packet send to tcpip_thread to process */