From: David Ahern <dsah...@gmail.com>

Add extack arg to the nla_parse_nested calls in rtnl_newlink, and
add messages for unknown device type and link network namespace id.
In particular, it improves the failure message when the wrong link
type is used. From
    $ ip li add bond1 type bonding
    RTNETLINK answers: Operation not supported
to
    $ ip li add bond1 type bonding
    Error: Unknown device type.

(The module name is bonding but the link type is bond.)

Signed-off-by: David Ahern <dsah...@gmail.com>
---
 net/core/rtnetlink.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index f787b7640d49..86f2d9cbdae3 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -3054,7 +3054,7 @@ static int rtnl_newlink(struct sk_buff *skb, struct 
nlmsghdr *nlh,
                        if (ops->maxtype && linkinfo[IFLA_INFO_DATA]) {
                                err = nla_parse_nested(attr, ops->maxtype,
                                                       linkinfo[IFLA_INFO_DATA],
-                                                      ops->policy, NULL);
+                                                      ops->policy, extack);
                                if (err < 0)
                                        return err;
                                data = attr;
@@ -3076,7 +3076,7 @@ static int rtnl_newlink(struct sk_buff *skb, struct 
nlmsghdr *nlh,
                                                       m_ops->slave_maxtype,
                                                       
linkinfo[IFLA_INFO_SLAVE_DATA],
                                                       m_ops->slave_policy,
-                                                      NULL);
+                                                      extack);
                                if (err < 0)
                                        return err;
                                slave_data = slave_attr;
@@ -3140,6 +3140,7 @@ static int rtnl_newlink(struct sk_buff *skb, struct 
nlmsghdr *nlh,
                                        goto replay;
                        }
 #endif
+                       NL_SET_ERR_MSG(extack, "Unknown device type");
                        return -EOPNOTSUPP;
                }
 
@@ -3160,6 +3161,7 @@ static int rtnl_newlink(struct sk_buff *skb, struct 
nlmsghdr *nlh,
 
                        link_net = get_net_ns_by_id(dest_net, id);
                        if (!link_net) {
+                               NL_SET_ERR_MSG(extack, "Unknown network 
namespace id");
                                err =  -EINVAL;
                                goto out;
                        }
-- 
2.11.0

Reply via email to