@ -15,6 +15,11 @@ bool _wifi_smartconfig_running = false;
bool _wifi_smartconfig_initial = false ;
bool _wifi_smartconfig_initial = false ;
uint8_t _wifi_ap_mode = WIFI_AP_FALLBACK ;
uint8_t _wifi_ap_mode = WIFI_AP_FALLBACK ;
# if WIFI_GRATUITOUS_ARP_SUPPORT
unsigned long _wifi_gratuitous_arp_interval = 0 ;
unsigned long _wifi_gratuitous_arp_last = 0 ;
# endif
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
// PRIVATE
// PRIVATE
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
@ -91,6 +96,14 @@ void _wifiConfigure() {
sleep_mode = constrain ( sleep_mode , 0 , 2 ) ;
sleep_mode = constrain ( sleep_mode , 0 , 2 ) ;
WiFi . setSleepMode ( static_cast < WiFiSleepType_t > ( sleep_mode ) ) ;
WiFi . setSleepMode ( static_cast < WiFiSleepType_t > ( sleep_mode ) ) ;
# if WIFI_GRATUITOUS_ARP_SUPPORT
_wifi_gratuitous_arp_last = millis ( ) ;
_wifi_gratuitous_arp_interval = getSetting ( " wifiGarpIntvl " , secureRandom (
WIFI_GRATUITOUS_ARP_INTERVAL_MIN , WIFI_GRATUITOUS_ARP_INTERVAL_MAX
) ) . toInt ( ) ;
# endif
}
}
void _wifiScan ( uint32_t client_id = 0 ) {
void _wifiScan ( uint32_t client_id = 0 ) {
@ -504,6 +517,47 @@ void _wifiWebSocketOnAction(uint32_t client_id, const char * action, JsonObject&
# endif
# endif
// -----------------------------------------------------------------------------
// SUPPORT
// -----------------------------------------------------------------------------
# if WIFI_GRATUITOUS_ARP_SUPPORT
// ref: lwip src/core/netif.c netif_issue_reports(...)
// ref: esp-lwip/core/ipv4/etharp.c garp_tmr()
// TODO: only for ipv4, need (?) a different method with ipv6
bool _wifiSendGratuitousArp ( ) {
bool result = false ;
for ( netif * interface = netif_list ; interface ! = nullptr ; interface = interface - > next ) {
if (
( interface - > flags & NETIF_FLAG_ETHARP )
& & ( interface - > hwaddr_len = = ETHARP_HWADDR_LEN )
# if LWIP_VERSION_MAJOR == 1
& & ( ! ip_addr_isany ( & interface - > ip_addr ) )
# else
& & ( ! ip4_addr_isany_val ( * netif_ip4_addr ( interface ) ) )
# endif
& & ( interface - > flags & NETIF_FLAG_LINK_UP )
& & ( interface - > flags & NETIF_FLAG_UP )
) {
etharp_gratuitous ( interface ) ;
result = true ;
}
}
return result ;
}
void _wifiSendGratuitousArp ( unsigned long interval ) {
if ( millis ( ) - _wifi_gratuitous_arp_last > interval ) {
_wifi_gratuitous_arp_last = millis ( ) ;
_wifiSendGratuitousArp ( ) ;
}
}
# endif // WIFI_GRATUITOUS_ARP_SUPPORT
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
// INFO
// INFO
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
@ -730,4 +784,11 @@ void wifiLoop() {
_wifiCheckAP ( ) ;
_wifiCheckAP ( ) ;
}
}
# if WIFI_GRATUITOUS_ARP_SUPPORT
// Only send out gra arp when in STA mode
if ( _wifi_gratuitous_arp_interval ) {
_wifiSendGratuitousArp ( _wifi_gratuitous_arp_interval ) ;
}
# endif
}
}