MeterLogger
Macros | Functions | Variables
wifi.c File Reference
#include <esp8266.h>
#include <lwip/ip.h>
#include <lwip/udp.h>
#include <lwip/tcp_impl.h>
#include <netif/etharp.h>
#include <lwip/netif.h>
#include <lwip/lwip_napt.h>
#include <lwip/dns.h>
#include <lwip/app/dhcpserver.h>
#include <lwip/opt.h>
#include <espconn.h>
#include "wifi.h"
#include "mqtt_msg.h"
#include "mqtt_utils.h"
#include "debug.h"
#include "user_config.h"
#include "config.h"
#include "led.h"
#include "tinyprintf.h"
Include dependency graph for wifi.c:

Go to the source code of this file.

Macros

#define WIFI_SCAN_INTERVAL   5000
 
#define WIFI_SCAN_TIMEOUT   60000
 
#define RSSI_CHECK_INTERVAL   10000
 

Functions

ICACHE_FLASH_ATTR err_t my_input_ap (struct pbuf *p, struct netif *inp)
 
ICACHE_FLASH_ATTR err_t my_output_ap (struct netif *outp, struct pbuf *p)
 
static ICACHE_FLASH_ATTR void patch_netif_ap (netif_input_fn ifn, netif_linkoutput_fn ofn, bool nat)
 
bool ICACHE_FLASH_ATTR acl_check_packet (struct pbuf *p)
 
static void ICACHE_FLASH_ATTR wifi_get_rssi_timer_func (void *arg)
 
static void ICACHE_FLASH_ATTR wifi_scan_timer_func (void *arg)
 
static void ICACHE_FLASH_ATTR wifi_scan_timeout_timer_func (void *arg)
 
void wifi_handle_event_cb (System_Event_t *evt)
 
void ICACHE_FLASH_ATTR wifi_scan_done_cb (void *arg, STATUS status)
 
void ICACHE_FLASH_ATTR wifi_default ()
 
void ICACHE_FLASH_ATTR wifi_fallback ()
 
void ICACHE_FLASH_ATTR wifi_connect (uint8_t *ssid, uint8_t *pass, WifiCallback cb)
 
void ICACHE_FLASH_ATTR wifi_softap_config (uint8_t *ssid, uint8_t *pass, uint8_t authmode)
 
void ICACHE_FLASH_ATTR wifi_softap_ip_config (void)
 
sint8_t ICACHE_FLASH_ATTR wifi_get_rssi ()
 
bool ICACHE_FLASH_ATTR wifi_get_status ()
 
void ICACHE_FLASH_ATTR wifi_start_scan ()
 
void ICACHE_FLASH_ATTR wifi_stop_scan ()
 
bool ICACHE_FLASH_ATTR wifi_scan_is_running ()
 
bool ICACHE_FLASH_ATTR wifi_fallback_is_present ()
 
void ICACHE_FLASH_ATTR set_my_auto_connect (bool enabled)
 
void wifi_scan_result_cb_register (wifi_scan_result_event_cb_t cb)
 
void wifi_scan_result_cb_unregister (wifi_scan_result_event_cb_t cb)
 

Variables

static os_timer_t wifi_scan_timer
 
static os_timer_t wifi_scan_timeout_timer
 
static os_timer_t wifi_get_rssi_timer
 
WifiCallback wifi_cb = NULL
 
wifi_scan_result_event_cb_t wifi_scan_result_cb = NULL
 
volatile uint8_t * config_ssid
 
volatile uint8_t * config_pass
 
static uint8_t wifi_status = STATION_IDLE
 
static uint8_t wifi_event = EVENT_STAMODE_DISCONNECTED
 
bool wifi_present = false
 
volatile bool wifi_fallback_present = false
 
bool wifi_fallback_last_present = false
 
volatile bool wifi_scan_runnning = false
 
volatile sint8_t rssi = 31
 
volatile bool get_rssi_running = false
 
volatile bool wifi_default_ok = false
 
volatile bool my_auto_connect = true
 
static netif_input_fn orig_input_ap
 
static netif_linkoutput_fn orig_output_ap
 
static ip_addr_t sta_network_addr
 
static ip_addr_t sta_network_mask
 
static ip_addr_t ap_network_addr
 
static ip_addr_t dns_ip
 

Macro Definition Documentation

◆ RSSI_CHECK_INTERVAL

#define RSSI_CHECK_INTERVAL   10000

Definition at line 35 of file wifi.c.

Referenced by wifi_connect(), and wifi_default().

◆ WIFI_SCAN_INTERVAL

#define WIFI_SCAN_INTERVAL   5000

Definition at line 33 of file wifi.c.

Referenced by wifi_start_scan().

◆ WIFI_SCAN_TIMEOUT

#define WIFI_SCAN_TIMEOUT   60000

Definition at line 34 of file wifi.c.

Referenced by wifi_scan_timer_func().

Function Documentation

◆ acl_check_packet()

bool ICACHE_FLASH_ATTR acl_check_packet ( struct pbuf p)

Definition at line 115 of file wifi.c.

References dns_ip, ICACHE_FLASH_ATTR, IP2STR, IP_PROTO_ICMP, IP_PROTO_TCP, IP_PROTO_UDP, IPADDR_BROADCAST, IPH_PROTO, pbuf::len, ntohs, os_printf, pbuf::payload, sta_network_addr, sta_network_mask, wifi_get_rssi_timer_func(), wifi_scan_timeout_timer_func(), and wifi_scan_timer_func().

Referenced by my_input_ap().

115  {
116  struct eth_hdr *mac_h;
117  struct ip_hdr *ip_h;
118  uint8_t proto;
119  struct udp_hdr *udp_h;
120  struct tcp_hdr *tcp_h;
121  uint16_t src_port = 0;
122  uint16_t dest_port = 0;
123  uint8_t *packet;
124 
125  if (p->len < sizeof(struct eth_hdr)) {
126  return false;
127  }
128 
129  mac_h = (struct eth_hdr *)p->payload;
130 
131  // Allow ARP
132  if (ntohs(mac_h->type) == ETHTYPE_ARP) {
133  return true;
134  }
135 
136  // Drop anything else if not IPv4
137  if (ntohs(mac_h->type) != ETHTYPE_IP) {
138  return false;
139  }
140 
141  if (p->len < sizeof(struct eth_hdr)+sizeof(struct ip_hdr)) {
142  return false;
143  }
144 
145  packet = (uint8_t*)p->payload;
146  ip_h = (struct ip_hdr *)&packet[sizeof(struct eth_hdr)];
147  proto = IPH_PROTO(ip_h);
148 
149  switch (proto) {
150  case IP_PROTO_UDP:
151  if (p->len < sizeof(struct eth_hdr)+sizeof(struct ip_hdr)+sizeof(struct udp_hdr)) {
152  return false;
153  }
154  udp_h = (struct udp_hdr *)&packet[sizeof(struct eth_hdr)+sizeof(struct ip_hdr)];
155  src_port = ntohs(udp_h->src);
156  dest_port = ntohs(udp_h->dest);
157  break;
158 
159  case IP_PROTO_TCP:
160  if (p->len < sizeof(struct eth_hdr)+sizeof(struct ip_hdr)+sizeof(struct tcp_hdr)) {
161  return false;
162  }
163  tcp_h = (struct tcp_hdr *)&packet[sizeof(struct eth_hdr)+sizeof(struct ip_hdr)];
164  src_port = ntohs(tcp_h->src);
165  dest_port = ntohs(tcp_h->dest);
166  break;
167 
168  case IP_PROTO_ICMP:
169  src_port = dest_port = 0;
170  break;
171  }
172 
173  // allow dhcp requests to broadcast network
174  if ((ip_h->dest.addr == IPADDR_BROADCAST) && (dest_port == 67)) {
175  return true;
176  }
177 
178  // allow dns requests to nameserver on uplink network
179  if ((ip_h->dest.addr == dns_ip.addr) && (dest_port == 53)) {
180  return true;
181  }
182 
183  // deny connections to hosts on uplink network
184  if ((ip_h->dest.addr & sta_network_mask.addr) == sta_network_addr.addr) {
185 #ifdef DEBUG
186  os_printf("dropping packet to uplink network: src: %d.%d.%d.%d dst: %d.%d.%d.%d proto: %s sport:%d dport:%d\n",
187  IP2STR(&ip_h->src), IP2STR(&ip_h->dest),
188  proto == IP_PROTO_TCP ? "TCP" : proto == IP_PROTO_UDP ? "UDP" : "IP4", src_port, dest_port);
189 #endif
190  return false;
191  }
192 
193  // default allow everything else
194  return true;
195 }
#define IP_PROTO_ICMP
Definition: ip.h:52
u16_t len
Definition: pbuf.h:93
#define IP_PROTO_TCP
Definition: ip.h:56
#define IP2STR(ipaddr)
Definition: ip_addr.h:240
#define os_printf
Definition: osapi.h:62
static ip_addr_t sta_network_addr
Definition: wifi.c:62
static ip_addr_t dns_ip
Definition: wifi.c:65
#define IPADDR_BROADCAST
Definition: ip_addr.h:102
#define IP_PROTO_UDP
Definition: ip.h:54
Definition: ip.h:116
void * payload
Definition: pbuf.h:81
#define ntohs(x)
Definition: def.h:82
#define IPH_PROTO(hdr)
Definition: ip.h:151
static ip_addr_t sta_network_mask
Definition: wifi.c:63
Here is the call graph for this function:
Here is the caller graph for this function:

◆ my_input_ap()

ICACHE_FLASH_ATTR err_t my_input_ap ( struct pbuf p,
struct netif inp 
)

Definition at line 67 of file wifi.c.

References acl_check_packet(), ERR_ABRT, orig_input_ap, and pbuf_free().

Referenced by wifi_handle_event_cb().

67  {
68  err_t err;
69 
70  if (acl_check_packet(p)) {
71  err = orig_input_ap(p, inp);
72  }
73  else {
74  pbuf_free(p);
75  return ERR_ABRT;
76  }
77  return err;
78 }
#define ERR_ABRT
Definition: err.h:63
s8_t err_t
Definition: err.h:47
static netif_input_fn orig_input_ap
Definition: wifi.c:59
u8_t pbuf_free(struct pbuf *p) ICACHE_FLASH_ATTR
Definition: pbuf.c:685
bool ICACHE_FLASH_ATTR acl_check_packet(struct pbuf *p)
Definition: wifi.c:115
Here is the call graph for this function:
Here is the caller graph for this function:

◆ my_output_ap()

ICACHE_FLASH_ATTR err_t my_output_ap ( struct netif outp,
struct pbuf p 
)

Definition at line 80 of file wifi.c.

References orig_output_ap.

Referenced by wifi_handle_event_cb().

80  {
81  err_t err;
82  err = orig_output_ap(outp, p);
83  return err;
84 }
static netif_linkoutput_fn orig_output_ap
Definition: wifi.c:60
s8_t err_t
Definition: err.h:47
Here is the caller graph for this function:

◆ patch_netif_ap()

static ICACHE_FLASH_ATTR void patch_netif_ap ( netif_input_fn  ifn,
netif_linkoutput_fn  ofn,
bool  nat 
)
static

Definition at line 87 of file wifi.c.

References ap_network_addr, netif::input, ip4_addr4, netif::ip_addr, netif::linkoutput, netif_list, netif::next, NULL, orig_input_ap, orig_output_ap, and os_printf.

Referenced by wifi_handle_event_cb().

87  {
88  struct netif *nif;
89  ip_addr_t ap_ip;
90 
91  ap_ip = ap_network_addr;
92  ip4_addr4(&ap_ip) = 1;
93 
94  for (nif = netif_list; nif != NULL && nif->ip_addr.addr != ap_ip.addr; nif = nif->next) {
95  // skip
96  }
97  if (nif == NULL) {
98  return;
99  }
100 
101  nif->napt = nat ? 1 : 0;
102  if (nif->input != ifn) {
103  orig_input_ap = nif->input;
104  nif->input = ifn;
105  }
106  if (nif->linkoutput != ofn) {
107  orig_output_ap = nif->linkoutput;
108  nif->linkoutput = ofn;
109  }
110 #ifdef DEBUG
111  os_printf("patched!\n");
112 #endif
113 }
struct netif * netif_list
Definition: netif.c:75
#define NULL
Definition: def.h:47
#define os_printf
Definition: osapi.h:62
static ip_addr_t ap_network_addr
Definition: wifi.c:64
struct netif * next
Definition: netif.h:141
static netif_linkoutput_fn orig_output_ap
Definition: wifi.c:60
typedefPACK_STRUCT_END struct ip_addr ip_addr_t
Definition: ip_addr.h:64
Definition: netif.h:139
static netif_input_fn orig_input_ap
Definition: wifi.c:59
ip_addr_t ip_addr
Definition: netif.h:144
netif_input_fn input
Definition: netif.h:150
#define ip4_addr4(ipaddr)
Definition: ip_addr.h:223
netif_linkoutput_fn linkoutput
Definition: netif.h:158
Here is the caller graph for this function:

◆ set_my_auto_connect()

void ICACHE_FLASH_ATTR set_my_auto_connect ( bool  enabled)

Definition at line 591 of file wifi.c.

References my_auto_connect.

Referenced by watchdog_timer_func(), and wifi_reconnect_timer_func().

591  {
592  my_auto_connect = enabled;
593 }
volatile bool my_auto_connect
Definition: wifi.c:56
Here is the caller graph for this function:

◆ wifi_connect()

void ICACHE_FLASH_ATTR wifi_connect ( uint8_t *  ssid,
uint8_t *  pass,
WifiCallback  cb 
)

Definition at line 437 of file wifi.c.

References syscfg_t::ap_enabled, config_pass, config_ssid, INFO, my_auto_connect, NULL, NULL_MODE, os_memset, os_timer_arm, os_timer_disarm, os_timer_func_t, os_timer_setfn, station_config::password, RSSI_CHECK_INTERVAL, station_config::ssid, STATION_MODE, STATIONAP_MODE, sys_cfg, tfp_snprintf(), wifi_cb, wifi_get_rssi_timer, wifi_get_rssi_timer_func(), wifi_handle_event_cb(), wifi_set_event_handler_cb(), wifi_set_opmode_current(), wifi_start_scan(), wifi_station_connect(), wifi_station_disconnect(), and wifi_station_set_config().

437  {
438  struct station_config stationConf;
439 
440  INFO("WIFI_INIT\r\n");
442 
443 #ifdef AP
444  if (sys_cfg.ap_enabled) {
446  }
447  else {
449  }
450 #else
452 #endif // AP
453 
454  wifi_cb = cb;
455  config_ssid = ssid;
456  config_pass = pass;
457 
458  os_memset(&stationConf, 0, sizeof(struct station_config));
459 
460  tfp_snprintf(stationConf.ssid, 32, "%s", ssid);
461  tfp_snprintf(stationConf.password, 64, "%s", pass);
462 
463  my_auto_connect = false; // disable wifi wifi_handle_event_cb() based auto connect
465  wifi_station_set_config(&stationConf);
466 
467  // start wifi scan timer
468  wifi_start_scan();
469 
471  my_auto_connect = true; // enable wifi wifi_handle_event_cb() based auto connect
472 
474 
475  // start wifi rssi timer
479 
480 // led_stop_pattern();
481 }
void wifi_handle_event_cb(System_Event_t *evt)
Definition: wifi.c:203
bool wifi_set_opmode_current(uint8 opmode)
#define os_timer_disarm
Definition: osapi.h:51
volatile uint8_t * config_pass
Definition: wifi.c:45
volatile bool my_auto_connect
Definition: wifi.c:56
#define NULL_MODE
#define STATIONAP_MODE
#define NULL
Definition: def.h:47
WifiCallback wifi_cb
Definition: wifi.c:41
void ICACHE_FLASH_ATTR wifi_start_scan()
Definition: wifi.c:570
#define os_timer_func_t
Definition: os_type.h:35
#define os_timer_setfn
Definition: osapi.h:52
bool wifi_station_set_config(struct station_config *config)
#define os_memset
Definition: osapi.h:38
bool ap_enabled
Definition: config.h:51
void wifi_set_event_handler_cb(wifi_event_handler_cb_t cb)
static os_timer_t wifi_get_rssi_timer
Definition: wifi.c:39
bool wifi_station_disconnect(void)
volatile uint8_t * config_ssid
Definition: wifi.c:44
ICACHE_FLASH_ATTR int tfp_snprintf(char *str, size_t size, const char *format,...)
Definition: tinyprintf.c:480
static void ICACHE_FLASH_ATTR wifi_get_rssi_timer_func(void *arg)
Definition: wifi.c:271
#define STATION_MODE
#define os_timer_arm(a, b, c)
Definition: osapi.h:50
#define INFO(...)
Definition: debug.h:17
#define RSSI_CHECK_INTERVAL
Definition: wifi.c:35
syscfg_t sys_cfg
Definition: config.c:12
bool wifi_station_connect(void)
Here is the call graph for this function:

◆ wifi_default()

void ICACHE_FLASH_ATTR wifi_default ( )

Definition at line 379 of file wifi.c.

References syscfg_t::ap_enabled, config_pass, config_ssid, NULL, os_memset, os_printf, os_timer_arm, os_timer_disarm, os_timer_func_t, os_timer_setfn, station_config::password, RSSI_CHECK_INTERVAL, station_config::ssid, STATION_MODE, STATIONAP_MODE, sys_cfg, tfp_snprintf(), wifi_get_rssi_timer, wifi_get_rssi_timer_func(), wifi_set_opmode_current(), wifi_station_connect(), wifi_station_disconnect(), wifi_station_get_config(), and wifi_station_set_config_current().

Referenced by wifi_scan_done_cb().

379  {
380  struct station_config stationConf;
381 
382  // go back to saved network
383  os_printf("DEFAULT_SSID\r\n");
385 #ifdef AP
386  if (sys_cfg.ap_enabled == true) {
388  }
389  else {
391  }
392 #else
394 #endif // AP
395  os_memset(&stationConf, 0, sizeof(struct station_config));
396  wifi_station_get_config(&stationConf);
397 
398  tfp_snprintf(stationConf.ssid, 32, "%s", config_ssid);
399  tfp_snprintf(stationConf.password, 64, "%s", config_pass);
400 
401  wifi_station_set_config_current(&stationConf);
402 
404 
405  // start wifi rssi timer
409 }
bool wifi_set_opmode_current(uint8 opmode)
#define os_timer_disarm
Definition: osapi.h:51
volatile uint8_t * config_pass
Definition: wifi.c:45
#define STATIONAP_MODE
#define NULL
Definition: def.h:47
#define os_timer_func_t
Definition: os_type.h:35
bool wifi_station_get_config(struct station_config *config)
#define os_printf
Definition: osapi.h:62
#define os_timer_setfn
Definition: osapi.h:52
#define os_memset
Definition: osapi.h:38
bool ap_enabled
Definition: config.h:51
static os_timer_t wifi_get_rssi_timer
Definition: wifi.c:39
bool wifi_station_disconnect(void)
volatile uint8_t * config_ssid
Definition: wifi.c:44
ICACHE_FLASH_ATTR int tfp_snprintf(char *str, size_t size, const char *format,...)
Definition: tinyprintf.c:480
static void ICACHE_FLASH_ATTR wifi_get_rssi_timer_func(void *arg)
Definition: wifi.c:271
#define STATION_MODE
bool wifi_station_set_config_current(struct station_config *config)
#define os_timer_arm(a, b, c)
Definition: osapi.h:50
#define RSSI_CHECK_INTERVAL
Definition: wifi.c:35
syscfg_t sys_cfg
Definition: config.c:12
bool wifi_station_connect(void)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ wifi_fallback()

