diff --git a/components/lwip/port/esp8266/freertos/udp_sync.c b/components/lwip/port/esp8266/freertos/udp_sync.c index d4ac7873..71ec3e50 100644 --- a/components/lwip/port/esp8266/freertos/udp_sync.c +++ b/components/lwip/port/esp8266/freertos/udp_sync.c @@ -22,7 +22,7 @@ #include "esp_log.h" -#if ESP_UDP +#if ESP_UDP && LWIP_NETIF_TX_SINGLE_PBUF #define UDP_SYNC_MAX MEMP_NUM_NETCONN #define UDP_SYNC_RETRY_MAX CONFIG_ESP_UDP_SYNC_RETRY_MAX @@ -40,15 +40,16 @@ typedef struct udp_sync { struct api_msg *msg; - int ret; + struct netif *netif; - int retry; + int8_t ret; + + uint8_t retry; } udp_sync_t; static const char *TAG = "udp_sync"; static size_t s_udp_sync_num; static udp_sync_t s_udp_sync[UDP_SYNC_MAX]; -static bool s_register_locked; static struct api_msg *s_cur_msg; /* @@ -57,7 +58,6 @@ static struct api_msg *s_cur_msg; void udp_sync_init(void) { memset(s_udp_sync, 0, sizeof(s_udp_sync)); - s_register_locked = false; s_udp_sync_num = 0; } @@ -68,18 +68,13 @@ void udp_sync_regitser(void *in_msg) { s_cur_msg = in_msg; - if (s_register_locked == true) - return ; - struct api_msg *msg = (struct api_msg *)in_msg; int s = msg->conn->socket; if (s < 0 || s >= UDP_SYNC_MAX) { ESP_LOGE(TAG, "UDP sync register error, socket is %d", s); - return ; } else if (s_udp_sync[s].msg) { ESP_LOGE(TAG, "UDP sync register error, msg is %p", s_udp_sync[s].msg); - return ; } s_udp_sync_num++; @@ -88,6 +83,25 @@ void udp_sync_regitser(void *in_msg) s_udp_sync[s].msg = msg; } +static void _udp_sync_ack_ret(int s, struct api_msg *msg) +{ + /* Only cache when low-level has no buffer to send packet */ + if (s_udp_sync[s].ret != ERR_MEM || s_udp_sync[s].retry >= UDP_SYNC_RETRY_MAX) { + + ESP_LOGD(TAG, "UDP sync ret %d retry %d", s_udp_sync[s].ret, s_udp_sync[s].retry); + + s_udp_sync[s].msg = NULL; + s_udp_sync[s].retry = 0; + s_udp_sync[s].ret = ERR_OK; + s_udp_sync_num--; + + TCPIP_APIMSG_ACK(msg); + } else { + s_udp_sync[s].retry++; + ESP_LOGD(TAG, "UDP sync ack error, errno %d", s_udp_sync[s].ret); + } +} + /* * @brief ack the message */ @@ -98,26 +112,11 @@ void udp_sync_ack(void *in_msg) if (s < 0 || s >= UDP_SYNC_MAX) { ESP_LOGE(TAG, "UDP sync ack error, socket is %d", s); - return ; } else if (!s_udp_sync[s].msg) { ESP_LOGE(TAG, "UDP sync ack error, msg is NULL"); - return ; } - /* Only cache when low-level has no buffer to send packet */ - if (s_udp_sync[s].ret != ERR_MEM || s_udp_sync[s].retry >= UDP_SYNC_RETRY_MAX) { - s_udp_sync[s].msg = NULL; - s_udp_sync[s].retry = 0; - s_udp_sync[s].ret = ERR_OK; - s_udp_sync_num--; - - ESP_LOGD(TAG, "UDP sync ret %d", s_udp_sync[s].ret); - - TCPIP_APIMSG_ACK(msg); - } else { - s_udp_sync[s].retry++; - ESP_LOGD(TAG, "UDP sync ack error, errno %d", s_udp_sync[s].ret); - } + _udp_sync_ack_ret(s, msg); s_cur_msg = NULL; } @@ -125,7 +124,7 @@ void udp_sync_ack(void *in_msg) /* * @brief set the current message send result */ -void udp_sync_set_ret(int ret) +void udp_sync_set_ret(void *netif, int ret) { /* Only poll and regitser can set current message */ if (!s_cur_msg) { @@ -139,15 +138,28 @@ void udp_sync_set_ret(int ret) if (s < 0 || s >= UDP_SYNC_MAX) { ESP_LOGE(TAG, "UDP sync ack error, socket is %d", s); - return ; } else if (!s_udp_sync[s].msg) { ESP_LOGE(TAG, "UDP sync ack error, msg is NULL"); - return ; } + s_udp_sync[s].netif = netif; s_udp_sync[s].ret = ret; } +static void udp_sync_send(struct api_msg *msg) +{ + struct pbuf *p = msg->msg.b->p; + int s = msg->conn->socket; + struct netif *netif = s_udp_sync[s].netif; + + s_cur_msg = msg; + + netif->linkoutput(netif, p); + _udp_sync_ack_ret(s, msg); + + s_cur_msg = NULL; +} + /* * @brief process the sync */ @@ -156,19 +168,17 @@ void udp_sync_proc(void) if (!s_udp_sync_num) return ; - s_register_locked = true; for (int i = 0; i < UDP_SYNC_MAX; i++) { if (!s_udp_sync[i].msg) continue; - lwip_netconn_do_send(s_udp_sync[i].msg); + udp_sync_send(s_udp_sync[i].msg); #if 0 //Todo: Add this later if (s_udp_sync[i].ret != ERR_OK) break; #endif } - s_register_locked = false; } #endif /* ESP_UDP */ diff --git a/components/lwip/port/esp8266/include/udp_sync.h b/components/lwip/port/esp8266/include/udp_sync.h index 29184fbf..b1040d49 100644 --- a/components/lwip/port/esp8266/include/udp_sync.h +++ b/components/lwip/port/esp8266/include/udp_sync.h @@ -43,7 +43,7 @@ void udp_sync_ack(void *in_msg); * * @param ret current message send result */ -void udp_sync_set_ret(int ret); +void udp_sync_set_ret(void *netif, int ret); /* * @brief process the sync diff --git a/components/lwip/port/esp8266/netif/ethernetif.c b/components/lwip/port/esp8266/netif/ethernetif.c index 45a7a5d6..cabf6041 100644 --- a/components/lwip/port/esp8266/netif/ethernetif.c +++ b/components/lwip/port/esp8266/netif/ethernetif.c @@ -303,7 +303,7 @@ static int8_t low_level_output(struct netif* netif, struct pbuf* p) */ err = esp_aio_sendto(&aio, NULL, 0); #if ESP_UDP - udp_sync_set_ret(err); + udp_sync_set_ret(netif, err); #endif if (err != ERR_OK) { if (err == ERR_MEM){