Commit 982f17ba authored by Florian Westphal's avatar Florian Westphal Committed by David S. Miller

mptcp: netlink: split mptcp_pm_parse_addr into two functions

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: default avatarPaolo Abeni <pabeni@redhat.com>
Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
Signed-off-by: default avatarMat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 8b201370
...@@ -1142,11 +1142,12 @@ static int mptcp_pm_family_to_addr(int family) ...@@ -1142,11 +1142,12 @@ static int mptcp_pm_family_to_addr(int family)
return MPTCP_PM_ADDR_ATTR_ADDR4; return MPTCP_PM_ADDR_ATTR_ADDR4;
} }
static int mptcp_pm_parse_addr(struct nlattr *attr, struct genl_info *info, static int mptcp_pm_parse_pm_addr_attr(struct nlattr *tb[],
bool require_family, const struct nlattr *attr,
struct mptcp_pm_addr_entry *entry) 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; int err, addr_addr;
if (!attr) { if (!attr) {
...@@ -1160,27 +1161,29 @@ static int mptcp_pm_parse_addr(struct nlattr *attr, struct genl_info *info, ...@@ -1160,27 +1161,29 @@ static int mptcp_pm_parse_addr(struct nlattr *attr, struct genl_info *info,
if (err) if (err)
return 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 (!tb[MPTCP_PM_ADDR_ATTR_FAMILY]) {
if (!require_family) if (!require_family)
goto skip_family; return err;
NL_SET_ERR_MSG_ATTR(info->extack, attr, NL_SET_ERR_MSG_ATTR(info->extack, attr,
"missing family"); "missing family");
return -EINVAL; return -EINVAL;
} }
entry->addr.family = nla_get_u16(tb[MPTCP_PM_ADDR_ATTR_FAMILY]); addr->family = nla_get_u16(tb[MPTCP_PM_ADDR_ATTR_FAMILY]);
if (entry->addr.family != AF_INET if (addr->family != AF_INET
#if IS_ENABLED(CONFIG_MPTCP_IPV6) #if IS_ENABLED(CONFIG_MPTCP_IPV6)
&& entry->addr.family != AF_INET6 && addr->family != AF_INET6
#endif #endif
) { ) {
NL_SET_ERR_MSG_ATTR(info->extack, attr, NL_SET_ERR_MSG_ATTR(info->extack, attr,
"unknown address family"); "unknown address family");
return -EINVAL; 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]) { if (!tb[addr_addr]) {
NL_SET_ERR_MSG_ATTR(info->extack, attr, NL_SET_ERR_MSG_ATTR(info->extack, attr,
"missing address data"); "missing address data");
...@@ -1188,22 +1191,37 @@ static int mptcp_pm_parse_addr(struct nlattr *attr, struct genl_info *info, ...@@ -1188,22 +1191,37 @@ static int mptcp_pm_parse_addr(struct nlattr *attr, struct genl_info *info,
} }
#if IS_ENABLED(CONFIG_MPTCP_IPV6) #if IS_ENABLED(CONFIG_MPTCP_IPV6)
if (entry->addr.family == AF_INET6) if (addr->family == AF_INET6)
entry->addr.addr6 = nla_get_in6_addr(tb[addr_addr]); addr->addr6 = nla_get_in6_addr(tb[addr_addr]);
else else
#endif #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]) { if (tb[MPTCP_PM_ADDR_ATTR_IF_IDX]) {
u32 val = nla_get_s32(tb[MPTCP_PM_ADDR_ATTR_IF_IDX]); u32 val = nla_get_s32(tb[MPTCP_PM_ADDR_ATTR_IF_IDX]);
entry->ifindex = val; 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]) if (tb[MPTCP_PM_ADDR_ATTR_FLAGS])
entry->flags = nla_get_u32(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) ...@@ -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; struct mptcp_pm_addr_entry addr, *entry;
int ret; int ret;
ret = mptcp_pm_parse_addr(attr, info, true, &addr); ret = mptcp_pm_parse_entry(attr, info, true, &addr);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -1445,7 +1463,7 @@ static int mptcp_nl_cmd_del_addr(struct sk_buff *skb, struct genl_info *info) ...@@ -1445,7 +1463,7 @@ static int mptcp_nl_cmd_del_addr(struct sk_buff *skb, struct genl_info *info)
unsigned int addr_max; unsigned int addr_max;
int ret; int ret;
ret = mptcp_pm_parse_addr(attr, info, false, &addr); ret = mptcp_pm_parse_entry(attr, info, false, &addr);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -1619,7 +1637,7 @@ static int mptcp_nl_cmd_get_addr(struct sk_buff *skb, struct genl_info *info) ...@@ -1619,7 +1637,7 @@ static int mptcp_nl_cmd_get_addr(struct sk_buff *skb, struct genl_info *info)
void *reply; void *reply;
int ret; int ret;
ret = mptcp_pm_parse_addr(attr, info, false, &addr); ret = mptcp_pm_parse_entry(attr, info, false, &addr);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -1830,7 +1848,7 @@ static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *info) ...@@ -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; u8 bkup = 0, lookup_by_id = 0;
int ret; int ret;
ret = mptcp_pm_parse_addr(attr, info, false, &addr); ret = mptcp_pm_parse_entry(attr, info, false, &addr);
if (ret < 0) if (ret < 0)
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment