mirror of
https://github.com/espressif/ESP8266_RTOS_SDK.git
synced 2025-07-01 22:28:37 +08:00
Merge branch 'feature/refactor_tcpip_adapter' into 'refactor'
feature/refactor_tcpip_adapter See merge request sdk/ESP8266_RTOS_SDK!240
This commit is contained in:
@ -45,6 +45,7 @@ typedef enum {
|
||||
SYSTEM_EVENT_AP_STOP, /**< ESP8266 soft-AP stop */
|
||||
SYSTEM_EVENT_AP_STACONNECTED, /**< a station connected to ESP8266 soft-AP */
|
||||
SYSTEM_EVENT_AP_STADISCONNECTED, /**< a station disconnected from ESP8266 soft-AP */
|
||||
SYSTEM_EVENT_AP_STAIPASSIGNED, /**< ESP8266 soft-AP assign an IP to a connected station */
|
||||
SYSTEM_EVENT_AP_PROBEREQRECVED, /**< Receive probe request packet in soft-AP interface */
|
||||
SYSTEM_EVENT_GOT_IP6, /**< ESP8266 station or ap or ethernet interface v6IP addr is preferred */
|
||||
SYSTEM_EVENT_ETH_START, /**< ESP8266 ethernet start */
|
||||
|
@ -82,23 +82,6 @@ void os_install_putc1(void (*p)(char c));
|
||||
*/
|
||||
void os_putc(char c);
|
||||
|
||||
enum dhcp_status {
|
||||
DHCP_STOPPED, /**< disable DHCP */
|
||||
DHCP_STARTED /**< enable DHCP */
|
||||
};
|
||||
|
||||
struct dhcps_lease {
|
||||
bool enable; /**< enable DHCP lease or not */
|
||||
struct ip4_addr start_ip; /**< start IP of IP range */
|
||||
struct ip4_addr end_ip; /**< end IP of IP range */
|
||||
};
|
||||
|
||||
enum dhcps_offer_option {
|
||||
OFFER_START = 0x00, /**< DHCP offer option start */
|
||||
OFFER_ROUTER = 0x01, /**< DHCP offer router, only support this option now */
|
||||
OFFER_END /**< DHCP offer option start */
|
||||
};
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
@ -20,7 +20,6 @@
|
||||
#include <stdbool.h>
|
||||
#include "esp_err.h"
|
||||
#include "esp_interface.h"
|
||||
#include "queue.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
@ -1,10 +1,10 @@
|
||||
gwen:
|
||||
crypto: 137694e
|
||||
espnow: 137694e
|
||||
core: 137694e
|
||||
net80211: 137694e
|
||||
core: 68ec0eb
|
||||
net80211: 68ec0eb
|
||||
pp: 137694e
|
||||
pwm: 0181338
|
||||
smartconfig:9ec59b5
|
||||
wpa: 137694e
|
||||
wpa: 68ec0eb
|
||||
wps: 137694e
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -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,
|
||||
|
@ -18,6 +18,7 @@
|
||||
|
||||
#include "esp_err.h"
|
||||
#include "esp_wifi.h"
|
||||
#include "esp_misc.h"
|
||||
#include "esp_event.h"
|
||||
#include "esp_event_loop.h"
|
||||
#include "esp_system.h"
|
||||
@ -32,6 +33,15 @@
|
||||
|
||||
static const char* TAG = "event";
|
||||
|
||||
#define WIFI_API_CALL_CHECK(info, api_call, ret) \
|
||||
do{\
|
||||
esp_err_t __err = (api_call);\
|
||||
if ((ret) != __err) {\
|
||||
ESP_LOGE(TAG, "%s %d %s ret=0x%X", __FUNCTION__, __LINE__, (info), __err);\
|
||||
return __err;\
|
||||
}\
|
||||
} while(0)
|
||||
|
||||
typedef esp_err_t (*system_event_handler_t)(system_event_t *e);
|
||||
|
||||
static esp_err_t system_event_ap_start_handle_default(system_event_t *event);
|
||||
@ -51,58 +61,241 @@ static system_event_handler_t default_event_handlers[SYSTEM_EVENT_MAX] = { 0 };
|
||||
|
||||
static esp_err_t system_event_sta_got_ip_default(system_event_t *event)
|
||||
{
|
||||
ESP_LOGI(TAG, "sta ip: " IPSTR ", mask: " IPSTR ", gw: " IPSTR,
|
||||
IP2STR(&event->event_info.got_ip.ip_info.ip),
|
||||
IP2STR(&event->event_info.got_ip.ip_info.netmask),
|
||||
IP2STR(&event->event_info.got_ip.ip_info.gw));
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
static esp_err_t system_event_sta_lost_ip_default(system_event_t *event)
|
||||
{
|
||||
ESP_LOGI(TAG, "station ip lost");
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t system_event_ap_start_handle_default(system_event_t *event)
|
||||
{
|
||||
tcpip_adapter_ip_info_t ap_ip;
|
||||
uint8_t ap_mac[6];
|
||||
|
||||
WIFI_API_CALL_CHECK("esp_wifi_mac_get", esp_wifi_get_mac(ESP_IF_WIFI_AP, ap_mac), ESP_OK);
|
||||
|
||||
tcpip_adapter_get_ip_info(TCPIP_ADAPTER_IF_AP, &ap_ip);
|
||||
tcpip_adapter_start(TCPIP_ADAPTER_IF_AP, ap_mac, &ap_ip);
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t system_event_ap_stop_handle_default(system_event_t *event)
|
||||
{
|
||||
tcpip_adapter_stop(TCPIP_ADAPTER_IF_AP);
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t system_event_sta_start_handle_default(system_event_t *event)
|
||||
{
|
||||
tcpip_adapter_ip_info_t sta_ip;
|
||||
uint8_t sta_mac[6];
|
||||
|
||||
WIFI_API_CALL_CHECK("esp_wifi_mac_get", esp_wifi_get_mac(ESP_IF_WIFI_STA, sta_mac), ESP_OK);
|
||||
tcpip_adapter_get_ip_info(TCPIP_ADAPTER_IF_STA, &sta_ip);
|
||||
tcpip_adapter_start(TCPIP_ADAPTER_IF_STA, sta_mac, &sta_ip);
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t system_event_sta_stop_handle_default(system_event_t *event)
|
||||
{
|
||||
tcpip_adapter_stop(TCPIP_ADAPTER_IF_STA);
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t system_event_sta_connected_handle_default(system_event_t *event)
|
||||
{
|
||||
tcpip_adapter_dhcp_status_t status;
|
||||
|
||||
tcpip_adapter_up(TCPIP_ADAPTER_IF_STA);
|
||||
tcpip_adapter_dhcpc_get_status(TCPIP_ADAPTER_IF_STA, &status);
|
||||
|
||||
if (status == TCPIP_ADAPTER_DHCP_INIT) {
|
||||
tcpip_adapter_dhcpc_start(TCPIP_ADAPTER_IF_STA);
|
||||
} else if (status == TCPIP_ADAPTER_DHCP_STOPPED) {
|
||||
tcpip_adapter_ip_info_t sta_ip;
|
||||
tcpip_adapter_ip_info_t sta_old_ip;
|
||||
|
||||
tcpip_adapter_get_ip_info(TCPIP_ADAPTER_IF_STA, &sta_ip);
|
||||
tcpip_adapter_get_old_ip_info(TCPIP_ADAPTER_IF_STA, &sta_old_ip);
|
||||
|
||||
if (!(ip4_addr_isany_val(sta_ip.ip) || ip4_addr_isany_val(sta_ip.netmask) || ip4_addr_isany_val(sta_ip.gw))) {
|
||||
system_event_t evt;
|
||||
|
||||
evt.event_id = SYSTEM_EVENT_STA_GOT_IP;
|
||||
evt.event_info.got_ip.ip_changed = false;
|
||||
|
||||
if (memcmp(&sta_ip, &sta_old_ip, sizeof(sta_ip))) {
|
||||
evt.event_info.got_ip.ip_changed = true;
|
||||
}
|
||||
|
||||
memcpy(&evt.event_info.got_ip.ip_info, &sta_ip, sizeof(tcpip_adapter_ip_info_t));
|
||||
tcpip_adapter_set_old_ip_info(TCPIP_ADAPTER_IF_STA, &sta_ip);
|
||||
|
||||
esp_event_send(&evt);
|
||||
ESP_LOGD(TAG, "static ip: ip changed=%d", evt.event_info.got_ip.ip_changed);
|
||||
} else {
|
||||
ESP_LOGE(TAG, "invalid static ip");
|
||||
}
|
||||
}
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t system_event_sta_disconnected_handle_default(system_event_t *event)
|
||||
{
|
||||
tcpip_adapter_down(TCPIP_ADAPTER_IF_STA);
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
static esp_err_t esp_system_event_debug(system_event_t *event)
|
||||
{
|
||||
if (event == NULL) {
|
||||
ESP_LOGE(TAG, "event is null!");
|
||||
printf("event is null!");
|
||||
return ESP_FAIL;
|
||||
}
|
||||
|
||||
switch (event->event_id) {
|
||||
case SYSTEM_EVENT_WIFI_READY: {
|
||||
ESP_LOGD(TAG, "SYSTEM_EVENT_WIFI_READY");
|
||||
break;
|
||||
}
|
||||
case SYSTEM_EVENT_SCAN_DONE: {
|
||||
system_event_sta_scan_done_t *scan_done = &event->event_info.scan_done;
|
||||
ESP_LOGD(TAG, "SYSTEM_EVENT_SCAN_DONE, status:%d, number:%d", scan_done->status, scan_done->number);
|
||||
break;
|
||||
}
|
||||
case SYSTEM_EVENT_STA_START: {
|
||||
ESP_LOGD(TAG, "SYSTEM_EVENT_STA_START");
|
||||
break;
|
||||
}
|
||||
case SYSTEM_EVENT_STA_STOP: {
|
||||
ESP_LOGD(TAG, "SYSTEM_EVENT_STA_STOP");
|
||||
break;
|
||||
}
|
||||
case SYSTEM_EVENT_STA_CONNECTED: {
|
||||
system_event_sta_connected_t *connected = &event->event_info.connected;
|
||||
ESP_LOGD(TAG, "SYSTEM_EVENT_STA_CONNECTED, ssid:%s, ssid_len:%d, bssid:" MACSTR ", channel:%d, authmode:%d", \
|
||||
connected->ssid, connected->ssid_len, MAC2STR(connected->bssid), connected->channel, connected->authmode);
|
||||
break;
|
||||
}
|
||||
case SYSTEM_EVENT_STA_DISCONNECTED: {
|
||||
system_event_sta_disconnected_t *disconnected = &event->event_info.disconnected;
|
||||
ESP_LOGD(TAG, "SYSTEM_EVENT_STA_DISCONNECTED, ssid:%s, ssid_len:%d, bssid:" MACSTR ", reason:%d", \
|
||||
disconnected->ssid, disconnected->ssid_len, MAC2STR(disconnected->bssid), disconnected->reason);
|
||||
break;
|
||||
}
|
||||
case SYSTEM_EVENT_STA_AUTHMODE_CHANGE: {
|
||||
system_event_sta_authmode_change_t *auth_change = &event->event_info.auth_change;
|
||||
ESP_LOGD(TAG, "SYSTEM_EVENT_STA_AUTHMODE_CHNAGE, old_mode:%d, new_mode:%d", auth_change->old_mode, auth_change->new_mode);
|
||||
break;
|
||||
}
|
||||
case SYSTEM_EVENT_STA_GOT_IP: {
|
||||
system_event_sta_got_ip_t *got_ip = &event->event_info.got_ip;
|
||||
ESP_LOGD(TAG, "SYSTEM_EVENT_STA_GOT_IP, ip:" IPSTR ", mask:" IPSTR ", gw:" IPSTR,
|
||||
IP2STR(&got_ip->ip_info.ip),
|
||||
IP2STR(&got_ip->ip_info.netmask),
|
||||
IP2STR(&got_ip->ip_info.gw));
|
||||
break;
|
||||
}
|
||||
case SYSTEM_EVENT_STA_LOST_IP: {
|
||||
ESP_LOGD(TAG, "SYSTEM_EVENT_STA_LOST_IP");
|
||||
break;
|
||||
}
|
||||
case SYSTEM_EVENT_STA_WPS_ER_SUCCESS: {
|
||||
ESP_LOGD(TAG, "SYSTEM_EVENT_STA_WPS_ER_SUCCESS");
|
||||
break;
|
||||
}
|
||||
case SYSTEM_EVENT_STA_WPS_ER_FAILED: {
|
||||
ESP_LOGD(TAG, "SYSTEM_EVENT_STA_WPS_ER_FAILED");
|
||||
break;
|
||||
}
|
||||
case SYSTEM_EVENT_STA_WPS_ER_TIMEOUT: {
|
||||
ESP_LOGD(TAG, "SYSTEM_EVENT_STA_WPS_ER_TIMEOUT");
|
||||
break;
|
||||
}
|
||||
case SYSTEM_EVENT_STA_WPS_ER_PIN: {
|
||||
ESP_LOGD(TAG, "SYSTEM_EVENT_STA_WPS_ER_PIN");
|
||||
break;
|
||||
}
|
||||
case SYSTEM_EVENT_AP_START: {
|
||||
ESP_LOGD(TAG, "SYSTEM_EVENT_AP_START");
|
||||
break;
|
||||
}
|
||||
case SYSTEM_EVENT_AP_STOP: {
|
||||
ESP_LOGD(TAG, "SYSTEM_EVENT_AP_STOP");
|
||||
break;
|
||||
}
|
||||
case SYSTEM_EVENT_AP_STACONNECTED: {
|
||||
system_event_ap_staconnected_t *staconnected = &event->event_info.sta_connected;
|
||||
ESP_LOGD(TAG, "SYSTEM_EVENT_AP_STACONNECTED, mac:" MACSTR ", aid:%d", \
|
||||
MAC2STR(staconnected->mac), staconnected->aid);
|
||||
break;
|
||||
}
|
||||
case SYSTEM_EVENT_AP_STADISCONNECTED: {
|
||||
system_event_ap_stadisconnected_t *stadisconnected = &event->event_info.sta_disconnected;
|
||||
ESP_LOGD(TAG, "SYSTEM_EVENT_AP_STADISCONNECTED, mac:" MACSTR ", aid:%d", \
|
||||
MAC2STR(stadisconnected->mac), stadisconnected->aid);
|
||||
break;
|
||||
}
|
||||
case SYSTEM_EVENT_AP_PROBEREQRECVED: {
|
||||
system_event_ap_probe_req_rx_t *ap_probereqrecved = &event->event_info.ap_probereqrecved;
|
||||
ESP_LOGD(TAG, "SYSTEM_EVENT_AP_PROBEREQRECVED, rssi:%d, mac:" MACSTR, \
|
||||
ap_probereqrecved->rssi, \
|
||||
MAC2STR(ap_probereqrecved->mac));
|
||||
break;
|
||||
}
|
||||
case SYSTEM_EVENT_GOT_IP6: {
|
||||
ip6_addr_t *addr = &event->event_info.got_ip6.ip6_info.ip;
|
||||
ESP_LOGD(TAG, "SYSTEM_EVENT_AP_STA_GOT_IP6 address %04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x",
|
||||
IP6_ADDR_BLOCK1(addr),
|
||||
IP6_ADDR_BLOCK2(addr),
|
||||
IP6_ADDR_BLOCK3(addr),
|
||||
IP6_ADDR_BLOCK4(addr),
|
||||
IP6_ADDR_BLOCK5(addr),
|
||||
IP6_ADDR_BLOCK6(addr),
|
||||
IP6_ADDR_BLOCK7(addr),
|
||||
IP6_ADDR_BLOCK8(addr));
|
||||
break;
|
||||
}
|
||||
|
||||
default: {
|
||||
ESP_LOGW(TAG, "unexpected system event %d!", event->event_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t esp_event_process_default(system_event_t *event)
|
||||
{
|
||||
if (event == NULL) {
|
||||
ESP_LOGE(TAG, "Error: event is null!");
|
||||
return ESP_FAIL;
|
||||
}
|
||||
|
||||
esp_system_event_debug(event);
|
||||
if ((event->event_id < SYSTEM_EVENT_MAX)) {
|
||||
if (default_event_handlers[event->event_id] != NULL) {
|
||||
ESP_LOGV(TAG, "enter default callback");
|
||||
default_event_handlers[event->event_id](event);
|
||||
ESP_LOGV(TAG, "exit default callback");
|
||||
}
|
||||
} else {
|
||||
ESP_LOGE(TAG, "mismatch or invalid event, id=%d", event->event_id);
|
||||
return ESP_FAIL;
|
||||
}
|
||||
return ESP_OK;
|
||||
@ -118,4 +311,6 @@ void esp_event_set_default_wifi_handlers()
|
||||
default_event_handlers[SYSTEM_EVENT_STA_LOST_IP] = system_event_sta_lost_ip_default;
|
||||
default_event_handlers[SYSTEM_EVENT_AP_START] = system_event_ap_start_handle_default;
|
||||
default_event_handlers[SYSTEM_EVENT_AP_STOP] = system_event_ap_stop_handle_default;
|
||||
|
||||
//esp_register_shutdown_handler((shutdown_handler_t)esp_wifi_stop);
|
||||
}
|
@ -27,10 +27,9 @@
|
||||
|
||||
static const char* TAG = "event";
|
||||
static bool s_event_init_flag = false;
|
||||
static void *s_event_queue = NULL;
|
||||
static system_event_cb_t s_event_handler_cb = NULL;
|
||||
static void *s_event_ctx = NULL;
|
||||
static void *s_event_queue = NULL;
|
||||
|
||||
|
||||
static esp_err_t esp_event_post_to_user(system_event_t *event)
|
||||
{
|
||||
@ -40,33 +39,6 @@ static esp_err_t esp_event_post_to_user(system_event_t *event)
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
system_event_cb_t esp_event_loop_set_cb(system_event_cb_t cb, void *ctx)
|
||||
{
|
||||
system_event_cb_t old_cb = s_event_handler_cb;
|
||||
s_event_handler_cb = cb;
|
||||
s_event_ctx = ctx;
|
||||
return old_cb;
|
||||
}
|
||||
|
||||
esp_err_t esp_event_send(system_event_t *event)
|
||||
{
|
||||
if (s_event_queue == NULL) {
|
||||
ESP_LOGE(TAG, "Event loop not initialized via esp_event_loop_init, but esp_event_send called");
|
||||
return ESP_ERR_INVALID_STATE;
|
||||
}
|
||||
|
||||
portBASE_TYPE ret = wifi_queue_send(s_event_queue, event, 0, 1);
|
||||
if (ret != pdPASS) {
|
||||
if (event) {
|
||||
ESP_LOGE(TAG, "e=%d f", event->event_id);
|
||||
} else {
|
||||
ESP_LOGE(TAG, "e null");
|
||||
}
|
||||
return ESP_FAIL;
|
||||
}
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
static void esp_event_loop_task(void *pvParameters)
|
||||
{
|
||||
while (1) {
|
||||
@ -80,10 +52,35 @@ static void esp_event_loop_task(void *pvParameters)
|
||||
if (ret != ESP_OK) {
|
||||
ESP_LOGE(TAG, "post event to user fail!");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
system_event_cb_t esp_event_loop_set_cb(system_event_cb_t cb, void *ctx)
|
||||
{
|
||||
system_event_cb_t old_cb = s_event_handler_cb;
|
||||
s_event_handler_cb = cb;
|
||||
s_event_ctx = ctx;
|
||||
return old_cb;
|
||||
}
|
||||
|
||||
esp_err_t esp_event_send(system_event_t *event)
|
||||
{
|
||||
if (s_event_queue == NULL) {
|
||||
ESP_LOGE(TAG, "Event loop not initialized via esp_event_loop_init, but esp_event_send called");
|
||||
return ESP_ERR_INVALID_STATE;
|
||||
}
|
||||
|
||||
int ret = wifi_queue_send(s_event_queue, event, 0, 1);
|
||||
if (ret != true) {
|
||||
if (event) {
|
||||
ESP_LOGE(TAG, "e=%d f", event->event_id);
|
||||
} else {
|
||||
ESP_LOGE(TAG, "esp_event_loop_task end");
|
||||
ESP_LOGE(TAG, "e null");
|
||||
}
|
||||
return ESP_FAIL;
|
||||
}
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
QueueHandle_t esp_event_loop_get_queue(void)
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,16 +1,26 @@
|
||||
// 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 __DHCPS_H__
|
||||
#define __DHCPS_H__
|
||||
|
||||
#define USE_DNS
|
||||
|
||||
#include "sdkconfig.h"
|
||||
#include "esp_wifi.h"
|
||||
#include "lwip/ip_addr.h"
|
||||
|
||||
typedef struct dhcps_state{
|
||||
s16_t state;
|
||||
} dhcps_state;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>dhcpclient<6E>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>DHCP msg<73>ṹ<EFBFBD><E1B9B9>
|
||||
typedef struct dhcps_msg {
|
||||
u8_t op, htype, hlen, hops;
|
||||
u8_t xid[4];
|
||||
@ -25,66 +35,61 @@ typedef struct dhcps_msg {
|
||||
u8_t options[312];
|
||||
}dhcps_msg;
|
||||
|
||||
/* Defined in esp_misc.h */
|
||||
typedef struct {
|
||||
bool enable;
|
||||
ip4_addr_t start_ip;
|
||||
ip4_addr_t end_ip;
|
||||
} dhcps_lease_t;
|
||||
|
||||
enum dhcps_offer_option{
|
||||
OFFER_START = 0x00,
|
||||
OFFER_ROUTER = 0x01,
|
||||
OFFER_DNS = 0x02,
|
||||
OFFER_END
|
||||
};
|
||||
|
||||
#define DHCPS_COARSE_TIMER_SECS 1
|
||||
#define DHCPS_MAX_LEASE 0x64
|
||||
#define DHCPS_LEASE_TIME_DEF (120)
|
||||
#define DHCPS_LEASE_UNIT CONFIG_LWIP_DHCPS_LEASE_UNIT
|
||||
|
||||
struct dhcps_pool{
|
||||
struct ip4_addr ip;
|
||||
ip4_addr_t ip;
|
||||
u8_t mac[6];
|
||||
u32_t lease_timer;
|
||||
};
|
||||
|
||||
typedef struct _list_node {
|
||||
void* pnode;
|
||||
struct _list_node* pnext;
|
||||
} list_node;
|
||||
typedef u32_t dhcps_time_t;
|
||||
typedef u8_t dhcps_offer_t;
|
||||
|
||||
extern u32_t dhcps_lease_time;
|
||||
#define DHCPS_COARSE_TIMER_SECS 1
|
||||
#define DHCPS_LEASE_TIMER dhcps_lease_time //0x05A0
|
||||
#define DHCPS_MAX_LEASE 0x64
|
||||
#define BOOTP_BROADCAST 0x8000
|
||||
typedef struct {
|
||||
dhcps_offer_t dhcps_offer;
|
||||
dhcps_offer_t dhcps_dns;
|
||||
dhcps_time_t dhcps_time;
|
||||
dhcps_lease_t dhcps_poll;
|
||||
} dhcps_options_t;
|
||||
|
||||
#define DHCP_REPLY 2
|
||||
#define DHCP_HTYPE_ETHERNET 1
|
||||
#define DHCP_HLEN_ETHERNET 6
|
||||
typedef void (*dhcps_cb_t)(u8_t client_ip[4]);
|
||||
|
||||
#define DHCPS_SERVER_PORT 67
|
||||
#define DHCPS_CLIENT_PORT 68
|
||||
static inline bool dhcps_router_enabled (dhcps_offer_t offer)
|
||||
{
|
||||
return (offer & OFFER_ROUTER) != 0;
|
||||
}
|
||||
|
||||
#define DHCPDISCOVER 1
|
||||
#define DHCPOFFER 2
|
||||
#define DHCPREQUEST 3
|
||||
#define DHCPDECLINE 4
|
||||
#define DHCPACK 5
|
||||
#define DHCPNAK 6
|
||||
#define DHCPRELEASE 7
|
||||
static inline bool dhcps_dns_enabled (dhcps_offer_t offer)
|
||||
{
|
||||
return (offer & OFFER_DNS) != 0;
|
||||
}
|
||||
|
||||
#define DHCP_OPTION_SUBNET_MASK 1
|
||||
#define DHCP_OPTION_ROUTER 3
|
||||
#define DHCP_OPTION_DNS_SERVER 6
|
||||
#define DHCP_OPTION_REQ_IPADDR 50
|
||||
#define DHCP_OPTION_LEASE_TIME 51
|
||||
#define DHCP_OPTION_MSG_TYPE 53
|
||||
#define DHCP_OPTION_SERVER_ID 54
|
||||
#define DHCP_OPTION_INTERFACE_MTU 26
|
||||
#define DHCP_OPTION_PERFORM_ROUTER_DISCOVERY 31
|
||||
#define DHCP_OPTION_BROADCAST_ADDRESS 28
|
||||
#define DHCP_OPTION_REQ_LIST 55
|
||||
#define DHCP_OPTION_END 255
|
||||
|
||||
//#define USE_CLASS_B_NET 1
|
||||
#define DHCPS_DEBUG CONFIG_LWIP_DHCP_SERVER_DEBUG
|
||||
#define MAX_STATION_NUM CONFIG_LWIP_DHCPS_MAX_STATION_NUM
|
||||
|
||||
#define DHCPS_STATE_OFFER 1
|
||||
#define DHCPS_STATE_DECLINE 2
|
||||
#define DHCPS_STATE_ACK 3
|
||||
#define DHCPS_STATE_NAK 4
|
||||
#define DHCPS_STATE_IDLE 5
|
||||
#define DHCPS_STATE_RELEASE 6
|
||||
|
||||
#define dhcps_router_enabled(offer) ((offer & OFFER_ROUTER) != 0)
|
||||
|
||||
void dhcps_start(tcpip_adapter_ip_info_t* info);
|
||||
void dhcps_stop(void);
|
||||
void dhcps_start(struct netif *netif, ip4_addr_t ip);
|
||||
void dhcps_stop(struct netif *netif);
|
||||
void *dhcps_option_info(u8_t op_id, u32_t opt_len);
|
||||
void dhcps_set_option_info(u8_t op_id, void *opt_info, u32_t opt_len);
|
||||
bool dhcp_search_ip_on_mac(u8_t *mac, ip4_addr_t *ip);
|
||||
void dhcps_dns_setserver(const ip_addr_t *dnsserver);
|
||||
ip4_addr_t dhcps_dns_getserver();
|
||||
void dhcps_set_new_lease_cb(dhcps_cb_t cb);
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -0,0 +1,134 @@
|
||||
// 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.
|
||||
#pragma once
|
||||
|
||||
/** DHCP Options
|
||||
|
||||
This macros are not part of the public dhcpserver.h interface.
|
||||
**/
|
||||
typedef enum
|
||||
{
|
||||
/* RFC 1497 Vendor Extensions */
|
||||
|
||||
PAD = 0,
|
||||
END = 255,
|
||||
|
||||
SUBNET_MASK = 1,
|
||||
TIME_OFFSET = 2,
|
||||
ROUTER = 3,
|
||||
TIME_SERVER = 4,
|
||||
NAME_SERVER = 5,
|
||||
DOMAIN_NAME_SERVER = 6,
|
||||
LOG_SERVER = 7,
|
||||
COOKIE_SERVER = 8,
|
||||
LPR_SERVER = 9,
|
||||
IMPRESS_SERVER = 10,
|
||||
RESOURCE_LOCATION_SERVER = 11,
|
||||
HOST_NAME = 12,
|
||||
BOOT_FILE_SIZE = 13,
|
||||
MERIT_DUMP_FILE = 14,
|
||||
DOMAIN_NAME = 15,
|
||||
SWAP_SERVER = 16,
|
||||
ROOT_PATH = 17,
|
||||
EXTENSIONS_PATH = 18,
|
||||
|
||||
/* IP Layer Parameters per Host */
|
||||
|
||||
IP_FORWARDING = 19,
|
||||
NON_LOCAL_SOURCE_ROUTING = 20,
|
||||
POLICY_FILTER = 21,
|
||||
MAXIMUM_DATAGRAM_REASSEMBLY_SIZE = 22,
|
||||
DEFAULT_IP_TIME_TO_LIVE = 23,
|
||||
PATH_MTU_AGING_TIMEOUT = 24,
|
||||
PATH_MTU_PLATEAU_TABLE = 25,
|
||||
|
||||
/* IP Layer Parameters per Interface */
|
||||
|
||||
INTERFACE_MTU = 26,
|
||||
ALL_SUBNETS_ARE_LOCAL = 27,
|
||||
BROADCAST_ADDRESS = 28,
|
||||
PERFORM_MASK_DISCOVERY = 29,
|
||||
MASK_SUPPLIER = 30,
|
||||
PERFORM_ROUTER_DISCOVERY = 31,
|
||||
ROUTER_SOLICITATION_ADDRESS = 32,
|
||||
STATIC_ROUTE = 33,
|
||||
|
||||
/* Link Layer Parameters per Interface */
|
||||
|
||||
TRAILER_ENCAPSULATION = 34,
|
||||
ARP_CACHE_TIMEOUT = 35,
|
||||
ETHERNET_ENCAPSULATION = 36,
|
||||
|
||||
/* TCP Parameters */
|
||||
|
||||
TCP_DEFAULT_TTL = 37,
|
||||
TCP_KEEPALIVE_INTERVAL = 38,
|
||||
TCP_KEEPALIVE_GARBAGE = 39,
|
||||
|
||||
/* Application and Service Parameters */
|
||||
|
||||
NETWORK_INFORMATION_SERVICE_DOMAIN = 40,
|
||||
NETWORK_INFORMATION_SERVERS = 41,
|
||||
NETWORK_TIME_PROTOCOL_SERVERS = 42,
|
||||
VENDOR_SPECIFIC_INFORMATION = 43,
|
||||
NETBIOS_OVER_TCP_IP_NAME_SERVER = 44,
|
||||
NETBIOS_OVER_TCP_IP_DATAGRAM_DISTRIBUTION_SERVER = 45,
|
||||
NETBIOS_OVER_TCP_IP_NODE_TYPE = 46,
|
||||
NETBIOS_OVER_TCP_IP_SCOPE = 47,
|
||||
X_WINDOW_SYSTEM_FONT_SERVER = 48,
|
||||
X_WINDOW_SYSTEM_DISPLAY_MANAGER = 49,
|
||||
NETWORK_INFORMATION_SERVICE_PLUS_DOMAIN = 64,
|
||||
NETWORK_INFORMATION_SERVICE_PLUS_SERVERS = 65,
|
||||
MOBILE_IP_HOME_AGENT = 68,
|
||||
SMTP_SERVER = 69,
|
||||
POP3_SERVER = 70,
|
||||
NNTP_SERVER = 71,
|
||||
DEFAULT_WWW_SERVER = 72,
|
||||
DEFAULT_FINGER_SERVER = 73,
|
||||
DEFAULT_IRC_SERVER = 74,
|
||||
STREETTALK_SERVER = 75,
|
||||
STREETTALK_DIRECTORY_ASSISTANCE_SERVER = 76,
|
||||
|
||||
/* DHCP Extensions */
|
||||
|
||||
REQUESTED_IP_ADDRESS = 50,
|
||||
IP_ADDRESS_LEASE_TIME = 51,
|
||||
OPTION_OVERLOAD = 52,
|
||||
TFTP_SERVER_NAME = 66,
|
||||
BOOTFILE_NAME = 67,
|
||||
DHCP_MESSAGE_TYPE = 53,
|
||||
SERVER_IDENTIFIER = 54,
|
||||
PARAMETER_REQUEST_LIST = 55,
|
||||
MESSAGE = 56,
|
||||
MAXIMUM_DHCP_MESSAGE_SIZE = 57,
|
||||
RENEWAL_T1_TIME_VALUE = 58,
|
||||
REBINDING_T2_TIME_VALUE = 59,
|
||||
VENDOR_CLASS_IDENTIFIER = 60,
|
||||
CLIENT_IDENTIFIER = 61,
|
||||
|
||||
USER_CLASS = 77,
|
||||
FQDN = 81,
|
||||
DHCP_AGENT_OPTIONS = 82,
|
||||
NDS_SERVERS = 85,
|
||||
NDS_TREE_NAME = 86,
|
||||
NDS_CONTEXT = 87,
|
||||
CLIENT_LAST_TRANSACTION_TIME = 91,
|
||||
ASSOCIATED_IP = 92,
|
||||
USER_AUTHENTICATION_PROTOCOL = 98,
|
||||
AUTO_CONFIGURE = 116,
|
||||
NAME_SERVICE_SEARCH = 117,
|
||||
SUBNET_SELECTION = 118,
|
||||
DOMAIN_SEARCH = 119,
|
||||
CLASSLESS_ROUTE = 121,
|
||||
} dhcp_msg_option;
|
@ -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 */
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
||||
/**
|
||||
* @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_ */
|
||||
|
||||
|
1100
components/tcpip_adapter/tcpip_adapter_lwip.c
Normal file
1100
components/tcpip_adapter/tcpip_adapter_lwip.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -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;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user