]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mptcp: pm: use NL_SET_ERR_MSG_ATTR when possible
authorMatthieu Baerts (NGI0) <matttbe@kernel.org>
Fri, 7 Feb 2025 13:59:26 +0000 (14:59 +0100)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 11 Feb 2025 11:46:37 +0000 (12:46 +0100)
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.

Reviewed-by: Geliang Tang <geliang@kernel.org>
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
net/mptcp/pm_netlink.c
net/mptcp/pm_userspace.c

index 4a1ba2bbb54d507af969ce9a9f8a3f606c2d5977..bbdfb7700538e6570f5b743f8b3e37eecc3742b5 100644 (file)
@@ -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;
        }
 
@@ -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;
        }
@@ -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;
        }
@@ -2021,7 +2024,8 @@ int mptcp_pm_nl_set_flags(struct sk_buff *skb, struct genl_info *info)
        if (addr.addr.family == AF_UNSPEC) {
                lookup_by_id = 1;
                if (!addr.addr.id) {
-                       GENL_SET_ERR_MSG(info, "missing address ID");
+                       NL_SET_ERR_MSG_ATTR(info->extack, attr,
+                                           "missing address ID");
                        return -EOPNOTSUPP;
                }
        }
@@ -2034,14 +2038,14 @@ int mptcp_pm_nl_set_flags(struct sk_buff *skb, struct genl_info *info)
                               __lookup_addr(pernet, &addr.addr);
        if (!entry) {
                spin_unlock_bh(&pernet->lock);
-               GENL_SET_ERR_MSG(info, "address not found");
+               NL_SET_ERR_MSG_ATTR(info->extack, attr, "address not found");
                return -EINVAL;
        }
        if ((addr.flags & MPTCP_PM_ADDR_FLAG_FULLMESH) &&
            (entry->flags & (MPTCP_PM_ADDR_FLAG_SIGNAL |
                             MPTCP_PM_ADDR_FLAG_IMPLICIT))) {
                spin_unlock_bh(&pernet->lock);
-               GENL_SET_ERR_MSG(info, "invalid addr flags");
+               NL_SET_ERR_MSG_ATTR(info->extack, attr, "invalid addr flags");
                return -EINVAL;
        }
 
index 525dcb84353f946a24923a1345a6e4b20a60663b..8dddb16247363a11ba11bcb94c4557dd0cfd8745 100644 (file)
@@ -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;
        }
@@ -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;
        }
 
@@ -354,9 +356,9 @@ int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
        err = 0;
 out:
        if (err)
-               GENL_SET_ERR_MSG_FMT(info,
-                                    "address with id %u not found",
-                                    id_val);
+               NL_SET_ERR_MSG_ATTR_FMT(info->extack, id,
+                                       "address with id %u not found",
+                                       id_val);
 
        sock_put(sk);
        return err;
@@ -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;
        }
@@ -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;
        }
 
@@ -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;
        }
@@ -588,7 +591,8 @@ int mptcp_userspace_pm_set_flags(struct sk_buff *skb, struct genl_info *info)
                goto set_flags_err;
 
        if (loc.addr.family == AF_UNSPEC) {
-               GENL_SET_ERR_MSG(info, "invalid local address family");
+               NL_SET_ERR_MSG_ATTR(info->extack, attr,
+                                   "invalid local address family");
                ret = -EINVAL;
                goto set_flags_err;
        }
@@ -599,7 +603,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;
        }
@@ -722,7 +727,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;
        }