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: 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>
This commit is contained in:
parent
8b20137012
commit
982f17ba1a
@ -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;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user