summaryrefslogtreecommitdiff
path: root/system-linux.c
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@nbd.name>2021-09-01 19:00:41 +0200
committerFelix Fietkau <nbd@nbd.name>2021-09-01 19:03:30 +0200
commit300b1220fab38600f102bb8cfcc59a29ce41b095 (patch)
tree103ae559ccdf4f34065fb761bcd25057b3d5ddb0 /system-linux.c
parentf8ff6d82028367620893872636d455702a1c1ea1 (diff)
downloadnetifd-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.c11
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)