mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
Merge branch 'bugfix/got_ip_event' into 'master'
tcpip_adapter: got ip event stuff Include: 1. add dhcp callback; 2. post got ip event in dhcp callback when dhcp bind; 3. tcpip_adapter typedef clean; 4. post got ip event in station connected event handler when use valid static ip; TW6926 See merge request !61
This commit is contained in:
commit
28ca0b0526
@ -13,6 +13,7 @@
|
||||
// limitations under the License.
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "esp_err.h"
|
||||
#include "esp_wifi.h"
|
||||
@ -77,12 +78,18 @@ static esp_err_t system_event_sta_gotip_default(system_event_t *event)
|
||||
{
|
||||
extern esp_err_t esp_wifi_set_sta_ip(void);
|
||||
WIFI_API_CALL_CHECK("esp_wifi_set_sta_ip", esp_wifi_set_sta_ip(), ESP_OK);
|
||||
|
||||
printf("ip: " IPSTR ", mask: " IPSTR ", gw: " IPSTR "\n",
|
||||
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;
|
||||
}
|
||||
|
||||
esp_err_t system_event_ap_start_handle_default(system_event_t *event)
|
||||
{
|
||||
struct ip_info ap_ip;
|
||||
tcpip_adapter_ip_info_t ap_ip;
|
||||
uint8_t ap_mac[6];
|
||||
|
||||
WIFI_API_CALL_CHECK("esp_wifi_reg_rxcb", esp_wifi_reg_rxcb(WIFI_IF_AP, (wifi_rxcb_t)tcpip_adapter_ap_input), ESP_OK);
|
||||
@ -105,7 +112,7 @@ esp_err_t system_event_ap_stop_handle_default(system_event_t *event)
|
||||
|
||||
esp_err_t system_event_sta_start_handle_default(system_event_t *event)
|
||||
{
|
||||
struct ip_info sta_ip;
|
||||
tcpip_adapter_ip_info_t sta_ip;
|
||||
uint8_t sta_mac[6];
|
||||
|
||||
WIFI_API_CALL_CHECK("esp_wifi_mac_get", esp_wifi_get_mac(WIFI_IF_STA, sta_mac), ESP_OK);
|
||||
@ -134,6 +141,22 @@ esp_err_t system_event_sta_connected_handle_default(system_event_t *event)
|
||||
|
||||
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_get_ip_info(TCPIP_ADAPTER_IF_STA, &sta_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;
|
||||
|
||||
//notify event
|
||||
evt.event_id = SYSTEM_EVENT_STA_GOTIP;
|
||||
memcpy(&evt.event_info.got_ip.ip_info, &sta_ip, sizeof(tcpip_adapter_ip_info_t));
|
||||
|
||||
esp_event_send(&evt);
|
||||
} else {
|
||||
WIFI_DEBUG("invalid static ip\n");
|
||||
}
|
||||
}
|
||||
|
||||
return ESP_OK;
|
||||
@ -213,7 +236,7 @@ static esp_err_t esp_system_event_debug(system_event_t *event)
|
||||
}
|
||||
case SYSTEM_EVENT_STA_GOTIP:
|
||||
{
|
||||
system_event_sta_gotip_t *got_ip;
|
||||
system_event_sta_got_ip_t *got_ip;
|
||||
got_ip = &event->event_info.got_ip;
|
||||
WIFI_DEBUG("SYSTEM_EVENT_STA_GOTIP\n");
|
||||
break;
|
||||
|
@ -21,6 +21,8 @@
|
||||
#include "esp_err.h"
|
||||
#include "esp_wifi.h"
|
||||
|
||||
#include "tcpip_adapter.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
@ -42,10 +44,6 @@ typedef enum {
|
||||
SYSTEM_EVENT_MAX
|
||||
} system_event_id_t;
|
||||
|
||||
typedef struct {
|
||||
uint32_t addr;
|
||||
} esp_ip_addr_t;
|
||||
|
||||
typedef struct {
|
||||
uint32_t status; /**< status of scanning APs*/
|
||||
uint8_t number;
|
||||
@ -73,10 +71,8 @@ typedef struct {
|
||||
} system_event_sta_authmode_change_t;
|
||||
|
||||
typedef struct {
|
||||
esp_ip_addr_t ip;
|
||||
esp_ip_addr_t netmask;
|
||||
esp_ip_addr_t gw;
|
||||
} system_event_sta_gotip_t;
|
||||
tcpip_adapter_ip_info_t ip_info;
|
||||
} system_event_sta_got_ip_t;
|
||||
|
||||
typedef struct {
|
||||
uint8_t mac[6]; /**< MAC address of the station connected to ESP32 soft-AP */
|
||||
@ -98,7 +94,7 @@ typedef union {
|
||||
system_event_sta_disconnected_t disconnected; /**< ESP32 station disconnected to AP */
|
||||
system_event_sta_scan_done_t scan_done; /**< ESP32 station scan (APs) done */
|
||||
system_event_sta_authmode_change_t auth_change; /**< the auth mode of AP ESP32 station connected to changed */
|
||||
system_event_sta_gotip_t got_ip;
|
||||
system_event_sta_got_ip_t got_ip;
|
||||
system_event_ap_staconnected_t sta_connected; /**< a station connected to ESP32 soft-AP */
|
||||
system_event_ap_stadisconnected_t sta_disconnected; /**< a station disconnected to ESP32 soft-AP */
|
||||
system_event_ap_probe_req_rx_t ap_probereqrecved; /**< ESP32 softAP receive probe request packet */
|
||||
|
@ -266,9 +266,9 @@ static u8_t *add_offer_options(u8_t *optptr)
|
||||
*optptr++ = ip4_addr4(&ipadd);
|
||||
|
||||
if (dhcps_router_enabled(dhcps_offer)) {
|
||||
struct ip_info if_ip;
|
||||
tcpip_adapter_ip_info_t if_ip;
|
||||
//bzero(&if_ip, sizeof(struct ip_info));
|
||||
memset(&if_ip , 0x00, sizeof(struct ip_info));
|
||||
memset(&if_ip , 0x00, sizeof(tcpip_adapter_ip_info_t));
|
||||
|
||||
tcpip_adapter_get_ip_info(WIFI_IF_AP, &if_ip);
|
||||
|
||||
@ -1024,18 +1024,17 @@ static void dhcps_poll_set(u32_t ip)
|
||||
* : info -- The current ip info
|
||||
* Returns : none
|
||||
*******************************************************************************/
|
||||
void dhcps_start(struct netif *netif, struct ip_info *info)
|
||||
void dhcps_start(struct netif *netif, ip4_addr_t ip)
|
||||
{
|
||||
struct netif *apnetif = netif;
|
||||
|
||||
|
||||
if (apnetif->dhcps_pcb != NULL) {
|
||||
udp_remove(apnetif->dhcps_pcb);
|
||||
}
|
||||
|
||||
pcb_dhcps = udp_new();
|
||||
|
||||
if (pcb_dhcps == NULL || info == NULL) {
|
||||
if (pcb_dhcps == NULL || ip4_addr_isany_val(ip)) {
|
||||
printf("dhcps_start(): could not obtain pcb\n");
|
||||
}
|
||||
|
||||
@ -1043,7 +1042,7 @@ void dhcps_start(struct netif *netif, struct ip_info *info)
|
||||
|
||||
IP4_ADDR(&broadcast_dhcps, 255, 255, 255, 255);
|
||||
|
||||
server_address = info->ip;
|
||||
server_address.addr = ip.addr;
|
||||
dhcps_poll_set(server_address.addr);
|
||||
|
||||
client_address_plus.addr = dhcps_poll.start_ip.addr;
|
||||
|
@ -710,6 +710,24 @@ void dhcp_cleanup(struct netif *netif)
|
||||
}
|
||||
}
|
||||
|
||||
/* Espressif add start. */
|
||||
|
||||
/** Set callback for dhcp, reversed parameter for future use.
|
||||
*
|
||||
* @param netif the netif from which to remove the struct dhcp
|
||||
* @param cb callback for chcp
|
||||
*/
|
||||
void dhcp_set_cb(struct netif *netif, void (*cb)(void))
|
||||
{
|
||||
LWIP_ASSERT("netif != NULL", netif != NULL);
|
||||
|
||||
if (netif->dhcp != NULL) {
|
||||
netif->dhcp->cb = cb;
|
||||
}
|
||||
}
|
||||
|
||||
/* Espressif add end. */
|
||||
|
||||
/**
|
||||
* Start DHCP negotiation for a network interface.
|
||||
*
|
||||
@ -1117,32 +1135,19 @@ dhcp_bind(struct netif *netif)
|
||||
}
|
||||
#endif /* LWIP_DHCP_AUTOIP_COOP */
|
||||
|
||||
/* Espressif add start. */
|
||||
/* back up old ip/netmask/gw */
|
||||
ip4_addr_t ip, mask, gw;
|
||||
ip4_addr_set(&ip, ip_2_ip4(&netif->ip_addr));
|
||||
ip4_addr_set(&mask, ip_2_ip4(&netif->netmask));
|
||||
ip4_addr_set(&gw, ip_2_ip4(&netif->gw));
|
||||
/* Espressif add end. */
|
||||
|
||||
LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_bind(): IP: 0x%08"X32_F" SN: 0x%08"X32_F" GW: 0x%08"X32_F"\n",
|
||||
ip4_addr_get_u32(&dhcp->offered_ip_addr), ip4_addr_get_u32(&sn_mask), ip4_addr_get_u32(&gw_addr)));
|
||||
netif_set_addr(netif, &dhcp->offered_ip_addr, &sn_mask, &gw_addr);
|
||||
/* interface is used by routing now that an address is set */
|
||||
|
||||
#ifdef LWIP_ESP8266
|
||||
/* use old ip/mask/gw to check whether ip/mask/gw changed */
|
||||
// extern void system_station_got_ip_set(ip4_addr_t *ip, ip4_addr_t *mask, ip4_addr_t *gw);
|
||||
// system_station_got_ip_set(&ip, &mask, &gw);
|
||||
#endif
|
||||
|
||||
/* use old ip/mask/gw to check whether ip/mask/gw changed */
|
||||
// extern void system_station_got_ip_set(ip4_addr_t *ip, ip4_addr_t *mask, ip4_addr_t *gw);
|
||||
// system_station_got_ip_set(&ip, &mask, &gw);
|
||||
|
||||
/* netif is now bound to DHCP leased address */
|
||||
dhcp_set_state(dhcp, DHCP_STATE_BOUND);
|
||||
|
||||
/* Espressif add start. */
|
||||
if (dhcp->cb != NULL) {
|
||||
dhcp->cb();
|
||||
}
|
||||
/* Espressif add end. */
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -315,14 +315,6 @@ netif_add(struct netif *netif,
|
||||
return netif;
|
||||
}
|
||||
|
||||
typedef int (*netif_addr_change_cb_t)(struct netif *netif);
|
||||
static netif_addr_change_cb_t g_netif_addr_change_cb = NULL;
|
||||
|
||||
void netif_reg_addr_change_cb(void *cb)
|
||||
{
|
||||
g_netif_addr_change_cb = (netif_addr_change_cb_t)cb;
|
||||
}
|
||||
|
||||
#if LWIP_IPV4
|
||||
/**
|
||||
* Change IP address configuration for a network interface (including netmask
|
||||
@ -341,9 +333,6 @@ netif_set_addr(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *
|
||||
netif_set_gw(netif, gw);
|
||||
/* set ipaddr last to ensure netmask/gw have been set when status callback is called */
|
||||
netif_set_ipaddr(netif, ipaddr);
|
||||
if (g_netif_addr_change_cb){
|
||||
g_netif_addr_change_cb(netif);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* LWIP_IPV4*/
|
||||
|
@ -17,17 +17,6 @@
|
||||
#include "lwip/ip_addr.h"
|
||||
//#include "esp_common.h"
|
||||
#define USE_DNS
|
||||
/* Here for now until needed in other places in lwIP */
|
||||
#ifndef isprint
|
||||
#define in_range(c, lo, up) ((u8_t)c >= lo && (u8_t)c <= up)
|
||||
#define isprint(c) in_range(c, 0x20, 0x7f)
|
||||
#define isdigit(c) in_range(c, '0', '9')
|
||||
#define isxdigit(c) (isdigit(c) || in_range(c, 'a', 'f') || in_range(c, 'A', 'F'))
|
||||
#define islower(c) in_range(c, 'a', 'z')
|
||||
#define isspace(c) (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v')
|
||||
#endif
|
||||
|
||||
#ifdef LWIP_ESP8266
|
||||
|
||||
typedef struct dhcps_state{
|
||||
s16_t state;
|
||||
@ -164,6 +153,12 @@ typedef enum
|
||||
CLASSLESS_ROUTE = 121,
|
||||
} dhcp_msg_option;
|
||||
|
||||
/* 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,
|
||||
@ -188,22 +183,18 @@ typedef struct _list_node{
|
||||
typedef u32_t dhcps_time_t;
|
||||
typedef u8_t dhcps_offer_t;
|
||||
|
||||
/* struct dhcps_lease defined in tcpip_adapter.h */
|
||||
typedef struct dhcps_lease dhcps_lease_t;
|
||||
|
||||
typedef struct _dhcps_options{
|
||||
typedef struct {
|
||||
dhcps_offer_t dhcps_offer;
|
||||
dhcps_time_t dhcps_time;
|
||||
dhcps_lease_t dhcps_poll;
|
||||
}dhcps_options_t;
|
||||
} dhcps_options_t;
|
||||
|
||||
#define dhcps_router_enabled(offer) ((offer & OFFER_ROUTER) != 0)
|
||||
void dhcps_start(struct netif *netif, struct ip_info *info);
|
||||
#define dhcps_router_enabled(offer) ((offer & OFFER_ROUTER) != 0)
|
||||
|
||||
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);
|
||||
bool dhcp_search_ip_on_mac(u8_t *mac, ip4_addr_t *ip);
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -94,6 +94,10 @@ struct dhcp
|
||||
ip_addr_t offered_si_addr;
|
||||
char boot_file_name[DHCP_FILE_LEN];
|
||||
#endif /* LWIP_DHCP_BOOTPFILE */
|
||||
|
||||
/* Espressif add start. */
|
||||
void (*cb)(void); /* callback for dhcp, add a parameter to show dhcp status if needed */
|
||||
/* Espressif add end. */
|
||||
};
|
||||
|
||||
/* MUST be compiled with "pack structs" or equivalent! */
|
||||
@ -140,6 +144,10 @@ void dhcp_set_struct(struct netif *netif, struct dhcp *dhcp);
|
||||
/** Remove a struct dhcp previously set to the netif using dhcp_set_struct() */
|
||||
#define dhcp_remove_struct(netif) do { (netif)->dhcp = NULL; } while(0)
|
||||
void dhcp_cleanup(struct netif *netif);
|
||||
/* Espressif add start. */
|
||||
/** set callback for DHCP */
|
||||
void dhcp_set_cb(struct netif *netif, void (*cb)(void));
|
||||
/* Espressif add end. */
|
||||
/** start DHCP configuration */
|
||||
err_t dhcp_start(struct netif *netif);
|
||||
/** enforce early lease renewal (not needed normally)*/
|
||||
|
@ -17,6 +17,8 @@
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "rom/queue.h"
|
||||
|
||||
#include "esp_wifi.h"
|
||||
|
||||
#define CONFIG_TCPIP_LWIP 1
|
||||
@ -24,24 +26,22 @@
|
||||
|
||||
#if CONFIG_TCPIP_LWIP
|
||||
#include "lwip/ip_addr.h"
|
||||
#include "rom/queue.h"
|
||||
#include "apps/dhcpserver.h"
|
||||
|
||||
struct ip_info {
|
||||
#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"
|
||||
|
||||
typedef struct {
|
||||
ip4_addr_t ip;
|
||||
ip4_addr_t netmask;
|
||||
ip4_addr_t gw;
|
||||
};
|
||||
} tcpip_adapter_ip_info_t;
|
||||
|
||||
/* Also used by dhcpserver.h */
|
||||
struct dhcps_lease {
|
||||
bool enable;
|
||||
ip4_addr_t start_ip;
|
||||
ip4_addr_t end_ip;
|
||||
};
|
||||
|
||||
typedef struct dhcps_lease tcpip_adapter_dhcps_lease;
|
||||
|
||||
#endif
|
||||
typedef dhcps_lease_t tcpip_adapter_dhcps_lease_t;
|
||||
|
||||
#if CONFIG_DHCP_STA_LIST
|
||||
struct station_list {
|
||||
@ -51,6 +51,8 @@ struct station_list {
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#define ESP_ERR_TCPIP_ADAPTER_BASE 0x5000 // base should be moved to esp_err.h
|
||||
|
||||
#define ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS ESP_ERR_TCPIP_ADAPTER_BASE + 0x00
|
||||
@ -75,24 +77,23 @@ typedef enum {
|
||||
TCPIP_ADAPTER_DHCP_STATUS_MAX
|
||||
} tcpip_adapter_dhcp_status_t;
|
||||
|
||||
/*op*/
|
||||
typedef enum{
|
||||
TCPIP_ADAPTER_OP_START = 0,
|
||||
TCPIP_ADAPTER_OP_SET,
|
||||
TCPIP_ADAPTER_OP_GET,
|
||||
TCPIP_ADAPTER_OP_MAX
|
||||
} tcpip_adapter_option_mode;
|
||||
} tcpip_adapter_option_mode_t;
|
||||
|
||||
typedef enum{
|
||||
TCPIP_ADAPTER_ROUTER_SOLICITATION_ADDRESS = 32,
|
||||
TCPIP_ADAPTER_REQUESTED_IP_ADDRESS = 50,
|
||||
TCPIP_ADAPTER_IP_ADDRESS_LEASE_TIME = 51,
|
||||
TCPIP_ADAPTER_IP_REQUEST_RETRY_TIME = 52,
|
||||
} tcpip_adapter_option_id;
|
||||
TCPIP_ADAPTER_ROUTER_SOLICITATION_ADDRESS = 32,
|
||||
TCPIP_ADAPTER_REQUESTED_IP_ADDRESS = 50,
|
||||
TCPIP_ADAPTER_IP_ADDRESS_LEASE_TIME = 51,
|
||||
TCPIP_ADAPTER_IP_REQUEST_RETRY_TIME = 52,
|
||||
} tcpip_adapter_option_id_t;
|
||||
|
||||
void tcpip_adapter_init(void);
|
||||
|
||||
esp_err_t tcpip_adapter_start(tcpip_adapter_if_t tcpip_if, uint8_t *mac, struct ip_info *info);
|
||||
esp_err_t tcpip_adapter_start(tcpip_adapter_if_t tcpip_if, uint8_t *mac, tcpip_adapter_ip_info_t *ip_info);
|
||||
|
||||
esp_err_t tcpip_adapter_stop(tcpip_adapter_if_t tcpip_if);
|
||||
|
||||
@ -100,9 +101,9 @@ esp_err_t tcpip_adapter_up(tcpip_adapter_if_t tcpip_if);
|
||||
|
||||
esp_err_t tcpip_adapter_down(tcpip_adapter_if_t tcpip_if);
|
||||
|
||||
esp_err_t tcpip_adapter_get_ip_info(tcpip_adapter_if_t tcpip_if, struct ip_info *if_ip);
|
||||
esp_err_t tcpip_adapter_get_ip_info(tcpip_adapter_if_t tcpip_if, tcpip_adapter_ip_info_t *ip_info);
|
||||
|
||||
esp_err_t tcpip_adapter_set_ip_info(tcpip_adapter_if_t tcpip_if, struct ip_info *if_ip);
|
||||
esp_err_t tcpip_adapter_set_ip_info(tcpip_adapter_if_t tcpip_if, tcpip_adapter_ip_info_t *ip_info);
|
||||
|
||||
#if 0
|
||||
esp_err_t tcpip_adapter_get_mac(tcpip_adapter_if_t tcpip_if, uint8_t *mac);
|
||||
@ -111,23 +112,17 @@ esp_err_t tcpip_adapter_set_mac(tcpip_adapter_if_t tcpip_if, uint8_t *mac);
|
||||
#endif
|
||||
|
||||
esp_err_t tcpip_adapter_dhcps_get_status(tcpip_adapter_if_t tcpip_if, tcpip_adapter_dhcp_status_t *status);
|
||||
esp_err_t tcpip_adapter_dhcps_option(tcpip_adapter_option_mode opt_op, tcpip_adapter_option_id opt_id, void *opt_val, uint32_t opt_len);
|
||||
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);
|
||||
esp_err_t tcpip_adapter_dhcps_start(tcpip_adapter_if_t tcpip_if);
|
||||
esp_err_t tcpip_adapter_dhcps_stop(tcpip_adapter_if_t tcpip_if);
|
||||
|
||||
esp_err_t tcpip_adapter_dhcpc_get_status(tcpip_adapter_if_t tcpip_if, tcpip_adapter_dhcp_status_t *status);
|
||||
esp_err_t tcpip_adapter_dhcpc_option(tcpip_adapter_option_mode opt_op, tcpip_adapter_option_id opt_id, void *opt_val, uint32_t opt_len);
|
||||
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);
|
||||
esp_err_t tcpip_adapter_dhcpc_start(tcpip_adapter_if_t tcpip_if);
|
||||
esp_err_t tcpip_adapter_dhcpc_stop(tcpip_adapter_if_t tcpip_if);
|
||||
|
||||
esp_err_t tcpip_adapter_sta_input(void *buffer, uint16_t len, void* eb);
|
||||
esp_err_t tcpip_adapter_ap_input(void *buffer, uint16_t len, void* eb);
|
||||
|
||||
#if 0
|
||||
//esp_err_t tcpip_dep_input(wifi_interface_t wifi_if, void *buffer, uint16 len);
|
||||
|
||||
esp_err_t tcpip_adapter_output(tcpip_adapter_if_t tcpip_if, void *buffer, uint16_t len);
|
||||
#endif
|
||||
esp_err_t tcpip_adapter_sta_input(void *buffer, uint16_t len, void *eb);
|
||||
esp_err_t tcpip_adapter_ap_input(void *buffer, uint16_t len, void *eb);
|
||||
|
||||
wifi_interface_t tcpip_adapter_get_wifi_if(void *dev);
|
||||
|
||||
|
@ -11,6 +11,7 @@
|
||||
// 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 <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
@ -30,14 +31,11 @@
|
||||
#include "esp_event.h"
|
||||
|
||||
static struct netif *esp_netif[TCPIP_ADAPTER_IF_MAX];
|
||||
static struct ip_info esp_ip[TCPIP_ADAPTER_IF_MAX];
|
||||
static tcpip_adapter_ip_info_t esp_ip[TCPIP_ADAPTER_IF_MAX];
|
||||
|
||||
static tcpip_adapter_dhcp_status_t dhcps_status = TCPIP_ADAPTER_DHCP_INIT;
|
||||
static tcpip_adapter_dhcp_status_t dhcpc_status = TCPIP_ADAPTER_DHCP_INIT;
|
||||
|
||||
|
||||
static esp_err_t tcpip_adapter_addr_change_cb(struct netif *netif);
|
||||
|
||||
#define TCPIP_ADAPTER_DEBUG(...)
|
||||
|
||||
void tcpip_adapter_init(void)
|
||||
@ -53,13 +51,11 @@ void tcpip_adapter_init(void)
|
||||
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);
|
||||
}
|
||||
|
||||
netif_reg_addr_change_cb(tcpip_adapter_addr_change_cb);
|
||||
}
|
||||
|
||||
esp_err_t tcpip_adapter_start(tcpip_adapter_if_t tcpip_if, uint8_t *mac, struct ip_info *info)
|
||||
esp_err_t tcpip_adapter_start(tcpip_adapter_if_t tcpip_if, uint8_t *mac, tcpip_adapter_ip_info_t *ip_info)
|
||||
{
|
||||
if (tcpip_if >= TCPIP_ADAPTER_IF_MAX || mac == NULL || info == NULL) {
|
||||
if (tcpip_if >= TCPIP_ADAPTER_IF_MAX || mac == NULL || ip_info == NULL) {
|
||||
return ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS;
|
||||
}
|
||||
|
||||
@ -69,18 +65,17 @@ esp_err_t tcpip_adapter_start(tcpip_adapter_if_t tcpip_if, uint8_t *mac, struct
|
||||
return ESP_ERR_NO_MEM;
|
||||
}
|
||||
memcpy(esp_netif[tcpip_if]->hwaddr, mac, NETIF_MAX_HWADDR_LEN);
|
||||
netif_add(esp_netif[tcpip_if], &info->ip, &info->netmask, &info->gw, NULL, wlanif_init, tcpip_input);
|
||||
netif_add(esp_netif[tcpip_if], &ip_info->ip, &ip_info->netmask, &ip_info->gw, NULL, wlanif_init, tcpip_input);
|
||||
}
|
||||
|
||||
if (tcpip_if == TCPIP_ADAPTER_IF_AP) {
|
||||
netif_set_up(esp_netif[tcpip_if]);
|
||||
|
||||
if (dhcps_status == TCPIP_ADAPTER_DHCP_INIT) {
|
||||
dhcps_start(esp_netif[tcpip_if], info);
|
||||
dhcps_start(esp_netif[tcpip_if], ip_info->ip);
|
||||
|
||||
printf("dhcp server start:(ip: %s, ", inet_ntoa(info->ip));
|
||||
printf("mask: %s, ", inet_ntoa(info->netmask));
|
||||
printf("gw: %s)\n", inet_ntoa(info->gw));
|
||||
printf("dhcp server start:(ip: " IPSTR ", mask: " IPSTR ", gw: " IPSTR ")\n",
|
||||
IP2STR(&ip_info->ip), IP2STR(&ip_info->netmask), IP2STR(&ip_info->gw));
|
||||
|
||||
dhcps_status = TCPIP_ADAPTER_DHCP_STARTED;
|
||||
}
|
||||
@ -110,8 +105,15 @@ esp_err_t tcpip_adapter_stop(tcpip_adapter_if_t tcpip_if)
|
||||
dhcps_stop(esp_netif[tcpip_if]); // TODO: dhcps checks status by its self
|
||||
dhcps_status = TCPIP_ADAPTER_DHCP_INIT;
|
||||
} else if (tcpip_if == TCPIP_ADAPTER_IF_STA) {
|
||||
dhcp_release(esp_netif[tcpip_if]);
|
||||
dhcp_stop(esp_netif[tcpip_if]);
|
||||
dhcp_cleanup(esp_netif[tcpip_if]);
|
||||
|
||||
dhcpc_status = TCPIP_ADAPTER_DHCP_INIT;
|
||||
|
||||
ip4_addr_set_zero(&esp_ip[tcpip_if].ip);
|
||||
ip4_addr_set_zero(&esp_ip[tcpip_if].gw);
|
||||
ip4_addr_set_zero(&esp_ip[tcpip_if].netmask);
|
||||
}
|
||||
|
||||
netif_remove(esp_netif[tcpip_if]);
|
||||
@ -149,101 +151,54 @@ esp_err_t tcpip_adapter_down(tcpip_adapter_if_t tcpip_if)
|
||||
return ESP_ERR_TCPIP_ADAPTER_IF_NOT_READY;
|
||||
}
|
||||
|
||||
if (esp_netif[tcpip_if]->dhcp != NULL) {
|
||||
dhcp_release(esp_netif[tcpip_if]);
|
||||
if (dhcpc_status == TCPIP_ADAPTER_DHCP_STARTED) {
|
||||
dhcp_stop(esp_netif[tcpip_if]);
|
||||
dhcp_cleanup(esp_netif[tcpip_if]);
|
||||
|
||||
if (dhcpc_status != TCPIP_ADAPTER_DHCP_STOPPED) {
|
||||
dhcpc_status = TCPIP_ADAPTER_DHCP_INIT;
|
||||
}
|
||||
dhcpc_status = TCPIP_ADAPTER_DHCP_INIT;
|
||||
|
||||
ip4_addr_set_zero(&esp_ip[tcpip_if].ip);
|
||||
ip4_addr_set_zero(&esp_ip[tcpip_if].gw);
|
||||
ip4_addr_set_zero(&esp_ip[tcpip_if].netmask);
|
||||
}
|
||||
|
||||
|
||||
netif_set_down(esp_netif[tcpip_if]);
|
||||
}
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t tcpip_adapter_addr_change_cb(struct netif *netif)
|
||||
{
|
||||
tcpip_adapter_if_t tcpip_if;
|
||||
system_event_t evt;
|
||||
|
||||
if (!netif) {
|
||||
TCPIP_ADAPTER_DEBUG("null netif=%p\n", netif);
|
||||
return ESP_ERR_TCPIP_ADAPTER_IF_NOT_READY;
|
||||
}
|
||||
|
||||
if (netif == esp_netif[TCPIP_ADAPTER_IF_STA]) {
|
||||
tcpip_if = TCPIP_ADAPTER_IF_STA;
|
||||
} else if (netif == esp_netif[TCPIP_ADAPTER_IF_AP]){
|
||||
tcpip_if = TCPIP_ADAPTER_IF_AP;
|
||||
} else {
|
||||
TCPIP_ADAPTER_DEBUG("invalid netif=%p\n", netif);
|
||||
return ESP_ERR_TCPIP_ADAPTER_IF_NOT_READY;
|
||||
}
|
||||
|
||||
//check whether IP is changed
|
||||
if ( !ip4_addr_cmp(ip_2_ip4(&netif->ip_addr), &esp_ip[tcpip_if].ip) ||
|
||||
!ip4_addr_cmp(ip_2_ip4(&netif->gw), &esp_ip[tcpip_if].gw) ||
|
||||
!ip4_addr_cmp(ip_2_ip4(&netif->netmask), &esp_ip[tcpip_if].netmask) ) {
|
||||
|
||||
ip4_addr_set(&esp_ip[tcpip_if].ip, ip_2_ip4(&netif->ip_addr));
|
||||
ip4_addr_set(&esp_ip[tcpip_if].netmask, ip_2_ip4(&netif->netmask));
|
||||
ip4_addr_set(&esp_ip[tcpip_if].gw, ip_2_ip4(&netif->gw));
|
||||
|
||||
//notify event
|
||||
if ( !ip4_addr_cmp(ip_2_ip4(&netif->ip_addr), IP4_ADDR_ANY) ) {
|
||||
evt.event_id = SYSTEM_EVENT_STA_GOTIP;
|
||||
memcpy(&evt.event_info.got_ip.ip, &esp_ip[tcpip_if].ip, sizeof(evt.event_info.got_ip.ip));
|
||||
memcpy(&evt.event_info.got_ip.netmask, &esp_ip[tcpip_if].netmask, sizeof(evt.event_info.got_ip.netmask));
|
||||
memcpy(&evt.event_info.got_ip.gw, &esp_ip[tcpip_if].gw, sizeof(evt.event_info.got_ip.gw));
|
||||
|
||||
esp_event_send(&evt);
|
||||
|
||||
printf("ip: %s, ", inet_ntoa(esp_ip[tcpip_if].ip));
|
||||
printf("mask: %s, ", inet_ntoa(esp_ip[tcpip_if].netmask));
|
||||
printf("gw: %s\n", inet_ntoa(esp_ip[tcpip_if].gw));
|
||||
}
|
||||
} else {
|
||||
TCPIP_ADAPTER_DEBUG("ip unchanged\n");
|
||||
}
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t tcpip_adapter_get_ip_info(tcpip_adapter_if_t tcpip_if, struct ip_info *if_ip)
|
||||
esp_err_t tcpip_adapter_get_ip_info(tcpip_adapter_if_t tcpip_if, tcpip_adapter_ip_info_t *ip_info)
|
||||
{
|
||||
struct netif *p_netif;
|
||||
|
||||
if (tcpip_if >= TCPIP_ADAPTER_IF_MAX || if_ip == NULL) {
|
||||
if (tcpip_if >= TCPIP_ADAPTER_IF_MAX || ip_info == NULL) {
|
||||
return ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS;
|
||||
}
|
||||
|
||||
p_netif = esp_netif[tcpip_if];
|
||||
|
||||
if (p_netif != NULL && netif_is_up(p_netif)) {
|
||||
ip4_addr_set(&if_ip->ip, ip_2_ip4(&p_netif->ip_addr));
|
||||
ip4_addr_set(&if_ip->netmask, ip_2_ip4(&p_netif->netmask));
|
||||
ip4_addr_set(&if_ip->gw, ip_2_ip4(&p_netif->gw));
|
||||
ip4_addr_set(&ip_info->ip, ip_2_ip4(&p_netif->ip_addr));
|
||||
ip4_addr_set(&ip_info->netmask, ip_2_ip4(&p_netif->netmask));
|
||||
ip4_addr_set(&ip_info->gw, ip_2_ip4(&p_netif->gw));
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
ip4_addr_copy(if_ip->ip, esp_ip[tcpip_if].ip);
|
||||
ip4_addr_copy(if_ip->gw, esp_ip[tcpip_if].gw);
|
||||
ip4_addr_copy(if_ip->netmask, esp_ip[tcpip_if].netmask);
|
||||
ip4_addr_copy(ip_info->ip, esp_ip[tcpip_if].ip);
|
||||
ip4_addr_copy(ip_info->gw, esp_ip[tcpip_if].gw);
|
||||
ip4_addr_copy(ip_info->netmask, esp_ip[tcpip_if].netmask);
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t tcpip_adapter_set_ip_info(tcpip_adapter_if_t tcpip_if, struct ip_info *if_ip)
|
||||
esp_err_t tcpip_adapter_set_ip_info(tcpip_adapter_if_t tcpip_if, tcpip_adapter_ip_info_t *ip_info)
|
||||
{
|
||||
struct netif *p_netif;
|
||||
tcpip_adapter_dhcp_status_t status;
|
||||
|
||||
if (tcpip_if >= TCPIP_ADAPTER_IF_MAX || if_ip == NULL) {
|
||||
if (tcpip_if >= TCPIP_ADAPTER_IF_MAX || ip_info == NULL ||
|
||||
ip4_addr_isany_val(ip_info->ip) || ip4_addr_isany_val(ip_info->netmask) || ip4_addr_isany_val(ip_info->gw)) {
|
||||
return ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS;
|
||||
}
|
||||
|
||||
@ -261,14 +216,14 @@ esp_err_t tcpip_adapter_set_ip_info(tcpip_adapter_if_t tcpip_if, struct ip_info
|
||||
}
|
||||
}
|
||||
|
||||
ip4_addr_copy(esp_ip[tcpip_if].ip, if_ip->ip);
|
||||
ip4_addr_copy(esp_ip[tcpip_if].gw, if_ip->gw);
|
||||
ip4_addr_copy(esp_ip[tcpip_if].netmask, if_ip->netmask);
|
||||
ip4_addr_copy(esp_ip[tcpip_if].ip, ip_info->ip);
|
||||
ip4_addr_copy(esp_ip[tcpip_if].gw, ip_info->gw);
|
||||
ip4_addr_copy(esp_ip[tcpip_if].netmask, ip_info->netmask);
|
||||
|
||||
p_netif = esp_netif[tcpip_if];
|
||||
|
||||
if (p_netif != NULL && netif_is_up(p_netif)) {
|
||||
netif_set_addr(p_netif, &if_ip->ip, &if_ip->netmask, &if_ip->gw);
|
||||
netif_set_addr(p_netif, &ip_info->ip, &ip_info->netmask, &ip_info->gw);
|
||||
}
|
||||
|
||||
return ESP_OK;
|
||||
@ -314,7 +269,7 @@ esp_err_t tcpip_adapter_set_mac(tcpip_adapter_if_t tcpip_if, uint8_t mac[6])
|
||||
}
|
||||
#endif
|
||||
|
||||
esp_err_t tcpip_adapter_dhcps_option(tcpip_adapter_option_mode opt_op, tcpip_adapter_option_id opt_id, void *opt_val, uint32_t opt_len)
|
||||
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)
|
||||
{
|
||||
void *opt_info = dhcps_option_info(opt_id, opt_len);
|
||||
|
||||
@ -357,18 +312,18 @@ esp_err_t tcpip_adapter_dhcps_option(tcpip_adapter_option_mode opt_op, tcpip_ada
|
||||
if (*(uint32_t*)opt_val != 0)
|
||||
*(uint32_t*)opt_info = *(uint32_t*)opt_val;
|
||||
else
|
||||
*(uint32_t*)opt_info = DHCPS_LEASE_TIME_DEF;
|
||||
*(uint32_t*)opt_info = DHCPS_LEASE_TIME_DEF;
|
||||
break;
|
||||
}
|
||||
case REQUESTED_IP_ADDRESS:
|
||||
{
|
||||
struct ip_info info;
|
||||
tcpip_adapter_ip_info_t info;
|
||||
uint32_t softap_ip = 0;
|
||||
uint32_t start_ip = 0;
|
||||
uint32_t end_ip = 0;
|
||||
struct dhcps_lease *poll = opt_val;
|
||||
dhcps_lease_t *poll = opt_val;
|
||||
|
||||
memset(&info, 0x00, sizeof(struct ip_info));
|
||||
memset(&info, 0x00, sizeof(tcpip_adapter_ip_info_t));
|
||||
tcpip_adapter_get_ip_info(WIFI_IF_AP, &info);
|
||||
softap_ip = htonl(info.ip.addr);
|
||||
start_ip = htonl(poll->start_ip.addr);
|
||||
@ -426,9 +381,9 @@ esp_err_t tcpip_adapter_dhcps_start(tcpip_adapter_if_t tcpip_if)
|
||||
struct netif *p_netif = esp_netif[tcpip_if];
|
||||
|
||||
if (p_netif != NULL && netif_is_up(p_netif)) {
|
||||
struct ip_info default_ip;
|
||||
tcpip_adapter_ip_info_t default_ip;
|
||||
tcpip_adapter_get_ip_info(WIFI_IF_AP, &default_ip);
|
||||
dhcps_start(p_netif, &default_ip);
|
||||
dhcps_start(p_netif, default_ip.ip);
|
||||
dhcps_status = TCPIP_ADAPTER_DHCP_STARTED;
|
||||
TCPIP_ADAPTER_DEBUG("dhcp server start successfully\n");
|
||||
return ESP_OK;
|
||||
@ -470,12 +425,47 @@ esp_err_t tcpip_adapter_dhcps_stop(tcpip_adapter_if_t tcpip_if)
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t tcpip_adapter_dhcpc_option(tcpip_adapter_option_mode opt_op, tcpip_adapter_option_id opt_id, void *opt_val, uint32_t opt_len)
|
||||
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)
|
||||
{
|
||||
// TODO: when dhcp request timeout,change the retry count
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
static void tcpip_adapter_dhcpc_cb(void)
|
||||
{
|
||||
struct netif *netif = esp_netif[TCPIP_ADAPTER_IF_STA];
|
||||
|
||||
if (!netif) {
|
||||
TCPIP_ADAPTER_DEBUG("null netif=%p\n", netif);
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !ip4_addr_cmp(ip_2_ip4(&netif->ip_addr), IP4_ADDR_ANY) ) {
|
||||
tcpip_adapter_ip_info_t *ip_info = &esp_ip[TCPIP_ADAPTER_IF_STA];
|
||||
|
||||
//check whether IP is changed
|
||||
if ( !ip4_addr_cmp(ip_2_ip4(&netif->ip_addr), &ip_info->ip) ||
|
||||
!ip4_addr_cmp(ip_2_ip4(&netif->netmask), &ip_info->netmask) ||
|
||||
!ip4_addr_cmp(ip_2_ip4(&netif->gw), &ip_info->gw) ) {
|
||||
system_event_t evt;
|
||||
|
||||
ip4_addr_set(&ip_info->ip, ip_2_ip4(&netif->ip_addr));
|
||||
ip4_addr_set(&ip_info->netmask, ip_2_ip4(&netif->netmask));
|
||||
ip4_addr_set(&ip_info->gw, ip_2_ip4(&netif->gw));
|
||||
|
||||
//notify event
|
||||
evt.event_id = SYSTEM_EVENT_STA_GOTIP;
|
||||
memcpy(&evt.event_info.got_ip.ip_info, ip_info, sizeof(tcpip_adapter_ip_info_t));
|
||||
|
||||
esp_event_send(&evt);
|
||||
} else {
|
||||
TCPIP_ADAPTER_DEBUG("ip unchanged\n");
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
esp_err_t tcpip_adapter_dhcpc_get_status(tcpip_adapter_if_t tcpip_if, tcpip_adapter_dhcp_status_t *status)
|
||||
{
|
||||
*status = dhcpc_status;
|
||||
@ -494,6 +484,10 @@ esp_err_t tcpip_adapter_dhcpc_start(tcpip_adapter_if_t tcpip_if)
|
||||
if (dhcpc_status != TCPIP_ADAPTER_DHCP_STARTED) {
|
||||
struct netif *p_netif = esp_netif[tcpip_if];
|
||||
|
||||
ip4_addr_set_zero(&esp_ip[tcpip_if].ip);
|
||||
ip4_addr_set_zero(&esp_ip[tcpip_if].gw);
|
||||
ip4_addr_set_zero(&esp_ip[tcpip_if].netmask);
|
||||
|
||||
if (p_netif != NULL) {
|
||||
if (netif_is_up(p_netif)) {
|
||||
TCPIP_ADAPTER_DEBUG("dhcp client init ip/mask/gw to all-0\n");
|
||||
@ -511,6 +505,8 @@ esp_err_t tcpip_adapter_dhcpc_start(tcpip_adapter_if_t tcpip_if)
|
||||
return ESP_ERR_TCPIP_ADAPTER_DHCPC_START_FAILED;
|
||||
}
|
||||
|
||||
dhcp_set_cb(p_netif, tcpip_adapter_dhcpc_cb);
|
||||
|
||||
TCPIP_ADAPTER_DEBUG("dhcp client start successfully\n");
|
||||
dhcpc_status = TCPIP_ADAPTER_DHCP_STARTED;
|
||||
return ESP_OK;
|
||||
@ -538,6 +534,10 @@ esp_err_t tcpip_adapter_dhcpc_stop(tcpip_adapter_if_t tcpip_if)
|
||||
|
||||
if (p_netif != NULL) {
|
||||
dhcp_stop(p_netif);
|
||||
|
||||
ip4_addr_set_zero(&esp_ip[tcpip_if].ip);
|
||||
ip4_addr_set_zero(&esp_ip[tcpip_if].gw);
|
||||
ip4_addr_set_zero(&esp_ip[tcpip_if].netmask);
|
||||
} else {
|
||||
TCPIP_ADAPTER_DEBUG("dhcp client if not ready\n");
|
||||
return ESP_ERR_TCPIP_ADAPTER_IF_NOT_READY;
|
||||
@ -552,13 +552,13 @@ esp_err_t tcpip_adapter_dhcpc_stop(tcpip_adapter_if_t tcpip_if)
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t tcpip_adapter_sta_input(void *buffer, uint16_t len, void* eb)
|
||||
esp_err_t tcpip_adapter_sta_input(void *buffer, uint16_t len, void *eb)
|
||||
{
|
||||
wlanif_input(esp_netif[TCPIP_ADAPTER_IF_STA], buffer, len, eb);
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t tcpip_adapter_ap_input(void *buffer, uint16_t len, void* eb)
|
||||
esp_err_t tcpip_adapter_ap_input(void *buffer, uint16_t len, void *eb)
|
||||
{
|
||||
wlanif_input(esp_netif[TCPIP_ADAPTER_IF_AP], buffer, len, eb);
|
||||
return ESP_OK;
|
||||
|
Loading…
x
Reference in New Issue
Block a user