diff options
Diffstat (limited to 'system-linux.c')
-rw-r--r-- | system-linux.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/system-linux.c b/system-linux.c index 944245c..01500a5 100644 --- a/system-linux.c +++ b/system-linux.c @@ -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; @@ -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); |