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)
system_set_dev_sysctl("/sys/devices/virtual/net/%s/bridge/multicast_snooping",
bridge->ifname, cfg->igmp_snoop ? "1" : "0");
+ system_set_dev_sysctl("/sys/devices/virtual/net/%s/bridge/multicast_querier",
+ bridge->ifname, cfg->igmp_snoop ? "1" : "0");
+
args[0] = BRCTL_SET_BRIDGE_PRIORITY;
args[1] = cfg->priority;
system_bridge_if(bridge->ifname, NULL, SIOCDEVPRIVATE, &args);
if (table == RT_TABLE_UNSPEC)
return false;
- /* do not consider main table special */
- if (table == RT_TABLE_MAIN)
- table = RT_TABLE_UNSPEC;
-
*id = table;
return true;
}
+bool system_is_default_rt_table(unsigned int id)
+{
+ return (id == RT_TABLE_MAIN);
+}
+
static int system_iprule(struct iprule *rule, int cmd)
{
int alen = ((rule->flags & IPRULE_FAMILY) == IPRULE_INET4) ? 4 : 16;