Skip to content

Commit 982f17b

Browse files
Florian Westphaldavem330
authored andcommitted
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 <[email protected]> Signed-off-by: Florian Westphal <[email protected]> Signed-off-by: Mat Martineau <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 8b20137 commit 982f17b

File tree

1 file changed

+39
-21
lines changed

1 file changed

+39
-21
lines changed

net/mptcp/pm_netlink.c

Lines changed: 39 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1142,11 +1142,12 @@ static int mptcp_pm_family_to_addr(int family)
11421142
return MPTCP_PM_ADDR_ATTR_ADDR4;
11431143
}
11441144

1145-
static int mptcp_pm_parse_addr(struct nlattr *attr, struct genl_info *info,
1146-
bool require_family,
1147-
struct mptcp_pm_addr_entry *entry)
1145+
static int mptcp_pm_parse_pm_addr_attr(struct nlattr *tb[],
1146+
const struct nlattr *attr,
1147+
struct genl_info *info,
1148+
struct mptcp_addr_info *addr,
1149+
bool require_family)
11481150
{
1149-
struct nlattr *tb[MPTCP_PM_ADDR_ATTR_MAX + 1];
11501151
int err, addr_addr;
11511152

11521153
if (!attr) {
@@ -1160,50 +1161,67 @@ static int mptcp_pm_parse_addr(struct nlattr *attr, struct genl_info *info,
11601161
if (err)
11611162
return err;
11621163

1163-
memset(entry, 0, sizeof(*entry));
1164+
if (tb[MPTCP_PM_ADDR_ATTR_ID])
1165+
addr->id = nla_get_u8(tb[MPTCP_PM_ADDR_ATTR_ID]);
1166+
11641167
if (!tb[MPTCP_PM_ADDR_ATTR_FAMILY]) {
11651168
if (!require_family)
1166-
goto skip_family;
1169+
return err;
11671170

11681171
NL_SET_ERR_MSG_ATTR(info->extack, attr,
11691172
"missing family");
11701173
return -EINVAL;
11711174
}
11721175

1173-
entry->addr.family = nla_get_u16(tb[MPTCP_PM_ADDR_ATTR_FAMILY]);
1174-
if (entry->addr.family != AF_INET
1176+
addr->family = nla_get_u16(tb[MPTCP_PM_ADDR_ATTR_FAMILY]);
1177+
if (addr->family != AF_INET
11751178
#if IS_ENABLED(CONFIG_MPTCP_IPV6)
1176-
&& entry->addr.family != AF_INET6
1179+
&& addr->family != AF_INET6
11771180
#endif
11781181
) {
11791182
NL_SET_ERR_MSG_ATTR(info->extack, attr,
11801183
"unknown address family");
11811184
return -EINVAL;
11821185
}
1183-
addr_addr = mptcp_pm_family_to_addr(entry->addr.family);
1186+
addr_addr = mptcp_pm_family_to_addr(addr->family);
11841187
if (!tb[addr_addr]) {
11851188
NL_SET_ERR_MSG_ATTR(info->extack, attr,
11861189
"missing address data");
11871190
return -EINVAL;
11881191
}
11891192

11901193
#if IS_ENABLED(CONFIG_MPTCP_IPV6)
1191-
if (entry->addr.family == AF_INET6)
1192-
entry->addr.addr6 = nla_get_in6_addr(tb[addr_addr]);
1194+
if (addr->family == AF_INET6)
1195+
addr->addr6 = nla_get_in6_addr(tb[addr_addr]);
11931196
else
11941197
#endif
1195-
entry->addr.addr.s_addr = nla_get_in_addr(tb[addr_addr]);
1198+
addr->addr.s_addr = nla_get_in_addr(tb[addr_addr]);
1199+
1200+
if (tb[MPTCP_PM_ADDR_ATTR_PORT])
1201+
addr->port = htons(nla_get_u16(tb[MPTCP_PM_ADDR_ATTR_PORT]));
1202+
1203+
return err;
1204+
}
1205+
1206+
static int mptcp_pm_parse_entry(struct nlattr *attr, struct genl_info *info,
1207+
bool require_family,
1208+
struct mptcp_pm_addr_entry *entry)
1209+
{
1210+
struct nlattr *tb[MPTCP_PM_ADDR_ATTR_MAX + 1];
1211+
int err;
1212+
1213+
memset(entry, 0, sizeof(*entry));
1214+
1215+
err = mptcp_pm_parse_pm_addr_attr(tb, attr, info, &entry->addr, require_family);
1216+
if (err)
1217+
return err;
11961218

1197-
skip_family:
11981219
if (tb[MPTCP_PM_ADDR_ATTR_IF_IDX]) {
11991220
u32 val = nla_get_s32(tb[MPTCP_PM_ADDR_ATTR_IF_IDX]);
12001221

12011222
entry->ifindex = val;
12021223
}
12031224

1204-
if (tb[MPTCP_PM_ADDR_ATTR_ID])
1205-
entry->addr.id = nla_get_u8(tb[MPTCP_PM_ADDR_ATTR_ID]);
1206-
12071225
if (tb[MPTCP_PM_ADDR_ATTR_FLAGS])
12081226
entry->flags = nla_get_u32(tb[MPTCP_PM_ADDR_ATTR_FLAGS]);
12091227

@@ -1251,7 +1269,7 @@ static int mptcp_nl_cmd_add_addr(struct sk_buff *skb, struct genl_info *info)
12511269
struct mptcp_pm_addr_entry addr, *entry;
12521270
int ret;
12531271

1254-
ret = mptcp_pm_parse_addr(attr, info, true, &addr);
1272+
ret = mptcp_pm_parse_entry(attr, info, true, &addr);
12551273
if (ret < 0)
12561274
return ret;
12571275

@@ -1445,7 +1463,7 @@ static int mptcp_nl_cmd_del_addr(struct sk_buff *skb, struct genl_info *info)
14451463
unsigned int addr_max;
14461464
int ret;
14471465

1448-
ret = mptcp_pm_parse_addr(attr, info, false, &addr);
1466+
ret = mptcp_pm_parse_entry(attr, info, false, &addr);
14491467
if (ret < 0)
14501468
return ret;
14511469

@@ -1619,7 +1637,7 @@ static int mptcp_nl_cmd_get_addr(struct sk_buff *skb, struct genl_info *info)
16191637
void *reply;
16201638
int ret;
16211639

1622-
ret = mptcp_pm_parse_addr(attr, info, false, &addr);
1640+
ret = mptcp_pm_parse_entry(attr, info, false, &addr);
16231641
if (ret < 0)
16241642
return ret;
16251643

@@ -1830,7 +1848,7 @@ static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *info)
18301848
u8 bkup = 0, lookup_by_id = 0;
18311849
int ret;
18321850

1833-
ret = mptcp_pm_parse_addr(attr, info, false, &addr);
1851+
ret = mptcp_pm_parse_entry(attr, info, false, &addr);
18341852
if (ret < 0)
18351853
return ret;
18361854

0 commit comments

Comments
 (0)