void ICACHE_FLASH_ATTR wifi_fallback ( )

Definition at line 411 of file wifi.c.

References syscfg_t::ap_enabled, os_memset, os_printf, station_config::password, station_config::ssid, STA_FALLBACK_PASS, STA_FALLBACK_SSID, STATION_MODE, STATIONAP_MODE, sys_cfg, tfp_snprintf(), wifi_set_opmode_current(), wifi_station_connect(), wifi_station_disconnect(), wifi_station_get_config(), and wifi_station_set_config_current().

Referenced by wifi_scan_done_cb().

411  {
412  struct station_config stationConf;
413 
414  // try fallback network
415  os_printf("FALLBACK_SSID\r\n");
417 #ifdef AP
418  if (sys_cfg.ap_enabled == true) {
420  }
421  else {
423  }
424 #else
426 #endif // AP
427  os_memset(&stationConf, 0, sizeof(struct station_config));
428  wifi_station_get_config(&stationConf);
429 
430  tfp_snprintf(stationConf.ssid, 32, "%s", STA_FALLBACK_SSID);
431  tfp_snprintf(stationConf.password, 64, "%s", STA_FALLBACK_PASS);
432 
433  wifi_station_set_config_current(&stationConf);
435 }
bool wifi_set_opmode_current(uint8 opmode)
#define STATIONAP_MODE
bool wifi_station_get_config(struct station_config *config)
#define os_printf
Definition: osapi.h:62
#define STA_FALLBACK_SSID
Definition: user_config.h:68
#define os_memset
Definition: osapi.h:38
bool ap_enabled
Definition: config.h:51
bool wifi_station_disconnect(void)
ICACHE_FLASH_ATTR int tfp_snprintf(char *str, size_t size, const char *format,...)
Definition: tinyprintf.c:480
#define STATION_MODE
bool wifi_station_set_config_current(struct station_config *config)
#define STA_FALLBACK_PASS
Definition: user_config.h:69
syscfg_t sys_cfg
Definition: config.c:12
bool wifi_station_connect(void)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ wifi_fallback_is_present()

bool ICACHE_FLASH_ATTR wifi_fallback_is_present ( )

Definition at line 587 of file wifi.c.

References wifi_fallback_present.

587  {
588  return wifi_fallback_present;
589 }
volatile bool wifi_fallback_present
Definition: wifi.c:49

◆ wifi_get_rssi()

sint8_t ICACHE_FLASH_ATTR wifi_get_rssi ( )

Definition at line 559 of file wifi.c.

References get_rssi_running, and rssi.

Referenced by wifi_scan_timer_func().

559  {
560  while (get_rssi_running == true) {
561  // wait for lock
562  }
563  return rssi;
564 }
volatile sint8_t rssi
Definition: wifi.c:53
volatile bool get_rssi_running
Definition: wifi.c:54
Here is the caller graph for this function:

◆ wifi_get_rssi_timer_func()

static void ICACHE_FLASH_ATTR wifi_get_rssi_timer_func ( void *  arg)
static

Definition at line 271 of file wifi.c.

References get_rssi_running, rssi, wifi_default_ok, and wifi_station_get_rssi().

Referenced by acl_check_packet(), wifi_connect(), and wifi_default().

271  {
272  get_rssi_running = true;
273  if (wifi_default_ok) { // only get rssi if connected to configured ssid
275  }
276  get_rssi_running = false;
277 }
volatile sint8_t rssi
Definition: wifi.c:53
volatile bool wifi_default_ok
Definition: wifi.c:55
volatile bool get_rssi_running
Definition: wifi.c:54
sint8 wifi_station_get_rssi(void)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ wifi_get_status()

bool ICACHE_FLASH_ATTR wifi_get_status ( )

Definition at line 566 of file wifi.c.

References wifi_default_ok.

566  {
567  return wifi_default_ok;
568 }
volatile bool wifi_default_ok
Definition: wifi.c:55

◆ wifi_handle_event_cb()

void wifi_handle_event_cb ( System_Event_t evt)

Definition at line 203 of file wifi.c.

References Event_SoftAPMode_StaConnected_t::aid, Event_Info_u::disconnected, _esp_event::event, _esp_event::event_info, EVENT_SOFTAPMODE_STACONNECTED, EVENT_STAMODE_CONNECTED, EVENT_STAMODE_DISCONNECTED, EVENT_STAMODE_GOT_IP, Event_Info_u::got_ip, Event_StaMode_Got_IP_t::ip, Event_SoftAPMode_StaConnected_t::mac, MAC2STR, MACSTR, Event_StaMode_Got_IP_t::mask, my_auto_connect, my_input_ap(), my_output_ap(), os_memset, os_printf, os_sprintf, os_strncmp, patch_netif_ap(), Event_StaMode_Disconnected_t::reason, station_config::ssid, Event_StaMode_Disconnected_t::ssid, Event_Info_u::sta_connected, sta_network_addr, sta_network_mask, syscfg_t::sta_ssid, sys_cfg, wifi_cb, wifi_default_ok, wifi_event, wifi_softap_ip_config(), wifi_station_connect(), wifi_station_get_config(), wifi_station_get_connect_status(), wifi_station_set_auto_connect(), and wifi_status.

Referenced by wifi_connect().

