netifd: Fix vlan delete via netlink
authorHans Dedecker <dedeckeh@gmail.com>
Wed, 18 Jun 2014 05:55:44 +0000 (05:55 +0000)
committerSteven Barth <steven@midlink.org>
Wed, 18 Jun 2014 11:01:14 +0000 (13:01 +0200)
Fix vlan delete via netlink as netlink attribute IFLA_IFNAME data size was incorrect.
In addition some minor improvements.

Signed-off-by: Hans Dedecker <dedeckeh@gmail.com>
system-linux.c

index f4721cc..ea71f65 100644 (file)
@@ -808,7 +808,7 @@ int system_vlandev_add(struct device *vlandev, struct device *dev, struct vlande
 {
        struct nl_msg *msg;
        struct nlattr *linkinfo, *data;
-       struct ifinfomsg iim = { .ifi_family = AF_INET };
+       struct ifinfomsg iim = { .ifi_family = AF_UNSPEC };
        int ifindex = system_if_resolve(dev);
        int rv;
 
@@ -821,14 +821,13 @@ int system_vlandev_add(struct device *vlandev, struct device *dev, struct vlande
                return -1;
 
        nlmsg_append(msg, &iim, sizeof(iim), 0);
-       nla_put(msg, IFLA_IFNAME, IFNAMSIZ, vlandev->ifname);
+       nla_put_string(msg, IFLA_IFNAME, vlandev->ifname);
        nla_put_u32(msg, IFLA_LINK, ifindex);
        
        if (!(linkinfo = nla_nest_start(msg, IFLA_LINKINFO)))
                goto nla_put_failure;
        
-       nla_put(msg, IFLA_INFO_KIND, strlen("vlan"), "vlan");
-
+       nla_put_string(msg, IFLA_INFO_KIND, "vlan");
 
        if (!(data = nla_nest_start(msg, IFLA_INFO_DATA)))
                goto nla_put_failure;
@@ -859,20 +858,19 @@ nla_put_failure:
 int system_vlandev_del(struct device *vlandev)
 {
        struct nl_msg *msg;
-       struct ifinfomsg iim;
-
-       iim.ifi_family = AF_INET;
-       iim.ifi_index  = 0;
+       struct ifinfomsg iim = {
+               .ifi_family = AF_UNSPEC,
+               .ifi_index = 0,
+       };
 
-       msg = nlmsg_alloc_simple(RTM_DELLINK, 0);
+       msg = nlmsg_alloc_simple(RTM_DELLINK, NLM_F_REQUEST);
 
        if (!msg)
                return -1;
 
        nlmsg_append(msg, &iim, sizeof(iim), 0);
 
-       nla_put(msg, IFLA_INFO_KIND, strlen("vlan"), "vlan");
-       nla_put(msg, IFLA_IFNAME, sizeof(vlandev->ifname), vlandev->ifname);
+       nla_put_string(msg, IFLA_IFNAME, vlandev->ifname);
 
        system_rtnl_call(msg);