remove flags for device settings that could not be applied successfully
[project/netifd.git] / system-linux.c
index 0ff2b3b..aa3aeda 100644 (file)
@@ -570,6 +570,30 @@ int system_vlan_del(struct device *dev)
 }
 
 static void
+system_if_get_settings(struct device *dev, struct device_settings *s)
+{
+       struct ifreq ifr;
+
+       memset(&ifr, 0, sizeof(ifr));
+       strncpy(ifr.ifr_name, dev->ifname, sizeof(ifr.ifr_name));
+
+       if (ioctl(sock_ioctl, SIOCGIFMTU, &ifr) == 0) {
+               s->mtu = ifr.ifr_mtu;
+               s->flags |= DEV_OPT_MTU;
+       }
+
+       if (ioctl(sock_ioctl, SIOCGIFTXQLEN, &ifr) == 0) {
+               s->txqueuelen = ifr.ifr_qlen;
+               s->flags |= DEV_OPT_TXQUEUELEN;
+       }
+
+       if (ioctl(sock_ioctl, SIOCGIFHWADDR, &ifr) == 0) {
+               memcpy(s->macaddr, &ifr.ifr_hwaddr, sizeof(s->macaddr));
+               s->flags |= DEV_OPT_MACADDR;
+       }
+}
+
+static void
 system_if_apply_settings(struct device *dev, struct device_settings *s)
 {
        struct ifreq ifr;
@@ -578,20 +602,24 @@ system_if_apply_settings(struct device *dev, struct device_settings *s)
        strncpy(ifr.ifr_name, dev->ifname, sizeof(ifr.ifr_name));
        if (s->flags & DEV_OPT_MTU) {
                ifr.ifr_mtu = s->mtu;
-               ioctl(sock_ioctl, SIOCSIFMTU, &ifr);
+               if (ioctl(sock_ioctl, SIOCSIFMTU, &ifr) < 0)
+                       s->flags &= ~DEV_OPT_MTU;
        }
        if (s->flags & DEV_OPT_TXQUEUELEN) {
                ifr.ifr_qlen = s->txqueuelen;
-               ioctl(sock_ioctl, SIOCSIFTXQLEN, &ifr);
+               if (ioctl(sock_ioctl, SIOCSIFTXQLEN, &ifr) < 0)
+                       s->flags &= ~DEV_OPT_TXQUEUELEN;
        }
        if (s->flags & DEV_OPT_MACADDR) {
                memcpy(&ifr.ifr_hwaddr, s->macaddr, sizeof(s->macaddr));
-               ioctl(sock_ioctl, SIOCSIFHWADDR, &ifr);
+               if (ioctl(sock_ioctl, SIOCSIFHWADDR, &ifr) < 0)
+                       s->flags &= ~DEV_OPT_MACADDR;
        }
 }
 
 int system_if_up(struct device *dev)
 {
+       system_if_get_settings(dev, &dev->orig_settings);
        system_if_apply_settings(dev, &dev->settings);
        dev->ifindex = system_if_resolve(dev);
        return system_if_flags(dev->ifname, IFF_UP, 0);
@@ -599,7 +627,9 @@ int system_if_up(struct device *dev)
 
 int system_if_down(struct device *dev)
 {
-       return system_if_flags(dev->ifname, 0, IFF_UP);
+       int ret = system_if_flags(dev->ifname, 0, IFF_UP);
+       system_if_apply_settings(dev, &dev->orig_settings);
+       return ret;
 }
 
 int system_if_check(struct device *dev)
@@ -719,8 +749,6 @@ system_if_dump_info(struct device *dev, struct blob_buf *b)
 
        if (read_int_file(dir_fd, "carrier", &val))
                blobmsg_add_u8(b, "link", !!val);
-       if (read_string_file(dir_fd, "address", buf, sizeof(buf)))
-               blobmsg_add_string(b, "macaddr", buf);
 
        memset(&ecmd, 0, sizeof(ecmd));
        memset(&ifr, 0, sizeof(ifr));