203  {
204 #ifdef DEBUG
205  uint8_t mac_str[20];
206 #endif
207  struct station_config stationConf;
208 
210  wifi_event = evt->event;
211 
212  os_memset(&stationConf, 0, sizeof(struct station_config));
213  wifi_station_get_config(&stationConf);
214 
215 #ifdef DEBUG
216 // os_printf("E%dW%d\n", evt->event, wifi_status);
217 #endif
218  switch (evt->event) {
220  // set default network status
221  if (os_strncmp((char *)&stationConf.ssid, sys_cfg.sta_ssid, sizeof(sys_cfg.sta_ssid)) == 0) {
222  wifi_default_ok = true;
223  }
224  break;
226 #ifdef DEBUG
227  os_printf("disconnected from ssid %s, reason %d\n", evt->event_info.disconnected.ssid, evt->event_info.disconnected.reason);
228 #endif
229  // set default network status
230  if (os_strncmp((char *)&stationConf.ssid, sys_cfg.sta_ssid, sizeof(sys_cfg.sta_ssid)) == 0) {
231  wifi_default_ok = false;
232  }
233  if (my_auto_connect) {
234 #ifdef DEBUG
235  os_printf("reconnecting on disconnect\n");
236 #endif
237  wifi_station_connect(); // reconnect on disconnect
238  }
239  break;
240  case EVENT_STAMODE_GOT_IP:
241  // set default network status
242  if (os_strncmp((char *)&stationConf.ssid, sys_cfg.sta_ssid, sizeof(sys_cfg.sta_ssid)) == 0) {
243  wifi_default_ok = true;
244  }
245 #ifdef AP
246  // set ap_network_addr from uplink
249  sta_network_addr.addr &= sta_network_mask.addr;
250 
252 
253  wifi_station_set_auto_connect(0); // disale auto connect, we handle reconnect with this event handler
254 #endif // AP
255  wifi_cb(wifi_status);
256  break;
258 #ifdef DEBUG
260  os_printf("station: %s join, AID = %d\n", mac_str, evt->event_info.sta_connected.aid);
261 #endif
262 #ifdef AP
264 #endif // AP
265  break;
266  default:
267  break;
268  }
269 }
#define os_sprintf
Definition: osapi.h:54
ICACHE_FLASH_ATTR err_t my_output_ap(struct netif *outp, struct pbuf *p)
Definition: wifi.c:80
uint8_t sta_ssid[64]
Definition: config.h:48
#define MAC2STR(a)
#define os_strncmp
Definition: osapi.h:44
volatile bool my_auto_connect
Definition: wifi.c:56
Event_Info_u event_info
WifiCallback wifi_cb
Definition: wifi.c:41
Event_SoftAPMode_StaConnected_t sta_connected
volatile bool wifi_default_ok
Definition: wifi.c:55
bool wifi_station_get_config(struct station_config *config)
uint8 wifi_station_get_connect_status(void)
#define os_printf
Definition: osapi.h:62
static ip_addr_t sta_network_addr
Definition: wifi.c:62
#define os_memset
Definition: osapi.h:38
#define MACSTR
ICACHE_FLASH_ATTR err_t my_input_ap(struct pbuf *p, struct netif *inp)
Definition: wifi.c:67
static ICACHE_FLASH_ATTR void patch_netif_ap(netif_input_fn ifn, netif_linkoutput_fn ofn, bool nat)
Definition: wifi.c:87
bool wifi_station_set_auto_connect(uint8 set)
Event_StaMode_Disconnected_t disconnected
static uint8_t wifi_status
Definition: wifi.c:46
void ICACHE_FLASH_ATTR wifi_softap_ip_config(void)
Definition: wifi.c:502
syscfg_t sys_cfg
Definition: config.c:12
bool wifi_station_connect(void)
static uint8_t wifi_event
Definition: wifi.c:47
static ip_addr_t sta_network_mask
Definition: wifi.c:63
Event_StaMode_Got_IP_t got_ip
Here is the call graph for this function:
Here is the caller graph for this function:

◆ wifi_scan_done_cb()

void ICACHE_FLASH_ATTR wifi_scan_done_cb ( void *  arg,
STATUS  status 
)

Definition at line 321 of file wifi.c.

References led_pattern_a(), led_stop_pattern(), NULL, OK, os_printf, os_strncmp, os_timer_disarm, bss_info::ssid, STA_FALLBACK_SSID, syscfg_t::sta_ssid, STATION_GOT_IP, sys_cfg, wifi_default(), wifi_fallback(), wifi_fallback_last_present, wifi_fallback_present, wifi_present, wifi_scan_result_cb, wifi_scan_result_cb_unregister(), wifi_scan_runnning, wifi_scan_timeout_timer, wifi_start_scan(), and wifi_station_get_connect_status().

Referenced by wifi_scan_timer_func().

