mptcp: more detailed error reporting on endpoint creation
authorPaolo Abeni <pabeni@redhat.com>
Fri, 18 Nov 2022 18:46:08 +0000 (10:46 -0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 21 Nov 2022 13:09:07 +0000 (13:09 +0000)
Endpoint creation can fail for a number of reasons; in case of failure
append the error number to the extended ack message, using a newly
introduced generic helper.

Additionally let mptcp_pm_nl_append_new_local_addr() report different
error reasons.

Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/genetlink.h
net/mptcp/pm_netlink.c

index d212107..ed4622d 100644 (file)
@@ -125,6 +125,9 @@ static inline void genl_info_net_set(struct genl_info *info, struct net *net)
 
 #define GENL_SET_ERR_MSG(info, msg) NL_SET_ERR_MSG((info)->extack, msg)
 
+#define GENL_SET_ERR_MSG_FMT(info, msg, args...) \
+       NL_SET_ERR_MSG_FMT((info)->extack, msg, ##args)
+
 /* Report that a root attribute is missing */
 #define GENL_REQ_ATTR_CHECK(info, attr) ({                             \
        struct genl_info *__info = (info);                              \
index fdf2ee2..d66fbd5 100644 (file)
@@ -912,10 +912,14 @@ static int mptcp_pm_nl_append_new_local_addr(struct pm_nl_pernet *pernet,
         */
        if (pernet->next_id == MPTCP_PM_MAX_ADDR_ID)
                pernet->next_id = 1;
-       if (pernet->addrs >= MPTCP_PM_ADDR_MAX)
+       if (pernet->addrs >= MPTCP_PM_ADDR_MAX) {
+               ret = -ERANGE;
                goto out;
-       if (test_bit(entry->addr.id, pernet->id_bitmap))
+       }
+       if (test_bit(entry->addr.id, pernet->id_bitmap)) {
+               ret = -EBUSY;
                goto out;
+       }
 
        /* do not insert duplicate address, differentiate on port only
         * singled addresses
@@ -929,8 +933,10 @@ static int mptcp_pm_nl_append_new_local_addr(struct pm_nl_pernet *pernet,
                         * endpoint is an implicit one and the user-space
                         * did not provide an endpoint id
                         */
-                       if (!(cur->flags & MPTCP_PM_ADDR_FLAG_IMPLICIT))
+                       if (!(cur->flags & MPTCP_PM_ADDR_FLAG_IMPLICIT)) {
+                               ret = -EEXIST;
                                goto out;
+                       }
                        if (entry->addr.id)
                                goto out;
 
@@ -1016,16 +1022,12 @@ static int mptcp_pm_nl_create_listen_socket(struct sock *sk,
                addrlen = sizeof(struct sockaddr_in6);
 #endif
        err = kernel_bind(ssock, (struct sockaddr *)&addr, addrlen);
-       if (err) {
-               pr_warn("kernel_bind error, err=%d", err);
+       if (err)
                return err;
-       }
 
        err = kernel_listen(ssock, backlog);
-       if (err) {
-               pr_warn("kernel_listen error, err=%d", err);
+       if (err)
                return err;
-       }
 
        return 0;
 }
@@ -1329,13 +1331,13 @@ static int mptcp_nl_cmd_add_addr(struct sk_buff *skb, struct genl_info *info)
        if (entry->addr.port) {
                ret = mptcp_pm_nl_create_listen_socket(skb->sk, entry);
                if (ret) {
-                       GENL_SET_ERR_MSG(info, "create listen socket error");
+                       GENL_SET_ERR_MSG_FMT(info, "create listen socket error: %d", ret);
                        goto out_free;
                }
        }
        ret = mptcp_pm_nl_append_new_local_addr(pernet, entry);
        if (ret < 0) {
-               GENL_SET_ERR_MSG(info, "too many addresses or duplicate one");
+               GENL_SET_ERR_MSG_FMT(info, "too many addresses or duplicate one: %d", ret);
                goto out_free;
        }