diff options
author | Hans Dedecker <dedeckeh@gmail.com> | 2014-03-10 16:27:51 +0100 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2014-03-11 10:22:57 +0100 |
commit | 02021e2069d0ee315b0ff263b6c010bef63b879c (patch) | |
tree | 73d096226852fa43cd41963a6d93627a3171d18f /system-linux.c | |
parent | 8aabd47c6f4fefc8fbd70c34a738f7c26956d8cd (diff) |
netifd: Fix bridge MTU setting when a bridge member is added
Reapply bridge mtu setting as adding a bridge member will override the bridge mtu in the kernel
Signed-off-by: Hans Dedecker <dedeckeh@gmail.com>
Diffstat (limited to 'system-linux.c')
-rw-r--r-- | system-linux.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/system-linux.c b/system-linux.c index 12682dc..7cec649 100644 --- a/system-linux.c +++ b/system-linux.c @@ -798,23 +798,26 @@ system_if_get_settings(struct device *dev, struct device_settings *s) } void -system_if_apply_settings(struct device *dev, struct device_settings *s) +system_if_apply_settings(struct device *dev, struct device_settings *s, unsigned int apply_mask) { struct ifreq ifr; + if (!apply_mask) + return; + memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, dev->ifname, sizeof(ifr.ifr_name)); - if (s->flags & DEV_OPT_MTU) { + if (s->flags & DEV_OPT_MTU & apply_mask) { ifr.ifr_mtu = s->mtu; if (ioctl(sock_ioctl, SIOCSIFMTU, &ifr) < 0) s->flags &= ~DEV_OPT_MTU; } - if (s->flags & DEV_OPT_TXQUEUELEN) { + if (s->flags & DEV_OPT_TXQUEUELEN & apply_mask) { ifr.ifr_qlen = s->txqueuelen; if (ioctl(sock_ioctl, SIOCSIFTXQLEN, &ifr) < 0) s->flags &= ~DEV_OPT_TXQUEUELEN; } - if ((s->flags & DEV_OPT_MACADDR) && !dev->external) { + if ((s->flags & DEV_OPT_MACADDR & apply_mask) && !dev->external) { ifr.ifr_hwaddr.sa_family = ARPHRD_ETHER; memcpy(&ifr.ifr_hwaddr.sa_data, s->macaddr, sizeof(s->macaddr)); if (ioctl(sock_ioctl, SIOCSIFHWADDR, &ifr) < 0) @@ -825,7 +828,7 @@ system_if_apply_settings(struct device *dev, struct device_settings *s) int system_if_up(struct device *dev) { system_if_get_settings(dev, &dev->orig_settings); - system_if_apply_settings(dev, &dev->settings); + system_if_apply_settings(dev, &dev->settings, dev->settings.flags); device_set_ifindex(dev, system_if_resolve(dev)); return system_if_flags(dev->ifname, IFF_UP, 0); } @@ -834,7 +837,7 @@ int system_if_down(struct device *dev) { int ret = system_if_flags(dev->ifname, 0, IFF_UP); dev->orig_settings.flags &= dev->settings.flags; - system_if_apply_settings(dev, &dev->orig_settings); + system_if_apply_settings(dev, &dev->orig_settings, dev->orig_settings.flags); return ret; } |