return mptcp_pm_nl_get_local_id(msk, &skc_local);
 }
 
+bool mptcp_pm_is_backup(struct mptcp_sock *msk, struct sock_common *skc)
+{
+       struct mptcp_addr_info skc_local;
+
+       mptcp_local_address((struct sock_common *)skc, &skc_local);
+
+       if (mptcp_pm_is_userspace(msk))
+               return mptcp_userspace_pm_is_backup(msk, &skc_local);
+
+       return mptcp_pm_nl_is_backup(msk, &skc_local);
+}
+
 int mptcp_pm_get_flags_and_ifindex_by_id(struct mptcp_sock *msk, unsigned int id,
                                         u8 *flags, int *ifindex)
 {
 
        return ret;
 }
 
+bool mptcp_pm_nl_is_backup(struct mptcp_sock *msk, struct mptcp_addr_info *skc)
+{
+       struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk);
+       struct mptcp_pm_addr_entry *entry;
+       bool backup = false;
+
+       rcu_read_lock();
+       list_for_each_entry_rcu(entry, &pernet->local_addr_list, list) {
+               if (mptcp_addresses_equal(&entry->addr, skc, entry->addr.port)) {
+                       backup = !!(entry->flags & MPTCP_PM_ADDR_FLAG_BACKUP);
+                       break;
+               }
+       }
+       rcu_read_unlock();
+
+       return backup;
+}
+
 #define MPTCP_PM_CMD_GRP_OFFSET       0
 #define MPTCP_PM_EV_GRP_OFFSET        1
 
 
        return mptcp_userspace_pm_append_new_local_addr(msk, &new_entry, true);
 }
 
+bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk,
+                                 struct mptcp_addr_info *skc)
+{
+       struct mptcp_pm_addr_entry *entry;
+       bool backup = false;
+
+       spin_lock_bh(&msk->pm.lock);
+       list_for_each_entry(entry, &msk->pm.userspace_pm_local_addr_list, list) {
+               if (mptcp_addresses_equal(&entry->addr, skc, false)) {
+                       backup = !!(entry->flags & MPTCP_PM_ADDR_FLAG_BACKUP);
+                       break;
+               }
+       }
+       spin_unlock_bh(&msk->pm.lock);
+
+       return backup;
+}
+
 int mptcp_pm_nl_announce_doit(struct sk_buff *skb, struct genl_info *info)
 {
        struct nlattr *token = info->attrs[MPTCP_PM_ATTR_TOKEN];
 
 int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);
 int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct mptcp_addr_info *skc);
 int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk, struct mptcp_addr_info *skc);
+bool mptcp_pm_is_backup(struct mptcp_sock *msk, struct sock_common *skc);
+bool mptcp_pm_nl_is_backup(struct mptcp_sock *msk, struct mptcp_addr_info *skc);
+bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk, struct mptcp_addr_info *skc);
 int mptcp_pm_dump_addr(struct sk_buff *msg, struct netlink_callback *cb);
 int mptcp_pm_nl_dump_addr(struct sk_buff *msg,
                          struct netlink_callback *cb);
 
                return NULL;
        }
        subflow_req->local_id = local_id;
+       subflow_req->request_bkup = mptcp_pm_is_backup(msk, (struct sock_common *)req);
 
        return msk;
 }
                return err;
 
        subflow_set_local_id(subflow, err);
+       subflow->request_bkup = mptcp_pm_is_backup(msk, (struct sock_common *)sk);
+
        return 0;
 }