]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
tipc: add extack messages for bearer/media failure
authorHoang Le <hoang.h.le@dektech.com.au>
Thu, 25 Mar 2021 01:56:41 +0000 (08:56 +0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 10 Jun 2021 11:24:05 +0000 (13:24 +0200)
[ Upstream commit b83e214b2e04204f1fc674574362061492c37245 ]

Add extack error messages for -EINVAL errors when enabling bearer,
getting/setting properties for a media/bearer

Acked-by: Jon Maloy <jmaloy@redhat.com>
Signed-off-by: Hoang Le <hoang.h.le@dektech.com.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
net/tipc/bearer.c

index 2649a0a0d45e0f3ccfd250b848bbe60491550101..8ab17f0da0268cee160919e046e5b574d3766d77 100644 (file)
@@ -231,7 +231,8 @@ void tipc_bearer_remove_dest(struct net *net, u32 bearer_id, u32 dest)
  */
 static int tipc_enable_bearer(struct net *net, const char *name,
                              u32 disc_domain, u32 prio,
-                             struct nlattr *attr[])
+                             struct nlattr *attr[],
+                             struct netlink_ext_ack *extack)
 {
        struct tipc_net *tn = tipc_net(net);
        struct tipc_bearer_names b_names;
@@ -245,17 +246,20 @@ static int tipc_enable_bearer(struct net *net, const char *name,
 
        if (!bearer_name_validate(name, &b_names)) {
                errstr = "illegal name";
+               NL_SET_ERR_MSG(extack, "Illegal name");
                goto rejected;
        }
 
        if (prio > TIPC_MAX_LINK_PRI && prio != TIPC_MEDIA_LINK_PRI) {
                errstr = "illegal priority";
+               NL_SET_ERR_MSG(extack, "Illegal priority");
                goto rejected;
        }
 
        m = tipc_media_find(b_names.media_name);
        if (!m) {
                errstr = "media not registered";
+               NL_SET_ERR_MSG(extack, "Media not registered");
                goto rejected;
        }
 
@@ -269,6 +273,7 @@ static int tipc_enable_bearer(struct net *net, const char *name,
                        break;
                if (!strcmp(name, b->name)) {
                        errstr = "already enabled";
+                       NL_SET_ERR_MSG(extack, "Already enabled");
                        goto rejected;
                }
                bearer_id++;
@@ -280,6 +285,7 @@ static int tipc_enable_bearer(struct net *net, const char *name,
                        name, prio);
                if (prio == TIPC_MIN_LINK_PRI) {
                        errstr = "cannot adjust to lower";
+                       NL_SET_ERR_MSG(extack, "Cannot adjust to lower");
                        goto rejected;
                }
                pr_warn("Bearer <%s>: trying with adjusted priority\n", name);
@@ -290,6 +296,7 @@ static int tipc_enable_bearer(struct net *net, const char *name,
 
        if (bearer_id >= MAX_BEARERS) {
                errstr = "max 3 bearers permitted";
+               NL_SET_ERR_MSG(extack, "Max 3 bearers permitted");
                goto rejected;
        }
 
@@ -303,6 +310,7 @@ static int tipc_enable_bearer(struct net *net, const char *name,
        if (res) {
                kfree(b);
                errstr = "failed to enable media";
+               NL_SET_ERR_MSG(extack, "Failed to enable media");
                goto rejected;
        }
 
@@ -318,6 +326,7 @@ static int tipc_enable_bearer(struct net *net, const char *name,
        if (res) {
                bearer_disable(net, b);
                errstr = "failed to create discoverer";
+               NL_SET_ERR_MSG(extack, "Failed to create discoverer");
                goto rejected;
        }
 
@@ -795,6 +804,7 @@ int tipc_nl_bearer_get(struct sk_buff *skb, struct genl_info *info)
        bearer = tipc_bearer_find(net, name);
        if (!bearer) {
                err = -EINVAL;
+               NL_SET_ERR_MSG(info->extack, "Bearer not found");
                goto err_out;
        }
 
@@ -834,8 +844,10 @@ int __tipc_nl_bearer_disable(struct sk_buff *skb, struct genl_info *info)
        name = nla_data(attrs[TIPC_NLA_BEARER_NAME]);
 
        bearer = tipc_bearer_find(net, name);
-       if (!bearer)
+       if (!bearer) {
+               NL_SET_ERR_MSG(info->extack, "Bearer not found");
                return -EINVAL;
+       }
 
        bearer_disable(net, bearer);
 
@@ -893,7 +905,8 @@ int __tipc_nl_bearer_enable(struct sk_buff *skb, struct genl_info *info)
                        prio = nla_get_u32(props[TIPC_NLA_PROP_PRIO]);
        }
 
-       return tipc_enable_bearer(net, bearer, domain, prio, attrs);
+       return tipc_enable_bearer(net, bearer, domain, prio, attrs,
+                                 info->extack);
 }
 
 int tipc_nl_bearer_enable(struct sk_buff *skb, struct genl_info *info)
@@ -932,6 +945,7 @@ int tipc_nl_bearer_add(struct sk_buff *skb, struct genl_info *info)
        b = tipc_bearer_find(net, name);
        if (!b) {
                rtnl_unlock();
+               NL_SET_ERR_MSG(info->extack, "Bearer not found");
                return -EINVAL;
        }
 
@@ -972,8 +986,10 @@ int __tipc_nl_bearer_set(struct sk_buff *skb, struct genl_info *info)
        name = nla_data(attrs[TIPC_NLA_BEARER_NAME]);
 
        b = tipc_bearer_find(net, name);
-       if (!b)
+       if (!b) {
+               NL_SET_ERR_MSG(info->extack, "Bearer not found");
                return -EINVAL;
+       }
 
        if (attrs[TIPC_NLA_BEARER_PROP]) {
                struct nlattr *props[TIPC_NLA_PROP_MAX + 1];
@@ -992,12 +1008,18 @@ int __tipc_nl_bearer_set(struct sk_buff *skb, struct genl_info *info)
                if (props[TIPC_NLA_PROP_WIN])
                        b->window = nla_get_u32(props[TIPC_NLA_PROP_WIN]);
                if (props[TIPC_NLA_PROP_MTU]) {
-                       if (b->media->type_id != TIPC_MEDIA_TYPE_UDP)
+                       if (b->media->type_id != TIPC_MEDIA_TYPE_UDP) {
+                               NL_SET_ERR_MSG(info->extack,
+                                              "MTU property is unsupported");
                                return -EINVAL;
+                       }
 #ifdef CONFIG_TIPC_MEDIA_UDP
                        if (tipc_udp_mtu_bad(nla_get_u32
-                                            (props[TIPC_NLA_PROP_MTU])))
+                                            (props[TIPC_NLA_PROP_MTU]))) {
+                               NL_SET_ERR_MSG(info->extack,
+                                              "MTU value is out-of-range");
                                return -EINVAL;
+                       }
                        b->mtu = nla_get_u32(props[TIPC_NLA_PROP_MTU]);
                        tipc_node_apply_property(net, b, TIPC_NLA_PROP_MTU);
 #endif
@@ -1125,6 +1147,7 @@ int tipc_nl_media_get(struct sk_buff *skb, struct genl_info *info)
        rtnl_lock();
        media = tipc_media_find(name);
        if (!media) {
+               NL_SET_ERR_MSG(info->extack, "Media not found");
                err = -EINVAL;
                goto err_out;
        }
@@ -1161,9 +1184,10 @@ int __tipc_nl_media_set(struct sk_buff *skb, struct genl_info *info)
        name = nla_data(attrs[TIPC_NLA_MEDIA_NAME]);
 
        m = tipc_media_find(name);
-       if (!m)
+       if (!m) {
+               NL_SET_ERR_MSG(info->extack, "Media not found");
                return -EINVAL;
-
+       }
        if (attrs[TIPC_NLA_MEDIA_PROP]) {
                struct nlattr *props[TIPC_NLA_PROP_MAX + 1];
 
@@ -1179,12 +1203,18 @@ int __tipc_nl_media_set(struct sk_buff *skb, struct genl_info *info)
                if (props[TIPC_NLA_PROP_WIN])
                        m->window = nla_get_u32(props[TIPC_NLA_PROP_WIN]);
                if (props[TIPC_NLA_PROP_MTU]) {
-                       if (m->type_id != TIPC_MEDIA_TYPE_UDP)
+                       if (m->type_id != TIPC_MEDIA_TYPE_UDP) {
+                               NL_SET_ERR_MSG(info->extack,
+                                              "MTU property is unsupported");
                                return -EINVAL;
+                       }
 #ifdef CONFIG_TIPC_MEDIA_UDP
                        if (tipc_udp_mtu_bad(nla_get_u32
-                                            (props[TIPC_NLA_PROP_MTU])))
+                                            (props[TIPC_NLA_PROP_MTU]))) {
+                               NL_SET_ERR_MSG(info->extack,
+                                              "MTU value is out-of-range");
                                return -EINVAL;
+                       }
                        m->mtu = nla_get_u32(props[TIPC_NLA_PROP_MTU]);
 #endif
                }