Commit ed8c8f60 authored by Jakub Kicinski's avatar Jakub Kicinski

Merge branch 'mptcp-improve-set-flags-command-and-update-self-tests'

Mat Martineau says:

====================
mptcp: Improve set-flags command and update self tests

Patches 1-3 allow more flexibility in the combinations of features and
flags allowed with the MPTCP_PM_CMD_SET_FLAGS netlink command, and add
self test case coverage for the new functionality.

Patches 4-6 and 9 refactor the mptcp_join.sh self tests to allow them to
configure all of the test cases using either the pm_nl_ctl utility (part
of the mptcp self tests) or the 'ip mptcp' command (from iproute2). The
default remains to use pm_nl_ctl.

Patches 7 and 8 update the pm_netlink.sh self tests to cover the use of
endpoint ids to set endpoint flags (instead of just addresses).
====================

Link: https://lore.kernel.org/r/20220205000337.187292-1-mathew.j.martineau@linux.intel.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 660a38bf 621bd393
...@@ -1174,14 +1174,8 @@ static int mptcp_pm_parse_addr(struct nlattr *attr, struct genl_info *info, ...@@ -1174,14 +1174,8 @@ static int mptcp_pm_parse_addr(struct nlattr *attr, struct genl_info *info,
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]);
if (tb[MPTCP_PM_ADDR_ATTR_PORT]) { 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;
}
entry->addr.port = htons(nla_get_u16(tb[MPTCP_PM_ADDR_ATTR_PORT])); entry->addr.port = htons(nla_get_u16(tb[MPTCP_PM_ADDR_ATTR_PORT]));
}
return 0; return 0;
} }
...@@ -1227,6 +1221,11 @@ static int mptcp_nl_cmd_add_addr(struct sk_buff *skb, struct genl_info *info) ...@@ -1227,6 +1221,11 @@ static int mptcp_nl_cmd_add_addr(struct sk_buff *skb, struct genl_info *info)
if (ret < 0) if (ret < 0)
return ret; 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); entry = kmalloc(sizeof(*entry), GFP_KERNEL);
if (!entry) { if (!entry) {
GENL_SET_ERR_MSG(info, "can't allocate addr"); GENL_SET_ERR_MSG(info, "can't allocate addr");
......
...@@ -164,4 +164,22 @@ id 253 flags 10.0.0.5 ...@@ -164,4 +164,22 @@ id 253 flags 10.0.0.5
id 254 flags 10.0.0.2 id 254 flags 10.0.0.2
id 255 flags 10.0.0.3" "wrap-around ids" id 255 flags 10.0.0.3" "wrap-around ids"
ip netns exec $ns1 ./pm_nl_ctl flush
ip netns exec $ns1 ./pm_nl_ctl add 10.0.1.1 flags subflow
ip netns exec $ns1 ./pm_nl_ctl set 10.0.1.1 flags backup
check "ip netns exec $ns1 ./pm_nl_ctl dump" "id 1 flags \
subflow,backup 10.0.1.1" "set flags (backup)"
ip netns exec $ns1 ./pm_nl_ctl set 10.0.1.1 flags nobackup
check "ip netns exec $ns1 ./pm_nl_ctl dump" "id 1 flags \
subflow 10.0.1.1" " (nobackup)"
ip netns exec $ns1 ./pm_nl_ctl set id 1 flags fullmesh
check "ip netns exec $ns1 ./pm_nl_ctl dump" "id 1 flags \
subflow,fullmesh 10.0.1.1" " (fullmesh)"
ip netns exec $ns1 ./pm_nl_ctl set id 1 flags nofullmesh
check "ip netns exec $ns1 ./pm_nl_ctl dump" "id 1 flags \
subflow 10.0.1.1" " (nofullmesh)"
ip netns exec $ns1 ./pm_nl_ctl set id 1 flags backup,fullmesh
check "ip netns exec $ns1 ./pm_nl_ctl dump" "id 1 flags \
subflow,backup,fullmesh 10.0.1.1" " (backup,fullmesh)"
exit $ret exit $ret
...@@ -28,7 +28,7 @@ static void syntax(char *argv[]) ...@@ -28,7 +28,7 @@ static void syntax(char *argv[])
fprintf(stderr, "\tadd [flags signal|subflow|backup|fullmesh] [id <nr>] [dev <name>] <ip>\n"); fprintf(stderr, "\tadd [flags signal|subflow|backup|fullmesh] [id <nr>] [dev <name>] <ip>\n");
fprintf(stderr, "\tdel <id> [<ip>]\n"); fprintf(stderr, "\tdel <id> [<ip>]\n");
fprintf(stderr, "\tget <id>\n"); fprintf(stderr, "\tget <id>\n");
fprintf(stderr, "\tset <ip> [flags backup|nobackup|fullmesh|nofullmesh]\n"); fprintf(stderr, "\tset [<ip>] [id <nr>] flags [no]backup|[no]fullmesh [port <nr>]\n");
fprintf(stderr, "\tflush\n"); fprintf(stderr, "\tflush\n");
fprintf(stderr, "\tdump\n"); fprintf(stderr, "\tdump\n");
fprintf(stderr, "\tlimits [<rcv addr max> <subflow max>]\n"); fprintf(stderr, "\tlimits [<rcv addr max> <subflow max>]\n");
...@@ -657,8 +657,10 @@ int set_flags(int fd, int pm_family, int argc, char *argv[]) ...@@ -657,8 +657,10 @@ int set_flags(int fd, int pm_family, int argc, char *argv[])
u_int32_t flags = 0; u_int32_t flags = 0;
u_int16_t family; u_int16_t family;
int nest_start; int nest_start;
int use_id = 0;
u_int8_t id;
int off = 0; int off = 0;
int arg; int arg = 2;
memset(data, 0, sizeof(data)); memset(data, 0, sizeof(data));
nh = (void *)data; nh = (void *)data;
...@@ -674,18 +676,30 @@ int set_flags(int fd, int pm_family, int argc, char *argv[]) ...@@ -674,18 +676,30 @@ int set_flags(int fd, int pm_family, int argc, char *argv[])
nest->rta_len = RTA_LENGTH(0); nest->rta_len = RTA_LENGTH(0);
off += NLMSG_ALIGN(nest->rta_len); off += NLMSG_ALIGN(nest->rta_len);
if (!strcmp(argv[arg], "id")) {
if (++arg >= argc)
error(1, 0, " missing id value");
use_id = 1;
id = atoi(argv[arg]);
rta = (void *)(data + off);
rta->rta_type = MPTCP_PM_ADDR_ATTR_ID;
rta->rta_len = RTA_LENGTH(1);
memcpy(RTA_DATA(rta), &id, 1);
off += NLMSG_ALIGN(rta->rta_len);
} else {
/* addr data */ /* addr data */
rta = (void *)(data + off); rta = (void *)(data + off);
if (inet_pton(AF_INET, argv[2], RTA_DATA(rta))) { if (inet_pton(AF_INET, argv[arg], RTA_DATA(rta))) {
family = AF_INET; family = AF_INET;
rta->rta_type = MPTCP_PM_ADDR_ATTR_ADDR4; rta->rta_type = MPTCP_PM_ADDR_ATTR_ADDR4;
rta->rta_len = RTA_LENGTH(4); rta->rta_len = RTA_LENGTH(4);
} else if (inet_pton(AF_INET6, argv[2], RTA_DATA(rta))) { } else if (inet_pton(AF_INET6, argv[arg], RTA_DATA(rta))) {
family = AF_INET6; family = AF_INET6;
rta->rta_type = MPTCP_PM_ADDR_ATTR_ADDR6; rta->rta_type = MPTCP_PM_ADDR_ATTR_ADDR6;
rta->rta_len = RTA_LENGTH(16); rta->rta_len = RTA_LENGTH(16);
} else { } else {
error(1, errno, "can't parse ip %s", argv[2]); error(1, errno, "can't parse ip %s", argv[arg]);
} }
off += NLMSG_ALIGN(rta->rta_len); off += NLMSG_ALIGN(rta->rta_len);
...@@ -695,8 +709,12 @@ int set_flags(int fd, int pm_family, int argc, char *argv[]) ...@@ -695,8 +709,12 @@ int set_flags(int fd, int pm_family, int argc, char *argv[])
rta->rta_len = RTA_LENGTH(2); rta->rta_len = RTA_LENGTH(2);
memcpy(RTA_DATA(rta), &family, 2); memcpy(RTA_DATA(rta), &family, 2);
off += NLMSG_ALIGN(rta->rta_len); off += NLMSG_ALIGN(rta->rta_len);
}
for (arg = 3; arg < argc; arg++) { if (++arg >= argc)
error(1, 0, " missing flags keyword");
for (; arg < argc; arg++) {
if (!strcmp(argv[arg], "flags")) { if (!strcmp(argv[arg], "flags")) {
char *tok, *str; char *tok, *str;
...@@ -721,6 +739,21 @@ int set_flags(int fd, int pm_family, int argc, char *argv[]) ...@@ -721,6 +739,21 @@ int set_flags(int fd, int pm_family, int argc, char *argv[])
rta->rta_len = RTA_LENGTH(4); rta->rta_len = RTA_LENGTH(4);
memcpy(RTA_DATA(rta), &flags, 4); memcpy(RTA_DATA(rta), &flags, 4);
off += NLMSG_ALIGN(rta->rta_len); off += NLMSG_ALIGN(rta->rta_len);
} else if (!strcmp(argv[arg], "port")) {
u_int16_t port;
if (use_id)
error(1, 0, " port can't be used with id");
if (++arg >= argc)
error(1, 0, " missing port value");
port = atoi(argv[arg]);
rta = (void *)(data + off);
rta->rta_type = MPTCP_PM_ADDR_ATTR_PORT;
rta->rta_len = RTA_LENGTH(2);
memcpy(RTA_DATA(rta), &port, 2);
off += NLMSG_ALIGN(rta->rta_len);
} else { } else {
error(1, 0, "unknown keyword %s", argv[arg]); error(1, 0, "unknown keyword %s", argv[arg]);
} }
......
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