]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.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)
committerKleber Sacilotto de Souza <kleber.souza@canonical.com>
Thu, 15 Jul 2021 17:27:05 +0000 (19:27 +0200)
BugLink: https://bugs.launchpad.net/bugs/1932957
[ 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>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Kelsey Skunberg <kelsey.skunberg@canonical.com>
net/tipc/bearer.c

index 0214aa1c442789089c6597ddc9980deadacd9dcc..0e01615977495a0febea1ec093ba4c1c0149def1 100644 (file)
@@ -233,7 +233,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;
@@ -247,17 +248,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;
        }
 
@@ -271,6 +275,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++;
@@ -282,6 +287,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);
@@ -292,6 +298,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;
        }
 
@@ -305,6 +312,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;
        }
 
@@ -320,6 +328,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;
        }
 
@@ -862,6 +871,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;
        }
 
@@ -901,8 +911,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);
 
@@ -960,7 +972,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)
@@ -999,6 +1012,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;
        }
 
@@ -1039,8 +1053,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];
@@ -1059,12 +1075,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
@@ -1192,6 +1214,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;
        }
@@ -1228,9 +1251,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];
 
@@ -1246,12 +1270,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
                }