wireless: fix bogus isolate setting on unbridged configuration
[project/netifd.git] / system-linux.c
index 944245c..f51c078 100644 (file)
@@ -325,6 +325,13 @@ static void system_bridge_set_hairpin_mode(struct device *dev, const char *val)
        system_set_dev_sysctl("/sys/class/net/%s/brport/hairpin_mode", dev->ifname, val);
 }
 
+static void system_bridge_set_multicast_router(struct device *dev, const char *val, bool bridge)
+{
+       system_set_dev_sysctl(bridge ? "/sys/class/net/%s/bridge/multicast_router" :
+                                      "/sys/class/net/%s/brport/multicast_router",
+                             dev->ifname, val);
+}
+
 static int system_get_sysctl(const char *path, char *buf, const size_t buf_sz)
 {
        int fd = -1, ret = -1;
@@ -569,7 +576,7 @@ static char *system_get_bridge(const char *name, char *buf, int buflen)
 static void
 system_bridge_set_wireless(struct device *bridge, struct device *dev)
 {
-       bool mcast_to_ucast = true;
+       bool mcast_to_ucast = dev->wireless_ap;
        bool hairpin = true;
 
        if (bridge->settings.flags & DEV_OPT_MULTICAST_TO_UNICAST &&
@@ -585,6 +592,7 @@ system_bridge_set_wireless(struct device *bridge, struct device *dev)
 
 int system_bridge_addif(struct device *bridge, struct device *dev)
 {
+       char buf[64];
        char *oldbr;
        int ret = 0;
 
@@ -595,6 +603,11 @@ int system_bridge_addif(struct device *bridge, struct device *dev)
        if (dev->wireless)
                system_bridge_set_wireless(bridge, dev);
 
+       if (dev->settings.flags & DEV_OPT_MULTICAST_ROUTER) {
+               snprintf(buf, sizeof(buf), "%i", dev->settings.multicast_router);
+               system_bridge_set_multicast_router(dev, buf, false);
+       }
+
        return ret;
 }
 
@@ -845,6 +858,11 @@ int system_bridge_addbr(struct device *bridge, struct bridge_config *cfg)
        system_set_dev_sysctl("/sys/devices/virtual/net/%s/bridge/hash_max",
                bridge->ifname, buf);
 
+       if (bridge->settings.flags & DEV_OPT_MULTICAST_ROUTER) {
+               snprintf(buf, sizeof(buf), "%i", bridge->settings.multicast_router);
+               system_bridge_set_multicast_router(bridge, buf, true);
+       }
+
        args[0] = BRCTL_SET_BRIDGE_PRIORITY;
        args[1] = cfg->priority;
        system_bridge_if(bridge->ifname, NULL, SIOCDEVPRIVATE, &args);