mptcp: allow to use port and non-signal in set_flags
authorGeliang Tang <geliang.tang@suse.com>
Sat, 5 Feb 2022 00:03:29 +0000 (16:03 -0800)
committerJakub Kicinski <kuba@kernel.org>
Sat, 5 Feb 2022 04:30:23 +0000 (20:30 -0800)
It's illegal to use both port and non-signal flags for adding address.
But it's legal to use both of them for setting flags, which always uses
non-signal flags, backup or fullmesh.

This patch moves this non-signal flag with port check from
mptcp_pm_parse_addr() to mptcp_nl_cmd_add_addr(). Do the check only when
adding addresses, not setting flags or deleting addresses.

Signed-off-by: Geliang Tang <geliang.tang@suse.com>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/mptcp/pm_netlink.c

index d47795748ad7e11767d544c20af6e454d3b678aa..5464c2d268bd6b2410127a57a5f9329cadb0493c 100644 (file)
@@ -1174,14 +1174,8 @@ skip_family:
        if (tb[MPTCP_PM_ADDR_ATTR_FLAGS])
                entry->flags = nla_get_u32(tb[MPTCP_PM_ADDR_ATTR_FLAGS]);
 
-       if (tb[MPTCP_PM_ADDR_ATTR_PORT]) {
-               if (!(entry->flags & MPTCP_PM_ADDR_FLAG_SIGNAL)) {
-                       NL_SET_ERR_MSG_ATTR(info->extack, attr,
-                                           "flags must have signal when using port");
-                       return -EINVAL;
-               }
+       if (tb[MPTCP_PM_ADDR_ATTR_PORT])
                entry->addr.port = htons(nla_get_u16(tb[MPTCP_PM_ADDR_ATTR_PORT]));
-       }
 
        return 0;
 }
@@ -1227,6 +1221,11 @@ static int mptcp_nl_cmd_add_addr(struct sk_buff *skb, struct genl_info *info)
        if (ret < 0)
                return ret;
 
+       if (addr.addr.port && !(addr.flags & MPTCP_PM_ADDR_FLAG_SIGNAL)) {
+               GENL_SET_ERR_MSG(info, "flags must have signal when using port");
+               return -EINVAL;
+       }
+
        entry = kmalloc(sizeof(*entry), GFP_KERNEL);
        if (!entry) {
                GENL_SET_ERR_MSG(info, "can't allocate addr");