Skip to content

Commit

Permalink
mptcp: pm: use NL_SET_ERR_MSG_ATTR when possible
Browse files Browse the repository at this point in the history
Instead of only returning a text message with GENL_SET_ERR_MSG(),
NL_SET_ERR_MSG_ATTR() can help the userspace developers by also
reporting which attribute is faulty.

When the error is specific to an attribute, NL_SET_ERR_MSG_ATTR() is now
used. The error messages have not been modified in this commit.

Signed-off-by: Matthieu Baerts (NGI0) <[email protected]>
  • Loading branch information
matttbe authored and intel-lab-lkp committed Jan 10, 2025
1 parent c250de5 commit b34975f
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 15 deletions.
13 changes: 8 additions & 5 deletions net/mptcp/pm_netlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -1407,18 +1407,21 @@ int mptcp_pm_nl_add_addr_doit(struct sk_buff *skb, struct genl_info *info)
return ret;

if (addr.addr.port && !address_use_port(&addr)) {
GENL_SET_ERR_MSG(info, "flags must have signal and not subflow when using port");
NL_SET_ERR_MSG_ATTR(info->extack, attr,
"flags must have signal and not subflow when using port");
return -EINVAL;
}

if (addr.flags & MPTCP_PM_ADDR_FLAG_SIGNAL &&
addr.flags & MPTCP_PM_ADDR_FLAG_FULLMESH) {
GENL_SET_ERR_MSG(info, "flags mustn't have both signal and fullmesh");
NL_SET_ERR_MSG_ATTR(info->extack, attr,
"flags mustn't have both signal and fullmesh");
return -EINVAL;
}

if (addr.flags & MPTCP_PM_ADDR_FLAG_IMPLICIT) {
GENL_SET_ERR_MSG(info, "can't create IMPLICIT endpoint");
NL_SET_ERR_MSG_ATTR(info->extack, attr,
"can't create IMPLICIT endpoint");
return -EINVAL;
}

Expand Down Expand Up @@ -1616,7 +1619,7 @@ int mptcp_pm_nl_del_addr_doit(struct sk_buff *skb, struct genl_info *info)
spin_lock_bh(&pernet->lock);
entry = __lookup_addr_by_id(pernet, addr.addr.id);
if (!entry) {
GENL_SET_ERR_MSG(info, "address not found");
NL_SET_ERR_MSG_ATTR(info->extack, attr, "address not found");
spin_unlock_bh(&pernet->lock);
return -EINVAL;
}
Expand Down Expand Up @@ -1802,7 +1805,7 @@ int mptcp_pm_nl_get_addr(struct sk_buff *skb, struct genl_info *info)
rcu_read_lock();
entry = __lookup_addr_by_id(pernet, addr.addr.id);
if (!entry) {
GENL_SET_ERR_MSG(info, "address not found");
NL_SET_ERR_MSG_ATTR(info->extack, attr, "address not found");
ret = -EINVAL;
goto unlock_fail;
}
Expand Down
24 changes: 14 additions & 10 deletions net/mptcp/pm_userspace.c
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,8 @@ static struct mptcp_sock *mptcp_userspace_pm_get_sock(const struct genl_info *in
}

if (!mptcp_pm_is_userspace(msk)) {
GENL_SET_ERR_MSG(info, "userspace PM not selected");
NL_SET_ERR_MSG_ATTR(info->extack, token,
"userspace PM not selected");
sock_put((struct sock *)msk);
return NULL;
}
Expand Down Expand Up @@ -220,20 +221,21 @@ int mptcp_pm_nl_announce_doit(struct sk_buff *skb, struct genl_info *info)
goto announce_err;

if (addr_val.addr.id == 0) {
GENL_SET_ERR_MSG(info, "invalid addr id");
NL_SET_ERR_MSG_ATTR(info->extack, addr, "invalid addr id");
err = -EINVAL;
goto announce_err;
}

if (!(addr_val.flags & MPTCP_PM_ADDR_FLAG_SIGNAL)) {
GENL_SET_ERR_MSG(info, "invalid addr flags");
NL_SET_ERR_MSG_ATTR(info->extack, addr, "invalid addr flags");
err = -EINVAL;
goto announce_err;
}

err = mptcp_userspace_pm_append_new_local_addr(msk, &addr_val, false);
if (err < 0) {
GENL_SET_ERR_MSG(info, "did not match address and id");
NL_SET_ERR_MSG_ATTR(info->extack, addr,
"did not match address and id");
goto announce_err;
}

Expand Down Expand Up @@ -388,7 +390,7 @@ int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, struct genl_info *info)
goto create_err;

if (entry.flags & MPTCP_PM_ADDR_FLAG_SIGNAL) {
GENL_SET_ERR_MSG(info, "invalid addr flags");
NL_SET_ERR_MSG_ATTR(info->extack, laddr, "invalid addr flags");
err = -EINVAL;
goto create_err;
}
Expand All @@ -407,7 +409,8 @@ int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, struct genl_info *info)

err = mptcp_userspace_pm_append_new_local_addr(msk, &entry, false);
if (err < 0) {
GENL_SET_ERR_MSG(info, "did not match address and id");
NL_SET_ERR_MSG_ATTR(info->extack, laddr,
"did not match address and id");
goto create_err;
}

Expand Down Expand Up @@ -528,13 +531,13 @@ int mptcp_pm_nl_subflow_destroy_doit(struct sk_buff *skb, struct genl_info *info
}

if (!addr_l.addr.port) {
GENL_SET_ERR_MSG(info, "missing local port");
NL_SET_ERR_MSG_ATTR(info->extack, laddr, "missing local port");
err = -EINVAL;
goto destroy_err;
}

if (!addr_r.port) {
GENL_SET_ERR_MSG(info, "missing remote port");
NL_SET_ERR_MSG_ATTR(info->extack, raddr, "missing remote port");
err = -EINVAL;
goto destroy_err;
}
Expand Down Expand Up @@ -599,7 +602,8 @@ int mptcp_userspace_pm_set_flags(struct sk_buff *skb, struct genl_info *info)
goto set_flags_err;

if (rem.addr.family == AF_UNSPEC) {
GENL_SET_ERR_MSG(info, "invalid remote address family");
NL_SET_ERR_MSG_ATTR(info->extack, attr_rem,
"invalid remote address family");
ret = -EINVAL;
goto set_flags_err;
}
Expand Down Expand Up @@ -722,7 +726,7 @@ int mptcp_userspace_pm_get_addr(struct sk_buff *skb,
spin_lock_bh(&msk->pm.lock);
entry = mptcp_userspace_pm_lookup_addr_by_id(msk, addr.addr.id);
if (!entry) {
GENL_SET_ERR_MSG(info, "address not found");
NL_SET_ERR_MSG_ATTR(info->extack, attr, "address not found");
ret = -EINVAL;
goto unlock_fail;
}
Expand Down

0 comments on commit b34975f

Please sign in to comment.