]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mptcp: pm: add id parameter for get_addr
authorGeliang Tang <tanggeliang@kylinos.cn>
Fri, 7 Feb 2025 13:59:29 +0000 (14:59 +0100)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 11 Feb 2025 11:46:37 +0000 (12:46 +0100)
The address id is parsed both in mptcp_pm_nl_get_addr() and
mptcp_userspace_pm_get_addr(), this makes the code somewhat repetitive.

So this patch adds a new parameter 'id' for all get_addr() interfaces.
The address id is only parsed in mptcp_pm_nl_get_addr_doit(), then pass
it to both mptcp_pm_nl_get_addr() and mptcp_userspace_pm_get_addr().

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
Reviewed-by: Matthieu Baerts (NGI0) <matttbe@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.c
net/mptcp/pm_netlink.c
net/mptcp/pm_userspace.c
net/mptcp/protocol.h

index 526e5bca1fa1bb67acb8532ad8b8b819d2f5151c..caf5bfc3cd1ddeb22799c28dec3d19b30467b169 100644 (file)
@@ -434,16 +434,28 @@ bool mptcp_pm_is_backup(struct mptcp_sock *msk, struct sock_common *skc)
        return mptcp_pm_nl_is_backup(msk, &skc_local);
 }
 
-static int mptcp_pm_get_addr(struct genl_info *info)
+static int mptcp_pm_get_addr(u8 id, struct genl_info *info)
 {
        if (info->attrs[MPTCP_PM_ATTR_TOKEN])
-               return mptcp_userspace_pm_get_addr(info);
-       return mptcp_pm_nl_get_addr(info);
+               return mptcp_userspace_pm_get_addr(id, info);
+       return mptcp_pm_nl_get_addr(id, info);
 }
 
 int mptcp_pm_nl_get_addr_doit(struct sk_buff *skb, struct genl_info *info)
 {
-       return mptcp_pm_get_addr(info);
+       struct mptcp_pm_addr_entry addr;
+       struct nlattr *attr;
+       int ret;
+
+       if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ENDPOINT_ADDR))
+               return -EINVAL;
+
+       attr = info->attrs[MPTCP_PM_ENDPOINT_ADDR];
+       ret = mptcp_pm_parse_entry(attr, info, false, &addr);
+       if (ret < 0)
+               return ret;
+
+       return mptcp_pm_get_addr(addr.addr.id, info);
 }
 
 static int mptcp_pm_dump_addr(struct sk_buff *msg, struct netlink_callback *cb)
index 8185697044e2b735edb161578685411f9ab231e4..5a6c33d0063df7e741b9a83a624099adab1611f6 100644 (file)
@@ -1773,23 +1773,15 @@ nla_put_failure:
        return -EMSGSIZE;
 }
 
-int mptcp_pm_nl_get_addr(struct genl_info *info)
+int mptcp_pm_nl_get_addr(u8 id, struct genl_info *info)
 {
+       struct nlattr *attr = info->attrs[MPTCP_PM_ENDPOINT_ADDR];
        struct pm_nl_pernet *pernet = genl_info_pm_nl(info);
-       struct mptcp_pm_addr_entry addr, *entry;
+       struct mptcp_pm_addr_entry *entry;
        struct sk_buff *msg;
-       struct nlattr *attr;
        void *reply;
        int ret;
 
-       if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ENDPOINT_ADDR))
-               return -EINVAL;
-
-       attr = info->attrs[MPTCP_PM_ENDPOINT_ADDR];
-       ret = mptcp_pm_parse_entry(attr, info, false, &addr);
-       if (ret < 0)
-               return ret;
-
        msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
        if (!msg)
                return -ENOMEM;
@@ -1803,7 +1795,7 @@ int mptcp_pm_nl_get_addr(struct genl_info *info)
        }
 
        rcu_read_lock();
-       entry = __lookup_addr_by_id(pernet, addr.addr.id);
+       entry = __lookup_addr_by_id(pernet, id);
        if (!entry) {
                NL_SET_ERR_MSG_ATTR(info->extack, attr, "address not found");
                ret = -EINVAL;
index 1246063598c8152eb908586dc2e3bcacaaba0a91..99e882a5a67180bc912818ec0952fd50ed601ac4 100644 (file)
@@ -684,30 +684,22 @@ int mptcp_userspace_pm_dump_addr(struct sk_buff *msg,
        return ret;
 }
 
-int mptcp_userspace_pm_get_addr(struct genl_info *info)
+int mptcp_userspace_pm_get_addr(u8 id, struct genl_info *info)
 {
-       struct mptcp_pm_addr_entry addr, *entry;
+       struct nlattr *attr = attr = info->attrs[MPTCP_PM_ENDPOINT_ADDR];
+       struct mptcp_pm_addr_entry *entry;
        struct mptcp_sock *msk;
        struct sk_buff *msg;
-       struct nlattr *attr;
        int ret = -EINVAL;
        struct sock *sk;
        void *reply;
 
-       if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ENDPOINT_ADDR))
-               return ret;
-
        msk = mptcp_userspace_pm_get_sock(info);
        if (!msk)
                return ret;
 
        sk = (struct sock *)msk;
 
-       attr = info->attrs[MPTCP_PM_ENDPOINT_ADDR];
-       ret = mptcp_pm_parse_entry(attr, info, false, &addr);
-       if (ret < 0)
-               goto out;
-
        msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
        if (!msg) {
                ret = -ENOMEM;
@@ -724,7 +716,7 @@ int mptcp_userspace_pm_get_addr(struct genl_info *info)
 
        lock_sock(sk);
        spin_lock_bh(&msk->pm.lock);
-       entry = mptcp_userspace_pm_lookup_addr_by_id(msk, addr.addr.id);
+       entry = mptcp_userspace_pm_lookup_addr_by_id(msk, id);
        if (!entry) {
                NL_SET_ERR_MSG_ATTR(info->extack, attr, "address not found");
                ret = -EINVAL;
index a4c799ecceffe2fe495c0066bcb31b9983d64b01..ffe370245ec55fe64b1215b48878d1bdaabd3248 100644 (file)
@@ -1134,8 +1134,8 @@ int mptcp_pm_nl_dump_addr(struct sk_buff *msg,
                          struct netlink_callback *cb);
 int mptcp_userspace_pm_dump_addr(struct sk_buff *msg,
                                 struct netlink_callback *cb);
-int mptcp_pm_nl_get_addr(struct genl_info *info);
-int mptcp_userspace_pm_get_addr(struct genl_info *info);
+int mptcp_pm_nl_get_addr(u8 id, struct genl_info *info);
+int mptcp_userspace_pm_get_addr(u8 id, struct genl_info *info);
 
 static inline u8 subflow_get_local_id(const struct mptcp_subflow_context *subflow)
 {