* [PATCH mptcp-next v2 0/3] fullmesh flag setting support
@ 2022-01-11 2:42 Geliang Tang
2022-01-11 2:42 ` [PATCH mptcp-next v2 1/3] mptcp: set fullmesh flag in pm_netlink Geliang Tang
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Geliang Tang @ 2022-01-11 2:42 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
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
include/uapi/linux/mptcp.h | 1 +
net/mptcp/pm_netlink.c | 27 +++++++++++++-----
.../testing/selftests/net/mptcp/mptcp_join.sh | 28 +++++++++++++++----
tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 6 +++-
4 files changed, 49 insertions(+), 13 deletions(-)
--
2.31.1
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH mptcp-next v2 1/3] mptcp: set fullmesh flag in pm_netlink
2022-01-11 2:42 [PATCH mptcp-next v2 0/3] fullmesh flag setting support Geliang Tang
@ 2022-01-11 2:42 ` Geliang Tang
2022-01-11 9:32 ` Paolo Abeni
2022-01-11 2:42 ` [PATCH mptcp-next v2 2/3] selftests: mptcp: set fullmesh flag in pm_nl_ctl Geliang Tang
2022-01-11 2:42 ` [PATCH mptcp-next v2 3/3] selftests: mptcp: add fullmesh setting tests Geliang Tang
2 siblings, 1 reply; 5+ messages in thread
From: Geliang Tang @ 2022-01-11 2:42 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
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>
---
include/uapi/linux/mptcp.h | 1 +
net/mptcp/pm_netlink.c | 27 ++++++++++++++++++++-------
2 files changed, 21 insertions(+), 7 deletions(-)
diff --git a/include/uapi/linux/mptcp.h b/include/uapi/linux/mptcp.h
index f106a3941cdf..16758e124e51 100644
--- a/include/uapi/linux/mptcp.h
+++ b/include/uapi/linux/mptcp.h
@@ -81,6 +81,7 @@ enum {
#define MPTCP_PM_ADDR_FLAG_SUBFLOW (1 << 1)
#define MPTCP_PM_ADDR_FLAG_BACKUP (1 << 2)
#define MPTCP_PM_ADDR_FLAG_FULLMESH (1 << 3)
+#define MPTCP_PM_ADDR_FLAG_NOFULLMESH (1 << 4)
enum {
MPTCP_PM_CMD_UNSPEC,
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index 47ad00d01cf2..1cdaa774cafc 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -1743,13 +1743,17 @@ static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *info)
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 fullmesh = 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)
+ if (addr.flags & MPTCP_PM_ADDR_FLAG_FULLMESH ||
+ addr.flags & MPTCP_PM_ADDR_FLAG_NOFULLMESH)
+ fullmesh = 1;
+ else if (addr.flags & MPTCP_PM_ADDR_FLAG_BACKUP)
bkup = 1;
if (addr.addr.family == AF_UNSPEC) {
lookup_by_id = 1;
@@ -1760,12 +1764,21 @@ 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 (fullmesh) {
+ mptcp_nl_remove_subflow_and_signal_addr(net, &entry->addr);
+ if (addr.flags & MPTCP_PM_ADDR_FLAG_FULLMESH)
+ entry->flags |= MPTCP_PM_ADDR_FLAG_FULLMESH;
+ else
+ entry->flags &= ~MPTCP_PM_ADDR_FLAG_FULLMESH;
+ mptcp_nl_add_subflow_or_signal_addr(net);
+ } else {
+ 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;
+ }
}
}
--
2.31.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH mptcp-next v2 2/3] selftests: mptcp: set fullmesh flag in pm_nl_ctl
2022-01-11 2:42 [PATCH mptcp-next v2 0/3] fullmesh flag setting support Geliang Tang
2022-01-11 2:42 ` [PATCH mptcp-next v2 1/3] mptcp: set fullmesh flag in pm_netlink Geliang Tang
@ 2022-01-11 2:42 ` Geliang Tang
2022-01-11 2:42 ` [PATCH mptcp-next v2 3/3] selftests: mptcp: add fullmesh setting tests Geliang Tang
2 siblings, 0 replies; 5+ messages in thread
From: Geliang Tang @ 2022-01-11 2:42 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
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 | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c
index 354784512748..db8b9fdb49d6 100644
--- a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c
+++ b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c
@@ -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, "\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");
@@ -709,6 +709,10 @@ 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, "fullmesh"))
+ flags |= MPTCP_PM_ADDR_FLAG_FULLMESH;
+ else if (!strcmp(tok, "nofullmesh"))
+ flags |= MPTCP_PM_ADDR_FLAG_NOFULLMESH;
else if (strcmp(tok, "nobackup"))
error(1, errno,
"unknown flag %s", argv[arg]);
--
2.31.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH mptcp-next v2 3/3] selftests: mptcp: add fullmesh setting tests
2022-01-11 2:42 [PATCH mptcp-next v2 0/3] fullmesh flag setting support Geliang Tang
2022-01-11 2:42 ` [PATCH mptcp-next v2 1/3] mptcp: set fullmesh flag in pm_netlink Geliang Tang
2022-01-11 2:42 ` [PATCH mptcp-next v2 2/3] selftests: mptcp: set fullmesh flag in pm_nl_ctl Geliang Tang
@ 2022-01-11 2:42 ` Geliang Tang
2 siblings, 0 replies; 5+ messages in thread
From: Geliang Tang @ 2022-01-11 2:42 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
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 | 28 +++++++++++++++----
1 file changed, 23 insertions(+), 5 deletions(-)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
index e48ce23d2386..2868e2657ca1 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
@@ -289,7 +289,7 @@ 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))
@@ -461,13 +461,13 @@ 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"
$backup
fi
done
@@ -545,7 +545,7 @@ run_tests()
addr_nr_ns1="${5:-0}"
addr_nr_ns2="${6:-0}"
speed="${7:-fast}"
- bkup="${8:-""}"
+ sflags="${8:-""}"
lret=0
oldin=""
@@ -574,7 +574,7 @@ 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=$?
}
@@ -1921,6 +1921,24 @@ 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_rm_nr 1 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_rm_nr 1 1
}
userspace_tests()
--
2.31.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH mptcp-next v2 1/3] mptcp: set fullmesh flag in pm_netlink
2022-01-11 2:42 ` [PATCH mptcp-next v2 1/3] mptcp: set fullmesh flag in pm_netlink Geliang Tang
@ 2022-01-11 9:32 ` Paolo Abeni
0 siblings, 0 replies; 5+ messages in thread
From: Paolo Abeni @ 2022-01-11 9:32 UTC (permalink / raw)
To: Geliang Tang, mptcp
Hello,
On Tue, 2022-01-11 at 10:42 +0800, Geliang Tang wrote:
> 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>
> ---
> include/uapi/linux/mptcp.h | 1 +
> net/mptcp/pm_netlink.c | 27 ++++++++++++++++++++-------
> 2 files changed, 21 insertions(+), 7 deletions(-)
>
> diff --git a/include/uapi/linux/mptcp.h b/include/uapi/linux/mptcp.h
> index f106a3941cdf..16758e124e51 100644
> --- a/include/uapi/linux/mptcp.h
> +++ b/include/uapi/linux/mptcp.h
> @@ -81,6 +81,7 @@ enum {
> #define MPTCP_PM_ADDR_FLAG_SUBFLOW (1 << 1)
> #define MPTCP_PM_ADDR_FLAG_BACKUP (1 << 2)
> #define MPTCP_PM_ADDR_FLAG_FULLMESH (1 << 3)
> +#define MPTCP_PM_ADDR_FLAG_NOFULLMESH (1 << 4)
>
> enum {
> MPTCP_PM_CMD_UNSPEC,
> diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
> index 47ad00d01cf2..1cdaa774cafc 100644
> --- a/net/mptcp/pm_netlink.c
> +++ b/net/mptcp/pm_netlink.c
> @@ -1743,13 +1743,17 @@ static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *info)
> 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 fullmesh = 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)
> + if (addr.flags & MPTCP_PM_ADDR_FLAG_FULLMESH ||
> + addr.flags & MPTCP_PM_ADDR_FLAG_NOFULLMESH)
> + fullmesh = 1;
> + else if (addr.flags & MPTCP_PM_ADDR_FLAG_BACKUP)
> bkup = 1;
if I read correctly this is somewhat halfway the two ideas discussed
yday and additionally allows to change either the backup or the
fullmesh flag, but not both simultanusly. I think we we can support
changing both flags with a single command and I think it's better to
stuck with one schema. Just:
if (addr.flags & MPTCP_PM_ADDR_FLAG_FULLMESH)
fullmesh = 1;
> if (addr.addr.family == AF_UNSPEC) {
> lookup_by_id = 1;
> @@ -1760,12 +1764,21 @@ 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) {
Here there is a pre-existing problem, I think. 'local_addr_list' is
protected by pernet->lock or RCU, but this chunk of code does not hold
any of them. The fix will conflict with this series.
> 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;
I think here it would be better to expand the mptcp_nl_addr_backup()
helper to cope with fullmesh, too (so we traverse the msk socket hash
only once);
static void mptcp_nl_addr_flags(struct net *net,
struct mptcp_addr_info *addr,
u8 bkup, u8 fullmesh)
{
long s_slot = 0, s_num = 0;
struct mptcp_sock *msk;
while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) {
struct sock *sk = (struct sock *)msk;
if (list_empty(&msk->conn_list) || mptcp_pm_is_userspace(msk))
goto next;
lock_sock(sk);
spin_lock_bh(&msk->pm.lock);
mptcp_pm_nl_mp_prio_send_ack(msk, addr, bkup);
/* this should create/delete subflows as needed.
if 'addr' is MPTCP_PM_ADDR_FLAG_SIGNAL is a no-op
*/
mptcp_pm_nl_fullmesh(msk, addr, fullmesh);
spin_unlock_bh(&msk->pm.lock);
release_sock(sk);
next:
sock_put(sk);
cond_resched();
}
}
> + if (fullmesh) {
> + mptcp_nl_remove_subflow_and_signal_addr(net, &entry->addr);
> + if (addr.flags & MPTCP_PM_ADDR_FLAG_FULLMESH)
> + entry->flags |= MPTCP_PM_ADDR_FLAG_FULLMESH;
> + else
> + entry->flags &= ~MPTCP_PM_ADDR_FLAG_FULLMESH;
> + mptcp_nl_add_subflow_or_signal_addr(net);
> + } else {
> + 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;
> + }
> }
> }
>
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2022-01-11 9:32 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-01-11 2:42 [PATCH mptcp-next v2 0/3] fullmesh flag setting support Geliang Tang
2022-01-11 2:42 ` [PATCH mptcp-next v2 1/3] mptcp: set fullmesh flag in pm_netlink Geliang Tang
2022-01-11 9:32 ` Paolo Abeni
2022-01-11 2:42 ` [PATCH mptcp-next v2 2/3] selftests: mptcp: set fullmesh flag in pm_nl_ctl Geliang Tang
2022-01-11 2:42 ` [PATCH mptcp-next v2 3/3] selftests: mptcp: add fullmesh setting tests Geliang Tang
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.