-
Notifications
You must be signed in to change notification settings - Fork 638
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Test: etharp_gratuitous #1877
Test: etharp_gratuitous #1877
Changes from 7 commits
5f376de
142a36b
7199d24
63db3b0
732cc7e
40da164
4c4a040
3fdf59e
b97c6ab
7264f7e
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -15,6 +15,11 @@ bool _wifi_smartconfig_running = false; | |
bool _wifi_smartconfig_initial = false; | ||
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 | ||
// ----------------------------------------------------------------------------- | ||
|
@@ -84,6 +89,14 @@ void _wifiConfigure() { | |
sleep_mode = constrain(sleep_mode, 0, 2); | ||
|
||
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) { | ||
|
@@ -491,6 +504,47 @@ void _wifiWebSocketOnAction(uint32_t client_id, const char * action, JsonObject& | |
|
||
#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 | ||
&& (interface->flags & NETIF_FLAG_LINK_UP) | ||
&& (!ip4_addr_isany_val(*netif_ip4_addr(interface))) | ||
#else | ||
&& (!ip_addr_isany(&interface->ip_addr)) | ||
#endif | ||
&& (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 | ||
// ----------------------------------------------------------------------------- | ||
|
@@ -685,4 +739,11 @@ void wifiLoop() { | |
_wifiCheckAP(); | ||
} | ||
|
||
#if WIFI_GRATUITOUS_ARP_SUPPORT | ||
// Only send out gra arp when in STA mode | ||
if (_wifi_gratuitous_arp_interval && ((WiFi.getMode() & WIFI_AP) == 0)) { | ||
_wifiSendGratuitousArp(_wifi_gratuitous_arp_interval); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. With STA+AP mode the WiFi radio is always on, which makes it less likely ARP requests may be missed. N.B. the AP and STA use different MAC addresses, so it should be no problem to send out Gratuitous ARP to the AP interface. (as long as you're sending the right IP of course :) ) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This part is copied from the idf, basically trying to emulate GARP flag that they check. No flag here, so STATION_IF seems like a solution. |
||
} | ||
#endif | ||
|
||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Strictly speaking, it is not the sending of an packet that fails, but receiving.
The other hosts in the network may no longer know how to retrieve what MAC address to use as destination when sending a packet to some IP-address. Also the other components on the network, like switch or AP may have the MAC address removed from their tables and thus no longer be able to route the packet to the correct port.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The wording is weird, true... that was a blatant c/p from the esp-lwip Kconfig entry. Reworded to mention ARP tables.