feat(tcpip_adapter): Refactor tcpip_adapter APIs

This commit is contained in:
Zhang Jun Hao
2018-06-26 17:15:50 +08:00
parent dcee0ad023
commit b041d65caa
7 changed files with 1639 additions and 630 deletions

View File

@ -20,7 +20,6 @@
#include <stdbool.h>
#include "esp_err.h"
#include "esp_interface.h"
#include "queue.h"
#ifdef __cplusplus
extern "C" {

View File

@ -18,6 +18,8 @@
#include "esp_socket.h"
#include "net/sockio.h"
esp_err_t esp_wifi_init_internal(const wifi_init_config_t *config);
/**
* @brief Init WiFi
* Alloc resource for WiFi driver, such as WiFi control structure, RX/TX buffer,

View File

@ -26,6 +26,9 @@ int8_t ieee80211_output_pbuf(uint8_t fd, uint8_t* dataptr, uint16_t datalen);
int8_t wifi_get_netif(uint8_t fd);
void wifi_station_set_default_hostname(uint8_t* hwaddr);
#define IFNAME0 'e'
#define IFNAME1 'n'
/**
* In this function, the hardware should be initialized.
* Called from ethernetif_init().
@ -36,7 +39,7 @@ void wifi_station_set_default_hostname(uint8_t* hwaddr);
static void low_level_init(struct netif* netif)
{
if (netif == NULL) {
TCPIP_ATAPTER_LOG("ERROR netif is NULL\n");
LWIP_DEBUGF(NETIF_DEBUG, ("low_level_init: netif is NULL\n"));
return;
}
@ -48,7 +51,7 @@ static void low_level_init(struct netif* netif)
/* device capabilities */
/* don't set NETIF_FLAG_ETHARP if this device is not an ethernet one */
netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP | NETIF_FLAG_UP;
netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP;
#if LWIP_IGMP
netif->flags |= NETIF_FLAG_IGMP;
@ -131,7 +134,7 @@ static int8_t low_level_output(struct netif* netif, struct pbuf* p)
int8_t err = ERR_OK;
if (netif == NULL) {
TCPIP_ATAPTER_LOG("ERROR netif is NULL\n");
LWIP_DEBUGF(NETIF_DEBUG, ("low_level_output: netif is NULL\n"));
return ERR_ARG;
}
@ -186,23 +189,23 @@ void ethernetif_input(struct netif* netif, struct pbuf* p)
struct eth_hdr* ethhdr;
if (p == NULL) {
TCPIP_ATAPTER_LOG("ERROR pbuf is NULL\n");
LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: pbuf is NULL\n"));
goto _exit;
}
if (p->payload == NULL) {
TCPIP_ATAPTER_LOG("ERROR payload is NULL\n");
LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: payload is NULL\n"));
pbuf_free(p);
goto _exit;
}
if (netif == NULL) {
TCPIP_ATAPTER_LOG("ERROR netif is NULL\n");
LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: netif is NULL\n"));
goto _exit;
}
if (!(netif->flags & NETIF_FLAG_LINK_UP)) {
TCPIP_ATAPTER_LOG("ERROR netif is not up\n");
LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: netif is not up\n"));
pbuf_free(p);
p = NULL;
goto _exit;
@ -225,7 +228,7 @@ void ethernetif_input(struct netif* netif, struct pbuf* p)
/* full packet send to tcpip_thread to process */
if (netif->input(p, netif) != ERR_OK) {
TCPIP_ATAPTER_LOG("ERROR IP input error\n");
LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n"));
pbuf_free(p);
p = NULL;
}
@ -259,7 +262,7 @@ int8_t ethernetif_init(struct netif* netif)
uint8_t mac[NETIF_MAX_HWADDR_LEN];
if (netif == NULL) {
TCPIP_ATAPTER_LOG("ERROR netif is NULL\n");
LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_init: netif is NULL\n"));
}
/* set MAC hardware address */

View File

@ -1,7 +1,16 @@
menu "tcpip adapter"
config TCPIP_ADAPER_DEBUG
bool "Enable tcpip adaptor debug"
default 1
config IP_LOST_TIMER_INTERVAL
int "IP Address lost timer interval (seconds)"
range 0 65535
default 120
help
The value of 0 indicates the IP lost timer is disabled, otherwise the timer is enabled.
The IP address may be lost because of some reasons, e.g. when the station disconnects
from soft-AP, or when DHCP IP renew fails etc. If the IP lost timer is enabled, it will
be started everytime the IP is lost. Event SYSTEM_EVENT_STA_LOST_IP will be raised if
the timer expires. The IP lost timer is stopped if the station get the IP again before
the timer expires.
endmenu

View File

@ -15,7 +15,6 @@
#ifndef _TCPIP_ADAPTER_H_
#define _TCPIP_ADAPTER_H_
#include "sdkconfig.h"
/**
* @brief TCPIP adapter library
*
@ -33,8 +32,41 @@
* get free station list APIs in application side. Other APIs are used in ESP8266_RTOS_SDK internal,
* otherwise the state maybe wrong.
*
* TODO: ipv6 support will be added, use menuconfig to disable CONFIG_TCPIP_LWIP
*/
#include <stdint.h>
#include "esp_wifi_types.h"
#define CONFIG_TCPIP_LWIP 1
#define CONFIG_DHCP_STA_LIST 1
#if CONFIG_TCPIP_LWIP
#include "lwip/ip_addr.h"
#include "dhcpserver/dhcpserver.h"
#ifdef __cplusplus
extern "C" {
#endif
#define IP2STR(ipaddr) ip4_addr1_16(ipaddr), \
ip4_addr2_16(ipaddr), \
ip4_addr3_16(ipaddr), \
ip4_addr4_16(ipaddr)
#define IPSTR "%d.%d.%d.%d"
#define IPV62STR(ipaddr) IP6_ADDR_BLOCK1(&(ipaddr)), \
IP6_ADDR_BLOCK2(&(ipaddr)), \
IP6_ADDR_BLOCK3(&(ipaddr)), \
IP6_ADDR_BLOCK4(&(ipaddr)), \
IP6_ADDR_BLOCK5(&(ipaddr)), \
IP6_ADDR_BLOCK6(&(ipaddr)), \
IP6_ADDR_BLOCK7(&(ipaddr)), \
IP6_ADDR_BLOCK8(&(ipaddr))
#define IPV6STR "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x"
typedef struct {
ip4_addr_t ip;
ip4_addr_t netmask;
@ -45,28 +77,101 @@ typedef struct {
ip6_addr_t ip;
} tcpip_adapter_ip6_info_t;
typedef dhcps_lease_t tcpip_adapter_dhcps_lease_t;
#if CONFIG_DHCP_STA_LIST
typedef struct {
uint8_t mac[6];
ip4_addr_t ip;
} tcpip_adapter_sta_info_t;
typedef struct {
tcpip_adapter_sta_info_t sta[ESP_WIFI_MAX_CONN_NUM];
int num;
} tcpip_adapter_sta_list_t;
#endif
#endif
#define ESP_ERR_TCPIP_ADAPTER_BASE 0x5000 // TODO: move base address to esp_err.h
#define ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS ESP_ERR_TCPIP_ADAPTER_BASE + 0x01
#define ESP_ERR_TCPIP_ADAPTER_IF_NOT_READY ESP_ERR_TCPIP_ADAPTER_BASE + 0x02
#define ESP_ERR_TCPIP_ADAPTER_DHCPC_START_FAILED ESP_ERR_TCPIP_ADAPTER_BASE + 0x03
#define ESP_ERR_TCPIP_ADAPTER_DHCP_ALREADY_STARTED ESP_ERR_TCPIP_ADAPTER_BASE + 0x04
#define ESP_ERR_TCPIP_ADAPTER_DHCP_ALREADY_STOPPED ESP_ERR_TCPIP_ADAPTER_BASE + 0x05
#define ESP_ERR_TCPIP_ADAPTER_NO_MEM ESP_ERR_TCPIP_ADAPTER_BASE + 0x06
#define ESP_ERR_TCPIP_ADAPTER_DHCP_NOT_STOPPED ESP_ERR_TCPIP_ADAPTER_BASE + 0x07
/* TODO: add Ethernet interface */
typedef enum {
TCPIP_ADAPTER_IF_STA = 0, /**< ESP8266 station interface */
TCPIP_ADAPTER_IF_AP, /**< ESP8266 soft-AP interface */
TCPIP_ADAPTER_IF_STA = 0, /**< ESP32 station interface */
TCPIP_ADAPTER_IF_AP, /**< ESP32 soft-AP interface */
TCPIP_ADAPTER_IF_ETH, /**< ESP32 ethernet interface */
TCPIP_ADAPTER_IF_MAX
} tcpip_adapter_if_t;
struct netif *esp_netif[TCPIP_ADAPTER_IF_MAX];
char* hostname;
bool default_hostname;
/*type of DNS server*/
typedef enum {
TCPIP_ADAPTER_DNS_MAIN= 0, /**DNS main server address*/
TCPIP_ADAPTER_DNS_BACKUP, /**DNS backup server address,for STA only,support soft-AP in future*/
TCPIP_ADAPTER_DNS_FALLBACK, /**DNS fallback server address,for STA only*/
TCPIP_ADAPTER_DNS_MAX /**Max DNS */
} tcpip_adapter_dns_type_t;
#define TCPIP_ADAPTER_IF_VALID(fd) ((fd < TCPIP_ADAPTER_IF_MAX) ? 1 : 0)
/*info of DNS server*/
typedef struct {
ip_addr_t ip;
} tcpip_adapter_dns_info_t;
/* Define those to better describe your network interface. */
#define IFNAME0 'e'
#define IFNAME1 'n'
/* status of DHCP client or DHCP server */
typedef enum {
TCPIP_ADAPTER_DHCP_INIT = 0, /**< DHCP client/server in initial state */
TCPIP_ADAPTER_DHCP_STARTED, /**< DHCP client/server already been started */
TCPIP_ADAPTER_DHCP_STOPPED, /**< DHCP client/server already been stopped */
TCPIP_ADAPTER_DHCP_STATUS_MAX
} tcpip_adapter_dhcp_status_t;
#ifdef CONFIG_TCPIP_ADAPER_DEBUG
#define TAG "TCPIP_ADAPTER"
#define TCPIP_ATAPTER_LOG(str, ...) printf(TAG " line: %d " str, __LINE__, ##__VA_ARGS__)
#else
#define TCPIP_ATAPTER_LOG(str, ...)
#endif
/* set the option mode for DHCP client or DHCP server */
typedef enum{
TCPIP_ADAPTER_OP_START = 0,
TCPIP_ADAPTER_OP_SET, /**< set option mode */
TCPIP_ADAPTER_OP_GET, /**< get option mode */
TCPIP_ADAPTER_OP_MAX
} tcpip_adapter_option_mode_t;
typedef enum{
TCPIP_ADAPTER_DOMAIN_NAME_SERVER = 6, /**< domain name server */
TCPIP_ADAPTER_ROUTER_SOLICITATION_ADDRESS = 32, /**< solicitation router address */
TCPIP_ADAPTER_REQUESTED_IP_ADDRESS = 50, /**< request IP address pool */
TCPIP_ADAPTER_IP_ADDRESS_LEASE_TIME = 51, /**< request IP address lease time */
TCPIP_ADAPTER_IP_REQUEST_RETRY_TIME = 52, /**< request IP address retry counter */
} tcpip_adapter_option_id_t;
struct tcpip_adapter_api_msg_s;
typedef int (*tcpip_adapter_api_fn)(struct tcpip_adapter_api_msg_s *msg);
typedef struct tcpip_adapter_api_msg_s {
int type; /**< The first field MUST be int */
int ret;
tcpip_adapter_api_fn api_fn;
tcpip_adapter_if_t tcpip_if;
tcpip_adapter_ip_info_t *ip_info;
uint8_t *mac;
void *data;
} tcpip_adapter_api_msg_t;
typedef struct tcpip_adapter_dns_param_s {
tcpip_adapter_dns_type_t dns_type;
tcpip_adapter_dns_info_t *dns_info;
} tcpip_adapter_dns_param_t;
#define TCPIP_ADAPTER_TRHEAD_SAFE 1
#define TCPIP_ADAPTER_IPC_LOCAL 0
#define TCPIP_ADAPTER_IPC_REMOTE 1
typedef struct tcpip_adatper_ip_lost_timer_s {
bool timer_running;
} tcpip_adapter_ip_lost_timer_t;
/**
* @brief Initialize tcpip adapter
@ -75,4 +180,395 @@ bool default_hostname;
*/
void tcpip_adapter_init(void);
#endif /* _TCPIP_ADAPTER_H_ */
/**
* @brief Start the Wi-Fi station/AP interface with specific MAC and IP
*
* Station/AP interface will be initialized, connect WiFi stack with TCPIP stack.
*
* @param[in] tcpip_if: Station/AP interface
* @param[in] mac: set MAC address of this interface
* @param[in] ip_info: set IP address of this interface
*
* @return ESP_OK
* ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS
* ESP_ERR_NO_MEM
*/
esp_err_t tcpip_adapter_start(tcpip_adapter_if_t tcpip_if, uint8_t *mac, tcpip_adapter_ip_info_t *ip_info);
/**
* @brief Stop an interface
*
* The interface will be cleanup in this API, if DHCP server/client are started, will be stopped.
*
* @param[in] tcpip_if: the interface which will be started
*
* @return ESP_OK
* ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS
* ESP_ERR_TCPIP_ADAPTER_IF_NOT_READY
*/
esp_err_t tcpip_adapter_stop(tcpip_adapter_if_t tcpip_if);
/**
* @brief Bring up an interface
*
* Only station interface need to be brought up, since station interface will be shut down when disconnect.
*
* @param[in] tcpip_if: the interface which will be up
*
* @return ESP_OK
* ESP_ERR_TCPIP_ADAPTER_IF_NOT_READY
*/
esp_err_t tcpip_adapter_up(tcpip_adapter_if_t tcpip_if);
/**
* @brief Shut down an interface
*
* Only station interface need to be shut down, since station interface will be brought up when connect.
*
* @param[in] tcpip_if: the interface which will be down
*
* @return ESP_OK
* ESP_ERR_TCPIP_ADAPTER_IF_NOT_READY
*/
esp_err_t tcpip_adapter_down(tcpip_adapter_if_t tcpip_if);
/**
* @brief Get interface's IP information
*
* There has an IP information copy in adapter library, if interface is up, get IP information from
* interface, otherwise get from copy.
*
* @param[in] tcpip_if: the interface which we want to get IP information
* @param[out] ip_info: If successful, IP information will be returned in this argument.
*
* @return ESP_OK
* ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS
*/
esp_err_t tcpip_adapter_get_ip_info(tcpip_adapter_if_t tcpip_if, tcpip_adapter_ip_info_t *ip_info);
/**
* @brief Set interface's IP information
*
* There has an IP information copy in adapter library, if interface is up, also set interface's IP.
* DHCP client/server should be stopped before set new IP information.
*
* This function is mainly used for setting static IP.
*
* @param[in] tcpip_if: the interface which we want to set IP information
* @param[in] ip_info: store the IP information which needs to be set to specified interface
*
* @return ESP_OK
* ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS
*/
esp_err_t tcpip_adapter_set_ip_info(tcpip_adapter_if_t tcpip_if, tcpip_adapter_ip_info_t *ip_info);
/**
* @brief Set DNS Server's information
*
* There has an DNS Server information copy in adapter library, set DNS Server for appointed interface and type.
*
* 1.In station mode, if dhcp client is enabled, then only the fallback DNS server can be set(TCPIP_ADAPTER_DNS_FALLBACK).
* Fallback DNS server is only used if no DNS servers are set via DHCP.
* If dhcp client is disabled, then need to set main/backup dns server(TCPIP_ADAPTER_DNS_MAIN, TCPIP_ADAPTER_DNS_BACKUP).
*
* 2.In soft-AP mode, the DNS Server's main dns server offered to the station is the IP address of soft-AP,
* if the application don't want to use the IP address of soft-AP, they can set the main dns server.
*
* This function is mainly used for setting static or Fallback DNS Server.
*
* @param[in] tcpip_if: the interface which we want to set DNS Server information
* @param[in] type: the type of DNS Server,including TCPIP_ADAPTER_DNS_MAIN, TCPIP_ADAPTER_DNS_BACKUP, TCPIP_ADAPTER_DNS_FALLBACK
* @param[in] dns: the DNS Server address to be set
*
* @return
* - ESP_OK on success
* - ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS invalid params
*/
esp_err_t tcpip_adapter_set_dns_info(tcpip_adapter_if_t tcpip_if, tcpip_adapter_dns_type_t type, tcpip_adapter_dns_info_t *dns);
/**
* @brief Get DNS Server's information
*
* When set the DNS Server information successfully, can get the DNS Server's information via the appointed tcpip_if and type
*
* This function is mainly used for getting DNS Server information.
*
* @param[in] tcpip_if: the interface which we want to get DNS Server information
* @param[in] type: the type of DNS Server,including TCPIP_ADAPTER_DNS_MAIN, TCPIP_ADAPTER_DNS_BACKUP, TCPIP_ADAPTER_DNS_FALLBACK
* @param[in] dns: the DNS Server address to be get
*
* @return
* - ESP_OK on success
* - ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS invalid params
*/
esp_err_t tcpip_adapter_get_dns_info(tcpip_adapter_if_t tcpip_if, tcpip_adapter_dns_type_t type, tcpip_adapter_dns_info_t *dns);
/**
* @brief Get interface's old IP information
*
* When the interface successfully gets a valid IP from DHCP server or static configured, a copy of
* the IP information is set to the old IP information. When IP lost timer expires, the old IP
* information is reset to 0.
*
* @param[in] tcpip_if: the interface which we want to get old IP information
* @param[out] ip_info: If successful, IP information will be returned in this argument.
*
* @return ESP_OK
* ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS
*/
esp_err_t tcpip_adapter_get_old_ip_info(tcpip_adapter_if_t tcpip_if, tcpip_adapter_ip_info_t *ip_info);
/**
* @brief Set interface's old IP information
*
* When the interface successfully gets a valid IP from DHCP server or static configured, a copy of
* the IP information is set to the old IP information. When IP lost timer expires, the old IP
* information is reset to 0.
*
* @param[in] tcpip_if: the interface which we want to set old IP information
* @param[in] ip_info: store the IP information which needs to be set to specified interface
*
* @return ESP_OK
* ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS
*/
esp_err_t tcpip_adapter_set_old_ip_info(tcpip_adapter_if_t tcpip_if, tcpip_adapter_ip_info_t *ip_info);
/**
* @brief create interface's linklocal IPv6 information
*
* @note this function will create a linklocal IPv6 address about input interface,
* if this address status changed to preferred, will call event call back ,
* notify user linklocal IPv6 address has been verified
*
* @param[in] tcpip_if: the interface which we want to set IP information
*
*
* @return ESP_OK
* ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS
*/
esp_err_t tcpip_adapter_create_ip6_linklocal(tcpip_adapter_if_t tcpip_if);
/**
* @brief get interface's linkloacl IPv6 information
*
* There has an IPv6 information copy in adapter library, if interface is up,and IPv6 info
* is preferred,it will get IPv6 linklocal IP successfully
*
* @param[in] tcpip_if: the interface which we want to set IP information
* @param[in] if_ip6: If successful, IPv6 information will be returned in this argument.
*
* @return ESP_OK
* ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS
*/
esp_err_t tcpip_adapter_get_ip6_linklocal(tcpip_adapter_if_t tcpip_if, ip6_addr_t *if_ip6);
#if 0
esp_err_t tcpip_adapter_get_mac(tcpip_adapter_if_t tcpip_if, uint8_t *mac);
esp_err_t tcpip_adapter_set_mac(tcpip_adapter_if_t tcpip_if, uint8_t *mac);
#endif
/**
* @brief Get DHCP server's status
*
* @param[in] tcpip_if: the interface which we will get status of DHCP server
* @param[out] status: If successful, the status of DHCP server will be return in this argument.
*
* @return ESP_OK
*/
esp_err_t tcpip_adapter_dhcps_get_status(tcpip_adapter_if_t tcpip_if, tcpip_adapter_dhcp_status_t *status);
/**
* @brief Set or Get DHCP server's option
*
* @param[in] opt_op: option operate type, 1 for SET, 2 for GET.
* @param[in] opt_id: option index, 32 for ROUTER, 50 for IP POLL, 51 for LEASE TIME, 52 for REQUEST TIME
* @param[in] opt_val: option parameter
* @param[in] opt_len: option length
*
* @return ESP_OK
* ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS
* ESP_ERR_TCPIP_ADAPTER_DHCP_ALREADY_STOPPED
* ESP_ERR_TCPIP_ADAPTER_DHCP_ALREADY_STARTED
*/
esp_err_t tcpip_adapter_dhcps_option(tcpip_adapter_option_mode_t opt_op, tcpip_adapter_option_id_t opt_id, void *opt_val, uint32_t opt_len);
/**
* @brief Start DHCP server
*
* @note Currently DHCP server is bind to softAP interface.
*
* @param[in] tcpip_if: the interface which we will start DHCP server
*
* @return ESP_OK
* ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS
* ESP_ERR_TCPIP_ADAPTER_DHCP_ALREADY_STARTED
*/
esp_err_t tcpip_adapter_dhcps_start(tcpip_adapter_if_t tcpip_if);
/**
* @brief Stop DHCP server
*
* @note Currently DHCP server is bind to softAP interface.
*
* @param[in] tcpip_if: the interface which we will stop DHCP server
*
* @return ESP_OK
* ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS
* ESP_ERR_TCPIP_ADAPTER_DHCP_ALREADY_STOPED
* ESP_ERR_TCPIP_ADAPTER_IF_NOT_READY
*/
esp_err_t tcpip_adapter_dhcps_stop(tcpip_adapter_if_t tcpip_if);
/**
* @brief Get DHCP client status
*
* @param[in] tcpip_if: the interface which we will get status of DHCP client
* @param[out] status: If successful, the status of DHCP client will be return in this argument.
*
* @return ESP_OK
*/
esp_err_t tcpip_adapter_dhcpc_get_status(tcpip_adapter_if_t tcpip_if, tcpip_adapter_dhcp_status_t *status);
/**
* @brief Set or Get DHCP client's option
*
* @note This function is not implement now.
*
* @param[in] opt_op: option operate type, 1 for SET, 2 for GET.
* @param[in] opt_id: option index, 32 for ROUTER, 50 for IP POLL, 51 for LEASE TIME, 52 for REQUEST TIME
* @param[in] opt_val: option parameter
* @param[in] opt_len: option length
*
* @return ESP_OK
*/
esp_err_t tcpip_adapter_dhcpc_option(tcpip_adapter_option_mode_t opt_op, tcpip_adapter_option_id_t opt_id, void *opt_val, uint32_t opt_len);
/**
* @brief Start DHCP client
*
* @note Currently DHCP client is bind to station interface.
*
* @param[in] tcpip_if: the interface which we will start DHCP client
*
* @return ESP_OK
* ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS
* ESP_ERR_TCPIP_ADAPTER_DHCP_ALREADY_STARTED
* ESP_ERR_TCPIP_ADAPTER_DHCPC_START_FAILED
*/
esp_err_t tcpip_adapter_dhcpc_start(tcpip_adapter_if_t tcpip_if);
/**
* @brief Stop DHCP client
*
* @note Currently DHCP client is bind to station interface.
*
* @param[in] tcpip_if: the interface which we will stop DHCP client
*
* @return ESP_OK
* ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS
* ESP_ERR_TCPIP_ADAPTER_DHCP_ALREADY_STOPED
* ESP_ERR_TCPIP_ADAPTER_IF_NOT_READY
*/
esp_err_t tcpip_adapter_dhcpc_stop(tcpip_adapter_if_t tcpip_if);
esp_err_t tcpip_adapter_eth_input(void *buffer, uint16_t len, void *eb);
/**
* @brief Get data from station interface
*
* This function should be installed by esp_wifi_reg_rxcb, so WiFi packets will be forward to TCPIP stack.
*
* @param[in] void *buffer: the received data point
* @param[in] uint16_t len: the received data length
* @param[in] void *eb: parameter
*
* @return ESP_OK
*/
esp_err_t tcpip_adapter_sta_input(void *buffer, uint16_t len, void *eb);
/**
* @brief Get data from softAP interface
*
* This function should be installed by esp_wifi_reg_rxcb, so WiFi packets will be forward to TCPIP stack.
*
* @param[in] void *buffer: the received data point
* @param[in] uint16_t len: the received data length
* @param[in] void *eb: parameter
*
* @return ESP_OK
*/
esp_err_t tcpip_adapter_ap_input(void *buffer, uint16_t len, void *eb);
/**
* @brief Get WiFi interface index
*
* Get WiFi interface from TCPIP interface struct pointer.
*
* @param[in] void *dev: adapter interface
*
* @return ESP_IF_WIFI_STA
* ESP_IF_WIFI_AP
ESP_IF_ETH
* ESP_IF_MAX
*/
esp_interface_t tcpip_adapter_get_esp_if(void *dev);
/**
* @brief Get the station information list
*
* @param[in] wifi_sta_list_t *wifi_sta_list: station list info
* @param[out] tcpip_adapter_sta_list_t *tcpip_sta_list: station list info
*
* @return ESP_OK
* ESP_ERR_TCPIP_ADAPTER_NO_MEM
* ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS
*/
esp_err_t tcpip_adapter_get_sta_list(wifi_sta_list_t *wifi_sta_list, tcpip_adapter_sta_list_t *tcpip_sta_list);
#define TCPIP_HOSTNAME_MAX_SIZE 32
/**
* @brief Set the hostname to the interface
*
* @param[in] tcpip_if: the interface which we will set the hostname
* @param[in] hostname: the host name for set the interface, the max length of hostname is 32 bytes
*
* @return ESP_OK:success
* ESP_ERR_TCPIP_ADAPTER_IF_NOT_READY:interface status error
* ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS:parameter error
*/
esp_err_t tcpip_adapter_set_hostname(tcpip_adapter_if_t tcpip_if, const char *hostname);
/**
* @brief Get the hostname from the interface
*
* @param[in] tcpip_if: the interface which we will get the hostname
* @param[in] hostname: the host name from the interface
*
* @return ESP_OK:success
* ESP_ERR_TCPIP_ADAPTER_IF_NOT_READY:interface status error
* ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS:parameter error
*/
esp_err_t tcpip_adapter_get_hostname(tcpip_adapter_if_t tcpip_if, const char **hostname);
/**
* @brief Get the LwIP netif* that is assigned to the interface
*
* @param[in] tcpip_if: the interface which we will get the hostname
* @param[out] void ** netif: pointer to fill the resulting interface
*
* @return ESP_OK:success
* ESP_ERR_TCPIP_ADAPTER_IF_NOT_READY:interface status error
* ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS:parameter error
*/
esp_err_t tcpip_adapter_get_netif(tcpip_adapter_if_t tcpip_if, void ** netif);
#ifdef __cplusplus
}
#endif
#endif /* _TCPIP_ADAPTER_H_ */

File diff suppressed because it is too large Load Diff

View File

@ -1,600 +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 <stdlib.h>
#include <string.h>
#include "lwip/netif.h"
#include "lwip/tcpip.h"
#include "lwip/dhcp.h"
#include "lwip/errno.h"
#include "lwip/prot/dhcp.h"
#include "netif/etharp.h"
#include "esp_wifi.h"
#include "esp_timer.h"
#include "esp_misc.h"
#include "tcpip_adapter.h"
#include "dhcpserver/dhcpserver.h"
#include "net/sockio.h"
#include "esp_socket.h"
struct tcpip_adapter_pbuf {
struct pbuf_custom pbuf;
void *base;
struct netif *netif;
};
u32_t LwipTimOutLim = 0; // For light sleep. time out. limit is 3000ms
/* Avoid warning. No header file has include these function */
err_t ethernetif_init(struct netif* netif);
void system_station_got_ip_set();
static os_timer_t* get_ip_timer;
static uint8_t dhcp_fail_time;
static bool dhcps_flag = true;
static bool dhcpc_flag = true;
static tcpip_adapter_ip_info_t esp_ip[TCPIP_ADAPTER_IF_MAX];
void tcpip_adapter_init(void)
{
//TODO:add tcpip init function.
}
void esp_wifi_station_dhcpc_event(uint8_t netif_index)
{
if (TCPIP_ADAPTER_IF_VALID(netif_index)) {
TCPIP_ATAPTER_LOG("wifi station dhcpc start\n");
dhcp_stop(esp_netif[netif_index]);
dhcp_cleanup(esp_netif[netif_index]);
dhcp_inform(esp_netif[netif_index]);
} else {
TCPIP_ATAPTER_LOG("ERROR bad netif index:%d\n", netif_index);
}
}
static void tcpip_adapter_dhcpc_done()
{
struct dhcp *clientdhcp = netif_dhcp_data(esp_netif[TCPIP_ADAPTER_IF_STA]) ;
os_timer_disarm(get_ip_timer);
if (clientdhcp->state == DHCP_STATE_BOUND) {
/*send event here*/
system_station_got_ip_set();
printf("ip:" IPSTR ",mask:" IPSTR ",gw:" IPSTR "\n", IP2STR(ip_2_ip4(&(esp_netif[0]->ip_addr))),
IP2STR(ip_2_ip4(&(esp_netif[0]->netmask))), IP2STR(ip_2_ip4(&(esp_netif[0]->gw))));
} else if (dhcp_fail_time < 100) {
TCPIP_ATAPTER_LOG("dhcpc time(ms): %d\n", dhcp_fail_time * 200);
dhcp_fail_time ++;
os_timer_setfn(get_ip_timer, tcpip_adapter_dhcpc_done, NULL);
os_timer_arm(get_ip_timer, 200, 1);
} else {
TCPIP_ATAPTER_LOG("ERROR dhcp get ip error\n");
free(get_ip_timer);
}
}
static void tcpip_adapter_station_dhcp_start()
{
err_t ret;
get_ip_timer = (os_timer_t*)malloc(sizeof(*get_ip_timer));
if (get_ip_timer == NULL) {
TCPIP_ATAPTER_LOG("ERROR NO MEMORY\n");
}
TCPIP_ATAPTER_LOG("dhcpc start\n");
ret = dhcp_start(esp_netif[TCPIP_ADAPTER_IF_STA]);
dhcp_fail_time = 0;
if (ret == 0) {
os_timer_disarm(get_ip_timer);
os_timer_setfn(get_ip_timer, tcpip_adapter_dhcpc_done, NULL);
os_timer_arm(get_ip_timer, 100, 1);
}
}
/*
* @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) {
TCPIP_ATAPTER_LOG("create socket of (AF_PACKET, SOCK_RAW, ETH_P_ALL) error\n");
return -1;
}
ret = esp_ioctl(s, SIOCGIFINDEX, name);
if (ret) {
TCPIP_ATAPTER_LOG("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) {
TCPIP_ATAPTER_LOG("socket %d register receive callback function %p error\n", s, tcpip_adapter_recv_cb);
esp_close(s);
return -1;
}
return s;
}
void tcpip_adapter_start(uint8_t netif_index, bool authed)
{
if (!TCPIP_ADAPTER_IF_VALID(netif_index)) {
TCPIP_ATAPTER_LOG("ERROR bad netif index:%d\n", netif_index);
return;
}
TCPIP_ATAPTER_LOG("start netif[%d]\n", netif_index);
if (netif_index == TCPIP_ADAPTER_IF_STA) {
if (authed == 0) {
if (esp_netif[netif_index] == NULL) {
int s;
const char *netcard_name = "sta0";
esp_netif[netif_index] = (struct netif*)os_zalloc(sizeof(*esp_netif[netif_index]));
TCPIP_ATAPTER_LOG("Malloc netif:%d\n", netif_index);
TCPIP_ATAPTER_LOG("Add netif:%d\n", netif_index);
s = tcpip_adapter_bind_netcard(netcard_name, esp_netif[netif_index]);
if (s < 0) {
TCPIP_ATAPTER_LOG("TCPIP adapter bind net card %s error\n", netcard_name);
return ;
}
netif_add(esp_netif[netif_index], NULL, NULL, NULL, (void *)s, ethernetif_init, tcpip_input);
}
} else {
if (dhcpc_flag) {
printf("dhcp client start...\n");
tcpip_adapter_station_dhcp_start();
} else {
if (esp_ip[TCPIP_ADAPTER_IF_STA].ip.addr != 0) {
netif_set_addr(esp_netif[netif_index], &esp_ip[TCPIP_ADAPTER_IF_STA].ip,
&esp_ip[TCPIP_ADAPTER_IF_STA].netmask, &esp_ip[TCPIP_ADAPTER_IF_STA].gw);
netif_set_up(esp_netif[netif_index]);
system_station_got_ip_set();
printf("ip: 0.0.0.0,mask: 0.0.0.0,gw: 0.0.0.0\n");
} else {
printf("check your static ip\n");
}
}
}
} else if (netif_index == TCPIP_ADAPTER_IF_AP) {
if (dhcps_flag) {
IP4_ADDR(&esp_ip[TCPIP_ADAPTER_IF_AP].ip, 192, 168 , 4, 1);
IP4_ADDR(&esp_ip[TCPIP_ADAPTER_IF_AP].gw, 192, 168 , 4, 1);
IP4_ADDR(&esp_ip[TCPIP_ADAPTER_IF_AP].netmask, 255, 255 , 255, 0);
}
if (esp_netif[netif_index] == NULL) {
int s;
const char *netcard_name = "ap0";
TCPIP_ATAPTER_LOG("Malloc netif:%d\n", netif_index);
esp_netif[netif_index] = (struct netif*)os_zalloc(sizeof(*esp_netif[netif_index]));
s = tcpip_adapter_bind_netcard(netcard_name, esp_netif[netif_index]);
if (s < 0) {
TCPIP_ATAPTER_LOG("TCPIP adapter bind net card %s error\n", netcard_name);
return ;
}
netif_add(esp_netif[netif_index], &esp_ip[TCPIP_ADAPTER_IF_AP].ip,
&esp_ip[TCPIP_ADAPTER_IF_AP].netmask, &esp_ip[TCPIP_ADAPTER_IF_AP].gw, (void *)s, ethernetif_init, tcpip_input);
}
if (dhcps_flag) {
dhcps_start(&esp_ip[TCPIP_ADAPTER_IF_AP]);
printf("dhcp server start:(");
printf("ip:" IPSTR ",mask:" IPSTR ",gw:" IPSTR, IP2STR((ip_2_ip4(&esp_netif[TCPIP_ADAPTER_IF_AP]->ip_addr))),
IP2STR((ip_2_ip4(&esp_netif[TCPIP_ADAPTER_IF_AP]->netmask))), IP2STR((ip_2_ip4(&esp_netif[TCPIP_ADAPTER_IF_AP]->gw))));
printf(")\n");
}
netif_set_up(esp_netif[netif_index]);
netif_set_default(esp_netif[netif_index]);
}
wifi_mode_t opmode;
esp_wifi_get_mode(&opmode);
if (opmode == WIFI_MODE_STA) {
netif_set_default(esp_netif[netif_index]);
}
}
void tcpip_adapter_stop(uint8_t netif_index)
{
if (!TCPIP_ADAPTER_IF_VALID(netif_index)) {
TCPIP_ATAPTER_LOG("ERROR bad netif index:%d\n", netif_index);
return;
}
if (esp_netif[netif_index] == NULL)
return;
if (netif_index == TCPIP_ADAPTER_IF_STA) {
TCPIP_ATAPTER_LOG("dhcp stop netif index:%d\n", netif_index);
dhcp_stop(esp_netif[netif_index]);
}
if (netif_index == TCPIP_ADAPTER_IF_AP) {
if(dhcps_flag){
TCPIP_ATAPTER_LOG("dhcp stop netif index:%d\n", netif_index);
dhcps_stop();
}
}
TCPIP_ATAPTER_LOG("stop netif[%d]\n", netif_index);
esp_close((int)esp_netif[netif_index]->state);
netif_remove(esp_netif[netif_index]);
os_free(esp_netif[netif_index]);
esp_netif[netif_index] = NULL;
}
bool wifi_set_ip_info(wifi_interface_t netif_index, tcpip_adapter_ip_info_t* if_ip)
{
if (!TCPIP_ADAPTER_IF_VALID((uint8_t)netif_index)) {
TCPIP_ATAPTER_LOG("ERROR bad netif index:%d\n", netif_index);
return false;
}
TCPIP_ATAPTER_LOG("Set netif[%d] ip info\n", netif_index);
netif_set_addr(esp_netif[netif_index], &if_ip->ip, &if_ip->netmask, &if_ip->gw);
return true;
}
bool wifi_get_ip_info(wifi_interface_t netif_index, tcpip_adapter_ip_info_t* if_ip)
{
if (!TCPIP_ADAPTER_IF_VALID((uint8_t)netif_index)) {
TCPIP_ATAPTER_LOG("ERROR bad netif index:%d\n", netif_index);
return false;
}
if(if_ip == NULL){
TCPIP_ATAPTER_LOG("ERROR ip info is NULL\n");
return false;
}
TCPIP_ATAPTER_LOG("Get netif[%d] ip info\n", netif_index);
if_ip->ip.addr = ip_addr_get_ip4_u32(&esp_netif[netif_index]->ip_addr);
if_ip->netmask.addr = ip_addr_get_ip4_u32(&esp_netif[netif_index]->netmask);
if_ip->gw.addr = ip_addr_get_ip4_u32(&esp_netif[netif_index]->gw);
return true;
}
bool wifi_create_linklocal_ip(uint8_t netif_index, bool ipv6)
{
if (!TCPIP_ADAPTER_IF_VALID(netif_index)) {
TCPIP_ATAPTER_LOG("ERROR bad netif index:%d\n", netif_index);
return false;
}
netif_create_ip6_linklocal_address(esp_netif[netif_index], ipv6);
return true;
}
#if LWIP_IPV6
bool wifi_get_linklocal_ip(uint8_t netif_index, ip6_addr_t* linklocal)
{
if (TCPIP_ADAPTER_IF_VALID(netif_index)) {
memcpy(linklocal, ip_2_ip6(&esp_netif[netif_index]->ip6_addr[0]), sizeof(*linklocal));
} else {
TCPIP_ATAPTER_LOG("ERROR bad netif index:%d\n", netif_index);
return false;
}
return true;
}
bool wifi_get_ipinfo_v6(uint8_t netif_index, uint8_t ip_index, ip6_addr_t* ipv6)
{
if (TCPIP_ADAPTER_IF_VALID(netif_index)) {
memcpy(ipv6, &esp_netif[netif_index]->ip6_addr[ip_index], sizeof(ip6_addr_t));
} else {
TCPIP_ATAPTER_LOG("ERROR bad netif index:%d\n", netif_index);
return false;
}
return true;
}
#endif
bool wifi_softap_dhcps_start(void)
{
wifi_mode_t opmode = WIFI_MODE_NULL;
TCPIP_ATAPTER_LOG("start softap dhcps\n");
taskENTER_CRITICAL();
esp_wifi_get_mode(&opmode);
if ((opmode == WIFI_MODE_STA) || (opmode == WIFI_MODE_NULL)) {
taskEXIT_CRITICAL();
TCPIP_ATAPTER_LOG("ERROR you shoud enable wifi softap before start dhcp server\n");
return false;
}
if (dhcps_flag == false) {
tcpip_adapter_ip_info_t ipinfo;
wifi_get_ip_info(ESP_IF_WIFI_AP, &ipinfo);
TCPIP_ATAPTER_LOG("start softap dhcpserver\n");
dhcps_start(&ipinfo);
}
dhcps_flag = true;
taskEXIT_CRITICAL();
return true;
}
enum dhcp_status wifi_softap_dhcps_status()
{
return dhcps_flag;
}
void tcpip_adapter_sta_leave()
{
TCPIP_ATAPTER_LOG("station leave\n");
if (esp_netif[TCPIP_ADAPTER_IF_STA] == NULL) {
return;
}
netif_set_down(esp_netif[TCPIP_ADAPTER_IF_STA]);
if (dhcpc_flag) {
dhcp_release(esp_netif[TCPIP_ADAPTER_IF_STA]);
dhcp_stop(esp_netif[TCPIP_ADAPTER_IF_STA]);
dhcp_cleanup(esp_netif[TCPIP_ADAPTER_IF_STA]);
}
ip_addr_set_zero(&esp_netif[TCPIP_ADAPTER_IF_STA]->ip_addr);
ip_addr_set_zero(&esp_netif[TCPIP_ADAPTER_IF_STA]->netmask);
ip_addr_set_zero(&esp_netif[TCPIP_ADAPTER_IF_STA]->gw);
}
bool wifi_softap_dhcps_stop()
{
wifi_mode_t opmode = WIFI_MODE_NULL;
taskENTER_CRITICAL();
esp_wifi_get_mode(&opmode);
if ((opmode == WIFI_MODE_STA) || (opmode == WIFI_MODE_NULL)) {
taskEXIT_CRITICAL();
TCPIP_ATAPTER_LOG("ERROR you shoud enable wifi softap before start dhcp server\n");
return false;
}
if (dhcps_flag == true) {
TCPIP_ATAPTER_LOG("dhcps stop\n");
dhcps_stop();
}
dhcps_flag = false;
taskEXIT_CRITICAL();
return true;
}
bool wifi_station_dhcpc_start(void)
{
wifi_mode_t opmode = WIFI_MODE_NULL;
err_t ret;
taskENTER_CRITICAL();
esp_wifi_get_mode(&opmode);
if ((opmode == WIFI_MODE_AP) || (opmode == WIFI_MODE_NULL)) {
taskEXIT_CRITICAL();
TCPIP_ATAPTER_LOG("ERROR you shoud enable wifi station mode before start dhcp client\n");
return false;
}
if (dhcpc_flag == false) {
if (netif_is_up(esp_netif[TCPIP_ADAPTER_IF_STA])) {
ip_addr_set_zero(&esp_netif[TCPIP_ADAPTER_IF_STA]->ip_addr);
ip_addr_set_zero(&esp_netif[TCPIP_ADAPTER_IF_STA]->netmask);
ip_addr_set_zero(&esp_netif[TCPIP_ADAPTER_IF_STA]->gw);
} else {
taskEXIT_CRITICAL();
TCPIP_ATAPTER_LOG("ERROR please init station netif\n");
return false;
}
ret = dhcp_start(esp_netif[TCPIP_ADAPTER_IF_STA]);
if (ret != ERR_OK) {
taskEXIT_CRITICAL();
TCPIP_ATAPTER_LOG("ERROR start dhcp client failed.ret=%d\n", ret);
return false;
}
}
dhcps_flag = true;
taskEXIT_CRITICAL();
TCPIP_ATAPTER_LOG("dhcp client start\n");
return true;
}
bool wifi_station_dhcpc_stop()
{
wifi_mode_t opmode = WIFI_MODE_NULL;
taskENTER_CRITICAL();
esp_wifi_get_mode(&opmode);
if ((opmode == WIFI_MODE_AP) || (opmode == WIFI_MODE_NULL)) {
taskEXIT_CRITICAL();
TCPIP_ATAPTER_LOG("ERROR you shoud enable wifi station mode before stop dhcp client\n");
return false;
}
if (dhcpc_flag == true) {
dhcp_stop(esp_netif[TCPIP_ADAPTER_IF_STA]);
} else {
TCPIP_ATAPTER_LOG("WARING dhcp client have not start yet\n");
}
dhcpc_flag = false;
taskEXIT_CRITICAL();
TCPIP_ATAPTER_LOG("stop dhcp client\n");
return true;
}
enum dhcp_status wifi_station_dhcpc_status()
{
return dhcpc_flag;
}
bool wifi_station_dhcpc_set_maxtry(uint8_t num)
{
return true;
}
bool tcpip_adapter_set_macaddr(uint8_t netif_index, uint8_t* macaddr)
{
if (esp_netif[netif_index] == NULL || macaddr == NULL) {
TCPIP_ATAPTER_LOG("set macaddr fail\n");
return false;
}
memcpy(esp_netif[netif_index]->hwaddr, macaddr, 6);
TCPIP_ATAPTER_LOG("set macaddr ok\n");
return true;
}
bool tcpip_adapter_get_macaddr(uint8_t netif_index, uint8_t* macaddr)
{
if (esp_netif[netif_index] == NULL || macaddr == NULL) {
return false;
}
if (esp_netif[netif_index]->hwaddr[0] == 0 && esp_netif[netif_index]->hwaddr[1] == 0
&& esp_netif[netif_index]->hwaddr[2] == 0 && esp_netif[netif_index]->hwaddr[3] == 0
&& esp_netif[netif_index]->hwaddr[4] == 0 && esp_netif[netif_index]->hwaddr[5] == 0)
return false;
memcpy(macaddr, esp_netif[netif_index]->hwaddr, 6);
return true;
}
bool wifi_station_set_hostname(char* name)
{
if (name == NULL) {
return false;
}
uint32_t len = strlen(name);
if (len > 32) {
return false;
}
wifi_mode_t opmode;
esp_wifi_get_mode(&opmode);
if (opmode == WIFI_MODE_STA || opmode == WIFI_MODE_AP) {
default_hostname = 0;
if (hostname != NULL) {
free(hostname);
hostname = NULL;
}
hostname = (char*)malloc(len + 1);
if (hostname != NULL) {
strcpy(hostname, name);
esp_netif[opmode - 1]->hostname = hostname;
} else {
return false;
}
} else {
return false;
}
return true;
}
struct netif* eagle_lwip_getif(uint8_t netif_index)
{
if (TCPIP_ADAPTER_IF_VALID(netif_index)) {
return esp_netif[netif_index];
} else {
TCPIP_ATAPTER_LOG("ERROR bad netif index:%d\n", netif_index);
return NULL;
}
}