mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 12:11:40 +00:00
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: 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>
This commit is contained in:
parent
976d302fb6
commit
a3400e8746
@ -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); \
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user