321  {
322  struct bss_info *info;
323 
324  wifi_present = false;
325  wifi_fallback_present = false;
326 
327  // check if fallback network is present
328  if ((arg != NULL) && (status == OK)) {
329  info = (struct bss_info *)arg;
330  wifi_fallback_present = false;
331 
332  while (info != NULL) {
333  if ((info != NULL) && (info->ssid != NULL) && (os_strncmp(info->ssid, sys_cfg.sta_ssid, sizeof(sys_cfg.sta_ssid)) == 0)) {
334  wifi_present = true;
335  }
336  if ((info != NULL) && (info->ssid != NULL) && (os_strncmp(info->ssid, STA_FALLBACK_SSID, sizeof(STA_FALLBACK_SSID)) == 0)) {
337  wifi_fallback_present = true;
338  }
339 
340  // handle sending scan results via mqtt
341  if (wifi_scan_result_cb) {
342  wifi_scan_result_cb(info);
343  }
344 
345  info = info->next.stqe_next;
346  }
347  wifi_scan_result_cb_unregister(); // done sending via mqtt
348 
349  // if fallback network appeared connect to it
351  wifi_fallback();
352  led_pattern_a();
353  }
354  // if fallback network disappeared connect to default network
356  wifi_default();
358  }
359 
361 #ifdef DEBUG
362  uint8_t s;
364  os_printf("wifi present: %s\n", (wifi_present ? "yes" : "no"));
365  os_printf("wifi fallback present: %s\n", (wifi_fallback_present ? "yes" : "no"));
366  os_printf("wifi status: %s (%u)\n", (s == STATION_GOT_IP) ? "connected" : "not connected", s);
367 #endif
368  }
369 
370  wifi_scan_runnning = false;
371 // os_printf("scan done\n");
373 // led_stop_pattern(); // DEBUG
374 
375  // start wifi scan timer again
376  wifi_start_scan();
377 }
uint8_t sta_ssid[64]
Definition: config.h:48
volatile bool wifi_fallback_present
Definition: wifi.c:49
void ICACHE_FLASH_ATTR wifi_fallback()
Definition: wifi.c:411
#define os_timer_disarm
Definition: osapi.h:51
#define os_strncmp
Definition: osapi.h:44
#define NULL
Definition: def.h:47
void ICACHE_FLASH_ATTR wifi_start_scan()
Definition: wifi.c:570
volatile bool wifi_scan_runnning
Definition: wifi.c:51
uint8 wifi_station_get_connect_status(void)
#define os_printf
Definition: osapi.h:62
#define STA_FALLBACK_SSID
Definition: user_config.h:68
bool wifi_fallback_last_present
Definition: wifi.c:50
wifi_scan_result_event_cb_t wifi_scan_result_cb
Definition: wifi.c:42
bool wifi_present
Definition: wifi.c:48
static os_timer_t wifi_scan_timeout_timer
Definition: wifi.c:38
Definition: c_types.h:80
uint8 ssid[32]
ICACHE_FLASH_ATTR void led_pattern_a(void)
Definition: led.c:106
ICACHE_FLASH_ATTR void led_stop_pattern(void)
Definition: led.c:128
void ICACHE_FLASH_ATTR wifi_default()
Definition: wifi.c:379
syscfg_t sys_cfg
Definition: config.c:12
void wifi_scan_result_cb_unregister(wifi_scan_result_event_cb_t cb)
Definition: wifi.c:599
Here is the call graph for this function:
Here is the caller graph for this function:

◆ wifi_scan_is_running()

bool ICACHE_FLASH_ATTR wifi_scan_is_running ( )

Definition at line 583 of file wifi.c.

References wifi_scan_runnning.

Referenced by wifi_reconnect_timer_func().

583  {
584  return wifi_scan_runnning;
585 }
volatile bool wifi_scan_runnning
Definition: wifi.c:51
Here is the caller graph for this function:

◆ wifi_scan_result_cb_register()

void wifi_scan_result_cb_register ( wifi_scan_result_event_cb_t  cb)

Definition at line 595 of file wifi.c.

References wifi_scan_result_cb.

595  {
596  wifi_scan_result_cb = cb;
597 }
wifi_scan_result_event_cb_t wifi_scan_result_cb
Definition: wifi.c:42

◆ wifi_scan_result_cb_unregister()

void wifi_scan_result_cb_unregister ( wifi_scan_result_event_cb_t  cb)

Definition at line 599 of file wifi.c.

References NULL, and wifi_scan_result_cb.

Referenced by wifi_scan_done_cb().

599  {
601 }
#define NULL
Definition: def.h:47
wifi_scan_result_event_cb_t wifi_scan_result_cb
Definition: wifi.c:42
Here is the caller graph for this function:

◆ wifi_scan_timeout_timer_func()

static void ICACHE_FLASH_ATTR wifi_scan_timeout_timer_func ( void *  arg)
static

Definition at line 309 of file wifi.c.

References os_printf, os_timer_disarm, wifi_scan_runnning, wifi_scan_timeout_timer, and wifi_start_scan().

Referenced by acl_check_packet(), and wifi_scan_timer_func().

309  {
310 #ifdef DEBUG
311  os_printf("scan timeout called\n");
312 #endif
313  wifi_scan_runnning = false;
315 // led_stop_pattern(); // DEBUG
316 
317  // start wifi scan timer again
318  wifi_start_scan();
319 }
#define os_timer_disarm
Definition: osapi.h:51
void ICACHE_FLASH_ATTR wifi_start_scan()
Definition: wifi.c:570
volatile bool wifi_scan_runnning
Definition: wifi.c:51
#define os_printf
Definition: osapi.h:62
static os_timer_t wifi_scan_timeout_timer
Definition: wifi.c:38
Here is the call graph for this function:
Here is the caller graph for this function:

◆ wifi_scan_timer_func()

static void ICACHE_FLASH_ATTR wifi_scan_timer_func ( void *  arg)
static

Definition at line 279 of file wifi.c.

References NULL, os_printf, os_timer_arm, os_timer_disarm, os_timer_func_t, os_timer_setfn, wifi_get_rssi(), wifi_scan_done_cb(), wifi_scan_runnning, WIFI_SCAN_TIMEOUT, wifi_scan_timeout_timer, wifi_scan_timeout_timer_func(), wifi_start_scan(), and wifi_station_scan().

Referenced by acl_check_packet(), and wifi_start_scan().

279  {
280 // struct scan_config config;
281 
282  if (!wifi_scan_runnning) {
283  // scan for fallback network
284  wifi_scan_runnning = true;
285 #ifdef DEBUG
286  os_printf("RSSI: %d\n", wifi_get_rssi()); // DEBUG: should not be here at all
287 #endif
288  // start wifi scan timeout timer
289  // hack to avoid wifi_station_scan() sometimes doesnt calling the callback
293  if (wifi_station_scan(NULL, wifi_scan_done_cb) == false) {
294  // something went wrong, restart scanner
295 #ifdef DEBUG
296  os_printf("wifi_station_scan() returned false, restarting scanner\n");
297 #endif
298  wifi_scan_runnning = false;
299 // led_pattern_a(); // DEBUG slow led blink to show if wifi_station_scan() returned false (indicates scanner restarting)
300  wifi_start_scan();
301  }
302  else {
303 // led_pattern_b(); // DEBUG fast led blink to show if wifi_scan_done_cb() returned true (indicates wifi scanner running)
304  }
305 // os_printf("scan running\n");
306  }
307 }
#define os_timer_disarm
Definition: osapi.h:51
static void ICACHE_FLASH_ATTR wifi_scan_timeout_timer_func(void *arg)
Definition: wifi.c:309
sint8_t ICACHE_FLASH_ATTR wifi_get_rssi()
Definition: wifi.c:559
#define WIFI_SCAN_TIMEOUT
Definition: wifi.c:34
#define NULL
Definition: def.h:47
void ICACHE_FLASH_ATTR wifi_start_scan()
Definition: wifi.c:570
void ICACHE_FLASH_ATTR wifi_scan_done_cb(void *arg, STATUS status)
Definition: wifi.c:321
#define os_timer_func_t
Definition: os_type.h:35
volatile bool wifi_scan_runnning
Definition: wifi.c:51
#define os_printf
Definition: osapi.h:62
#define os_timer_setfn
Definition: osapi.h:52
static os_timer_t wifi_scan_timeout_timer
Definition: wifi.c:38
bool wifi_station_scan(struct scan_config *config, scan_done_cb_t cb)
#define os_timer_arm(a, b, c)
Definition: osapi.h:50
Here is the call graph for this function:
Here is the caller graph for this function:

