:p
atchew
Login
Added the fullmesh flag setting support: # pm_nl_ctl set 10.0.1.1 flags backup # pm_nl_ctl clear 10.0.1.1 flags backup # pm_nl_ctl set 10.0.1.1 flags fullmesh # pm_nl_ctl clear 10.0.1.1 flags fullmesh Geliang Tang (7): mptcp: fix removing ids bitmap mptcp: add clear_flags in pm_netlink selftests: mptcp: add clear_flags in pm_nl_ctl selftests: mptcp: add clear_flags in mptcp_join.sh mptcp: set fullmesh flag in pm_netlink selftests: mptcp: set fullmesh flag in pm_nl_ctl selftests: mptcp: add fullmesh setting tests include/uapi/linux/mptcp.h | 1 + net/mptcp/pm_netlink.c | 45 ++++++++++++++----- .../testing/selftests/net/mptcp/mptcp_join.sh | 42 ++++++++++++++--- tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 16 ++++--- 4 files changed, 82 insertions(+), 22 deletions(-) -- 2.31.1
In mptcp_pm_nl_rm_addr_or_subflow(), the bit of rm_list->ids[i] in the id_avail_bitmap should be set, not rm_list->ids[1]. This patch fixed it. Fixes: 86e39e04482b ("mptcp: keep track of local endpoint still available for each msk") Signed-off-by: Geliang Tang <geliang.tang@suse.com> --- net/mptcp/pm_netlink.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index XXXXXXX..XXXXXXX 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -XXX,XX +XXX,XX @@ static void mptcp_pm_nl_rm_addr_or_subflow(struct mptcp_sock *msk, removed = true; __MPTCP_INC_STATS(sock_net(sk), rm_type); } - __set_bit(rm_list->ids[1], msk->pm.id_avail_bitmap); + __set_bit(rm_list->ids[i], msk->pm.id_avail_bitmap); if (!removed) continue; -- 2.31.1
Splite set_flags() into two parts, set_flags() and clear_flags(), make it easy to add new flags to set or clear. This patch added a new PM command MPTCP_PM_CMD_CLEAR_FLAGS, and a new function mptcp_nl_cmd_clear_flags(). Signed-off-by: Geliang Tang <geliang.tang@suse.com> --- include/uapi/linux/mptcp.h | 1 + net/mptcp/pm_netlink.c | 36 ++++++++++++++++++++++++++---------- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/include/uapi/linux/mptcp.h b/include/uapi/linux/mptcp.h index XXXXXXX..XXXXXXX 100644 --- a/include/uapi/linux/mptcp.h +++ b/include/uapi/linux/mptcp.h @@ -XXX,XX +XXX,XX @@ enum { MPTCP_PM_CMD_SET_LIMITS, MPTCP_PM_CMD_GET_LIMITS, MPTCP_PM_CMD_SET_FLAGS, + MPTCP_PM_CMD_CLEAR_FLAGS, __MPTCP_PM_CMD_AFTER_LAST }; diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index XXXXXXX..XXXXXXX 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -XXX,XX +XXX,XX @@ static int mptcp_nl_addr_backup(struct net *net, return ret; } -static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *info) +static int __mptcp_nl_cmd_set_flags(struct sk_buff *skb, + struct genl_info *info, + int clear_flags) { struct mptcp_pm_addr_entry addr = { .addr = { .family = AF_UNSPEC }, }, *entry; struct nlattr *attr = info->attrs[MPTCP_PM_ATTR_ADDR]; struct pm_nl_pernet *pernet = genl_info_pm_nl(info); struct net *net = sock_net(skb->sk); - u8 bkup = 0, lookup_by_id = 0; + u8 lookup_by_id = 0; int ret; ret = mptcp_pm_parse_addr(attr, info, false, &addr); if (ret < 0) return ret; - if (addr.flags & MPTCP_PM_ADDR_FLAG_BACKUP) - bkup = 1; if (addr.addr.family == AF_UNSPEC) { lookup_by_id = 1; if (!addr.addr.id) @@ -XXX,XX +XXX,XX @@ static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *info) list_for_each_entry(entry, &pernet->local_addr_list, list) { if ((!lookup_by_id && addresses_equal(&entry->addr, &addr.addr, true)) || (lookup_by_id && entry->addr.id == addr.addr.id)) { - mptcp_nl_addr_backup(net, &entry->addr, bkup); - - if (bkup) - entry->flags |= MPTCP_PM_ADDR_FLAG_BACKUP; - else - entry->flags &= ~MPTCP_PM_ADDR_FLAG_BACKUP; + if (addr.flags & MPTCP_PM_ADDR_FLAG_BACKUP) { + mptcp_nl_addr_backup(net, &entry->addr, !clear_flags); + if (clear_flags) + entry->flags &= ~MPTCP_PM_ADDR_FLAG_BACKUP; + else + entry->flags |= MPTCP_PM_ADDR_FLAG_BACKUP; + } } } return 0; } +static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *info) +{ + return __mptcp_nl_cmd_set_flags(skb, info, 0); +} + +static int mptcp_nl_cmd_clear_flags(struct sk_buff *skb, struct genl_info *info) +{ + return __mptcp_nl_cmd_set_flags(skb, info, 1); +} + static void mptcp_nl_mcast_send(struct net *net, struct sk_buff *nlskb, gfp_t gfp) { genlmsg_multicast_netns(&mptcp_genl_family, net, @@ -XXX,XX +XXX,XX @@ static const struct genl_small_ops mptcp_pm_ops[] = { .doit = mptcp_nl_cmd_set_flags, .flags = GENL_ADMIN_PERM, }, + { + .cmd = MPTCP_PM_CMD_CLEAR_FLAGS, + .doit = mptcp_nl_cmd_clear_flags, + .flags = GENL_ADMIN_PERM, + }, }; static struct genl_family mptcp_genl_family __ro_after_init = { -- 2.31.1
This patch added 'clear' command for pm_nl_ctl, to replace the command 'pm_nl_ctl set ip flags nobackup' with 'pm_nl_ctl clear ip flags backup'. Signed-off-by: Geliang Tang <geliang.tang@suse.com> --- tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c index XXXXXXX..XXXXXXX 100644 --- a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c +++ b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c @@ -XXX,XX +XXX,XX @@ static void syntax(char *argv[]) fprintf(stderr, "\tadd [flags signal|subflow|backup|fullmesh] [id <nr>] [dev <name>] <ip>\n"); fprintf(stderr, "\tdel <id> [<ip>]\n"); fprintf(stderr, "\tget <id>\n"); - fprintf(stderr, "\tset <ip> [flags backup|nobackup]\n"); + fprintf(stderr, "\tset <ip> [flags backup]\n"); + fprintf(stderr, "\tclear <ip> [flags backup]\n"); fprintf(stderr, "\tflush\n"); fprintf(stderr, "\tdump\n"); fprintf(stderr, "\tlimits [<rcv addr max> <subflow max>]\n"); @@ -XXX,XX +XXX,XX @@ int get_set_limits(int fd, int pm_family, int argc, char *argv[]) return 0; } -int set_flags(int fd, int pm_family, int argc, char *argv[]) +int set_flags(int fd, int pm_family, int clear_flags, int argc, char *argv[]) { char data[NLMSG_ALIGN(sizeof(struct nlmsghdr)) + NLMSG_ALIGN(sizeof(struct genlmsghdr)) + @@ -XXX,XX +XXX,XX @@ int set_flags(int fd, int pm_family, int argc, char *argv[]) memset(data, 0, sizeof(data)); nh = (void *)data; - off = init_genl_req(data, pm_family, MPTCP_PM_CMD_SET_FLAGS, + off = init_genl_req(data, pm_family, + clear_flags ? MPTCP_PM_CMD_CLEAR_FLAGS : MPTCP_PM_CMD_SET_FLAGS, MPTCP_PM_VER); if (argc < 3) @@ -XXX,XX +XXX,XX @@ int main(int argc, char *argv[]) else if (!strcmp(argv[1], "limits")) return get_set_limits(fd, pm_family, argc, argv); else if (!strcmp(argv[1], "set")) - return set_flags(fd, pm_family, argc, argv); + return set_flags(fd, pm_family, 0, argc, argv); + else if (!strcmp(argv[1], "clear")) + return set_flags(fd, pm_family, 1, argc, argv); fprintf(stderr, "unknown sub-command: %s", argv[1]); syntax(argv); -- 2.31.1
This patch changed the command 'pm_nl_ctl set $addr flags nobackup' to 'pm_nl_ctl clear $addr flags backup', and renamed bkup to setflags. Signed-off-by: Geliang Tang <geliang.tang@suse.com> --- .../testing/selftests/net/mptcp/mptcp_join.sh | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh index XXXXXXX..XXXXXXX 100755 --- a/tools/testing/selftests/net/mptcp/mptcp_join.sh +++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh @@ -XXX,XX +XXX,XX @@ do_transfer() addr_nr_ns1="$7" addr_nr_ns2="$8" speed="$9" - bkup="${10}" + setflags="${10}" port=$((10000+$TEST_COUNT)) TEST_COUNT=$((TEST_COUNT+1)) @@ -XXX,XX +XXX,XX @@ do_transfer() fi fi - if [ ! -z $bkup ]; then + if [ ! -z $setflags ]; then sleep 1 for netns in "$ns1" "$ns2"; do dump=(`ip netns exec $netns ./pm_nl_ctl dump`) if [ ${#dump[@]} -gt 0 ]; then addr=${dump[${#dump[@]} - 1]} - backup="ip netns exec $netns ./pm_nl_ctl set $addr flags $bkup" - $backup + if [ $setflags = "backup" ]; then + cmd=set + flags=backup + elif [ $setflags = "nobackup" ]; then + cmd=clear + flags=backup + fi + ip netns exec $netns ./pm_nl_ctl $cmd $addr flags $flags fi done fi @@ -XXX,XX +XXX,XX @@ run_tests() addr_nr_ns1="${5:-0}" addr_nr_ns2="${6:-0}" speed="${7:-fast}" - bkup="${8:-""}" + setflags="${8:-""}" lret=0 oldin="" @@ -XXX,XX +XXX,XX @@ run_tests() fi do_transfer ${listener_ns} ${connector_ns} MPTCP MPTCP ${connect_addr} \ - ${test_linkfail} ${addr_nr_ns1} ${addr_nr_ns2} ${speed} ${bkup} + ${test_linkfail} ${addr_nr_ns1} ${addr_nr_ns2} ${speed} ${setflags} lret=$? } -- 2.31.1
This patch added the fullmesh flag setting and clearing support in pm_netlink. Signed-off-by: Geliang Tang <geliang.tang@suse.com> --- net/mptcp/pm_netlink.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index XXXXXXX..XXXXXXX 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -XXX,XX +XXX,XX @@ static int __mptcp_nl_cmd_set_flags(struct sk_buff *skb, entry->flags &= ~MPTCP_PM_ADDR_FLAG_BACKUP; else entry->flags |= MPTCP_PM_ADDR_FLAG_BACKUP; + } else if (addr.flags & MPTCP_PM_ADDR_FLAG_FULLMESH) { + mptcp_nl_remove_subflow_and_signal_addr(net, &entry->addr); + if (clear_flags) + entry->flags &= ~MPTCP_PM_ADDR_FLAG_FULLMESH; + else + entry->flags |= MPTCP_PM_ADDR_FLAG_FULLMESH; + mptcp_nl_add_subflow_or_signal_addr(net); } } } -- 2.31.1
This patch added the fullmesh flag setting and clearing support in pm_nl_ctl: # pm_nl_ctl set ip flags fullmesh # pm_nl_ctl clear ip flags fullmesh Signed-off-by: Geliang Tang <geliang.tang@suse.com> --- tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c index XXXXXXX..XXXXXXX 100644 --- a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c +++ b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c @@ -XXX,XX +XXX,XX @@ static void syntax(char *argv[]) fprintf(stderr, "\tadd [flags signal|subflow|backup|fullmesh] [id <nr>] [dev <name>] <ip>\n"); fprintf(stderr, "\tdel <id> [<ip>]\n"); fprintf(stderr, "\tget <id>\n"); - fprintf(stderr, "\tset <ip> [flags backup]\n"); - fprintf(stderr, "\tclear <ip> [flags backup]\n"); + fprintf(stderr, "\tset <ip> [flags backup|fullmesh]\n"); + fprintf(stderr, "\tclear <ip> [flags backup|fullmesh]\n"); fprintf(stderr, "\tflush\n"); fprintf(stderr, "\tdump\n"); fprintf(stderr, "\tlimits [<rcv addr max> <subflow max>]\n"); @@ -XXX,XX +XXX,XX @@ int set_flags(int fd, int pm_family, int clear_flags, int argc, char *argv[]) str = NULL) { if (!strcmp(tok, "backup")) flags |= MPTCP_PM_ADDR_FLAG_BACKUP; - else if (strcmp(tok, "nobackup")) + else if (!strcmp(tok, "fullmesh")) + flags |= MPTCP_PM_ADDR_FLAG_FULLMESH; + else error(1, errno, "unknown flag %s", argv[arg]); } -- 2.31.1
This patch added the fullmesh setting and clearing selftests in mptcp_join.sh. Signed-off-by: Geliang Tang <geliang.tang@suse.com> --- .../testing/selftests/net/mptcp/mptcp_join.sh | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh index XXXXXXX..XXXXXXX 100755 --- a/tools/testing/selftests/net/mptcp/mptcp_join.sh +++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh @@ -XXX,XX +XXX,XX @@ do_transfer() elif [ $setflags = "nobackup" ]; then cmd=clear flags=backup + elif [ $setflags = "fullmesh" ]; then + cmd=set + flags=fullmesh + elif [ $setflags = "nofullmesh" ]; then + cmd=clear + flags=fullmesh fi ip netns exec $netns ./pm_nl_ctl $cmd $addr flags $flags fi @@ -XXX,XX +XXX,XX @@ fullmesh_tests() run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_2 slow chk_join_nr "fullmesh test 1x2, limited" 4 4 4 chk_add_nr 1 1 + + # fullmesh flag setting test + reset + ip netns exec $ns1 ./pm_nl_ctl limits 4 4 + ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags subflow + ip netns exec $ns2 ./pm_nl_ctl limits 4 4 + run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow fullmesh + chk_join_nr "fullmesh flag setting test" 2 2 2 + chk_rm_nr 1 1 + + # fullmesh flag clearing test + reset + ip netns exec $ns1 ./pm_nl_ctl limits 4 4 + ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags subflow,fullmesh + ip netns exec $ns2 ./pm_nl_ctl limits 4 4 + run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_1 slow nofullmesh + chk_join_nr "fullmesh flag clearing test" 2 2 2 + chk_rm_nr 1 1 } userspace_tests() -- 2.31.1
v4: - update patch 1 as Paolo suggested. - put the iproute2 patch into this series too. - depend on: mptcp: fix removing ids bitmap setting mptcp: fix msk traversal in mptcp_nl_cmd_set_flags() v3: - drop MPTCP_PM_ADDR_FLAG_NOFULLMESH. - clear both backup and fullmesh flags as Paolo suggested. - depend on: mptcp: fix removing ids bitmap setting mptcp: fix msk traversal in mptcp_nl_cmd_set_flags() v2: - add MPTCP_PM_ADDR_FLAG_NOFULLMESH instead of MPTCP_PM_CMD_CLEAR_FLAGS Added the fullmesh flag setting support: # pm_nl_ctl set 10.0.1.1 flags fullmesh # pm_nl_ctl set 10.0.1.1 flags nofullmesh Geliang Tang (3): mptcp: set fullmesh flag in pm_netlink selftests: mptcp: set fullmesh flag in pm_nl_ctl selftests: mptcp: add fullmesh setting tests net/mptcp/pm_netlink.c | 35 ++++++++++++++----- .../testing/selftests/net/mptcp/mptcp_join.sh | 33 +++++++++++++---- tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 7 ++-- 3 files changed, 58 insertions(+), 17 deletions(-) Geliang Tang (1): mptcp: add the fullmesh flag setting support ip/ipmptcp.c | 16 ++++++++++++---- man/man8/ip-mptcp.8 | 8 ++++++-- 2 files changed, 18 insertions(+), 6 deletions(-) -- 2.31.1
This patch added the fullmesh flag setting support in pm_netlink. If the fullmesh flag of the address is changed, remove all the related subflows, update the fullmesh flag and create subflows again. Signed-off-by: Geliang Tang <geliang.tang@suse.com> --- net/mptcp/pm_netlink.c | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index XXXXXXX..XXXXXXX 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -XXX,XX +XXX,XX @@ mptcp_nl_cmd_get_limits(struct sk_buff *skb, struct genl_info *info) return -EMSGSIZE; } -static int mptcp_nl_addr_backup(struct net *net, - struct mptcp_addr_info *addr, - u8 bkup) +static void mptcp_pm_nl_fullmesh(struct mptcp_sock *msk, + struct mptcp_addr_info *addr) +{ + struct mptcp_rm_list list = { .nr = 0 }; + + list.ids[list.nr++] = addr->id; + + mptcp_pm_nl_rm_subflow_received(msk, &list); + mptcp_pm_create_subflow_or_signal_addr(msk); +} + +static int mptcp_nl_set_flags(struct net *net, + struct mptcp_pm_addr_entry *entry) { long s_slot = 0, s_num = 0; struct mptcp_sock *msk; @@ -XXX,XX +XXX,XX @@ static int mptcp_nl_addr_backup(struct net *net, lock_sock(sk); spin_lock_bh(&msk->pm.lock); - ret = mptcp_pm_nl_mp_prio_send_ack(msk, addr, bkup); + ret = mptcp_pm_nl_mp_prio_send_ack(msk, &entry->addr, + entry->flags & MPTCP_PM_ADDR_FLAG_BACKUP); + if (!(entry->flags & MPTCP_PM_ADDR_FLAG_SIGNAL)) + mptcp_pm_nl_fullmesh(msk, &entry->addr); spin_unlock_bh(&msk->pm.lock); release_sock(sk); @@ -XXX,XX +XXX,XX @@ static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *info) struct nlattr *attr = info->attrs[MPTCP_PM_ATTR_ADDR]; struct pm_nl_pernet *pernet = genl_info_pm_nl(info); struct net *net = sock_net(skb->sk); - u8 bkup = 0, lookup_by_id = 0; + u8 lookup_by_id = 0; int ret; ret = mptcp_pm_parse_addr(attr, info, false, &addr); if (ret < 0) return ret; - if (addr.flags & MPTCP_PM_ADDR_FLAG_BACKUP) - bkup = 1; if (addr.addr.family == AF_UNSPEC) { lookup_by_id = 1; if (!addr.addr.id) @@ -XXX,XX +XXX,XX @@ static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *info) return -EINVAL; } - if (bkup) + if (addr.flags & MPTCP_PM_ADDR_FLAG_BACKUP) entry->flags |= MPTCP_PM_ADDR_FLAG_BACKUP; else entry->flags &= ~MPTCP_PM_ADDR_FLAG_BACKUP; + + if (addr.flags & MPTCP_PM_ADDR_FLAG_FULLMESH) + entry->flags |= MPTCP_PM_ADDR_FLAG_FULLMESH; + else + entry->flags &= ~MPTCP_PM_ADDR_FLAG_FULLMESH; + addr = *entry; spin_unlock_bh(&pernet->lock); - mptcp_nl_addr_backup(net, &addr.addr, bkup); + mptcp_nl_set_flags(net, &addr); return 0; } -- 2.31.1
This patch added the fullmesh flag setting and clearing support in pm_nl_ctl: # pm_nl_ctl set ip flags fullmesh # pm_nl_ctl set ip flags nofullmesh Signed-off-by: Geliang Tang <geliang.tang@suse.com> --- tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c index XXXXXXX..XXXXXXX 100644 --- a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c +++ b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c @@ -XXX,XX +XXX,XX @@ static void syntax(char *argv[]) fprintf(stderr, "\tadd [flags signal|subflow|backup|fullmesh] [id <nr>] [dev <name>] <ip>\n"); fprintf(stderr, "\tdel <id> [<ip>]\n"); fprintf(stderr, "\tget <id>\n"); - fprintf(stderr, "\tset <ip> [flags backup|nobackup]\n"); + fprintf(stderr, "\tset <ip> [flags backup|nobackup|fullmesh|nofullmesh]\n"); fprintf(stderr, "\tflush\n"); fprintf(stderr, "\tdump\n"); fprintf(stderr, "\tlimits [<rcv addr max> <subflow max>]\n"); @@ -XXX,XX +XXX,XX @@ int set_flags(int fd, int pm_family, int argc, char *argv[]) str = NULL) { if (!strcmp(tok, "backup")) flags |= MPTCP_PM_ADDR_FLAG_BACKUP; - else if (strcmp(tok, "nobackup")) + else if (!strcmp(tok, "fullmesh")) + flags |= MPTCP_PM_ADDR_FLAG_FULLMESH; + else if (strcmp(tok, "nobackup") && + strcmp(tok, "nofullmesh")) error(1, errno, "unknown flag %s", argv[arg]); } -- 2.31.1
This patch added the fullmesh setting and clearing selftests in mptcp_join.sh. Now we can set both backup and fullmesh flags, so avoid using the words 'backup' and 'bkup'. Signed-off-by: Geliang Tang <geliang.tang@suse.com> --- .../testing/selftests/net/mptcp/mptcp_join.sh | 33 +++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh index XXXXXXX..XXXXXXX 100755 --- a/tools/testing/selftests/net/mptcp/mptcp_join.sh +++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh @@ -XXX,XX +XXX,XX @@ do_transfer() addr_nr_ns1="$7" addr_nr_ns2="$8" speed="$9" - bkup="${10}" + sflags="${10}" port=$((10000+$TEST_COUNT)) TEST_COUNT=$((TEST_COUNT+1)) @@ -XXX,XX +XXX,XX @@ do_transfer() fi fi - if [ ! -z $bkup ]; then + if [ ! -z $sflags ]; then sleep 1 for netns in "$ns1" "$ns2"; do dump=(`ip netns exec $netns ./pm_nl_ctl dump`) if [ ${#dump[@]} -gt 0 ]; then addr=${dump[${#dump[@]} - 1]} - backup="ip netns exec $netns ./pm_nl_ctl set $addr flags $bkup" - $backup + ip netns exec $netns ./pm_nl_ctl set $addr flags $sflags fi done fi @@ -XXX,XX +XXX,XX @@ run_tests() addr_nr_ns1="${5:-0}" addr_nr_ns2="${6:-0}" speed="${7:-fast}" - bkup="${8:-""}" + sflags="${8:-""}" lret=0 oldin="" @@ -XXX,XX +XXX,XX @@ run_tests() fi do_transfer ${listener_ns} ${connector_ns} MPTCP MPTCP ${connect_addr} \ - ${test_linkfail} ${addr_nr_ns1} ${addr_nr_ns2} ${speed} ${bkup} + ${test_linkfail} ${addr_nr_ns1} ${addr_nr_ns2} ${speed} ${sflags} lret=$? } @@ -XXX,XX +XXX,XX @@ backup_tests() run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow nobackup chk_join_nr "single subflow, backup" 1 1 1 chk_prio_nr 0 1 + chk_rm_nr 0 1 # single address, backup reset @@ -XXX,XX +XXX,XX @@ backup_tests() chk_join_nr "single address, backup" 1 1 1 chk_add_nr 1 1 chk_prio_nr 1 0 + chk_rm_nr 0 0 } add_addr_ports_tests() @@ -XXX,XX +XXX,XX @@ fullmesh_tests() run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_2 slow chk_join_nr "fullmesh test 1x2, limited" 4 4 4 chk_add_nr 1 1 + + # set fullmesh flag + reset + ip netns exec $ns1 ./pm_nl_ctl limits 4 4 + ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags subflow + ip netns exec $ns2 ./pm_nl_ctl limits 4 4 + run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow fullmesh + chk_join_nr "set fullmesh flag test" 2 2 2 + chk_prio_nr 0 1 + chk_rm_nr 0 1 + + # set nofullmesh flag + reset + ip netns exec $ns1 ./pm_nl_ctl limits 4 4 + ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags subflow,fullmesh + ip netns exec $ns2 ./pm_nl_ctl limits 4 4 + run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_1 slow nofullmesh + chk_join_nr "set nofullmesh flag test" 2 2 2 + chk_prio_nr 0 1 + chk_rm_nr 0 1 } userspace_tests() -- 2.31.1
This patch added the fullmesh flag setting support. ip mptcp endpoint change id 1 fullmesh ip mptcp endpoint change id 1 nofullmesh Added the fullmesh flag check for the adding address too. Signed-off-by: Geliang Tang <geliang.tang@suse.com> --- v4: - put into 'fullmesh flag setting support' serirs. - No code changed. v2: - drop MPTCP_PM_ADDR_FLAG_NOFULLMESH. - rename MPTCP_PM_ADDR_FLAG_NOBACKUP to MPTCP_PM_ADDR_FLAG_NONE. - Needs to apply the patch "mptcp: add id check for deleting address" first. --- ip/ipmptcp.c | 16 ++++++++++++---- man/man8/ip-mptcp.8 | 8 ++++++-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/ip/ipmptcp.c b/ip/ipmptcp.c index XXXXXXX..XXXXXXX 100644 --- a/ip/ipmptcp.c +++ b/ip/ipmptcp.c @@ -XXX,XX +XXX,XX @@ static void usage(void) "Usage: ip mptcp endpoint add ADDRESS [ dev NAME ] [ id ID ]\n" " [ port NR ] [ FLAG-LIST ]\n" " ip mptcp endpoint delete id ID [ ADDRESS ]\n" - " ip mptcp endpoint change id ID [ backup | nobackup ]\n" + " ip mptcp endpoint change id ID [ backup | nobackup |\n" + " fullmesh | nofullmesh ]\n" " ip mptcp endpoint show [ id ID ]\n" " ip mptcp endpoint flush\n" " ip mptcp limits set [ subflows NR ] [ add_addr_accepted NR ]\n" @@ -XXX,XX +XXX,XX @@ static int genl_family = -1; GENL_REQUEST(_req, MPTCP_BUFLEN, genl_family, 0, \ MPTCP_PM_VER, _cmd, _flags) -#define MPTCP_PM_ADDR_FLAG_NOBACKUP 0x0 +#define MPTCP_PM_ADDR_FLAG_NONE 0x0 /* Mapping from argument to address flag mask */ static const struct { @@ -XXX,XX +XXX,XX @@ static const struct { { "subflow", MPTCP_PM_ADDR_FLAG_SUBFLOW }, { "backup", MPTCP_PM_ADDR_FLAG_BACKUP }, { "fullmesh", MPTCP_PM_ADDR_FLAG_FULLMESH }, - { "nobackup", MPTCP_PM_ADDR_FLAG_NOBACKUP } + { "nobackup", MPTCP_PM_ADDR_FLAG_NONE }, + { "nofullmesh", MPTCP_PM_ADDR_FLAG_NONE } }; static void print_mptcp_addr_flags(unsigned int flags) @@ -XXX,XX +XXX,XX @@ static int mptcp_parse_opt(int argc, char **argv, struct nlmsghdr *n, int cmd) ll_init_map(&rth); while (argc > 0) { if (get_flags(*argv, &flags) == 0) { + if (adding && + (flags & MPTCP_PM_ADDR_FLAG_SIGNAL) && + (flags & MPTCP_PM_ADDR_FLAG_FULLMESH)) + invarg("invalid flags\n", *argv); + /* allow changing the 'backup' flag only */ if (cmd == MPTCP_PM_CMD_SET_FLAGS && - (flags & ~MPTCP_PM_ADDR_FLAG_BACKUP)) + (flags & ~MPTCP_PM_ADDR_FLAG_BACKUP) && + (flags & ~MPTCP_PM_ADDR_FLAG_FULLMESH)) invarg("invalid flags\n", *argv); } else if (matches(*argv, "id") == 0) { diff --git a/man/man8/ip-mptcp.8 b/man/man8/ip-mptcp.8 index XXXXXXX..XXXXXXX 100644 --- a/man/man8/ip-mptcp.8 +++ b/man/man8/ip-mptcp.8 @@ -XXX,XX +XXX,XX @@ ip-mptcp \- MPTCP path manager configuration .BR "ip mptcp endpoint change id " .I ID .RB "[ " -.I BACKUP-OPT +.I CHANGE-OPT .RB "] " .ti -8 @@ -XXX,XX +XXX,XX @@ ip-mptcp \- MPTCP path manager configuration .RB "]" .ti -8 -.IR BACKUP-OPT " := [" +.IR CHANGE-OPT " := [" .B backup .RB "|" .B nobackup +.RB "|" +.B fullmesh +.RB "|" +.B nofullmesh .RB "]" .ti -8 -- 2.31.1