simplify vlist, move avl key handling to vlist_add()
[project/netifd.git] / system-linux.c
index 0a989b0..aa1bd54 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/if_vlan.h>
 #include <linux/if_bridge.h>
 #include <linux/ethtool.h>
+#include <net/if_arp.h>
 
 #include <unistd.h>
 #include <string.h>
@@ -588,7 +589,7 @@ system_if_get_settings(struct device *dev, struct device_settings *s)
        }
 
        if (ioctl(sock_ioctl, SIOCGIFHWADDR, &ifr) == 0) {
-               memcpy(s->macaddr, &ifr.ifr_hwaddr, sizeof(s->macaddr));
+               memcpy(s->macaddr, &ifr.ifr_hwaddr.sa_data, sizeof(s->macaddr));
                s->flags |= DEV_OPT_MACADDR;
        }
 }
@@ -611,7 +612,8 @@ system_if_apply_settings(struct device *dev, struct device_settings *s)
                        s->flags &= ~DEV_OPT_TXQUEUELEN;
        }
        if (s->flags & DEV_OPT_MACADDR) {
-               memcpy(&ifr.ifr_hwaddr, s->macaddr, sizeof(s->macaddr));
+               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)
                        s->flags &= ~DEV_OPT_MACADDR;
        }
@@ -628,6 +630,7 @@ int system_if_up(struct device *dev)
 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);
        return ret;
 }
@@ -823,13 +826,8 @@ static int system_addr(struct device *dev, struct device_addr *addr, int cmd)
 
        nlmsg_append(msg, &ifa, sizeof(ifa), 0);
        nla_put(msg, IFA_LOCAL, alen, &addr->addr);
-       if (v4) {
-               uint32_t mask = ~0;
-               uint32_t *a = (uint32_t *) &addr->addr;
-
-               mask >>= addr->mask;
-               nla_put_u32(msg, IFA_BROADCAST, *a | mask);
-       }
+       if (v4)
+               nla_put_u32(msg, IFA_BROADCAST, addr->broadcast);
 
        return system_rtnl_call(msg);
 }