◆ wifi_softap_config()

void ICACHE_FLASH_ATTR wifi_softap_config ( uint8_t *  ssid,
uint8_t *  pass,
uint8_t  authmode 
)

Definition at line 483 of file wifi.c.

References softap_config::authmode, softap_config::beacon_interval, softap_config::channel, softap_config::max_connection, memset, softap_config::password, softap_config::ssid, softap_config::ssid_hidden, softap_config::ssid_len, tfp_snprintf(), wifi_softap_get_config(), and wifi_softap_set_config().

483  {
484  struct softap_config ap_conf;
485 
486  wifi_softap_get_config(&ap_conf);
487  memset(ap_conf.ssid, 0, sizeof(ap_conf.ssid));
488  memset(ap_conf.password, 0, sizeof(ap_conf.password));
489  tfp_snprintf(ap_conf.ssid, 32, ssid);
490  tfp_snprintf(ap_conf.password, 64, pass);
491  ap_conf.authmode = authmode;
492  ap_conf.ssid_len = 0;
493  ap_conf.beacon_interval = 100;
494  ap_conf.channel = 1;
495  ap_conf.max_connection = 8;
496  ap_conf.ssid_hidden = 0;
497 
498  wifi_softap_set_config(&ap_conf);
499 }
#define memset(x, a, b)
Definition: platform.h:21
bool wifi_softap_get_config(struct softap_config *config)
uint8 ssid[32]
AUTH_MODE authmode
ICACHE_FLASH_ATTR int tfp_snprintf(char *str, size_t size, const char *format,...)
Definition: tinyprintf.c:480
bool wifi_softap_set_config(struct softap_config *config)
Here is the call graph for this function:

◆ wifi_softap_ip_config()

void ICACHE_FLASH_ATTR wifi_softap_ip_config ( void  )

Definition at line 502 of file wifi.c.

References AP_NETWORK, ap_network_addr, dhcps_set_DNS(), dns_ip, dhcps_lease::end_ip, espconn_dns_setserver(), ip_info::gw, ip_info::ip, IP2STR, IP4_ADDR, ip4_addr3, ip4_addr4, ip_addr_cmp, IPSTR, netif_list, ip_info::netmask, netif::next, NULL, netif::num, os_printf, sta_network_addr, dhcps_lease::start_ip, UTILS_StrToIP(), wifi_set_ip_info(), wifi_softap_dhcps_start(), wifi_softap_dhcps_stop(), and wifi_softap_set_dhcps_lease().

Referenced by wifi_handle_event_cb().

502  {
503  struct ip_info info;
504  struct dhcps_lease dhcp_lease;
505  struct netif *nif;
506 
507  // find the netif of the AP (that with num != 0)
508  for (nif = netif_list; nif != NULL && nif->num == 0; nif = nif->next) {
509  // skip
510  }
511  if (nif == NULL) {
512  return;
513  }
514  // if is not 1, set it to 1.
515  // kind of a hack, but the Espressif-internals expect it like this (hardcoded 1).
516  nif->num = 1;
517 
518  // configure AP dhcp
520 
521  // if we have not got an ip set ap ip to default
522  if (ap_network_addr.addr == 0) {
524  }
525  // increment ap_network_addr if same as sta_network_addr
527  ip4_addr3(&ap_network_addr) += 1;
528  }
529 
530  // if we have not got a dns server set to default
531  dns_ip = dns_getserver(0);
532  if (dns_ip.addr == 0) {
533  // Google's DNS as default, as long as we havn't got one from DHCP
534  IP4_ADDR(&dns_ip, 8, 8, 8, 8);
535  }
538 #ifdef DEBUG
539  os_printf("sta net:" IPSTR ",ap net:" IPSTR ",dns:" IPSTR "\n", IP2STR(&sta_network_addr), IP2STR(&ap_network_addr), IP2STR(&dns_ip));
540 #endif
541 
542  info.ip = ap_network_addr;
543  ip4_addr4(&info.ip) = 1;
544  info.gw = info.ip;
545  IP4_ADDR(&info.netmask, 255, 255, 255, 0);
546 
547  wifi_set_ip_info(nif->num, &info);
548 
549  dhcp_lease.start_ip = ap_network_addr;
550  ip4_addr4(&dhcp_lease.start_ip) = 2;
551  dhcp_lease.end_ip = ap_network_addr;
552  ip4_addr4(&dhcp_lease.end_ip) = 254;
553  wifi_softap_set_dhcps_lease(&dhcp_lease);
554 
556 }
struct netif * netif_list
Definition: netif.c:75
void espconn_dns_setserver(u8_t numdns, ip_addr_t *dnsserver)
Definition: espconn.c:1302
#define NULL
Definition: def.h:47
bool wifi_softap_dhcps_stop(void)
u8_t num
Definition: netif.h:197
#define IP2STR(ipaddr)
Definition: ip_addr.h:240
#define AP_NETWORK
Definition: user_config.h:81
#define os_printf
Definition: osapi.h:62
uint8_t ICACHE_FLASH_ATTR UTILS_StrToIP(const int8_t *str, void *ip)
Definition: mqtt_utils.c:91
static ip_addr_t ap_network_addr
Definition: wifi.c:64
static ip_addr_t sta_network_addr
Definition: wifi.c:62
#define ip_addr_cmp(addr1, addr2)
Definition: ip_addr.h:198
bool wifi_softap_dhcps_start(void)
struct netif * next
Definition: netif.h:141
bool wifi_set_ip_info(uint8 if_index, struct ip_info *info)
static ip_addr_t dns_ip
Definition: wifi.c:65
Definition: netif.h:139
#define IPSTR
Definition: ip_addr.h:245
bool ICACHE_FLASH_ATTR wifi_softap_set_dhcps_lease(struct dhcps_lease *please)
Definition: dhcpserver.c:952
#define ip4_addr3(ipaddr)
Definition: ip_addr.h:222
#define ip4_addr4(ipaddr)
Definition: ip_addr.h:223
void dhcps_set_DNS(struct ip_addr *dns_ip) ICACHE_FLASH_ATTR
Definition: dhcpserver.c:1155
#define IP4_ADDR(ipaddr, a, b, c, d)
Definition: ip_addr.h:139
Here is the call graph for this function:
Here is the caller graph for this function:

