mirror of
https://github.com/espressif/ESP8266_RTOS_SDK.git
synced 2025-05-22 17:47:04 +08:00

Commit ID: 2f8508c7 1. Fix possible crash when probing on particular interface with duplicated service instances due to naming conflicts on network. Issue: MDNS server initially sends probing packets to resolve naming confilicts with already registered service instances. In case of a conflict, instance name is altered and probing restarts. Original instance however wasnnot removed from the structure and upon service removal only one entry was removed and a dangling service might have been kept in the structure to bring about a crash. Resolution: Keep only one instance of a service in the probing structure 2. Enable pcbs before starting service thread to avoid updating pcb's internal variables from concurent tasks. Possible race condition: user task runs mdns_init, which enables pcbs while mdns-task already created could execute enable/disable of the same pcbs if an appropriate system event received 3. Fix possible deadlock on mdns deinit calling mdns_free(). Mnds_free() initiates stop and delete timer tasks, which after locking the mutex could lead to a dead lock in case timer task executed before deleting the task, as it would wait indefinitelly for unlocking the mutex. This condition is fixed by calling _mdns_stop_timer without locking the mutex, because there's no need to protect any data when stopping and deleting the timer task 4. Fix race condition in updating packet data from user task when failed to allocate or queue a new service. Issue: mdns_service_add API allocates and queues an action to be processed in mdns task context; when allocation or queueing fails, allocated structure needs to be freed. Function _mdns_free_service did not only fee all the structures, but also updates packet data. Resolution: Moved removal of packet data outside of _mdns_free_service function 5. Fix possible crash when packet scheduled to transmit contained service which might have been already removed. Packets scheduled to transmit are pushed to action queue and removed from tx_queue_head structure, which is searched for all remaining services and while service is removed, then service questions/asnwers are also removed from this structure. This update fixes possible crash when packet is pushed to action queue, and when service is removed, its answers are removed from tx_queue_head, but not from action queue. This could lead to a crash when the packet is poped from action queue containing questions/answers to already removed (freed) service 6. Use binary semaphore instead of mutex when searching. Mdns_search_once_t::lock is used to synchronize tasks (taken by one task and given by the other) so it should not be a mutex. Convert to semaphore, and rename to indicate its purpose 7. Fix memory leak in pbuf if tcpipadapter failed to get netif 8. Fix malfuctional query_txt. When running a query for a single txt, result entries were not created and attached to result structure. This issue was introduced when fixing memory leak in txt structure, which worked correctly for PTR queries, but caused trouble for TXT query 9. Fix possible crash when mdns_free called while action queue not empty 10. Fix memory leak when query for service receives multiple ptr entries for one instance 11. Fix crash after init if no memory for task. Mdns init first starts timer task, then starts service task. If service task failed to be created, timer task needs to be stopped too 12. Fixed crash on free undefined ptr after skipped strdup. Shortcircuit evaluation may cause skip of _mdns_strdup_check of any further question field, which after clear_rx_packet freed undefined memory 13. Fix networking running udp_sendif from lwip thread 14. Check all mallocs for failure and add default hook to log error with free heap. Solves crash about _mdns_result_txt_create when stress test 15. Fixed static memory leak 16. Resolve memory leak when txt record received multiple times 17. Skip sending search when finished, not properly locked timer task 18. Sending search packets also in probing and announcing state. Mdns queries did not work properly when send imeadiately after set_hostname, which cuased reinit of pcb and therefore restarted probing, so search packets were blocked until probing finished
191 lines
8.2 KiB
C
191 lines
8.2 KiB
C
// Copyright 2018 Espressif Systems (Shanghai) PTE LTD
|
||
//
|
||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||
// you may not use this file except in compliance with the License.
|
||
// You may obtain a copy of the License at
|
||
|
||
// http://www.apache.org/licenses/LICENSE-2.0
|
||
//
|
||
// Unless required by applicable law or agreed to in writing, software
|
||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
// See the License for the specific language governing permissions and
|
||
// limitations under the License.
|
||
|
||
#ifndef __ESP_EVENT_H__
|
||
#define __ESP_EVENT_H__
|
||
|
||
#include <stdint.h>
|
||
#include <stdbool.h>
|
||
|
||
#include "esp_err.h"
|
||
#include "esp_wifi_types.h"
|
||
#include "lwip/ip_addr.h"
|
||
#include "tcpip_adapter.h"
|
||
|
||
#include "freertos/FreeRTOS.h"
|
||
#include "freertos/task.h"
|
||
#include "freertos/queue.h"
|
||
#include "freertos/semphr.h"
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
#define ESP_EVENT_IPV6 LWIP_IPV6
|
||
|
||
typedef enum {
|
||
SYSTEM_EVENT_WIFI_READY = 0, /**< ESP8266 WiFi ready */
|
||
SYSTEM_EVENT_SCAN_DONE, /**< ESP8266 finish scanning AP */
|
||
SYSTEM_EVENT_STA_START, /**< ESP8266 station start */
|
||
SYSTEM_EVENT_STA_STOP, /**< ESP8266 station stop */
|
||
SYSTEM_EVENT_STA_CONNECTED, /**< ESP8266 station connected to AP */
|
||
SYSTEM_EVENT_STA_DISCONNECTED, /**< ESP8266 station disconnected from AP */
|
||
SYSTEM_EVENT_STA_AUTHMODE_CHANGE, /**< the auth mode of AP connected by ESP8266 station changed */
|
||
SYSTEM_EVENT_STA_GOT_IP, /**< ESP8266 station got IP from connected AP */
|
||
SYSTEM_EVENT_STA_LOST_IP, /**< ESP8266 station lost IP and the IP is reset to 0 */
|
||
SYSTEM_EVENT_STA_WPS_ER_SUCCESS, /**< ESP8266 station wps succeeds in enrollee mode */
|
||
SYSTEM_EVENT_STA_WPS_ER_FAILED, /**< ESP8266 station wps fails in enrollee mode */
|
||
SYSTEM_EVENT_STA_WPS_ER_TIMEOUT, /**< ESP8266 station wps timeout in enrollee mode */
|
||
SYSTEM_EVENT_STA_WPS_ER_PIN, /**< ESP8266 station wps pin code in enrollee mode */
|
||
SYSTEM_EVENT_AP_START, /**< ESP8266 soft-AP start */
|
||
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 */
|
||
SYSTEM_EVENT_ETH_STOP, /**< ESP8266 ethernet stop */
|
||
SYSTEM_EVENT_ETH_CONNECTED, /**< ESP8266 ethernet phy link up */
|
||
SYSTEM_EVENT_ETH_DISCONNECTED, /**< ESP8266 ethernet phy link down */
|
||
SYSTEM_EVENT_ETH_GOT_IP, /**< ESP8266 ethernet got IP from connected AP */
|
||
SYSTEM_EVENT_MAX
|
||
} system_event_id_t;
|
||
|
||
/* add this macro define for compatible with old IDF version */
|
||
#ifndef SYSTEM_EVENT_AP_STA_GOT_IP6
|
||
#define SYSTEM_EVENT_AP_STA_GOT_IP6 SYSTEM_EVENT_GOT_IP6
|
||
#endif
|
||
|
||
typedef enum {
|
||
WPS_FAIL_REASON_NORMAL = 0, /**< ESP8266 WPS normal fail reason */
|
||
WPS_FAIL_REASON_RECV_M2D, /**< ESP8266 WPS receive M2D frame */
|
||
WPS_FAIL_REASON_MAX
|
||
}system_event_sta_wps_fail_reason_t;
|
||
|
||
typedef struct {
|
||
uint32_t status; /**< status of scanning APs */
|
||
uint8_t number;
|
||
uint8_t scan_id;
|
||
} system_event_sta_scan_done_t;
|
||
|
||
typedef struct {
|
||
uint8_t ssid[32]; /**< SSID of connected AP */
|
||
uint8_t ssid_len; /**< SSID length of connected AP */
|
||
uint8_t bssid[6]; /**< BSSID of connected AP*/
|
||
uint8_t channel; /**< channel of connected AP*/
|
||
wifi_auth_mode_t authmode;
|
||
} system_event_sta_connected_t;
|
||
|
||
typedef struct {
|
||
uint8_t ssid[32]; /**< SSID of disconnected AP */
|
||
uint8_t ssid_len; /**< SSID length of disconnected AP */
|
||
uint8_t bssid[6]; /**< BSSID of disconnected AP */
|
||
uint8_t reason; /**< reason of disconnection */
|
||
} system_event_sta_disconnected_t;
|
||
|
||
typedef struct {
|
||
wifi_auth_mode_t old_mode; /**< the old auth mode of AP */
|
||
wifi_auth_mode_t new_mode; /**< the new auth mode of AP */
|
||
} system_event_sta_authmode_change_t;
|
||
|
||
typedef struct {
|
||
tcpip_adapter_ip_info_t ip_info;
|
||
bool ip_changed;
|
||
} system_event_sta_got_ip_t;
|
||
|
||
typedef struct {
|
||
uint8_t pin_code[8]; /**< PIN code of station in enrollee mode */
|
||
} system_event_sta_wps_er_pin_t;
|
||
|
||
typedef struct {
|
||
tcpip_adapter_if_t if_index;
|
||
tcpip_adapter_ip6_info_t ip6_info;
|
||
} system_event_got_ip6_t;
|
||
|
||
typedef struct {
|
||
uint8_t mac[6]; /**< MAC address of the station connected to ESP8266 soft-AP */
|
||
uint8_t aid; /**< the aid that ESP8266 soft-AP gives to the station connected to */
|
||
} system_event_ap_staconnected_t;
|
||
|
||
typedef struct {
|
||
uint8_t mac[6]; /**< MAC address of the station disconnects to ESP8266 soft-AP */
|
||
uint8_t aid; /**< the aid that ESP8266 soft-AP gave to the station disconnects to */
|
||
} system_event_ap_stadisconnected_t;
|
||
|
||
typedef struct {
|
||
int rssi; /**< Received probe request signal strength */
|
||
uint8_t mac[6]; /**< MAC address of the station which send probe request */
|
||
} system_event_ap_probe_req_rx_t;
|
||
|
||
typedef union {
|
||
system_event_sta_connected_t connected; /**< ESP8266 station connected to AP */
|
||
system_event_sta_disconnected_t disconnected; /**< ESP8266 station disconnected to AP */
|
||
system_event_sta_scan_done_t scan_done; /**< ESP8266 station scan (APs) done */
|
||
system_event_sta_authmode_change_t auth_change; /**< the auth mode of AP ESP8266 station connected to changed */
|
||
system_event_sta_got_ip_t got_ip; /**< ESP8266 station got IP, first time got IP or when IP is changed */
|
||
system_event_sta_wps_er_pin_t sta_er_pin; /**< ESP8266 station WPS enrollee mode PIN code received */
|
||
system_event_sta_wps_fail_reason_t sta_er_fail_reason;/**< ESP8266 station WPS enrollee mode failed reason code received */
|
||
system_event_ap_staconnected_t sta_connected; /**< a station connected to ESP8266 soft-AP */
|
||
system_event_ap_stadisconnected_t sta_disconnected; /**< a station disconnected to ESP8266 soft-AP */
|
||
system_event_ap_probe_req_rx_t ap_probereqrecved; /**< ESP8266 soft-AP receive probe request packet */
|
||
system_event_got_ip6_t got_ip6; /**< ESP8266 station or ap or ethernet ipv6 addr state change to preferred */
|
||
} system_event_info_t;
|
||
|
||
typedef struct {
|
||
system_event_id_t event_id; /**< event ID */
|
||
system_event_info_t event_info; /**< event information */
|
||
} system_event_t;
|
||
|
||
typedef esp_err_t (*system_event_handler_t)(system_event_t *event);
|
||
|
||
/**
|
||
* @brief Send a event to event task
|
||
*
|
||
* @attention 1. Other task/modules, such as the TCPIP module, can call this API to send an event to event task
|
||
*
|
||
* @param system_event_t * event : event
|
||
*
|
||
* @return ESP_OK : succeed
|
||
* @return others : fail
|
||
*/
|
||
esp_err_t esp_event_send(system_event_t *event);
|
||
|
||
/**
|
||
* @brief Default event handler for system events
|
||
*
|
||
* This function performs default handling of system events.
|
||
* When using esp_event_loop APIs, it is called automatically before invoking the user-provided
|
||
* callback function.
|
||
*
|
||
* Applications which implement a custom event loop must call this function
|
||
* as part of event processing.
|
||
*
|
||
* @param event pointer to event to be handled
|
||
* @return ESP_OK if an event was handled successfully
|
||
*/
|
||
esp_err_t esp_event_process_default(system_event_t *event);
|
||
|
||
/**
|
||
* @brief Install default event handlers for Wi-Fi interfaces (station and AP)
|
||
*
|
||
*/
|
||
void esp_event_set_default_wifi_handlers();
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
#endif /* __ESP_EVENT_H__ */
|