]> Pileus Git - ~andy/linux/blobdiff - net/core/rtnetlink.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[~andy/linux] / net / core / rtnetlink.c
index 1a63c6efd2eaed0bad1582bd0c1a07a83ed73fb6..545a969672ab778fdcced03da911b31a95ed6d2d 100644 (file)
@@ -38,7 +38,6 @@
 #include <linux/pci.h>
 
 #include <asm/uaccess.h>
-#include <asm/system.h>
 
 #include <linux/inet.h>
 #include <linux/netdevice.h>
@@ -608,7 +607,8 @@ int rtnetlink_put_metrics(struct sk_buff *skb, u32 *metrics)
        for (i = 0; i < RTAX_MAX; i++) {
                if (metrics[i]) {
                        valid++;
-                       NLA_PUT_U32(skb, i+1, metrics[i]);
+                       if (nla_put_u32(skb, i+1, metrics[i]))
+                               goto nla_put_failure;
                }
        }
 
@@ -783,6 +783,7 @@ static noinline size_t if_nlmsg_size(const struct net_device *dev,
               + nla_total_size(4) /* IFLA_MTU */
               + nla_total_size(4) /* IFLA_LINK */
               + nla_total_size(4) /* IFLA_MASTER */
+              + nla_total_size(4) /* IFLA_PROMISCUITY */
               + nla_total_size(1) /* IFLA_OPERSTATE */
               + nla_total_size(1) /* IFLA_LINKMODE */
               + nla_total_size(ext_filter_mask
@@ -808,7 +809,8 @@ static int rtnl_vf_ports_fill(struct sk_buff *skb, struct net_device *dev)
                vf_port = nla_nest_start(skb, IFLA_VF_PORT);
                if (!vf_port)
                        goto nla_put_failure;
-               NLA_PUT_U32(skb, IFLA_PORT_VF, vf);
+               if (nla_put_u32(skb, IFLA_PORT_VF, vf))
+                       goto nla_put_failure;
                err = dev->netdev_ops->ndo_get_vf_port(dev, vf, skb);
                if (err == -EMSGSIZE)
                        goto nla_put_failure;
@@ -892,25 +894,23 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
        ifm->ifi_flags = dev_get_flags(dev);
        ifm->ifi_change = change;
 
-       NLA_PUT_STRING(skb, IFLA_IFNAME, dev->name);
-       NLA_PUT_U32(skb, IFLA_TXQLEN, dev->tx_queue_len);
-       NLA_PUT_U8(skb, IFLA_OPERSTATE,
-                  netif_running(dev) ? dev->operstate : IF_OPER_DOWN);
-       NLA_PUT_U8(skb, IFLA_LINKMODE, dev->link_mode);
-       NLA_PUT_U32(skb, IFLA_MTU, dev->mtu);
-       NLA_PUT_U32(skb, IFLA_GROUP, dev->group);
-
-       if (dev->ifindex != dev->iflink)
-               NLA_PUT_U32(skb, IFLA_LINK, dev->iflink);
-
-       if (dev->master)
-               NLA_PUT_U32(skb, IFLA_MASTER, dev->master->ifindex);
-
-       if (dev->qdisc)
-               NLA_PUT_STRING(skb, IFLA_QDISC, dev->qdisc->ops->id);
-
-       if (dev->ifalias)
-               NLA_PUT_STRING(skb, IFLA_IFALIAS, dev->ifalias);
+       if (nla_put_string(skb, IFLA_IFNAME, dev->name) ||
+           nla_put_u32(skb, IFLA_TXQLEN, dev->tx_queue_len) ||
+           nla_put_u8(skb, IFLA_OPERSTATE,
+                      netif_running(dev) ? dev->operstate : IF_OPER_DOWN) ||
+           nla_put_u8(skb, IFLA_LINKMODE, dev->link_mode) ||
+           nla_put_u32(skb, IFLA_MTU, dev->mtu) ||
+           nla_put_u32(skb, IFLA_GROUP, dev->group) ||
+           nla_put_u32(skb, IFLA_PROMISCUITY, dev->promiscuity) ||
+           (dev->ifindex != dev->iflink &&
+            nla_put_u32(skb, IFLA_LINK, dev->iflink)) ||
+           (dev->master &&
+            nla_put_u32(skb, IFLA_MASTER, dev->master->ifindex)) ||
+           (dev->qdisc &&
+            nla_put_string(skb, IFLA_QDISC, dev->qdisc->ops->id)) ||
+           (dev->ifalias &&
+            nla_put_string(skb, IFLA_IFALIAS, dev->ifalias)))
+               goto nla_put_failure;
 
        if (1) {
                struct rtnl_link_ifmap map = {
@@ -921,12 +921,14 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
                        .dma         = dev->dma,
                        .port        = dev->if_port,
                };
-               NLA_PUT(skb, IFLA_MAP, sizeof(map), &map);
+               if (nla_put(skb, IFLA_MAP, sizeof(map), &map))
+                       goto nla_put_failure;
        }
 
        if (dev->addr_len) {
-               NLA_PUT(skb, IFLA_ADDRESS, dev->addr_len, dev->dev_addr);
-               NLA_PUT(skb, IFLA_BROADCAST, dev->addr_len, dev->broadcast);
+               if (nla_put(skb, IFLA_ADDRESS, dev->addr_len, dev->dev_addr) ||
+                   nla_put(skb, IFLA_BROADCAST, dev->addr_len, dev->broadcast))
+                       goto nla_put_failure;
        }
 
        attr = nla_reserve(skb, IFLA_STATS,
@@ -943,8 +945,9 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
                goto nla_put_failure;
        copy_rtnl_link_stats64(nla_data(attr), stats);
 
-       if (dev->dev.parent && (ext_filter_mask & RTEXT_FILTER_VF))
-               NLA_PUT_U32(skb, IFLA_NUM_VF, dev_num_vf(dev->dev.parent));
+       if (dev->dev.parent && (ext_filter_mask & RTEXT_FILTER_VF) &&
+           nla_put_u32(skb, IFLA_NUM_VF, dev_num_vf(dev->dev.parent)))
+               goto nla_put_failure;
 
        if (dev->netdev_ops->ndo_get_vf_config && dev->dev.parent
            && (ext_filter_mask & RTEXT_FILTER_VF)) {
@@ -987,12 +990,13 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
                                nla_nest_cancel(skb, vfinfo);
                                goto nla_put_failure;
                        }
-                       NLA_PUT(skb, IFLA_VF_MAC, sizeof(vf_mac), &vf_mac);
-                       NLA_PUT(skb, IFLA_VF_VLAN, sizeof(vf_vlan), &vf_vlan);
-                       NLA_PUT(skb, IFLA_VF_TX_RATE, sizeof(vf_tx_rate),
-                               &vf_tx_rate);
-                       NLA_PUT(skb, IFLA_VF_SPOOFCHK, sizeof(vf_spoofchk),
-                               &vf_spoofchk);
+                       if (nla_put(skb, IFLA_VF_MAC, sizeof(vf_mac), &vf_mac) ||
+                           nla_put(skb, IFLA_VF_VLAN, sizeof(vf_vlan), &vf_vlan) ||
+                           nla_put(skb, IFLA_VF_TX_RATE, sizeof(vf_tx_rate),
+                                   &vf_tx_rate) ||
+                           nla_put(skb, IFLA_VF_SPOOFCHK, sizeof(vf_spoofchk),
+                                   &vf_spoofchk))
+                               goto nla_put_failure;
                        nla_nest_end(skb, vf);
                }
                nla_nest_end(skb, vfinfo);
@@ -1114,6 +1118,7 @@ const struct nla_policy ifla_policy[IFLA_MAX+1] = {
        [IFLA_PORT_SELF]        = { .type = NLA_NESTED },
        [IFLA_AF_SPEC]          = { .type = NLA_NESTED },
        [IFLA_EXT_MASK]         = { .type = NLA_U32 },
+       [IFLA_PROMISCUITY]      = { .type = NLA_U32 },
 };
 EXPORT_SYMBOL(ifla_policy);