sock_put(sk);
        return ret;
 }
+
+int mptcp_userspace_pm_dump_addr(struct sk_buff *msg,
+                                struct netlink_callback *cb)
+{
+       struct id_bitmap {
+               DECLARE_BITMAP(map, MPTCP_PM_MAX_ADDR_ID + 1);
+       } *bitmap;
+       const struct genl_info *info = genl_info_dump(cb);
+       struct net *net = sock_net(msg->sk);
+       struct mptcp_pm_addr_entry *entry;
+       struct mptcp_sock *msk;
+       struct nlattr *token;
+       int ret = -EINVAL;
+       struct sock *sk;
+       void *hdr;
+
+       bitmap = (struct id_bitmap *)cb->ctx;
+       token = info->attrs[MPTCP_PM_ATTR_TOKEN];
+
+       msk = mptcp_token_get_sock(net, nla_get_u32(token));
+       if (!msk) {
+               NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token");
+               return ret;
+       }
+
+       sk = (struct sock *)msk;
+
+       if (!mptcp_pm_is_userspace(msk)) {
+               GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected");
+               goto out;
+       }
+
+       lock_sock(sk);
+       spin_lock_bh(&msk->pm.lock);
+       list_for_each_entry(entry, &msk->pm.userspace_pm_local_addr_list, list) {
+               if (test_bit(entry->addr.id, bitmap->map))
+                       continue;
+
+               hdr = genlmsg_put(msg, NETLINK_CB(cb->skb).portid,
+                                 cb->nlh->nlmsg_seq, &mptcp_genl_family,
+                                 NLM_F_MULTI, MPTCP_PM_CMD_GET_ADDR);
+               if (!hdr)
+                       break;
+
+               if (mptcp_nl_fill_addr(msg, entry) < 0) {
+                       genlmsg_cancel(msg, hdr);
+                       break;
+               }
+
+               __set_bit(entry->addr.id, bitmap->map);
+               genlmsg_end(msg, hdr);
+       }
+       spin_unlock_bh(&msk->pm.lock);
+       release_sock(sk);
+       ret = msg->len;
+
+out:
+       sock_put(sk);
+       return ret;
+}
 
 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);
+int mptcp_userspace_pm_dump_addr(struct sk_buff *msg,
+                                struct netlink_callback *cb);
 
 static inline u8 subflow_get_local_id(const struct mptcp_subflow_context *subflow)
 {