lwip: optimize low_level_output

When the parameter pbuf for low_level_output is a list, malloc a new pbuf of
which the length equals to the total length of pbuf and send the new pbuf to L2
This commit is contained in:
Liu Zhi Fu
2016-11-19 22:25:30 +08:00
parent 139fdcb9ec
commit fa57720cdf

View File

@@ -118,37 +118,29 @@ low_level_init(struct netif *netif)
static err_t static err_t
low_level_output(struct netif *netif, struct pbuf *p) low_level_output(struct netif *netif, struct pbuf *p)
{ {
struct pbuf *q; wifi_interface_t wifi_if = tcpip_adapter_get_wifi_if(netif);
wifi_interface_t wifi_if = tcpip_adapter_get_wifi_if(netif); struct pbuf *q = p;
err_t ret;
if (wifi_if >= WIFI_IF_MAX) { if (wifi_if >= WIFI_IF_MAX) {
return ERR_IF; return ERR_IF;
} }
#if ESP_LWIP
q = p;
u16_t pbuf_x_len = 0;
pbuf_x_len = q->len;
if(q->next !=NULL) if(q->next !=NULL)
{ {
//char cnt = 0; LWIP_DEBUGF(PBUF_DEBUG, ("low_level_output: pbuf is a list, application may has bug"));
struct pbuf *tmp = q->next; printf("low level_output: len=%d\n", p->tot_len);
while(tmp != NULL) q = pbuf_alloc(PBUF_RAW_TX, p->tot_len, PBUF_RAM);
{ if (q != NULL) {
memcpy( (u8_t *)( (u8_t *)(q->payload) + pbuf_x_len), (u8_t *)tmp->payload , tmp->len ); pbuf_copy(q, p);
pbuf_x_len += tmp->len; } else {
//cnt++; return ERR_MEM;
tmp = tmp->next;
} }
} }
return esp_wifi_internal_tx(wifi_if, q->payload, pbuf_x_len); ret = esp_wifi_internal_tx(wifi_if, q->payload, q->len);
#else pbuf_free(q);
for(q = p; q != NULL; q = q->next) { return ret;
esp_wifi_internal_tx(wifi_if, q->payload, q->len);
}
return ERR_OK;
#endif
} }
/** /**