Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[sfrench/cifs-2.6.git] / net / core / neighbour.c
index 9b9da5142613aac35faae53dfff24b9339e1c457..dfa871061f147f4087194ac29e89f2f98a4e462d 100644 (file)
@@ -1865,7 +1865,8 @@ static int neigh_add(struct sk_buff *skb, struct nlmsghdr *nlh,
        int err;
 
        ASSERT_RTNL();
-       err = nlmsg_parse(nlh, sizeof(*ndm), tb, NDA_MAX, nda_policy, extack);
+       err = nlmsg_parse_deprecated(nlh, sizeof(*ndm), tb, NDA_MAX,
+                                    nda_policy, extack);
        if (err < 0)
                goto out;
 
@@ -1923,6 +1924,11 @@ static int neigh_add(struct sk_buff *skb, struct nlmsghdr *nlh,
                goto out;
        }
 
+       if (tbl->allow_add && !tbl->allow_add(dev, extack)) {
+               err = -EINVAL;
+               goto out;
+       }
+
        neigh = neigh_lookup(tbl, dst, dev);
        if (neigh == NULL) {
                bool exempt_from_gc;
@@ -1977,7 +1983,7 @@ static int neightbl_fill_parms(struct sk_buff *skb, struct neigh_parms *parms)
 {
        struct nlattr *nest;
 
-       nest = nla_nest_start(skb, NDTA_PARMS);
+       nest = nla_nest_start_noflag(skb, NDTA_PARMS);
        if (nest == NULL)
                return -ENOBUFS;
 
@@ -2179,8 +2185,8 @@ static int neightbl_set(struct sk_buff *skb, struct nlmsghdr *nlh,
        bool found = false;
        int err, tidx;
 
-       err = nlmsg_parse(nlh, sizeof(*ndtmsg), tb, NDTA_MAX,
-                         nl_neightbl_policy, extack);
+       err = nlmsg_parse_deprecated(nlh, sizeof(*ndtmsg), tb, NDTA_MAX,
+                                    nl_neightbl_policy, extack);
        if (err < 0)
                goto errout;
 
@@ -2217,8 +2223,9 @@ static int neightbl_set(struct sk_buff *skb, struct nlmsghdr *nlh,
                struct neigh_parms *p;
                int i, ifindex = 0;
 
-               err = nla_parse_nested(tbp, NDTPA_MAX, tb[NDTA_PARMS],
-                                      nl_ntbl_parm_policy, extack);
+               err = nla_parse_nested_deprecated(tbp, NDTPA_MAX,
+                                                 tb[NDTA_PARMS],
+                                                 nl_ntbl_parm_policy, extack);
                if (err < 0)
                        goto errout_tbl_lock;
 
@@ -2658,11 +2665,12 @@ static int neigh_valid_dump_req(const struct nlmsghdr *nlh,
                        return -EINVAL;
                }
 
-               err = nlmsg_parse_strict(nlh, sizeof(struct ndmsg), tb, NDA_MAX,
-                                        nda_policy, extack);
+               err = nlmsg_parse_deprecated_strict(nlh, sizeof(struct ndmsg),
+                                                   tb, NDA_MAX, nda_policy,
+                                                   extack);
        } else {
-               err = nlmsg_parse(nlh, sizeof(struct ndmsg), tb, NDA_MAX,
-                                 nda_policy, extack);
+               err = nlmsg_parse_deprecated(nlh, sizeof(struct ndmsg), tb,
+                                            NDA_MAX, nda_policy, extack);
        }
        if (err < 0)
                return err;
@@ -2762,8 +2770,8 @@ static int neigh_valid_get_req(const struct nlmsghdr *nlh,
                return -EINVAL;
        }
 
-       err = nlmsg_parse_strict(nlh, sizeof(struct ndmsg), tb, NDA_MAX,
-                                nda_policy, extack);
+       err = nlmsg_parse_deprecated_strict(nlh, sizeof(struct ndmsg), tb,
+                                           NDA_MAX, nda_policy, extack);
        if (err < 0)
                return err;