Merge branch 'feature/add_wifi_send_buffer_result_to_aio_ret' into 'master'

feat(lib): add wifi buffer send result to aio ret

See merge request sdk/ESP8266_RTOS_SDK!441
This commit is contained in:
Dong Heng
2018-09-07 15:46:08 +08:00
5 changed files with 139 additions and 71 deletions

View File

@ -121,8 +121,8 @@ typedef union {
/** @brief Parameters for an SSID scan. */ /** @brief Parameters for an SSID scan. */
typedef struct { typedef struct {
uint8_t *ssid; /**< SSID of AP */ uint8_t* ssid; /**< SSID of AP */
uint8_t *bssid; /**< MAC address of AP */ uint8_t* bssid; /**< MAC address of AP */
uint8_t channel; /**< channel, scan the specific channel */ uint8_t channel; /**< channel, scan the specific channel */
bool show_hidden; /**< enable to scan AP whose SSID is hidden */ bool show_hidden; /**< enable to scan AP whose SSID is hidden */
wifi_scan_type_t scan_type; /**< scan type, active or passive */ wifi_scan_type_t scan_type; /**< scan type, active or passive */
@ -156,30 +156,30 @@ typedef struct {
wifi_cipher_type_t pairwise_cipher; /**< pairwise cipher of AP */ wifi_cipher_type_t pairwise_cipher; /**< pairwise cipher of AP */
wifi_cipher_type_t group_cipher; /**< group cipher of AP */ wifi_cipher_type_t group_cipher; /**< group cipher of AP */
wifi_ant_t ant; /**< antenna used to receive beacon from AP */ wifi_ant_t ant; /**< antenna used to receive beacon from AP */
uint32_t phy_11b:1; /**< bit: 0 flag to identify if 11b mode is enabled or not */ uint32_t phy_11b: 1; /**< bit: 0 flag to identify if 11b mode is enabled or not */
uint32_t phy_11g:1; /**< bit: 1 flag to identify if 11g mode is enabled or not */ uint32_t phy_11g: 1; /**< bit: 1 flag to identify if 11g mode is enabled or not */
uint32_t phy_11n:1; /**< bit: 2 flag to identify if 11n mode is enabled or not */ uint32_t phy_11n: 1; /**< bit: 2 flag to identify if 11n mode is enabled or not */
uint32_t phy_lr:1; /**< bit: 3 flag to identify if low rate is enabled or not */ uint32_t phy_lr: 1; /**< bit: 3 flag to identify if low rate is enabled or not */
uint32_t wps:1; /**< bit: 4 flag to identify if WPS is supported or not */ uint32_t wps: 1; /**< bit: 4 flag to identify if WPS is supported or not */
uint32_t reserved:27; /**< bit: 5..31 reserved */ uint32_t reserved: 27; /**< bit: 5..31 reserved */
wifi_country_t country; /**< country information of AP */ wifi_country_t country; /**< country information of AP */
} wifi_ap_record_t; } wifi_ap_record_t;
typedef enum { typedef enum {
WIFI_FAST_SCAN = 0, /**< Do fast scan, scan will end after find SSID match AP */ WIFI_FAST_SCAN = 0, /**< Do fast scan, scan will end after find SSID match AP */
WIFI_ALL_CHANNEL_SCAN, /**< All channel scan, scan will end after scan all the channel */ WIFI_ALL_CHANNEL_SCAN, /**< All channel scan, scan will end after scan all the channel */
}wifi_scan_method_t; } wifi_scan_method_t;
typedef enum { typedef enum {
WIFI_CONNECT_AP_BY_SIGNAL = 0, /**< Sort match AP in scan list by RSSI */ WIFI_CONNECT_AP_BY_SIGNAL = 0, /**< Sort match AP in scan list by RSSI */
WIFI_CONNECT_AP_BY_SECURITY, /**< Sort match AP in scan list by security mode */ WIFI_CONNECT_AP_BY_SECURITY, /**< Sort match AP in scan list by security mode */
}wifi_sort_method_t; } wifi_sort_method_t;
/** @brief Structure describing parameters for a WiFi fast scan */ /** @brief Structure describing parameters for a WiFi fast scan */
typedef struct { typedef struct {
int8_t rssi; /**< The minimum rssi to accept in the fast scan mode */ int8_t rssi; /**< The minimum rssi to accept in the fast scan mode */
wifi_auth_mode_t authmode; /**< The weakest authmode to accept in the fast scan mode */ wifi_auth_mode_t authmode; /**< The weakest authmode to accept in the fast scan mode */
}wifi_fast_scan_threshold_t; } wifi_fast_scan_threshold_t;
typedef enum { typedef enum {
WIFI_PS_NONE, /**< No power save */ WIFI_PS_NONE, /**< No power save */
@ -238,11 +238,11 @@ typedef union {
/** @brief Description of STA associated with AP */ /** @brief Description of STA associated with AP */
typedef struct { typedef struct {
uint8_t mac[6]; /**< mac address */ uint8_t mac[6]; /**< mac address */
uint32_t phy_11b:1; /**< bit: 0 flag to identify if 11b mode is enabled or not */ uint32_t phy_11b: 1; /**< bit: 0 flag to identify if 11b mode is enabled or not */
uint32_t phy_11g:1; /**< bit: 1 flag to identify if 11g mode is enabled or not */ uint32_t phy_11g: 1; /**< bit: 1 flag to identify if 11g mode is enabled or not */
uint32_t phy_11n:1; /**< bit: 2 flag to identify if 11n mode is enabled or not */ uint32_t phy_11n: 1; /**< bit: 2 flag to identify if 11n mode is enabled or not */
uint32_t phy_lr:1; /**< bit: 3 flag to identify if low rate is enabled or not */ uint32_t phy_lr: 1; /**< bit: 3 flag to identify if low rate is enabled or not */
uint32_t reserved:28; /**< bit: 4..31 reserved */ uint32_t reserved: 28; /**< bit: 4..31 reserved */
} wifi_sta_info_t; } wifi_sta_info_t;
#define ESP_WIFI_MAX_CONN_NUM (10) /**< max number of stations which can connect to ESP8266 soft-AP */ #define ESP_WIFI_MAX_CONN_NUM (10) /**< max number of stations which can connect to ESP8266 soft-AP */
@ -298,31 +298,31 @@ typedef struct {
/** @brief Received packet radio metadata header, this is the common header at the beginning of all promiscuous mode RX callback buffers */ /** @brief Received packet radio metadata header, this is the common header at the beginning of all promiscuous mode RX callback buffers */
typedef struct { typedef struct {
signed rssi:8; /**< signal intensity of packet */ signed rssi: 8; /**< signal intensity of packet */
unsigned rate:4; /**< data rate */ unsigned rate: 4; /**< data rate */
unsigned is_group:1; unsigned is_group: 1;
unsigned :1; /**< reserve */ unsigned : 1; /**< reserve */
unsigned sig_mode:2; /**< 0:is not 11n packet; 1:is 11n packet */ unsigned sig_mode: 2; /**< 0:is not 11n packet; 1:is 11n packet */
unsigned legacy_length:12; unsigned legacy_length: 12;
unsigned damatch0:1; unsigned damatch0: 1;
unsigned damatch1:1; unsigned damatch1: 1;
unsigned bssidmatch0:1; unsigned bssidmatch0: 1;
unsigned bssidmatch1:1; unsigned bssidmatch1: 1;
unsigned mcs:7; /**< if is 11n packet, shows the modulation(range from 0 to 76) */ unsigned mcs: 7; /**< if is 11n packet, shows the modulation(range from 0 to 76) */
unsigned cwb:1; /**< if is 11n packet, shows if is HT40 packet or not */ unsigned cwb: 1; /**< if is 11n packet, shows if is HT40 packet or not */
unsigned HT_length:16; /**< reserve */ unsigned HT_length: 16; /**< reserve */
unsigned smoothing:1; /**< reserve */ unsigned smoothing: 1; /**< reserve */
unsigned not_sounding:1; /**< reserve */ unsigned not_sounding: 1; /**< reserve */
unsigned :1; /**< reserve */ unsigned : 1; /**< reserve */
unsigned aggregation:1; /**< Aggregation */ unsigned aggregation: 1; /**< Aggregation */
unsigned stbc:2; /**< STBC */ unsigned stbc: 2; /**< STBC */
unsigned fec_coding:1; /**< Flag is set for 11n packets which are LDPC */ unsigned fec_coding: 1; /**< Flag is set for 11n packets which are LDPC */
unsigned sgi:1; /**< SGI */ unsigned sgi: 1; /**< SGI */
unsigned rxend_state:8; unsigned rxend_state: 8;
unsigned ampdu_cnt:8; /**< ampdu cnt */ unsigned ampdu_cnt: 8; /**< ampdu cnt */
unsigned channel:4; /**< which channel this packet in */ unsigned channel: 4; /**< which channel this packet in */
unsigned :4; /**< reserve */ unsigned : 4; /**< reserve */
signed noise_floor:8; signed noise_floor: 8;
} wifi_pkt_rx_ctrl_t; } wifi_pkt_rx_ctrl_t;
/** @brief Payload passed to 'buf' parameter of promiscuous mode RX callback. /** @brief Payload passed to 'buf' parameter of promiscuous mode RX callback.
@ -372,6 +372,40 @@ typedef struct {
#define WIFI_EVENT_MASK_NONE (0) /**< mask none of the WiFi events */ #define WIFI_EVENT_MASK_NONE (0) /**< mask none of the WiFi events */
#define WIFI_EVENT_MASK_AP_PROBEREQRECVED (BIT(0)) /**< mask SYSTEM_EVENT_AP_PROBEREQRECVED event */ #define WIFI_EVENT_MASK_AP_PROBEREQRECVED (BIT(0)) /**< mask SYSTEM_EVENT_AP_PROBEREQRECVED event */
typedef enum {
TX_STATUS_SUCCESS = 1,
TX_STATUS_SRC_EXCEED,
TX_STATUS_LRC_EXCEED,
TX_STATUS_DISCARD,
} wifi_tx_result_t;
typedef enum {
PHY_RATE_1_LONG,
PHY_RATE_2_LONG,
PHY_RATE_5_LONG,
PHY_RATE_11_LONG,
PHY_RATE_RESERVED,
PHY_RATE_2_SHORT,
PHY_RATE_5_SHORT,
PHY_RATE_11_SHORT,
PHY_RATE_48,
PHY_RATE_24,
PHY_RATE_12,
PHY_RATE_6,
PHY_RATE_54,
PHY_RATE_36,
PHY_RATE_18,
PHY_RATE_9,
} wifi_tx_rate_t;
typedef struct {
unsigned wifi_tx_result: 8;
unsigned wifi_tx_src: 6;
unsigned wifi_tx_lrc: 6;
unsigned wifi_tx_rate: 8;
unsigned unused: 4;
} wifi_tx_status_t;
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -1,7 +1,7 @@
gwen: gwen:
core: b9f2d3e core: b9f2d3e
net80211: eca7811 net80211: eca7811
pp: eca7811 pp: 82269d9
smartconfig:eca7811 smartconfig:eca7811
wpa: eca7811 wpa: eca7811
phy: 1055_8 phy: 1055_8

Binary file not shown.

View File

@ -48,11 +48,13 @@ static int low_level_send_cb(esp_aio_t* aio);
static inline bool check_pbuf_to_insert(struct pbuf* p) static inline bool check_pbuf_to_insert(struct pbuf* p)
{ {
uint8_t* buf = (uint8_t *)p->payload; uint8_t* buf = (uint8_t*)p->payload;
/*Check if pbuf is tcp ip*/ /*Check if pbuf is tcp ip*/
if (buf[12] == 0x08 && buf[13] == 0x00 && buf[23] == 0x06) { if (buf[12] == 0x08 && buf[13] == 0x00 && buf[23] == 0x06) {
return true; return true;
} }
return false; return false;
} }
@ -69,20 +71,23 @@ static void insert_to_list(int fd, struct pbuf* p)
return; return;
} }
LWIP_DEBUGF(PBUF_CACHE_DEBUG, ("Insert %p,%d\n",p,pbuf_send_list_num)); LWIP_DEBUGF(PBUF_CACHE_DEBUG, ("Insert %p,%d\n", p, pbuf_send_list_num));
if (pbuf_list_head == NULL) {
pbuf_list_head = (pbuf_send_list_t* )malloc(sizeof(pbuf_send_list_t));
pbuf_send_list_num++;
if (!pbuf_list_head) { if (pbuf_list_head == NULL) {
LWIP_DEBUGF(PBUF_CACHE_DEBUG, ("no menory malloc pbuf list error\n")); tmp_pbuf_list1 = (pbuf_send_list_t*)malloc(sizeof(pbuf_send_list_t));
if (!tmp_pbuf_list1) {
LWIP_DEBUGF(PBUF_CACHE_DEBUG, ("no memory malloc pbuf list error\n"));
return; return;
} }
pbuf_ref(p); pbuf_ref(p);
pbuf_list_head->aiofd = fd; tmp_pbuf_list1->aiofd = fd;
pbuf_list_head->p = p; tmp_pbuf_list1->p = p;
pbuf_list_head->next = NULL; tmp_pbuf_list1->next = NULL;
pbuf_list_head->err_cnt = 0; tmp_pbuf_list1->err_cnt = 0;
pbuf_list_head = tmp_pbuf_list1;
pbuf_send_list_num++;
return; return;
} }
@ -94,16 +99,15 @@ static void insert_to_list(int fd, struct pbuf* p)
tmp_pbuf_list1->err_cnt ++; tmp_pbuf_list1->err_cnt ++;
return; return;
} }
tmp_pbuf_list2 = tmp_pbuf_list1; tmp_pbuf_list2 = tmp_pbuf_list1;
tmp_pbuf_list1 = tmp_pbuf_list2->next; tmp_pbuf_list1 = tmp_pbuf_list2->next;
} }
tmp_pbuf_list2->next = (pbuf_send_list_t*)malloc(sizeof(pbuf_send_list_t)); tmp_pbuf_list1 = (pbuf_send_list_t*)malloc(sizeof(pbuf_send_list_t));
pbuf_send_list_num++;
tmp_pbuf_list1 = tmp_pbuf_list2->next;
if (!tmp_pbuf_list1) { if (!tmp_pbuf_list1) {
LWIP_DEBUGF(PBUF_CACHE_DEBUG, ("no menory malloc pbuf list error\n")); LWIP_DEBUGF(PBUF_CACHE_DEBUG, ("no memory malloc pbuf list error\n"));
return; return;
} }
@ -112,6 +116,8 @@ static void insert_to_list(int fd, struct pbuf* p)
tmp_pbuf_list1->p = p; tmp_pbuf_list1->p = p;
tmp_pbuf_list1->next = NULL; tmp_pbuf_list1->next = NULL;
tmp_pbuf_list1->err_cnt = 0; tmp_pbuf_list1->err_cnt = 0;
tmp_pbuf_list2->next = tmp_pbuf_list1;
pbuf_send_list_num++;
} }
void send_from_list() void send_from_list()
@ -121,7 +127,7 @@ void send_from_list()
while (pbuf_list_head != NULL) { while (pbuf_list_head != NULL) {
if (pbuf_list_head->p->ref == 1) { if (pbuf_list_head->p->ref == 1) {
tmp_pbuf_list1 = pbuf_list_head->next; tmp_pbuf_list1 = pbuf_list_head->next;
LWIP_DEBUGF(PBUF_CACHE_DEBUG, ("Delete %p,%d\n",pbuf_list_head->p,pbuf_send_list_num)); LWIP_DEBUGF(PBUF_CACHE_DEBUG, ("Delete %p,%d\n", pbuf_list_head->p, pbuf_send_list_num));
pbuf_free(pbuf_list_head->p); pbuf_free(pbuf_list_head->p);
free(pbuf_list_head); free(pbuf_list_head);
pbuf_send_list_num--; pbuf_send_list_num--;
@ -141,21 +147,23 @@ void send_from_list()
if (err == ERR_MEM) { if (err == ERR_MEM) {
pbuf_list_head->err_cnt++; pbuf_list_head->err_cnt++;
if (pbuf_list_head->err_cnt >= 3) { if (pbuf_list_head->err_cnt >= 3) {
LWIP_DEBUGF(PBUF_CACHE_DEBUG, ("Delete %p,%d\n",pbuf_list_head->p,pbuf_send_list_num)); LWIP_DEBUGF(PBUF_CACHE_DEBUG, ("Delete %p,%d\n", pbuf_list_head->p, pbuf_send_list_num));
pbuf_free(pbuf_list_head->p); pbuf_free(pbuf_list_head->p);
free(pbuf_list_head); free(pbuf_list_head);
pbuf_send_list_num--; pbuf_send_list_num--;
pbuf_list_head = tmp_pbuf_list1; pbuf_list_head = tmp_pbuf_list1;
} }
return; return;
} else if (err == ERR_OK){ } else if (err == ERR_OK) {
LWIP_DEBUGF(PBUF_CACHE_DEBUG, ("Delete %p,%d\n",pbuf_list_head->p,pbuf_send_list_num)); LWIP_DEBUGF(PBUF_CACHE_DEBUG, ("Delete %p,%d\n", pbuf_list_head->p, pbuf_send_list_num));
free(pbuf_list_head); free(pbuf_list_head);
pbuf_send_list_num--; pbuf_send_list_num--;
pbuf_list_head = tmp_pbuf_list1; pbuf_list_head = tmp_pbuf_list1;
} else { } else {
LWIP_DEBUGF(PBUF_CACHE_DEBUG, ("Delete %p,%d\n",pbuf_list_head->p,pbuf_send_list_num)); LWIP_DEBUGF(PBUF_CACHE_DEBUG, ("Delete %p,%d\n", pbuf_list_head->p, pbuf_send_list_num));
pbuf_free(pbuf_list_head->p); pbuf_free(pbuf_list_head->p);
free(pbuf_list_head); free(pbuf_list_head);
pbuf_send_list_num--; pbuf_send_list_num--;
@ -202,9 +210,31 @@ static void low_level_init(struct netif* netif)
* *
* @return 0 meaning successs * @return 0 meaning successs
*/ */
static int low_level_send_cb(esp_aio_t *aio) static int low_level_send_cb(esp_aio_t* aio)
{ {
struct pbuf *pbuf = aio->arg; struct pbuf* pbuf = aio->arg;
wifi_tx_status_t* status = (wifi_tx_status_t*) & (aio->ret);
if ((TX_STATUS_SUCCESS != status->wifi_tx_result) && check_pbuf_to_insert(pbuf)) {
uint8_t* buf = (uint8_t*)pbuf->payload;
struct eth_hdr ethhdr;
if (*(buf - 17) & 0x01) { //From DS
memcpy(&ethhdr.dest, buf - 2, ETH_HWADDR_LEN);
memcpy(&ethhdr.src, buf - 2 - ETH_HWADDR_LEN, ETH_HWADDR_LEN);
} else if (*(buf - 17) & 0x02) { //To DS
memcpy(&ethhdr.dest, buf - 2 - ETH_HWADDR_LEN - ETH_HWADDR_LEN, ETH_HWADDR_LEN);
memcpy(&ethhdr.src, buf - 2, 6);
} else {
pbuf_free(pbuf);
return 0;
}
memcpy(buf, &ethhdr, (ETH_HWADDR_LEN + ETH_HWADDR_LEN));
LWIP_DEBUGF(PBUF_CACHE_DEBUG, ("Send packet fail: result:%d, LRC:%d, SRC:%d, RATE:%d",
status->wifi_tx_result, status->wifi_tx_lrc, status->wifi_tx_src, status->wifi_tx_rate));
insert_to_list(aio->fd, aio->arg);
}
pbuf_free(pbuf); pbuf_free(pbuf);
@ -219,9 +249,9 @@ static int low_level_send_cb(esp_aio_t *aio)
* *
* @return LWIP pbuf pointer which it not "PBUF_FLAG_IS_CUSTOM" attribute * @return LWIP pbuf pointer which it not "PBUF_FLAG_IS_CUSTOM" attribute
*/ */
static inline struct pbuf *ethernetif_transform_pbuf(struct pbuf *pbuf) static inline struct pbuf* ethernetif_transform_pbuf(struct pbuf* pbuf)
{ {
struct pbuf *p; struct pbuf* p;
if (!(pbuf->flags & PBUF_FLAG_IS_CUSTOM) && IS_DRAM(pbuf->payload)) { if (!(pbuf->flags & PBUF_FLAG_IS_CUSTOM) && IS_DRAM(pbuf->payload)) {
/* /*
@ -232,8 +262,10 @@ static inline struct pbuf *ethernetif_transform_pbuf(struct pbuf *pbuf)
} }
p = pbuf_alloc(PBUF_RAW, pbuf->len, PBUF_RAM); p = pbuf_alloc(PBUF_RAW, pbuf->len, PBUF_RAM);
if (!p)
if (!p) {
return NULL; return NULL;
}
if (IS_IRAM(p->payload)) { if (IS_IRAM(p->payload)) {
LWIP_DEBUGF(NETIF_DEBUG, ("low_level_output: data in IRAM\n")); LWIP_DEBUGF(NETIF_DEBUG, ("low_level_output: data in IRAM\n"));
@ -285,6 +317,7 @@ static int8_t low_level_output(struct netif* netif, struct pbuf* p)
#endif #endif
p = ethernetif_transform_pbuf(p); p = ethernetif_transform_pbuf(p);
if (!p) { if (!p) {
LWIP_DEBUGF(NETIF_DEBUG, ("low_level_output: lack memory\n")); LWIP_DEBUGF(NETIF_DEBUG, ("low_level_output: lack memory\n"));
return ERR_OK; return ERR_OK;
@ -305,8 +338,9 @@ static int8_t low_level_output(struct netif* netif, struct pbuf* p)
#if ESP_UDP #if ESP_UDP
udp_sync_set_ret(netif, err); udp_sync_set_ret(netif, err);
#endif #endif
if (err != ERR_OK) { if (err != ERR_OK) {
if (err == ERR_MEM){ if (err == ERR_MEM) {
insert_to_list(aio.fd, p); insert_to_list(aio.fd, p);
err = ERR_OK; err = ERR_OK;
} }

View File

@ -241,7 +241,7 @@ esp_err_t tcpip_adapter_start(tcpip_adapter_if_t tcpip_if, uint8_t *mac, tcpip_a
} }
if (esp_netif[tcpip_if] == NULL) { if (esp_netif[tcpip_if] == NULL) {
ESP_LOGE(TAG, "TCPIP adapter has no menory\n"); ESP_LOGE(TAG, "TCPIP adapter has no memory\n");
return ESP_ERR_NO_MEM; return ESP_ERR_NO_MEM;
} }
memcpy(esp_netif[tcpip_if]->hwaddr, mac, NETIF_MAX_HWADDR_LEN); memcpy(esp_netif[tcpip_if]->hwaddr, mac, NETIF_MAX_HWADDR_LEN);