Re: [PATCH net-next] neighbor: Add extack messages for add and delete commands

2018-12-05 Thread David Miller
From: David Ahern 
Date: Wed,  5 Dec 2018 20:02:29 -0800

> From: David Ahern 
> 
> Add extack messages for failures in neigh_add and neigh_delete.
> 
> Signed-off-by: David Ahern 

Looks good, applied, thanks David.


[PATCH net-next] neighbor: Add extack messages for add and delete commands

2018-12-05 Thread David Ahern
From: David Ahern 

Add extack messages for failures in neigh_add and neigh_delete.

Signed-off-by: David Ahern 
---
 net/core/neighbour.c | 55 +---
 1 file changed, 39 insertions(+), 16 deletions(-)

diff --git a/net/core/neighbour.c b/net/core/neighbour.c
index 41954e42a2de..6d479b5562be 100644
--- a/net/core/neighbour.c
+++ b/net/core/neighbour.c
@@ -1137,8 +1137,9 @@ static void neigh_update_hhs(struct neighbour *neigh)
Caller MUST hold reference count on the entry.
  */
 
-int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new,
-u32 flags, u32 nlmsg_pid)
+static int __neigh_update(struct neighbour *neigh, const u8 *lladdr,
+ u8 new, u32 flags, u32 nlmsg_pid,
+ struct netlink_ext_ack *extack)
 {
u8 old;
int err;
@@ -1155,8 +1156,10 @@ int neigh_update(struct neighbour *neigh, const u8 
*lladdr, u8 new,
if (!(flags & NEIGH_UPDATE_F_ADMIN) &&
(old & (NUD_NOARP | NUD_PERMANENT)))
goto out;
-   if (neigh->dead)
+   if (neigh->dead) {
+   NL_SET_ERR_MSG(extack, "Neighbor entry is now dead");
goto out;
+   }
 
neigh_update_ext_learned(neigh, flags, ¬ify);
 
@@ -1193,8 +1196,10 @@ int neigh_update(struct neighbour *neigh, const u8 
*lladdr, u8 new,
   use it, otherwise discard the request.
 */
err = -EINVAL;
-   if (!(old & NUD_VALID))
+   if (!(old & NUD_VALID)) {
+   NL_SET_ERR_MSG(extack, "No link layer address given");
goto out;
+   }
lladdr = neigh->ha;
}
 
@@ -1307,6 +1312,12 @@ int neigh_update(struct neighbour *neigh, const u8 
*lladdr, u8 new,
 
return err;
 }
+
+int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new,
+u32 flags, u32 nlmsg_pid)
+{
+   return __neigh_update(neigh, lladdr, new, flags, nlmsg_pid, NULL);
+}
 EXPORT_SYMBOL(neigh_update);
 
 /* Update the neigh to listen temporarily for probe responses, even if it is
@@ -1678,8 +1689,10 @@ static int neigh_delete(struct sk_buff *skb, struct 
nlmsghdr *nlh,
goto out;
 
dst_attr = nlmsg_find_attr(nlh, sizeof(*ndm), NDA_DST);
-   if (dst_attr == NULL)
+   if (!dst_attr) {
+   NL_SET_ERR_MSG(extack, "Network address not specified");
goto out;
+   }
 
ndm = nlmsg_data(nlh);
if (ndm->ndm_ifindex) {
@@ -1694,8 +1707,10 @@ static int neigh_delete(struct sk_buff *skb, struct 
nlmsghdr *nlh,
if (tbl == NULL)
return -EAFNOSUPPORT;
 
-   if (nla_len(dst_attr) < (int)tbl->key_len)
+   if (nla_len(dst_attr) < (int)tbl->key_len) {
+   NL_SET_ERR_MSG(extack, "Invalid network address");
goto out;
+   }
 
if (ndm->ndm_flags & NTF_PROXY) {
err = pneigh_delete(tbl, net, nla_data(dst_attr), dev);
@@ -1711,10 +1726,9 @@ static int neigh_delete(struct sk_buff *skb, struct 
nlmsghdr *nlh,
goto out;
}
 
-   err = neigh_update(neigh, NULL, NUD_FAILED,
-  NEIGH_UPDATE_F_OVERRIDE |
-  NEIGH_UPDATE_F_ADMIN,
-  NETLINK_CB(skb).portid);
+   err = __neigh_update(neigh, NULL, NUD_FAILED,
+NEIGH_UPDATE_F_OVERRIDE | NEIGH_UPDATE_F_ADMIN,
+NETLINK_CB(skb).portid, extack);
write_lock_bh(&tbl->lock);
neigh_release(neigh);
neigh_remove_one(neigh, tbl);
@@ -1744,8 +1758,10 @@ static int neigh_add(struct sk_buff *skb, struct 
nlmsghdr *nlh,
goto out;
 
err = -EINVAL;
-   if (tb[NDA_DST] == NULL)
+   if (!tb[NDA_DST]) {
+   NL_SET_ERR_MSG(extack, "Network address not specified");
goto out;
+   }
 
ndm = nlmsg_data(nlh);
if (ndm->ndm_ifindex) {
@@ -1755,16 +1771,21 @@ static int neigh_add(struct sk_buff *skb, struct 
nlmsghdr *nlh,
goto out;
}
 
-   if (tb[NDA_LLADDR] && nla_len(tb[NDA_LLADDR]) < dev->addr_len)
+   if (tb[NDA_LLADDR] && nla_len(tb[NDA_LLADDR]) < dev->addr_len) {
+   NL_SET_ERR_MSG(extack, "Invalid link address");
goto out;
+   }
}
 
tbl = neigh_find_table(ndm->ndm_family);
if (tbl == NULL)
return -EAFNOSUPPORT;
 
-   if (nla_len(tb[NDA_DST]) < (int)tbl->key_len)
+   if (nla_len(tb[NDA_DST]) < (int)tbl->key_len) {
+   NL_SET_ERR_MSG(extack, "Invalid network address");
goto out;
+   }
+
dst = nla_data(tb[NDA_DST]);
lladdr = tb[NDA_LLADDR] ? nla_data(tb[NDA_LLADDR]) : NULL;
 
@@ -1780,8 +1801,10 @@ static int neigh_add(s