struct nlattr *laddr = info->attrs[MPTCP_PM_ATTR_ADDR];
        struct mptcp_pm_addr_entry local = { 0 };
        struct mptcp_addr_info addr_r;
-       struct mptcp_addr_info addr_l;
        struct mptcp_sock *msk;
        int err = -EINVAL;
        struct sock *sk;
                goto create_err;
        }
 
-       err = mptcp_pm_parse_addr(laddr, info, &addr_l);
+       err = mptcp_pm_parse_entry(laddr, info, true, &local);
        if (err < 0) {
                NL_SET_ERR_MSG_ATTR(info->extack, laddr, "error parsing local addr");
                goto create_err;
        }
 
+       if (local.flags & MPTCP_PM_ADDR_FLAG_SIGNAL) {
+               GENL_SET_ERR_MSG(info, "invalid addr flags");
+               err = -EINVAL;
+               goto create_err;
+       }
+       local.flags |= MPTCP_PM_ADDR_FLAG_SUBFLOW;
+
        err = mptcp_pm_parse_addr(raddr, info, &addr_r);
        if (err < 0) {
                NL_SET_ERR_MSG_ATTR(info->extack, raddr, "error parsing remote addr");
                goto create_err;
        }
 
-       if (!mptcp_pm_addr_families_match(sk, &addr_l, &addr_r)) {
+       if (!mptcp_pm_addr_families_match(sk, &local.addr, &addr_r)) {
                GENL_SET_ERR_MSG(info, "families mismatch");
                err = -EINVAL;
                goto create_err;
        }
 
-       local.addr = addr_l;
        err = mptcp_userspace_pm_append_new_local_addr(msk, &local, false);
        if (err < 0) {
                GENL_SET_ERR_MSG(info, "did not match address and id");
 
        lock_sock(sk);
 
-       err = __mptcp_subflow_connect(sk, &addr_l, &addr_r);
+       err = __mptcp_subflow_connect(sk, &local.addr, &addr_r);
 
        release_sock(sk);