diff --git a/components/esp8266/include/esp_module.h b/components/esp8266/include/esp_module.h deleted file mode 100644 index 9818f2fe..00000000 --- a/components/esp8266/include/esp_module.h +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2018 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef _ESP_MODULE_H -#define _ESP_MODULE_H - -#ifdef __cplusplus -extern "C" { -#endif - -#define __EXPORT_SYMBOL_NAME(sec) "ksymatab"sec - -#define __EXPORT_SYMBOL(sym, sec) \ - static const typeof(sym) *__ksymtab_##sym \ - __attribute__((used,section("ksymatab"sec))) \ - = &sym - -#define __DECLARE_SYMBOL_NAME(sec) __EXPORT_SYMBOL_NAME(sec) - -#define __DECLARE_SYMBOL(type, sym, sec) \ - static const type sym __attribute__((used,section("ksymatab"sec),aligned(sizeof(void *)))) - -#ifdef __cplusplus -} -#endif - -#endif /* _ESP_MODULE_H */ diff --git a/components/esp8266/include/esp_socket.h b/components/esp8266/include/esp_socket.h deleted file mode 100644 index 5b5ee1f4..00000000 --- a/components/esp8266/include/esp_socket.h +++ /dev/null @@ -1,260 +0,0 @@ -// Copyright 2018 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef _ESP_SOCKET_H -#define _ESP_SOCKET_H - -#include - -#include "esp_aio.h" -#include "esp_module.h" -#include "net/if_packet.h" -#include "net/if_socket.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* used for socket link */ -#define ESP_SOCKET_METHOD_BASENAME "esp_socket" -#define ESP_SOCKET_METHOD_NAME(sec) __DECLARE_SYMBOL_NAME(ESP_SOCKET_METHOD_BASENAME) -#define ESP_SOCKET_METHOD_DECLARE(sym) __DECLARE_SYMBOL(esp_socket_method_t, sym, ESP_SOCKET_METHOD_BASENAME) - -#ifndef socklen_t -typedef uint32_t socklen_t; -#endif - -#define esp_socket_va_start(va, arg) va = (va_list)arg - -/* - * socket async event - */ -enum esp_socket_event_type { - ESP_SOCKET_CONNECT_EVENT = 0, - ESP_SOCKET_ACCEPT_EVENT = ESP_SOCKET_CONNECT_EVENT, - ESP_SOCKET_RECV_EVENT = 1, - ESP_SOCKET_ERROR_EVENT = 2, - - ESP_SOCKET_MAX_EVENT -}; - -/* - * socket information object - */ -typedef struct esp_socket_info { - int domain; - int type; - int protocol; -} esp_socket_info_t; - -/* - * socket method object - */ -typedef struct esp_socket_method { - /* - * socket method name - */ - const char *name; - - /* - * @brief open lowlevel socket module - * - * @param info socket information - * - * @return return lowlevel socket index if successfully, otherwise return NULL - * and you can get the real fail reason by "errno" - */ - void* (*open)(esp_socket_info_t *info); - - /* - * @brief send a block of data asynchronously and receive result by callback function - * - * @param index lowlevel index - * @param aio asynchronous I/O controlling block - * @param to target address with lowlevel address data format - * @param len target address data length - * - * @return return 0 if successfully, otherwise return -1 and you can get the real fail - * reason by "errno" - */ - int (*aio_sendto)(void *index, esp_aio_t *aio, const struct sockaddr_ll *to, socklen_t len); - - /* - * @brief register an event and its callback function to lowlevel socket module - * - * @param index lowlevel index - * @param event asynchronous I/O event - * @param cb callback function - * @param arg callback function parameter - * - * @return return 0 if successfully, otherwise return -1 and you can get the real fail - * reason by "errno" - */ - int (*aio_event)(void *index, unsigned int event, esp_aio_cb_t cb, void *arg); - - /* - * @brief free buffer taken from event callback - * - * @param index lowlevel index - * @param pbuf buffer pointer - * - * @return return 0 if successfully, otherwise return -1 and you can get the real fail - * reason by "errno" - */ - int (*free_pbuf)(void *index, void *pbuf); - - /* - * @brief send request command to lowlevel socket module and get the result synchronously - * - * @param index lowlevel index - * @param cmd request command - * @param arg start address to variable parameters - * - * @return return 0 if successfully, otherwise return -1 and you can get the real fail - * reason by "errno" - */ - int (*ioctl)(void *index, unsigned int cmd, void *arg); - - /* - * @brief close lowlevel socket module - * - * @param index lowlevel index - * - * @return return 0 if successfully, otherwise return -1 and you can get the real fail - * reason by "errno" - */ - int (*close)(void *index); -} esp_socket_method_t; - -/* - * @brief free an aio control block by calling the callback function - * - * @param aio asynchronous I/O controlling block - * @param aio data handling result - * - * @return none - */ -static inline void esp_aio_free(esp_aio_t *aio, int status) -{ - if (aio->cb) { - aio->ret = status; - aio->cb(aio); - } -} - -/* - * @brief drop an aio control block by disable "pbuf" and "cb" - * and then the aio control block has no meaning - * - * @param aio asynchronous I/O controlling block - * - * @return none - */ -static inline void esp_aio_drop(esp_aio_t *aio) -{ - aio->pbuf = NULL; - aio->cb = NULL; -} - -/* - * @brief create a socket file description - * - * @param domain protocal domain and it must be "AF_PACKET" now - * @param type socket type and it must be "SOCK_RAW" now - * @param protocol target protocol and it must be "ETH_P_ALL" now - * - * @return return 0 if successfully, otherwise return -1 and you can get the real fail - * reason by "errno" - * - * @note using "AF_PACKET", "SOCK_RAW" and "ETH_P_ALL" means that you receive and send full - * ethernet II type message with full message head: " destination mac | source mac | type" - */ -int esp_socket(int domain, int type, int protocol); - -/* - * @brief send a block of data asynchronously and receive result by callback function - * - * @param aio asynchronous I/O controlling block - * @param to target address with lowlevel address data format - * @param len target address data length - * - * @return return 0 if successfully, otherwise return -1 and you can get the real fail - * reason by "errno" - */ -int esp_aio_sendto(esp_aio_t *aio, const struct sockaddr_ll *to, socklen_t len); - -/* - * @brief register an event and its callback function to target of file description - * - * @param fd file description - * @param event asynchronous I/O event - * @param cb callback function - * @param arg callback function parameter - * - * @return return 0 if successfully, otherwise return -1 and you can get the real fail - * reason by "errno" - */ -int esp_aio_event(int fd, unsigned int event, esp_aio_cb_t cb, void *arg); - -/* - * @brief lowlevel socket module upload event and its data - * - * @param index lowlevel index - * @param info socket information - * @param event asynchronous I/O event - * @param aio asynchronous I/O controlling block - * - * @return return 0 if successfully, otherwise return -1 and you can get the real fail - * reason by "errno" - */ -int esp_upload_event(void *index, esp_socket_info_t *info, unsigned int event, esp_aio_data_t *aio_data); - -/* - * @brief free buffer taken from event callback - * - * @param fd file description - * @param pbuf buffer pointer - * - * @return return 0 if successfully, otherwise return -1 and you can get the real fail - * reason by "errno" - */ -int esp_free_pbuf(int fd, void *pbuf); - -/* - * @brief send request command to target by file description and get the result synchronously - * - * @param fd file description - * @param cmd request command - * @param ... realy command parameters and it must be related to realy object of lowlevel - * - * @return return 0 if successfully, otherwise return -1 and you can get the real fail - * reason by "errno" - */ -int esp_ioctl(int fd, unsigned int cmd, ...); - -/* - * @brief close target of file description - * - * @param fd file description - * - * @return return 0 if successfully, otherwise return -1 and you can get the real fail - * reason by "errno" - */ -int esp_close(int fd); - -#ifdef __cplusplus -} -#endif - -#endif /* _ESP_SOCKET_H */ diff --git a/components/esp8266/include/internal/esp_wifi_internal.h b/components/esp8266/include/internal/esp_wifi_internal.h index fc100bb0..f3eb9c74 100644 --- a/components/esp8266/include/internal/esp_wifi_internal.h +++ b/components/esp8266/include/internal/esp_wifi_internal.h @@ -63,6 +63,49 @@ typedef void (*wifi_sta_rx_probe_req_t)(const uint8_t *frame, int len, int rssi) */ esp_err_t esp_wifi_set_sta_rx_probe_req(wifi_sta_rx_probe_req_t cb); +/** + * @brief free the rx buffer which allocated by wifi driver + * + * @param void* buffer: rx buffer pointer + */ +void esp_wifi_internal_free_rx_buffer(void* buffer); + +/** + * @brief transmit the buffer via wifi driver + * + * @param wifi_interface_t wifi_if : wifi interface id + * @param void *buffer : the buffer to be tansmit + * @param uint16_t len : the length of buffer + * + * @return + * - ERR_OK : Successfully transmit the buffer to wifi driver + * - ERR_MEM : Out of memory + * - ERR_IF : WiFi driver error + * - ERR_ARG : Invalid argument + */ +int esp_wifi_internal_tx(wifi_interface_t wifi_if, void *buffer, uint16_t len); + +/** + * @brief The WiFi RX callback function + * + * Each time the WiFi need to forward the packets to high layer, the callback function will be called + */ +typedef esp_err_t (*wifi_rxcb_t)(void *buffer, uint16_t len, void *eb); + +/** + * @brief Set the WiFi RX callback + * + * @attention 1. Currently we support only one RX callback for each interface + * + * @param wifi_interface_t ifx : interface + * @param wifi_rxcb_t fn : WiFi RX callback + * + * @return + * - ESP_OK : succeed + * - others : fail + */ +esp_err_t esp_wifi_internal_reg_rxcb(wifi_interface_t ifx, wifi_rxcb_t fn); + #ifdef __cplusplus } #endif diff --git a/components/esp8266/include/net/if_packet.h b/components/esp8266/include/net/if_packet.h deleted file mode 100644 index 114cb577..00000000 --- a/components/esp8266/include/net/if_packet.h +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2018 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef _IF_PACKET_H -#define _IF_PACKET_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * socket II type address used by low-level module whose address is base on MAC address - * - * Note: Now it just support 802.3 and 802.11 protocol, so only "sll_addr" works here - */ -struct sockaddr_ll { - unsigned short sll_family; // it must be AF_PACKET - unsigned short sll_protocol; // physics level protocol - int sll_ifindex; // interface index not socket ID - unsigned short sll_hatype; // ARP hardware address type - unsigned char sll_pkttype; // packet type - unsigned char sll_halen; // hardware address length - unsigned char sll_addr[8]; // address data -}; - -#ifdef __cplusplus -} -#endif - -#endif /* _IF_PACKET_H */ diff --git a/components/esp8266/include/net/if_socket.h b/components/esp8266/include/net/if_socket.h deleted file mode 100644 index 389fef44..00000000 --- a/components/esp8266/include/net/if_socket.h +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2018 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef _IF_ETHER_H -#define _IF_ETHER_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * undefine some global macro - */ -#undef ETH_P_ALL -#undef ETH_P_ARP -#undef ETH_P_IP - -#undef AF_PACKET - -#undef SOCK_RAW - -/* - * socket domain - */ -#define AF_PACKET 0 - -/* - * socket type - */ -#define SOCK_RAW 0 - -/* - * use 16(2^4) type for socket - */ -#define IF_SOCK_SHIFT 4 -#define IF_SOCK_TYPE(d) (d & 0xf) -#define IF_SOCK_DATA(t, s) ((1 << (s + IF_SOCK_SHIFT)) + t) - -enum if_sock_type { - IF_SOCK_ETH = 0, - IF_SOCK_WIFI, - - IF_SOCK_MAX, -}; - -#define IF_ETH_DATA(s) IF_SOCK_DATA(IF_SOCK_ETH, s) -#define IF_WIFI_DATA(s) IF_SOCK_DATA(IF_SOCK_WIFI, s) - -/* - * socket protocol - */ -#define ETH_P_IP IF_ETH_DATA(0) -#define ETH_P_ARP IF_ETH_DATA(1) -#define ETH_P_ALL ETH_P_IP | ETH_P_ARP - -#define WIFI_P_MNG IF_WIFI_DATA(0) -#define WIFI_P_CTL IF_WIFI_DATA(1) -#define WIFI_P_DAT IF_WIFI_DATA(2) -#define WIFI_P_ALL WIFI_P_MNG | WIFI_P_CTL | WIFI_P_DAT - -#ifdef __cplusplus -} -#endif - -#endif /* _IF_ETHER_H */ diff --git a/components/esp8266/include/net/sockio.h b/components/esp8266/include/net/sockio.h deleted file mode 100644 index 8132a8b2..00000000 --- a/components/esp8266/include/net/sockio.h +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2018 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef _SOCKIO_H -#define _SOCKIO_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* espressif specific socket ioctls */ -#define SIOESPSTART 0x5500 /* start of espressif specific code */ - -/* routing table calls. */ -#define SIOCADDRT 0x890B /* add routing table entry */ -#define SIOCDELRT 0x890C /* delete routing table entry */ -#define SIOCRTMSG 0x890D /* call to routing system */ - -/* socket configuration controls. */ -#define SIOCGIFADDR 0x8915 /* get PA address */ -#define SIOCSIFADDR 0x8916 /* set PA address */ -#define SIOCGIFBRDADDR 0x8919 /* get broadcast PA address */ -#define SIOCSIFBRDADDR 0x891a /* set broadcast PA address */ -#define SIOCGIFNETMASK 0x891b /* get network PA mask */ -#define SIOCSIFNETMASK 0x891c /* set network PA mask */ -#define SIOCSIFHWADDR 0x8924 /* set hardware address */ -#define SIOCGIFHWADDR 0x8927 /* Get hardware address */ -#define SIOCGIFINDEX 0x8933 /* name -> if_index mapping */ -#define SIOGIFINDEX SIOCGIFINDEX /* misprint compatibility :-) */ - -#ifdef __cplusplus -} -#endif - -#endif /* _SOCKIO_H */ diff --git a/components/esp8266/ld/esp8266.common.ld b/components/esp8266/ld/esp8266.common.ld index c8c3e5c1..74b57db7 100644 --- a/components/esp8266/ld/esp8266.common.ld +++ b/components/esp8266/ld/esp8266.common.ld @@ -233,12 +233,7 @@ SECTIONS *(.user.data) *(.rodata.* .rodata .irom0.literal .irom.literal .irom.text.literal .irom0.text .irom.text) *(.literal.* .text.*) - - . = ALIGN(16); - __start_ksymatabesp_socket = .; - *(ksymatabesp_socket) - __stop_ksymatabesp_socket = .; - + _irom0_text_end = ABSOLUTE(.); } >irom0_0_seg :irom0_0_phdr diff --git a/components/esp8266/lib/VERSION b/components/esp8266/lib/VERSION index 414730ae..5d6ced50 100644 --- a/components/esp8266/lib/VERSION +++ b/components/esp8266/lib/VERSION @@ -1,10 +1,10 @@ gwen: - core: 0945c02 - net80211: a2ced47 - pp: 0945c02 - wpa: 4e2372f - espnow: eeb16c6 - wps: 4e2372f + core: f0128c3 + net80211: f0128c3 + pp: f0128c3 + wpa: f0128c3 + espnow: f0128c3 + wps: f0128c3 smartconfig: 2.8.1 phy: 1055_8 diff --git a/components/esp8266/lib/libcore.a b/components/esp8266/lib/libcore.a index e1ab0e01..c80c222c 100644 Binary files a/components/esp8266/lib/libcore.a and b/components/esp8266/lib/libcore.a differ diff --git a/components/esp8266/lib/libespnow.a b/components/esp8266/lib/libespnow.a index 0d8a0535..70d45422 100644 Binary files a/components/esp8266/lib/libespnow.a and b/components/esp8266/lib/libespnow.a differ diff --git a/components/esp8266/lib/libnet80211.a b/components/esp8266/lib/libnet80211.a old mode 100755 new mode 100644 index fdbe8139..864bd23f Binary files a/components/esp8266/lib/libnet80211.a and b/components/esp8266/lib/libnet80211.a differ diff --git a/components/esp8266/lib/libpp.a b/components/esp8266/lib/libpp.a index 65701206..a0b1f0c0 100644 Binary files a/components/esp8266/lib/libpp.a and b/components/esp8266/lib/libpp.a differ diff --git a/components/esp8266/lib/libwpa.a b/components/esp8266/lib/libwpa.a index c337f36c..9b2b2024 100644 Binary files a/components/esp8266/lib/libwpa.a and b/components/esp8266/lib/libwpa.a differ diff --git a/components/esp8266/lib/libwps.a b/components/esp8266/lib/libwps.a index a35f9608..bc3dea07 100644 Binary files a/components/esp8266/lib/libwps.a and b/components/esp8266/lib/libwps.a differ diff --git a/components/esp8266/source/esp_socket.c b/components/esp8266/source/esp_socket.c deleted file mode 100644 index 74d2def5..00000000 --- a/components/esp8266/source/esp_socket.c +++ /dev/null @@ -1,333 +0,0 @@ -// Copyright 2018 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include -#include -#include -#include - -#include "esp_socket.h" -#include "net/sockio.h" - -#define CRITICAL_DECLARE(t) -#define CRITICAL_ENTER(t) -#define CRITICAL_EXIT(t) - -#ifndef ESP_SOCKET_MAX -#define ESP_SOCKET_MAX 2 -#endif - -#define SET_ERR(err) errno = err - -#define CHECK_FD(s) \ - if (s >= ESP_SOCKET_MAX \ - || !s_socket[s].info) { \ - SET_ERR(EINVAL); \ - return -1; \ - } - -#define CHECK_METHOD(s, io) \ - CHECK_FD(s) \ - if (!s_socket[s].method \ - || !s_socket[s].method->io) { \ - SET_ERR(ESRCH); \ - return -1; \ - } - -#define SOCKET_IO_METHOD(s, io, ...) \ - s_socket[s].method->io(s_socket[s].index, ##__VA_ARGS__) - -/* - * socket event object - */ -typedef struct esp_socket_event { - esp_aio_cb_t cb; - void *arg; -} esp_socket_event_t; - -/* - * socket object - */ -typedef struct esp_socket { - esp_socket_info_t *info; - - /* - * lowlevel socket module index - */ - void *index; - - /* - * lowlevel socket module method - */ - const esp_socket_method_t *method; - - esp_socket_event_t event[ESP_SOCKET_MAX_EVENT]; -} esp_socket_t; - -static esp_socket_t s_socket[ESP_SOCKET_MAX]; - -static inline int event_is_used(int s, int e) -{ - return s_socket[s].event[e].cb != NULL; -} - -static inline int alloc_event(int s, int e) -{ - CRITICAL_DECLARE(t); - - if (e >= ESP_SOCKET_MAX_EVENT) - return -1; - - CRITICAL_ENTER(t); - if (event_is_used(s, e)) { - e = ESP_SOCKET_MAX_EVENT; - } - CRITICAL_EXIT(t); - - return e < ESP_SOCKET_MAX_EVENT ? e : -1; -} - -static inline void free_event(int s, int e) -{ - s_socket[s].event[e].cb = NULL; -} - -static inline int alloc_socket(void) -{ - int s; - CRITICAL_DECLARE(t); - - CRITICAL_ENTER(t); - for (s = 0; s < ESP_SOCKET_MAX; s++) { - if (s_socket[s].info == NULL) { - s_socket[s].info = (void *)1; - break; - } - } - CRITICAL_EXIT(t); - - return s < ESP_SOCKET_MAX ? s : -1; -} - -static inline void free_socket(int s) -{ - int e; - - s_socket[s].info = NULL; - for (e = 0; e < ESP_SOCKET_MAX_EVENT; e++) { - free_event(s, e); - } -} - -/* - * @brief create a socket file description - */ -int esp_socket(int domain, int type, int protocol) -{ - int s; - - s = alloc_socket(); - if (s < 0) { - SET_ERR(ENOMEM); - return -1; - } - - s_socket[s].info = malloc(sizeof(esp_socket_info_t)); - if (!s_socket[s].info) { - free_socket(s); - SET_ERR(ENOMEM); - return -1; - } - - s_socket[s].info->domain = domain; - s_socket[s].info->type = type; - s_socket[s].info->protocol = protocol; - - s_socket[s].index = NULL; - s_socket[s].method = NULL; - - return s; -} - -/* - * @brief send a block of data asynchronously and receive result by callback function - */ -int esp_aio_sendto(esp_aio_t *aio, const struct sockaddr_ll *to, socklen_t len) -{ - int s = aio->fd; - - CHECK_METHOD(s, aio_sendto); - - return SOCKET_IO_METHOD(s, aio_sendto, aio, to, len); -} - -/* - * @brief register a event and its callback function to target of file description - */ -int esp_aio_event(int fd, unsigned int event, esp_aio_cb_t cb, void *arg) -{ - int e; - int ret; - int s = fd; - - CHECK_METHOD(s, aio_event); - - e = alloc_event(s, event); - if (e < 0) { - SET_ERR(ENOMEM); - return -1; - } - - ret = SOCKET_IO_METHOD(s, aio_event, event, cb, arg); - if (ret) { - free_event(s, e); - return -1; - } - - s_socket[s].event[e].cb = cb; - s_socket[s].event[e].arg = arg; - - return 0; -} - -/* - * @brief lowlevel socket module upload event and its data - */ -int esp_upload_event(void *index, esp_socket_info_t *info, unsigned int event, esp_aio_data_t *aio_data) -{ - int ret; - int s; - - if (event >= ESP_SOCKET_MAX_EVENT) - return -EINVAL; - - for (s = 0; s < ESP_SOCKET_MAX; s++) { - if (s_socket[s].index == index && event_is_used(s, event)) { - esp_aio_t aio; - - aio.fd = s; - aio.cb = s_socket[s].event[event].cb; - aio.arg = s_socket[s].event[event].arg; - - aio.pbuf = aio_data->pbuf; - aio.len = aio_data->len; - aio.ret = aio_data->status; - - ret = s_socket[s].event[event].cb(&aio); - if (ret) - return ret; - } - } - - return 0; -} - -/* - * @brief free buffer taken from event callback - */ -int esp_free_pbuf(int fd, void *pbuf) -{ - int ret; - int s = fd; - - CHECK_METHOD(s, free_pbuf); - - ret = SOCKET_IO_METHOD(s, free_pbuf, pbuf); - if (ret) - return -1; - - return 0; -} - -/* - * @brief map real lowlevel socket object to virtual socket - */ -static int map_socket_ll(int fd, const char *name) -{ - int s = fd; - const esp_socket_method_t *p; - extern const esp_socket_method_t __start_ksymatabesp_socket, __stop_ksymatabesp_socket; - - for (p = &__start_ksymatabesp_socket; p != &__stop_ksymatabesp_socket; p++) { - if (!strcmp(name, p->name)) - break; - } - if (p >= &__stop_ksymatabesp_socket) { - SET_ERR(ENXIO); - return -1; - } - - s_socket[s].index = p->open(s_socket[s].info); - if (!s_socket[s].index) - return -1; - s_socket[s].method = p; - - return 0; -} - -/* - * @brief send requset command to target by file description and get the result synchronously - */ -int esp_ioctl(int fd, unsigned int cmd, ...) -{ - int ret; - va_list va; - int s = fd; - - va_start(va, cmd); - - switch(cmd) { -#if SIOCGIFINDEX != SIOGIFINDEX - case SIOGIFINDEX: -#endif - case SIOCGIFINDEX: { - const char *name; - - name = va_arg(va, const char *); - ret = map_socket_ll(fd, name); - break; - } - default: { - int *arg = ((int *)&cmd) + 1; - - CHECK_METHOD(s, ioctl); - ret = SOCKET_IO_METHOD(s, ioctl, cmd, arg); - break; - } - } - - va_end(va); - - return ret; -} - -/* - * @brief close target of file description - */ -int esp_close(int fd) -{ - int ret; - int s = fd; - - CHECK_METHOD(s, close); - - ret = SOCKET_IO_METHOD(s, close); - if (ret) - return -1; - - free(s_socket[s].info); - free_socket(s); - - return 0; -} diff --git a/components/esp8266/source/esp_wifi.c b/components/esp8266/source/esp_wifi.c index a7c3d9ba..3fc90cc5 100644 --- a/components/esp8266/source/esp_wifi.c +++ b/components/esp8266/source/esp_wifi.c @@ -17,8 +17,6 @@ #include "esp_system.h" #include "esp_wifi.h" #include "internal/esp_wifi_internal.h" -#include "esp_socket.h" -#include "net/sockio.h" #include "phy.h" const size_t _g_esp_wifi_ppt_task_stk_size = CONFIG_WIFI_PPT_TASKSTACK_SIZE; diff --git a/components/lwip/port/esp8266/netif/ethernetif.c b/components/lwip/port/esp8266/netif/ethernetif.c index a35a6808..e4e375ff 100644 --- a/components/lwip/port/esp8266/netif/ethernetif.c +++ b/components/lwip/port/esp8266/netif/ethernetif.c @@ -19,15 +19,15 @@ #include "netif/etharp.h" #include "esp_libc.h" #include "esp_wifi.h" +#include "esp_aio.h" #include "tcpip_adapter.h" -#include "esp_socket.h" #include "freertos/semphr.h" #include "lwip/tcpip.h" #include "stdlib.h" #include "esp8266/eagle_soc.h" -int8_t ieee80211_output_pbuf(uint8_t fd, uint8_t* dataptr, uint16_t datalen); +int ieee80211_output_pbuf(esp_aio_t *aio); int8_t wifi_get_netif(uint8_t fd); void wifi_station_set_default_hostname(uint8_t* hwaddr); @@ -144,7 +144,7 @@ void send_from_list() aio.arg = pbuf_list_head->p; aio.ret = 0; - err = esp_aio_sendto(&aio, NULL, 0); + err = ieee80211_output_pbuf(aio); tmp_pbuf_list1 = pbuf_list_head->next; if (err == ERR_MEM) { @@ -349,7 +349,7 @@ static int8_t low_level_output(struct netif* netif, struct pbuf* p) * we use "SOCK_RAW" to create socket, so all input/output datas include full ethernet * header, meaning we should not pass target low-level address here. */ - err = esp_aio_sendto(&aio, NULL, 0); + err = ieee80211_output_pbuf(&aio); #if ESP_UDP udp_sync_set_ret(netif, p, err); #endif diff --git a/components/tcpip_adapter/tcpip_adapter_lwip.c b/components/tcpip_adapter/tcpip_adapter_lwip.c index 6bfc0458..16e9fe19 100644 --- a/components/tcpip_adapter/tcpip_adapter_lwip.c +++ b/components/tcpip_adapter/tcpip_adapter_lwip.c @@ -40,17 +40,15 @@ #include "rom/ets_sys.h" #include "dhcpserver/dhcpserver.h" #include "dhcpserver/dhcpserver_options.h" -#include "net/sockio.h" -#include "esp_socket.h" #include "esp_log.h" #include "esp_wifi_osi.h" +#include "internal/esp_wifi_internal.h" struct tcpip_adapter_pbuf { struct pbuf_custom pbuf; - void *base; - - struct netif *netif; + void *eb; + void *buffer; }; struct tcpip_adapter_api_call_data { @@ -74,7 +72,6 @@ static esp_err_t tcpip_adapter_reset_ip_info(tcpip_adapter_if_t tcpip_if); static esp_err_t tcpip_adapter_start_ip_lost_timer(tcpip_adapter_if_t tcpip_if); static void tcpip_adapter_dhcpc_cb(struct netif *netif); static void tcpip_adapter_ip_lost_timer(void *arg); -static int tcpip_adapter_bind_netcard(const char *name, struct netif *netif); static void tcpip_adapter_dhcpc_done(void *arg); static bool tcpip_inited = false; @@ -190,6 +187,88 @@ void tcpip_adapter_init(void) } } +/* + * @brief LWIP custom pbuf callback function, it is to free custom pbuf + * + * @param p LWIP pbuf pointer + * + * @return none + */ +static void tcpip_adapter_free_pbuf(struct pbuf *p) +{ + struct tcpip_adapter_pbuf *pa = (struct tcpip_adapter_pbuf *)p; + + if (pa->eb) { + esp_wifi_internal_free_rx_buffer(pa->eb); + pa->eb = NULL; + } else { + os_free(pa->buffer); + pa->buffer = NULL; + } + + os_free(pa); +} + +/* + * @brief TCPIP adapter AI/O recieve callback function, it is to recieve input data + * and pass it to LWIP core + * + * @param aio AI/O control block pointer + * + * @return 0 if success or others if failed + */ +static int tcpip_adapter_recv_cb(void *index, void *buffer, uint16_t len, void *eb) +{ + struct pbuf *pbuf = NULL; + struct tcpip_adapter_pbuf *p; + struct netif *netif = (struct netif *)index; + + extern void ethernetif_input(struct netif *netif, struct pbuf *p); + + p = os_malloc(sizeof(struct tcpip_adapter_pbuf)); + if (!p) + return -ENOMEM; + + // PBUF_RAW means payload = (char *)aio->pbuf + offset(=0) + pbuf = pbuf_alloced_custom(PBUF_RAW, len, PBUF_REF, &p->pbuf, buffer, len); + if (!pbuf) + return -ENOMEM; + + p->pbuf.custom_free_function = tcpip_adapter_free_pbuf; + p->eb = (void *)eb; + p->buffer = buffer; + + ethernetif_input(netif, pbuf); + + return 0; +} + +/* + * @brief TCPIP adapter AI/O recieve callback function, it is to recieve input data + * and pass it to LWIP core + * + * @param aio AI/O control block pointer + * + * @return 0 if success or others if failed + */ +static int tcpip_adapter_ap_recv_cb(void *buffer, uint16_t len, void *eb) +{ + return tcpip_adapter_recv_cb(esp_netif[ESP_IF_WIFI_AP], buffer, len, eb); +} + +/* + * @brief TCPIP adapter AI/O recieve callback function, it is to recieve input data + * and pass it to LWIP core + * + * @param aio AI/O control block pointer + * + * @return 0 if success or others if failed + */ +static int tcpip_adapter_sta_recv_cb(void *buffer, uint16_t len, void *eb) +{ + return tcpip_adapter_recv_cb(esp_netif[ESP_IF_WIFI_STA], buffer, len, eb); +} + static void tcpip_adapter_dhcpc_done(void *arg) { struct dhcp *clientdhcp = netif_dhcp_data(esp_netif[TCPIP_ADAPTER_IF_STA]) ; @@ -247,7 +326,7 @@ static esp_err_t tcpip_adapter_update_default_netif(void) esp_err_t tcpip_adapter_start(tcpip_adapter_if_t tcpip_if, uint8_t *mac, tcpip_adapter_ip_info_t *ip_info) { - int s = -1; + esp_err_t ret = -1; if (tcpip_if >= TCPIP_ADAPTER_IF_MAX || mac == NULL || ip_info == NULL) { return ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS; } @@ -267,22 +346,19 @@ esp_err_t tcpip_adapter_start(tcpip_adapter_if_t tcpip_if, uint8_t *mac, tcpip_a } memcpy(esp_netif[tcpip_if]->hwaddr, mac, NETIF_MAX_HWADDR_LEN); if (tcpip_if == TCPIP_ADAPTER_IF_STA) { - const char *netcard_name = "sta0"; - s = tcpip_adapter_bind_netcard(netcard_name, esp_netif[tcpip_if]); - if (s < 0) { - ESP_LOGE(TAG, "TCPIP adapter bind net card %s error\n", netcard_name); + ret = esp_wifi_internal_reg_rxcb(ESP_IF_WIFI_STA, tcpip_adapter_sta_recv_cb); + if (ret < 0) { + ESP_LOGE(TAG, "TCPIP adapter bind %d error\n", ESP_IF_WIFI_STA); return ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS; } } else if (tcpip_if == TCPIP_ADAPTER_IF_AP) { - const char *netcard_name = "ap0"; - - s = tcpip_adapter_bind_netcard(netcard_name, esp_netif[tcpip_if]); - if (s < 0) { - ESP_LOGE(TAG, "TCPIP adapter bind net card %s error\n", netcard_name); + ret = esp_wifi_internal_reg_rxcb(ESP_IF_WIFI_AP, tcpip_adapter_ap_recv_cb); + if (ret < 0) { + ESP_LOGE(TAG, "TCPIP adapter bind %d error\n", ESP_IF_WIFI_AP); return ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS; } } - netif_add(esp_netif[tcpip_if], &ip_info->ip, &ip_info->netmask, &ip_info->gw, (void *)s, ethernetif_init, tcpip_input); + netif_add(esp_netif[tcpip_if], &ip_info->ip, &ip_info->netmask, &ip_info->gw, (void *)tcpip_if, ethernetif_init, tcpip_input); } if (tcpip_if == TCPIP_ADAPTER_IF_AP) { @@ -315,7 +391,7 @@ esp_err_t tcpip_adapter_stop(tcpip_adapter_if_t tcpip_if) return ESP_ERR_TCPIP_ADAPTER_IF_NOT_READY; } - esp_close((int)esp_netif[tcpip_if]->state); + esp_wifi_internal_reg_rxcb((wifi_interface_t)tcpip_if, NULL); if (!netif_is_up(esp_netif[tcpip_if])) { tcpip_adapter_clean_dhcp(esp_netif[tcpip_if]); netif_remove(esp_netif[tcpip_if]); @@ -343,89 +419,6 @@ esp_err_t tcpip_adapter_stop(tcpip_adapter_if_t tcpip_if) return ESP_OK; } - -/* - * @brief LWIP custom pbuf callback function, it is to free custom pbuf - * - * @param p LWIP pbuf pointer - * - * @return none - */ -static void tcpip_adapter_free_pbuf(struct pbuf *p) -{ - struct tcpip_adapter_pbuf *pa = (struct tcpip_adapter_pbuf *)p; - int s = (int)pa->netif->state; - - esp_free_pbuf(s, pa->base); - os_free(pa); -} - -/* - * @brief TCPIP adapter AI/O recieve callback function, it is to recieve input data - * and pass it to LWIP core - * - * @param aio AI/O control block pointer - * - * @return 0 if success or others if failed - */ -static int tcpip_adapter_recv_cb(struct esp_aio *aio) -{ - struct pbuf *pbuf = NULL; - struct tcpip_adapter_pbuf *p; - struct netif *netif = (struct netif *)aio->arg; - - extern void ethernetif_input(struct netif *netif, struct pbuf *p); - - p = os_malloc(sizeof(struct tcpip_adapter_pbuf)); - if (!p) - return -ENOMEM; - p->pbuf.custom_free_function = tcpip_adapter_free_pbuf; - p->base = (void *)aio->pbuf; - p->netif = netif; - - // PBUF_RAW means payload = (char *)aio->pbuf + offset(=0) - pbuf = pbuf_alloced_custom(PBUF_RAW, aio->len, PBUF_REF, &p->pbuf, (void *)aio->pbuf, aio->len); - if (!pbuf) - return -ENOMEM; - - ethernetif_input(netif, pbuf); - - return 0; -} - -/* - * @brief create a "esp_socket" and bind it to target net card - * - * @param name net card name pointer - * @param netif LWIP net interface pointer - * - * @return 0 if success or others if failed - */ -static int tcpip_adapter_bind_netcard(const char *name, struct netif *netif) -{ - int s, ret; - s = esp_socket(AF_PACKET, SOCK_RAW, ETH_P_ALL); - if (s < 0) { - ESP_LOGE(TAG,"create socket of (AF_PACKET, SOCK_RAW, ETH_P_ALL) error\n"); - return -1; - } - - ret = esp_ioctl(s, SIOCGIFINDEX, name); - if (ret) { - ESP_LOGE(TAG,"bind socket %d to netcard %s error\n", s, name); - esp_close(s); - return -1; - } - - ret = esp_aio_event(s, ESP_SOCKET_RECV_EVENT, tcpip_adapter_recv_cb, netif); - if (ret) { - ESP_LOGE(TAG,"socket %d register receive callback function %p error\n", s, tcpip_adapter_recv_cb); - esp_close(s); - return -1; - } - return s; -} - esp_err_t tcpip_adapter_up(tcpip_adapter_if_t tcpip_if) { if (tcpip_if == TCPIP_ADAPTER_IF_STA) {