X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=system-linux.c;h=e313cbc97934bf37f410e180419fe66bef039f99;hp=24254451308b1ad5c069bc06968b938d45f12d32;hb=3ff220f1861f76ddfeb1aebc61ffbaf14b6d60df;hpb=53f8ed2cdcf986389b605c79d273f08b5a687636 diff --git a/system-linux.c b/system-linux.c index 2425445..e313cbc 100644 --- a/system-linux.c +++ b/system-linux.c @@ -99,12 +99,17 @@ static void system_set_sysctl(const char *path, const char *val) close(fd); } -static void system_set_disable_ipv6(struct device *dev, const char *val) +static void system_set_dev_sysctl(const char *path, const char *device, const char *val) { char buf[256]; - snprintf(buf, sizeof(buf), "/proc/sys/net/ipv6/conf/%s/disable_ipv6", dev->ifname); - system_set_sysctl(buf, "0"); + snprintf(buf, sizeof(buf), path, val); + system_set_sysctl(buf, val); +} + +static void system_set_disable_ipv6(struct device *dev, const char *val) +{ + system_set_dev_sysctl("/proc/sys/net/ipv6/conf/%s/disable_ipv6", dev->ifname, val); } // Evaluate netlink messages @@ -411,6 +416,9 @@ int system_bridge_addbr(struct device *bridge, struct bridge_config *cfg) args[1] = sec_to_jiffies(cfg->forward_delay); system_bridge_if(bridge->ifname, NULL, SIOCDEVPRIVATE, &args); + system_set_dev_sysctl("/sys/devices/virtual/net/%s/bridge/multicast_snooping", + bridge->ifname, cfg->igmp_snoop ? "1" : "0"); + if (cfg->flags & BRIDGE_OPT_AGEING_TIME) { args[0] = BRCTL_SET_AGEING_TIME; args[1] = sec_to_jiffies(cfg->ageing_time); @@ -462,9 +470,32 @@ int system_vlan_del(struct device *dev) return system_vlan(dev, -1); } -int system_if_up(struct device *dev) +static void +system_if_apply_settings(struct device *dev) { + struct ifreq ifr; + + memset(&ifr, 0, sizeof(ifr)); + strncpy(ifr.ifr_name, dev->ifname, sizeof(ifr.ifr_name)); + if (dev->flags & DEV_OPT_MTU) { + ifr.ifr_mtu = dev->mtu; + ioctl(sock_ioctl, SIOCSIFMTU, &ifr); + } + if (dev->flags & DEV_OPT_TXQUEUELEN) { + ifr.ifr_qlen = dev->txqueuelen; + ioctl(sock_ioctl, SIOCSIFTXQLEN, &ifr); + } + if (dev->flags & DEV_OPT_MACADDR) { + memcpy(&ifr.ifr_hwaddr, dev->macaddr, sizeof(dev->macaddr)); + ioctl(sock_ioctl, SIOCSIFHWADDR, &ifr); + } + dev->ifindex = system_if_resolve(dev); +} + +int system_if_up(struct device *dev) +{ + system_if_apply_settings(dev); return system_if_flags(dev->ifname, IFF_UP, 0); }