* [PATCH mptcp-next v3 0/3] add pm listener events
@ 2022-11-12 9:28 Geliang Tang
2022-11-12 9:28 ` [PATCH mptcp-next v3 1/3] mptcp: " Geliang Tang
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Geliang Tang @ 2022-11-12 9:28 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
v3:
- add selftests.
v2:
- send created event from mptcp_listen.
- add a new patch, use entry->lsk directly.
Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/313
Geliang Tang (3):
mptcp: add pm listener events
selftests: mptcp: update userspace pm tests
selftests: mptcp: add pm_listener tests
include/uapi/linux/mptcp.h | 9 ++
net/mptcp/pm_netlink.c | 57 ++++++++++++
net/mptcp/protocol.c | 3 +
net/mptcp/protocol.h | 2 +
.../testing/selftests/net/mptcp/mptcp_join.sh | 72 ++++++++++++++-
.../selftests/net/mptcp/userspace_pm.sh | 89 ++++++++++++++++++-
6 files changed, 228 insertions(+), 4 deletions(-)
--
2.35.3
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH mptcp-next v3 1/3] mptcp: add pm listener events
2022-11-12 9:28 [PATCH mptcp-next v3 0/3] add pm listener events Geliang Tang
@ 2022-11-12 9:28 ` Geliang Tang
2022-11-12 9:28 ` [PATCH mptcp-next v3 2/3] selftests: mptcp: update userspace pm tests Geliang Tang
2022-11-12 9:28 ` [PATCH mptcp-next v3 3/3] selftests: mptcp: add pm_listener tests Geliang Tang
2 siblings, 0 replies; 5+ messages in thread
From: Geliang Tang @ 2022-11-12 9:28 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch adds MPTCP netlink events for PM listening socket create and
close.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
include/uapi/linux/mptcp.h | 9 ++++++
net/mptcp/pm_netlink.c | 57 ++++++++++++++++++++++++++++++++++++++
net/mptcp/protocol.c | 3 ++
net/mptcp/protocol.h | 2 ++
4 files changed, 71 insertions(+)
diff --git a/include/uapi/linux/mptcp.h b/include/uapi/linux/mptcp.h
index dfe19bf13f4c..32af2d278cb4 100644
--- a/include/uapi/linux/mptcp.h
+++ b/include/uapi/linux/mptcp.h
@@ -160,6 +160,12 @@ struct mptcp_info {
* daddr4 | daddr6, sport, dport, backup, if_idx
* [, error]
* The priority of a subflow has changed. 'error' should not be set.
+ *
+ * MPTCP_EVENT_LISTENER_CREATED: family, sport, saddr4 | saddr6
+ * A new PM listener is created.
+ *
+ * MPTCP_EVENT_LISTENER_CLOSED: family, sport, saddr4 | saddr6
+ * A PM listener is closed.
*/
enum mptcp_event_type {
MPTCP_EVENT_UNSPEC = 0,
@@ -174,6 +180,9 @@ enum mptcp_event_type {
MPTCP_EVENT_SUB_CLOSED = 11,
MPTCP_EVENT_SUB_PRIORITY = 13,
+
+ MPTCP_EVENT_LISTENER_CREATED = 15,
+ MPTCP_EVENT_LISTENER_CLOSED = 16,
};
enum mptcp_event_attr {
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index 08806f97c8fb..685240f6bc80 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -1026,6 +1026,8 @@ static int mptcp_pm_nl_create_listen_socket(struct sock *sk,
if (err)
return err;
+ mptcp_event_pm_listener(ssock->sk, MPTCP_EVENT_LISTENER_CREATED);
+
return 0;
}
@@ -2149,6 +2151,58 @@ void mptcp_event_addr_announced(const struct sock *ssk,
kfree_skb(skb);
}
+void mptcp_event_pm_listener(const struct sock *ssk,
+ enum mptcp_event_type event)
+{
+ const struct inet_sock *issk = inet_sk(ssk);
+ struct net *net = sock_net(ssk);
+ struct nlmsghdr *nlh;
+ struct sk_buff *skb;
+
+ if (!genl_has_listeners(&mptcp_genl_family, net, MPTCP_PM_EV_GRP_OFFSET))
+ return;
+
+ skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
+ if (!skb)
+ return;
+
+ nlh = genlmsg_put(skb, 0, 0, &mptcp_genl_family, 0, event);
+ if (!nlh)
+ goto nla_put_failure;
+
+ if (nla_put_u16(skb, MPTCP_ATTR_FAMILY, ssk->sk_family))
+ goto nla_put_failure;
+
+ if (nla_put_be16(skb, MPTCP_ATTR_SPORT, issk->inet_sport))
+ goto nla_put_failure;
+
+ switch (ssk->sk_family) {
+ case AF_INET:
+ if (nla_put_in_addr(skb, MPTCP_ATTR_SADDR4, issk->inet_saddr))
+ goto nla_put_failure;
+ break;
+#if IS_ENABLED(CONFIG_MPTCP_IPV6)
+ case AF_INET6: {
+ const struct ipv6_pinfo *np = inet6_sk(ssk);
+
+ if (nla_put_in6_addr(skb, MPTCP_ATTR_SADDR6, &np->saddr))
+ goto nla_put_failure;
+ break;
+ }
+#endif
+ default:
+ WARN_ON_ONCE(1);
+ goto nla_put_failure;
+ }
+
+ genlmsg_end(skb, nlh);
+ mptcp_nl_mcast_send(net, skb, GFP_ATOMIC);
+ return;
+
+nla_put_failure:
+ kfree_skb(skb);
+}
+
void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk,
const struct sock *ssk, gfp_t gfp)
{
@@ -2194,6 +2248,9 @@ void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk,
if (mptcp_event_sub_closed(skb, msk, ssk) < 0)
goto nla_put_failure;
break;
+ case MPTCP_EVENT_LISTENER_CREATED:
+ case MPTCP_EVENT_LISTENER_CLOSED:
+ break;
}
genlmsg_end(skb, nlh);
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index 9e5b3cf27a45..42dae4c0d8ce 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -2369,6 +2369,7 @@ static void __mptcp_close_ssk(struct sock *sk, struct sock *ssk,
tcp_set_state(ssk, TCP_CLOSE);
mptcp_subflow_queue_clean(ssk);
inet_csk_listen_stop(ssk);
+ mptcp_event_pm_listener(ssk, MPTCP_EVENT_LISTENER_CLOSED);
}
__tcp_close(ssk, 0);
@@ -3685,6 +3686,8 @@ static int mptcp_listen(struct socket *sock, int backlog)
if (!err)
mptcp_copy_inaddrs(sock->sk, ssock->sk);
+ mptcp_event_pm_listener(ssock->sk, MPTCP_EVENT_LISTENER_CREATED);
+
unlock:
release_sock(sock->sk);
return err;
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 4780fb5a8087..5c9bb0d5f28a 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -844,6 +844,8 @@ void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk,
const struct sock *ssk, gfp_t gfp);
void mptcp_event_addr_announced(const struct sock *ssk, const struct mptcp_addr_info *info);
void mptcp_event_addr_removed(const struct mptcp_sock *msk, u8 id);
+void mptcp_event_pm_listener(const struct sock *ssk,
+ enum mptcp_event_type event);
bool mptcp_userspace_pm_active(const struct mptcp_sock *msk);
// Fast Open Mechanism functions begin
--
2.35.3
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH mptcp-next v3 2/3] selftests: mptcp: update userspace pm tests
2022-11-12 9:28 [PATCH mptcp-next v3 0/3] add pm listener events Geliang Tang
2022-11-12 9:28 ` [PATCH mptcp-next v3 1/3] mptcp: " Geliang Tang
@ 2022-11-12 9:28 ` Geliang Tang
2022-11-12 9:28 ` [PATCH mptcp-next v3 3/3] selftests: mptcp: add pm_listener tests Geliang Tang
2 siblings, 0 replies; 5+ messages in thread
From: Geliang Tang @ 2022-11-12 9:28 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
Some userspace pm tests failed since pm listener events have been added.
Fix them.
patch 3 in "add pm listener events" series.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
tools/testing/selftests/net/mptcp/mptcp_join.sh | 3 ++-
tools/testing/selftests/net/mptcp/userspace_pm.sh | 7 ++++---
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
index 2a402b3b771f..f10ef65a7009 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
@@ -830,7 +830,8 @@ do_transfer()
if [ $userspace_pm -eq 0 ]; then
pm_nl_add_endpoint $ns1 $addr flags signal
else
- tk=$(sed -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q' "$evts_ns1")
+ tk=$(grep "type:1," "$evts_ns1" |
+ sed -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q')
ip netns exec ${listener_ns} ./pm_nl_ctl ann $addr token $tk id $id
sleep 1
ip netns exec ${listener_ns} ./pm_nl_ctl rem token $tk id $id
diff --git a/tools/testing/selftests/net/mptcp/userspace_pm.sh b/tools/testing/selftests/net/mptcp/userspace_pm.sh
index 5dfc3ee74b98..08a88ea47a29 100755
--- a/tools/testing/selftests/net/mptcp/userspace_pm.sh
+++ b/tools/testing/selftests/net/mptcp/userspace_pm.sh
@@ -172,9 +172,10 @@ make_connection()
client_serverside=$(sed --unbuffered -n 's/.*\(server_side:\)\([[:digit:]]*\).*$/\2/p;q'\
"$client_evts")
kill_wait $server_evts_pid
- server_token=$(sed --unbuffered -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q' "$server_evts")
- server_serverside=$(sed --unbuffered -n 's/.*\(server_side:\)\([[:digit:]]*\).*$/\2/p;q'\
- "$server_evts")
+ server_token=$(grep "type:1," "$server_evts" |
+ sed --unbuffered -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q')
+ server_serverside=$(grep "type:1," "$server_evts" |
+ sed --unbuffered -n 's/.*\(server_side:\)\([[:digit:]]*\).*$/\2/p;q')
rm -f "$client_evts" "$server_evts" "$file"
if [ "$client_token" != "" ] && [ "$server_token" != "" ] && [ "$client_serverside" = 0 ] &&
--
2.35.3
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH mptcp-next v3 3/3] selftests: mptcp: add pm_listener tests
2022-11-12 9:28 [PATCH mptcp-next v3 0/3] add pm listener events Geliang Tang
2022-11-12 9:28 ` [PATCH mptcp-next v3 1/3] mptcp: " Geliang Tang
2022-11-12 9:28 ` [PATCH mptcp-next v3 2/3] selftests: mptcp: update userspace pm tests Geliang Tang
@ 2022-11-12 9:28 ` Geliang Tang
2022-11-12 11:08 ` selftests: mptcp: add pm_listener tests: Tests Results MPTCP CI
2 siblings, 1 reply; 5+ messages in thread
From: Geliang Tang @ 2022-11-12 9:28 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
Add pm_listener selftests for mptcp_join.sh and userspace_pm.sh.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
.../testing/selftests/net/mptcp/mptcp_join.sh | 69 ++++++++++++++++
.../selftests/net/mptcp/userspace_pm.sh | 82 +++++++++++++++++++
2 files changed, 151 insertions(+)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
index f10ef65a7009..0d085396405d 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
@@ -2509,6 +2509,51 @@ backup_tests()
fi
}
+AF_INET=2
+AF_INET6=10
+
+verify_listener_events()
+{
+ local evt=$1
+ local e_type=$2
+ local e_family=$3
+ local e_saddr=$4
+ local e_sport=$5
+ local type
+ local family
+ local saddr
+ local sport
+
+ if [ "$e_type" = 15 ]; then
+ stdbuf -o0 -e0 printf "\t\t\t\t\t CREATE_LISTENER %s:%s"\
+ "$e_saddr" "$e_sport"
+ elif [ "$e_type" = 16 ]; then
+ stdbuf -o0 -e0 printf "\t\t\t\t\t CLOSE_LISTENER %s:%s "\
+ "$e_saddr" "$e_sport"
+ fi
+
+ type=$(grep "type:$e_type," "$evt" |
+ sed --unbuffered -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q')
+ family=$(grep "type:$e_type," "$evt" |
+ sed --unbuffered -n 's/.*\(family:\)\([[:digit:]]*\).*$/\2/p;q')
+ sport=$(grep "type:$e_type," "$evt" |
+ sed --unbuffered -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q')
+ if [ "$family" = "$AF_INET6" ]; then
+ saddr=$(grep "type:$e_type," "$evt" |
+ sed --unbuffered -n 's/.*\(saddr6:\)\([0-9a-f:.]*\).*$/\2/p;q')
+ else
+ saddr=$(grep "type:$e_type," "$evt" |
+ sed --unbuffered -n 's/.*\(saddr4:\)\([0-9.]*\).*$/\2/p;q')
+ fi
+
+ if [ "$type" = "$e_type" ] && [ "$family" = "$e_family" ] &&
+ [ "$saddr" = "$e_saddr" ] && [ "$sport" = "$e_sport" ]; then
+ stdbuf -o0 -e0 printf "[ ok ]\n"
+ return 0
+ fi
+ stdbuf -o0 -e0 printf "[fail]\n"
+}
+
add_addr_ports_tests()
{
# signal address with port
@@ -2589,6 +2634,30 @@ add_addr_ports_tests()
chk_join_nr 2 2 2
chk_add_nr 2 2 2
fi
+
+ # pm listener events
+ if reset "pm listener events"; then
+ local evts
+ local pid
+
+ evts=$(mktemp)
+ :> "$evts"
+ ip netns exec $ns1 ./pm_nl_ctl events >> "$evts" 2>&1 &
+ pid=$!
+
+ pm_nl_set_limits $ns1 0 1
+ pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
+ pm_nl_set_limits $ns2 1 1
+ run_tests $ns1 $ns2 10.0.1.1 0 -1 0 slow
+ chk_join_nr 1 1 1
+ chk_add_nr 1 1 1
+ chk_rm_nr 1 1 invert
+
+ verify_listener_events "$evts" 15 "$AF_INET" "10.0.2.1" "10100"
+ verify_listener_events "$evts" 16 "$AF_INET" "10.0.2.1" "10100"
+ kill_wait $pid
+ rm -rf $evts
+ fi
}
syncookies_tests()
diff --git a/tools/testing/selftests/net/mptcp/userspace_pm.sh b/tools/testing/selftests/net/mptcp/userspace_pm.sh
index 08a88ea47a29..73d2297b5824 100755
--- a/tools/testing/selftests/net/mptcp/userspace_pm.sh
+++ b/tools/testing/selftests/net/mptcp/userspace_pm.sh
@@ -11,6 +11,8 @@ ANNOUNCED=6 # MPTCP_EVENT_ANNOUNCED
REMOVED=7 # MPTCP_EVENT_REMOVED
SUB_ESTABLISHED=10 # MPTCP_EVENT_SUB_ESTABLISHED
SUB_CLOSED=11 # MPTCP_EVENT_SUB_CLOSED
+LISTENER_CREATED=15
+LISTENER_CLOSED=16
AF_INET=2
AF_INET6=10
@@ -808,11 +810,91 @@ test_prio()
fi
}
+verify_listener_events()
+{
+ local evt=$1
+ local e_type=$2
+ local e_family=$3
+ local e_saddr=$4
+ local e_sport=$5
+ local type
+ local family
+ local saddr
+ local sport
+
+ if [ "$e_type" = "$LISTENER_CREATED" ]; then
+ stdbuf -o0 -e0 printf "CREATE_LISTENER %s:%s\t\t\t\t\t"\
+ "$e_saddr" "$e_sport"
+ elif [ "$e_type" = "$LISTENER_CLOSED" ]; then
+ stdbuf -o0 -e0 printf "CLOSE_LISTENER %s:%s\t\t\t\t\t"\
+ "$e_saddr" "$e_sport"
+ fi
+
+ type=$(grep "type:$e_type," "$evt" |
+ sed --unbuffered -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q')
+ family=$(grep "type:$e_type," "$evt" |
+ sed --unbuffered -n 's/.*\(family:\)\([[:digit:]]*\).*$/\2/p;q')
+ sport=$(grep "type:$e_type," "$evt" |
+ sed --unbuffered -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q')
+ if [ "$family" = "$AF_INET6" ]; then
+ saddr=$(grep "type:$e_type," "$evt" |
+ sed --unbuffered -n 's/.*\(saddr6:\)\([0-9a-f:.]*\).*$/\2/p;q')
+ else
+ saddr=$(grep "type:$e_type," "$evt" |
+ sed --unbuffered -n 's/.*\(saddr4:\)\([0-9.]*\).*$/\2/p;q')
+ fi
+
+ if [ "$type" = "$e_type" ] && [ "$family" = "$e_family" ] &&
+ [ "$saddr" = "$e_saddr" ] && [ "$sport" = "$e_sport" ]; then
+ stdbuf -o0 -e0 printf "[OK]\n"
+ return 0
+ fi
+ stdbuf -o0 -e0 printf "[FAIL]\n"
+ exit 1
+}
+
+test_listener()
+{
+ local evts
+ evts=$(mktemp)
+ # Capture events on the network namespace running the server
+ :>"$evts"
+ ip netns exec "$ns2" ./pm_nl_ctl events >> "$evts" 2>&1 &
+ evts_pid=$!
+ sleep 0.5
+
+ # Attempt to add a listener at 10.0.2.2:<subflow-port>
+ ip netns exec "$ns2" ./pm_nl_ctl listen 10.0.2.2\
+ "$client4_port" > /dev/null 2>&1 &
+ local listener_pid=$!
+
+ verify_listener_events "$evts" 15 "$AF_INET" "10.0.2.2" "$client4_port"
+
+ # ADD_ADDR from client to server machine reusing the subflow port
+ ip netns exec "$ns2" ./pm_nl_ctl ann 10.0.2.2 token "$client4_token" id\
+ $client_addr_id > /dev/null 2>&1
+ sleep 0.5
+
+ # CREATE_SUBFLOW from server to client machine
+ ip netns exec "$ns1" ./pm_nl_ctl csf lip 10.0.2.1 lid 23 rip 10.0.2.2\
+ rport "$client4_port" token "$server4_token" > /dev/null 2>&1
+ sleep 0.5
+
+ # Delete the listener from the client ns, if one was created
+ kill_wait $listener_pid
+
+ verify_listener_events "$evts" 16 "$AF_INET" "10.0.2.2" "$client4_port"
+
+ kill_wait $evts_pid
+ rm -f "$evts"
+}
+
make_connection
make_connection "v6"
test_announce
test_remove
test_subflows
test_prio
+test_listener
exit 0
--
2.35.3
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: selftests: mptcp: add pm_listener tests: Tests Results
2022-11-12 9:28 ` [PATCH mptcp-next v3 3/3] selftests: mptcp: add pm_listener tests Geliang Tang
@ 2022-11-12 11:08 ` MPTCP CI
0 siblings, 0 replies; 5+ messages in thread
From: MPTCP CI @ 2022-11-12 11:08 UTC (permalink / raw)
To: Geliang Tang; +Cc: mptcp
Hi Geliang,
Thank you for your modifications, that's great!
Our CI did some validations and here is its report:
- KVM Validation: normal:
- Success! ✅:
- Task: https://cirrus-ci.com/task/6123235083812864
- Summary: https://api.cirrus-ci.com/v1/artifact/task/6123235083812864/summary/summary.txt
- KVM Validation: debug:
- Unstable: 1 failed test(s): selftest_mptcp_join 🔴:
- Task: https://cirrus-ci.com/task/5560285130391552
- Summary: https://api.cirrus-ci.com/v1/artifact/task/5560285130391552/summary/summary.txt
Initiator: Patchew Applier
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/a10cffea84ee
If there are some issues, you can reproduce them using the same environment as
the one used by the CI thanks to a docker image, e.g.:
$ cd [kernel source code]
$ docker run -v "${PWD}:${PWD}:rw" -w "${PWD}" --privileged --rm -it \
--pull always mptcp/mptcp-upstream-virtme-docker:latest \
auto-debug
For more details:
https://github.com/multipath-tcp/mptcp-upstream-virtme-docker
Please note that despite all the efforts that have been already done to have a
stable tests suite when executed on a public CI like here, it is possible some
reported issues are not due to your modifications. Still, do not hesitate to
help us improve that ;-)
Cheers,
MPTCP GH Action bot
Bot operated by Matthieu Baerts (Tessares)
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2022-11-12 11:08 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-11-12 9:28 [PATCH mptcp-next v3 0/3] add pm listener events Geliang Tang
2022-11-12 9:28 ` [PATCH mptcp-next v3 1/3] mptcp: " Geliang Tang
2022-11-12 9:28 ` [PATCH mptcp-next v3 2/3] selftests: mptcp: update userspace pm tests Geliang Tang
2022-11-12 9:28 ` [PATCH mptcp-next v3 3/3] selftests: mptcp: add pm_listener tests Geliang Tang
2022-11-12 11:08 ` selftests: mptcp: add pm_listener tests: Tests Results MPTCP CI
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.