diff options
author | Felix Fietkau <nbd@nbd.name> | 2021-09-01 19:00:41 +0200 |
---|---|---|
committer | Felix Fietkau <nbd@nbd.name> | 2021-09-01 19:03:30 +0200 |
commit | 300b1220fab38600f102bb8cfcc59a29ce41b095 (patch) | |
tree | 103ae559ccdf4f34065fb761bcd25057b3d5ddb0 /system-linux.c | |
parent | f8ff6d82028367620893872636d455702a1c1ea1 (diff) | |
download | netifd-300b1220fab38600f102bb8cfcc59a29ce41b095.tar.gz |
wireless: improve reliability of proxyarp support
instead of relying on hostapd to manipulate bridge attributes (which can race
against netifd adding/removing of member ports), set the proxyarp related
attributes in netifd directly when bringing up the member port
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Diffstat (limited to 'system-linux.c')
-rw-r--r-- | system-linux.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/system-linux.c b/system-linux.c index 7c91008..6c6f1ec 100644 --- a/system-linux.c +++ b/system-linux.c @@ -464,6 +464,11 @@ static void system_bridge_set_hairpin_mode(struct device *dev, const char *val) system_set_dev_sysfs("brport/hairpin_mode", dev->ifname, val); } +static void system_bridge_set_proxyarp_wifi(struct device *dev, const char *val) +{ + system_set_dev_sysfs("brport/proxyarp_wifi", dev->ifname, val); +} + static void system_bridge_set_bpdu_filter(struct device *dev, const char *val) { system_set_dev_sysfs("brport/bpdu_filter", dev->ifname, val); @@ -870,17 +875,19 @@ static void system_bridge_set_wireless(struct device *bridge, struct device *dev) { bool mcast_to_ucast = dev->wireless_ap; - bool hairpin = true; + bool hairpin; if (bridge->settings.flags & DEV_OPT_MULTICAST_TO_UNICAST && !bridge->settings.multicast_to_unicast) mcast_to_ucast = false; - if (!mcast_to_ucast || dev->wireless_isolate) + hairpin = mcast_to_ucast || dev->wireless_proxyarp; + if (dev->wireless_isolate) hairpin = false; system_bridge_set_multicast_to_unicast(dev, mcast_to_ucast ? "1" : "0"); system_bridge_set_hairpin_mode(dev, hairpin ? "1" : "0"); + system_bridge_set_proxyarp_wifi(dev, dev->wireless_proxyarp ? "1" : "0"); } int system_bridge_addif(struct device *bridge, struct device *dev) |