X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=system-linux.c;h=5c960b40119854e42e7d5531a6929e7ca6736626;hp=c6f17e99c8015ca7f414231c6a77139c7a522e2e;hb=a3bf8cbe10b0bad85475f4c3dc2bae4afb65774b;hpb=61e627ed78ed47e40cc63a24ff8fb2f5fb2c418f diff --git a/system-linux.c b/system-linux.c index c6f17e9..5c960b4 100644 --- a/system-linux.c +++ b/system-linux.c @@ -452,15 +452,27 @@ static char *system_get_bridge(const char *name, char *buf, int buflen) return path + 1; } +static void system_bridge_set_wireless(const char *bridge, const char *dev) +{ + snprintf(dev_buf, sizeof(dev_buf), + "/sys/devices/virtual/net/%s/brif/%s/multicast_to_unicast", + bridge, dev); + system_set_sysctl(dev_buf, "1"); +} + int system_bridge_addif(struct device *bridge, struct device *dev) { char *oldbr; + int ret = 0; oldbr = system_get_bridge(dev->ifname, dev_buf, sizeof(dev_buf)); - if (oldbr && !strcmp(oldbr, bridge->ifname)) - return 0; + if (!oldbr || strcmp(oldbr, bridge->ifname) != 0) + ret = system_bridge_if(bridge->ifname, dev, SIOCBRADDIF, NULL); + + if (dev->wireless) + system_bridge_set_wireless(bridge->ifname, dev->ifname); - return system_bridge_if(bridge->ifname, dev, SIOCBRADDIF, NULL); + return ret; } int system_bridge_delif(struct device *bridge, struct device *dev)