Commit a3400e87 authored by Paolo Abeni's avatar Paolo Abeni Committed by David S. Miller

mptcp: more detailed error reporting on endpoint creation

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: default avatarMat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
Signed-off-by: default avatarMat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 976d302f
...@@ -125,6 +125,9 @@ static inline void genl_info_net_set(struct genl_info *info, struct net *net) ...@@ -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(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 */ /* Report that a root attribute is missing */
#define GENL_REQ_ATTR_CHECK(info, attr) ({ \ #define GENL_REQ_ATTR_CHECK(info, attr) ({ \
struct genl_info *__info = (info); \ struct genl_info *__info = (info); \
......
...@@ -912,10 +912,14 @@ static int mptcp_pm_nl_append_new_local_addr(struct pm_nl_pernet *pernet, ...@@ -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) if (pernet->next_id == MPTCP_PM_MAX_ADDR_ID)
pernet->next_id = 1; pernet->next_id = 1;
if (pernet->addrs >= MPTCP_PM_ADDR_MAX) if (pernet->addrs >= MPTCP_PM_ADDR_MAX) {
ret = -ERANGE;
goto out; goto out;
if (test_bit(entry->addr.id, pernet->id_bitmap)) }
if (test_bit(entry->addr.id, pernet->id_bitmap)) {
ret = -EBUSY;
goto out; goto out;
}
/* do not insert duplicate address, differentiate on port only /* do not insert duplicate address, differentiate on port only
* singled addresses * singled addresses
...@@ -929,8 +933,10 @@ static int mptcp_pm_nl_append_new_local_addr(struct pm_nl_pernet *pernet, ...@@ -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 * endpoint is an implicit one and the user-space
* did not provide an endpoint id * 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; goto out;
}
if (entry->addr.id) if (entry->addr.id)
goto out; goto out;
...@@ -1016,16 +1022,12 @@ static int mptcp_pm_nl_create_listen_socket(struct sock *sk, ...@@ -1016,16 +1022,12 @@ static int mptcp_pm_nl_create_listen_socket(struct sock *sk,
addrlen = sizeof(struct sockaddr_in6); addrlen = sizeof(struct sockaddr_in6);
#endif #endif
err = kernel_bind(ssock, (struct sockaddr *)&addr, addrlen); err = kernel_bind(ssock, (struct sockaddr *)&addr, addrlen);
if (err) { if (err)
pr_warn("kernel_bind error, err=%d", err);
return err; return err;
}
err = kernel_listen(ssock, backlog); err = kernel_listen(ssock, backlog);
if (err) { if (err)
pr_warn("kernel_listen error, err=%d", err);
return err; return err;
}
return 0; return 0;
} }
...@@ -1329,13 +1331,13 @@ static int mptcp_nl_cmd_add_addr(struct sk_buff *skb, struct genl_info *info) ...@@ -1329,13 +1331,13 @@ static int mptcp_nl_cmd_add_addr(struct sk_buff *skb, struct genl_info *info)
if (entry->addr.port) { if (entry->addr.port) {
ret = mptcp_pm_nl_create_listen_socket(skb->sk, entry); ret = mptcp_pm_nl_create_listen_socket(skb->sk, entry);
if (ret) { 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; goto out_free;
} }
} }
ret = mptcp_pm_nl_append_new_local_addr(pernet, entry); ret = mptcp_pm_nl_append_new_local_addr(pernet, entry);
if (ret < 0) { 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; goto out_free;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment