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)
 
        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);
                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;
 }
 
 
        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;
        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);
        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;
                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;
        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 */
 
                                   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);