◆ wifi_start_scan()

void ICACHE_FLASH_ATTR wifi_start_scan ( )

Definition at line 570 of file wifi.c.

References NULL, os_timer_arm, os_timer_disarm, os_timer_func_t, os_timer_setfn, WIFI_SCAN_INTERVAL, wifi_scan_timer, and wifi_scan_timer_func().

Referenced by wifi_connect(), wifi_reconnect_timer_func(), wifi_scan_done_cb(), wifi_scan_timeout_timer_func(), and wifi_scan_timer_func().

570  {
571  // start wifi scan timer
575 }
#define os_timer_disarm
Definition: osapi.h:51
#define NULL
Definition: def.h:47
#define os_timer_func_t
Definition: os_type.h:35
#define os_timer_setfn
Definition: osapi.h:52
static void ICACHE_FLASH_ATTR wifi_scan_timer_func(void *arg)
Definition: wifi.c:279
#define WIFI_SCAN_INTERVAL
Definition: wifi.c:33
static os_timer_t wifi_scan_timer
Definition: wifi.c:37
#define os_timer_arm(a, b, c)
Definition: osapi.h:50
Here is the call graph for this function:
Here is the caller graph for this function:

◆ wifi_stop_scan()

void ICACHE_FLASH_ATTR wifi_stop_scan ( )

Definition at line 577 of file wifi.c.

References os_timer_disarm, wifi_scan_runnning, and wifi_scan_timer.

Referenced by watchdog_timer_func().

577  {
578  // stop wifi scan timer
580  wifi_scan_runnning = false;
581 }
#define os_timer_disarm
Definition: osapi.h:51
volatile bool wifi_scan_runnning
Definition: wifi.c:51
static os_timer_t wifi_scan_timer
Definition: wifi.c:37
Here is the caller graph for this function:

Variable Documentation

◆ ap_network_addr

ip_addr_t ap_network_addr
static

Definition at line 64 of file wifi.c.

Referenced by patch_netif_ap(), and wifi_softap_ip_config().

◆ config_pass

volatile uint8_t* config_pass

Definition at line 45 of file wifi.c.

Referenced by wifi_connect(), and wifi_default().

◆ config_ssid

volatile uint8_t* config_ssid

Definition at line 44 of file wifi.c.

Referenced by wifi_connect(), and wifi_default().

◆ dns_ip

ip_addr_t dns_ip
static

Definition at line 65 of file wifi.c.

Referenced by acl_check_packet(), dhcps_set_DNS(), and wifi_softap_ip_config().

◆ get_rssi_running

volatile bool get_rssi_running = false

Definition at line 54 of file wifi.c.

Referenced by wifi_get_rssi(), and wifi_get_rssi_timer_func().

◆ my_auto_connect

volatile bool my_auto_connect = true

Definition at line 56 of file wifi.c.

Referenced by set_my_auto_connect(), wifi_connect(), and wifi_handle_event_cb().

◆ orig_input_ap

netif_input_fn orig_input_ap
static

Definition at line 59 of file wifi.c.

Referenced by my_input_ap(), and patch_netif_ap().

◆ orig_output_ap

netif_linkoutput_fn orig_output_ap
static

Definition at line 60 of file wifi.c.

Referenced by my_output_ap(), and patch_netif_ap().

◆ rssi

volatile sint8_t rssi = 31

Definition at line 53 of file wifi.c.

Referenced by wifi_get_rssi(), and wifi_get_rssi_timer_func().

◆ sta_network_addr

ip_addr_t sta_network_addr
static

Definition at line 62 of file wifi.c.

Referenced by acl_check_packet(), wifi_handle_event_cb(), and wifi_softap_ip_config().

◆ sta_network_mask

ip_addr_t sta_network_mask
static

Definition at line 63 of file wifi.c.

Referenced by acl_check_packet(), and wifi_handle_event_cb().

◆ wifi_cb

WifiCallback wifi_cb = NULL

Definition at line 41 of file wifi.c.

Referenced by wifi_connect(), and wifi_handle_event_cb().

◆ wifi_default_ok

volatile bool wifi_default_ok = false

Definition at line 55 of file wifi.c.

Referenced by wifi_get_rssi_timer_func(), wifi_get_status(), and wifi_handle_event_cb().

◆ wifi_event

uint8_t wifi_event = EVENT_STAMODE_DISCONNECTED
static

Definition at line 47 of file wifi.c.

Referenced by wifi_handle_event_cb().

◆ wifi_fallback_last_present

bool wifi_fallback_last_present = false

Definition at line 50 of file wifi.c.

Referenced by wifi_scan_done_cb().

◆ wifi_fallback_present

volatile bool wifi_fallback_present = false

Definition at line 49 of file wifi.c.

Referenced by wifi_fallback_is_present(), and wifi_scan_done_cb().

◆ wifi_get_rssi_timer

os_timer_t wifi_get_rssi_timer
static

Definition at line 39 of file wifi.c.

Referenced by wifi_connect(), and wifi_default().

◆ wifi_present

bool wifi_present = false

Definition at line 48 of file wifi.c.

Referenced by wifi_scan_done_cb().

◆ wifi_scan_result_cb

wifi_scan_result_event_cb_t wifi_scan_result_cb = NULL

◆ wifi_scan_runnning

volatile bool wifi_scan_runnning = false

◆ wifi_scan_timeout_timer

os_timer_t wifi_scan_timeout_timer
static

Definition at line 38 of file wifi.c.

Referenced by wifi_scan_done_cb(), wifi_scan_timeout_timer_func(), and wifi_scan_timer_func().

◆ wifi_scan_timer

os_timer_t wifi_scan_timer
static

Definition at line 37 of file wifi.c.

Referenced by wifi_start_scan(), and wifi_stop_scan().

◆ wifi_status

uint8_t wifi_status = STATION_IDLE
static

Definition at line 46 of file wifi.c.

Referenced by wifi_handle_event_cb().