mptcp: netlink: split mptcp_pm_parse_addr into two functions
authorFlorian Westphal <fw@strlen.de>
Wed, 4 May 2022 02:38:51 +0000 (19:38 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 4 May 2022 09:49:31 +0000 (10:49 +0100)
Next patch will need to parse MPTCP_PM_ATTR_ADDR attributes and
fill an mptcp_addr_info structure from a different genl command
callback.

To avoid copy-paste, split the existing function to a helper
that does the common part and then call the helper from the
(renamed)mptcp_pm_parse_entry function.

Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/mptcp/pm_netlink.c

index 79f5e71..7d9bed5 100644 (file)
@@ -1142,11 +1142,12 @@ static int mptcp_pm_family_to_addr(int family)
        return MPTCP_PM_ADDR_ATTR_ADDR4;
 }
 
-static int mptcp_pm_parse_addr(struct nlattr *attr, struct genl_info *info,
-                              bool require_family,
-                              struct mptcp_pm_addr_entry *entry)
+static int mptcp_pm_parse_pm_addr_attr(struct nlattr *tb[],
+                                      const struct nlattr *attr,
+                                      struct genl_info *info,
+                                      struct mptcp_addr_info *addr,
+                                      bool require_family)
 {
-       struct nlattr *tb[MPTCP_PM_ADDR_ATTR_MAX + 1];
        int err, addr_addr;
 
        if (!attr) {
@@ -1160,27 +1161,29 @@ static int mptcp_pm_parse_addr(struct nlattr *attr, struct genl_info *info,
        if (err)
                return err;
 
-       memset(entry, 0, sizeof(*entry));
+       if (tb[MPTCP_PM_ADDR_ATTR_ID])
+               addr->id = nla_get_u8(tb[MPTCP_PM_ADDR_ATTR_ID]);
+
        if (!tb[MPTCP_PM_ADDR_ATTR_FAMILY]) {
                if (!require_family)
-                       goto skip_family;
+                       return err;
 
                NL_SET_ERR_MSG_ATTR(info->extack, attr,
                                    "missing family");
                return -EINVAL;
        }
 
-       entry->addr.family = nla_get_u16(tb[MPTCP_PM_ADDR_ATTR_FAMILY]);
-       if (entry->addr.family != AF_INET
+       addr->family = nla_get_u16(tb[MPTCP_PM_ADDR_ATTR_FAMILY]);
+       if (addr->family != AF_INET
 #if IS_ENABLED(CONFIG_MPTCP_IPV6)
-           && entry->addr.family != AF_INET6
+           && addr->family != AF_INET6
 #endif
            ) {
                NL_SET_ERR_MSG_ATTR(info->extack, attr,
                                    "unknown address family");
                return -EINVAL;
        }
-       addr_addr = mptcp_pm_family_to_addr(entry->addr.family);
+       addr_addr = mptcp_pm_family_to_addr(addr->family);
        if (!tb[addr_addr]) {
                NL_SET_ERR_MSG_ATTR(info->extack, attr,
                                    "missing address data");
@@ -1188,22 +1191,37 @@ static int mptcp_pm_parse_addr(struct nlattr *attr, struct genl_info *info,
        }
 
 #if IS_ENABLED(CONFIG_MPTCP_IPV6)
-       if (entry->addr.family == AF_INET6)
-               entry->addr.addr6 = nla_get_in6_addr(tb[addr_addr]);
+       if (addr->family == AF_INET6)
+               addr->addr6 = nla_get_in6_addr(tb[addr_addr]);
        else
 #endif
-               entry->addr.addr.s_addr = nla_get_in_addr(tb[addr_addr]);
+               addr->addr.s_addr = nla_get_in_addr(tb[addr_addr]);
+
+       if (tb[MPTCP_PM_ADDR_ATTR_PORT])
+               addr->port = htons(nla_get_u16(tb[MPTCP_PM_ADDR_ATTR_PORT]));
+
+       return err;
+}
+
+static int mptcp_pm_parse_entry(struct nlattr *attr, struct genl_info *info,
+                               bool require_family,
+                               struct mptcp_pm_addr_entry *entry)
+{
+       struct nlattr *tb[MPTCP_PM_ADDR_ATTR_MAX + 1];
+       int err;
+
+       memset(entry, 0, sizeof(*entry));
+
+       err = mptcp_pm_parse_pm_addr_attr(tb, attr, info, &entry->addr, require_family);
+       if (err)
+               return err;
 
-skip_family:
        if (tb[MPTCP_PM_ADDR_ATTR_IF_IDX]) {
                u32 val = nla_get_s32(tb[MPTCP_PM_ADDR_ATTR_IF_IDX]);
 
                entry->ifindex = val;
        }
 
-       if (tb[MPTCP_PM_ADDR_ATTR_ID])
-               entry->addr.id = nla_get_u8(tb[MPTCP_PM_ADDR_ATTR_ID]);
-
        if (tb[MPTCP_PM_ADDR_ATTR_FLAGS])
                entry->flags = nla_get_u32(tb[MPTCP_PM_ADDR_ATTR_FLAGS]);
 
@@ -1251,7 +1269,7 @@ static int mptcp_nl_cmd_add_addr(struct sk_buff *skb, struct genl_info *info)
        struct mptcp_pm_addr_entry addr, *entry;
        int ret;
 
-       ret = mptcp_pm_parse_addr(attr, info, true, &addr);
+       ret = mptcp_pm_parse_entry(attr, info, true, &addr);
        if (ret < 0)
                return ret;
 
@@ -1445,7 +1463,7 @@ static int mptcp_nl_cmd_del_addr(struct sk_buff *skb, struct genl_info *info)
        unsigned int addr_max;
        int ret;
 
-       ret = mptcp_pm_parse_addr(attr, info, false, &addr);
+       ret = mptcp_pm_parse_entry(attr, info, false, &addr);
        if (ret < 0)
                return ret;
 
@@ -1619,7 +1637,7 @@ static int mptcp_nl_cmd_get_addr(struct sk_buff *skb, struct genl_info *info)
        void *reply;
        int ret;
 
-       ret = mptcp_pm_parse_addr(attr, info, false, &addr);
+       ret = mptcp_pm_parse_entry(attr, info, false, &addr);
        if (ret < 0)
                return ret;
 
@@ -1830,7 +1848,7 @@ static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *info)
        u8 bkup = 0, lookup_by_id = 0;
        int ret;
 
-       ret = mptcp_pm_parse_addr(attr, info, false, &addr);
+       ret = mptcp_pm_parse_entry(attr, info, false, &addr);
        if (ret < 0)
                return ret;