]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mptcp: pm: add local parameter for set_flags
authorGeliang Tang <tanggeliang@kylinos.cn>
Fri, 7 Feb 2025 13:59:33 +0000 (14:59 +0100)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 11 Feb 2025 11:46:38 +0000 (12:46 +0100)
This patch updates the interfaces set_flags to reduce repetitive
code, adds a new parameter 'local' for them.

The local address is parsed in public helper mptcp_pm_nl_set_flags_doit(),
then pass it to mptcp_pm_nl_set_flags() and mptcp_userspace_pm_set_flags().

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 c213f06bc70234ad3cb84d43971f6eb4aa6ff429..b1f36dc1a09113594324ef0547093a5447664181 100644 (file)
@@ -506,9 +506,21 @@ int mptcp_pm_nl_get_addr_dumpit(struct sk_buff *msg,
 
 static int mptcp_pm_set_flags(struct genl_info *info)
 {
+       struct mptcp_pm_addr_entry loc = { .addr = { .family = AF_UNSPEC }, };
+       struct nlattr *attr_loc;
+       int ret = -EINVAL;
+
+       if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_ADDR))
+               return ret;
+
+       attr_loc = info->attrs[MPTCP_PM_ATTR_ADDR];
+       ret = mptcp_pm_parse_entry(attr_loc, info, false, &loc);
+       if (ret < 0)
+               return ret;
+
        if (info->attrs[MPTCP_PM_ATTR_TOKEN])
-               return mptcp_userspace_pm_set_flags(info);
-       return mptcp_pm_nl_set_flags(info);
+               return mptcp_userspace_pm_set_flags(&loc, info);
+       return mptcp_pm_nl_set_flags(&loc, info);
 }
 
 int mptcp_pm_nl_set_flags_doit(struct sk_buff *skb, struct genl_info *info)
index 172ddb04e3495348a62feb4b634ed2c32ad7dce2..99705a9c2238c6be96e320e8cd1d12bfa0e0e7f0 100644 (file)
@@ -1951,50 +1951,41 @@ next:
        return ret;
 }
 
-int mptcp_pm_nl_set_flags(struct genl_info *info)
+int mptcp_pm_nl_set_flags(struct mptcp_pm_addr_entry *local,
+                         struct genl_info *info)
 {
-       struct mptcp_pm_addr_entry addr = { .addr = { .family = AF_UNSPEC }, };
+       struct nlattr *attr = info->attrs[MPTCP_PM_ATTR_ADDR];
        u8 changed, mask = MPTCP_PM_ADDR_FLAG_BACKUP |
                           MPTCP_PM_ADDR_FLAG_FULLMESH;
        struct net *net = genl_info_net(info);
        struct mptcp_pm_addr_entry *entry;
        struct pm_nl_pernet *pernet;
-       struct nlattr *attr;
        u8 lookup_by_id = 0;
        u8 bkup = 0;
-       int ret;
-
-       if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_ADDR))
-               return -EINVAL;
 
        pernet = pm_nl_get_pernet(net);
 
-       attr = info->attrs[MPTCP_PM_ATTR_ADDR];
-       ret = mptcp_pm_parse_entry(attr, info, false, &addr);
-       if (ret < 0)
-               return ret;
-
-       if (addr.addr.family == AF_UNSPEC) {
+       if (local->addr.family == AF_UNSPEC) {
                lookup_by_id = 1;
-               if (!addr.addr.id) {
+               if (!local->addr.id) {
                        NL_SET_ERR_MSG_ATTR(info->extack, attr,
                                            "missing address ID");
                        return -EOPNOTSUPP;
                }
        }
 
-       if (addr.flags & MPTCP_PM_ADDR_FLAG_BACKUP)
+       if (local->flags & MPTCP_PM_ADDR_FLAG_BACKUP)
                bkup = 1;
 
        spin_lock_bh(&pernet->lock);
-       entry = lookup_by_id ? __lookup_addr_by_id(pernet, addr.addr.id) :
-                              __lookup_addr(pernet, &addr.addr);
+       entry = lookup_by_id ? __lookup_addr_by_id(pernet, local->addr.id) :
+                              __lookup_addr(pernet, &local->addr);
        if (!entry) {
                spin_unlock_bh(&pernet->lock);
                NL_SET_ERR_MSG_ATTR(info->extack, attr, "address not found");
                return -EINVAL;
        }
-       if ((addr.flags & MPTCP_PM_ADDR_FLAG_FULLMESH) &&
+       if ((local->flags & MPTCP_PM_ADDR_FLAG_FULLMESH) &&
            (entry->flags & (MPTCP_PM_ADDR_FLAG_SIGNAL |
                             MPTCP_PM_ADDR_FLAG_IMPLICIT))) {
                spin_unlock_bh(&pernet->lock);
@@ -2002,12 +1993,12 @@ int mptcp_pm_nl_set_flags(struct genl_info *info)
                return -EINVAL;
        }
 
-       changed = (addr.flags ^ entry->flags) & mask;
-       entry->flags = (entry->flags & ~mask) | (addr.flags & mask);
-       addr = *entry;
+       changed = (local->flags ^ entry->flags) & mask;
+       entry->flags = (entry->flags & ~mask) | (local->flags & mask);
+       *local = *entry;
        spin_unlock_bh(&pernet->lock);
 
-       mptcp_nl_set_flags(net, &addr.addr, bkup, changed);
+       mptcp_nl_set_flags(net, &local->addr, bkup, changed);
        return 0;
 }
 
index 1af70828c03c21d03a25f3747132014dcdc5c0e8..277cf092a87042a85623470237a8ef24d29e65e6 100644 (file)
@@ -564,9 +564,9 @@ destroy_err:
        return err;
 }
 
-int mptcp_userspace_pm_set_flags(struct genl_info *info)
+int mptcp_userspace_pm_set_flags(struct mptcp_pm_addr_entry *local,
+                                struct genl_info *info)
 {
-       struct mptcp_pm_addr_entry loc = { .addr = { .family = AF_UNSPEC }, };
        struct mptcp_addr_info rem = { .family = AF_UNSPEC, };
        struct mptcp_pm_addr_entry *entry;
        struct nlattr *attr, *attr_rem;
@@ -575,8 +575,7 @@ int mptcp_userspace_pm_set_flags(struct genl_info *info)
        struct sock *sk;
        u8 bkup = 0;
 
-       if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_ADDR) ||
-           GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_ADDR_REMOTE))
+       if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_ADDR_REMOTE))
                return ret;
 
        msk = mptcp_userspace_pm_get_sock(info);
@@ -586,11 +585,7 @@ int mptcp_userspace_pm_set_flags(struct genl_info *info)
        sk = (struct sock *)msk;
 
        attr = info->attrs[MPTCP_PM_ATTR_ADDR];
-       ret = mptcp_pm_parse_entry(attr, info, false, &loc);
-       if (ret < 0)
-               goto set_flags_err;
-
-       if (loc.addr.family == AF_UNSPEC) {
+       if (local->addr.family == AF_UNSPEC) {
                NL_SET_ERR_MSG_ATTR(info->extack, attr,
                                    "invalid local address family");
                ret = -EINVAL;
@@ -609,11 +604,11 @@ int mptcp_userspace_pm_set_flags(struct genl_info *info)
                goto set_flags_err;
        }
 
-       if (loc.flags & MPTCP_PM_ADDR_FLAG_BACKUP)
+       if (local->flags & MPTCP_PM_ADDR_FLAG_BACKUP)
                bkup = 1;
 
        spin_lock_bh(&msk->pm.lock);
-       entry = mptcp_userspace_pm_lookup_addr(msk, &loc.addr);
+       entry = mptcp_userspace_pm_lookup_addr(msk, &local->addr);
        if (entry) {
                if (bkup)
                        entry->flags |= MPTCP_PM_ADDR_FLAG_BACKUP;
@@ -623,7 +618,7 @@ int mptcp_userspace_pm_set_flags(struct genl_info *info)
        spin_unlock_bh(&msk->pm.lock);
 
        lock_sock(sk);
-       ret = mptcp_pm_nl_mp_prio_send_ack(msk, &loc.addr, &rem, bkup);
+       ret = mptcp_pm_nl_mp_prio_send_ack(msk, &local->addr, &rem, bkup);
        release_sock(sk);
 
        /* mptcp_pm_nl_mp_prio_send_ack() only fails in one case */
index 6e7dc5375e291f9b6ec27bc8c632691401b91717..37226cdd9e3717c4f8cf0d4c879a0feaaa91d459 100644 (file)
@@ -1038,8 +1038,10 @@ bool mptcp_lookup_subflow_by_saddr(const struct list_head *list,
                                   const struct mptcp_addr_info *saddr);
 bool mptcp_remove_anno_list_by_saddr(struct mptcp_sock *msk,
                                     const struct mptcp_addr_info *addr);
-int mptcp_pm_nl_set_flags(struct genl_info *info);
-int mptcp_userspace_pm_set_flags(struct genl_info *info);
+int mptcp_pm_nl_set_flags(struct mptcp_pm_addr_entry *local,
+                         struct genl_info *info);
+int mptcp_userspace_pm_set_flags(struct mptcp_pm_addr_entry *local,
+                                struct genl_info *info);
 int mptcp_pm_announce_addr(struct mptcp_sock *msk,
                           const struct mptcp_addr_info *addr,
                           bool echo);