]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
mptcp: MIB counters for sent MP_JOIN
authorMatthieu Baerts (NGI0) <matttbe@kernel.org>
Mon, 2 Sep 2024 10:45:54 +0000 (12:45 +0200)
committerJakub Kicinski <kuba@kernel.org>
Tue, 3 Sep 2024 22:25:42 +0000 (15:25 -0700)
Recently, a few issues have been discovered around the creation of
additional subflows. Without these counters, it was difficult to point
out the reason why some subflows were not created as expected.

These counters should have been added earlier, because there is no other
simple ways to extract such information from the kernel, and understand
why subflows have not been created.

While at it, some pr_debug() have been added, just in case the errno
needs to be printed.

Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/509
Reviewed-by: Geliang Tang <geliang@kernel.org>
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Link: https://patch.msgid.link/20240902-net-next-mptcp-mib-mpjtx-misc-v1-3-d3e0f3773b90@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/mptcp/mib.c
net/mptcp/mib.h
net/mptcp/subflow.c

index 7884217f33eb2f75ea76086c7f7fbea7106b0c1a..ec0d461cb921e0ef4d79700dd3d140b9c4314e5b 100644 (file)
@@ -25,6 +25,10 @@ static const struct snmp_mib mptcp_snmp_list[] = {
        SNMP_MIB_ITEM("MPJoinSynAckHMacFailure", MPTCP_MIB_JOINSYNACKMAC),
        SNMP_MIB_ITEM("MPJoinAckRx", MPTCP_MIB_JOINACKRX),
        SNMP_MIB_ITEM("MPJoinAckHMacFailure", MPTCP_MIB_JOINACKMAC),
+       SNMP_MIB_ITEM("MPJoinSynTx", MPTCP_MIB_JOINSYNTX),
+       SNMP_MIB_ITEM("MPJoinSynTxCreatSkErr", MPTCP_MIB_JOINSYNTXCREATSKERR),
+       SNMP_MIB_ITEM("MPJoinSynTxBindErr", MPTCP_MIB_JOINSYNTXBINDERR),
+       SNMP_MIB_ITEM("MPJoinSynTxConnectErr", MPTCP_MIB_JOINSYNTXCONNECTERR),
        SNMP_MIB_ITEM("DSSNotMatching", MPTCP_MIB_DSSNOMATCH),
        SNMP_MIB_ITEM("InfiniteMapTx", MPTCP_MIB_INFINITEMAPTX),
        SNMP_MIB_ITEM("InfiniteMapRx", MPTCP_MIB_INFINITEMAPRX),
index 66aa67f49d032c75e2821ed69be24b41e30a956a..d68136f93dac5dfb9cd57c44b08e2223f87702ed 100644 (file)
@@ -20,6 +20,10 @@ enum linux_mptcp_mib_field {
        MPTCP_MIB_JOINSYNACKMAC,        /* HMAC was wrong on SYN/ACK + MP_JOIN */
        MPTCP_MIB_JOINACKRX,            /* Received an ACK + MP_JOIN */
        MPTCP_MIB_JOINACKMAC,           /* HMAC was wrong on ACK + MP_JOIN */
+       MPTCP_MIB_JOINSYNTX,            /* Sending a SYN + MP_JOIN */
+       MPTCP_MIB_JOINSYNTXCREATSKERR,  /* Not able to create a socket when sending a SYN + MP_JOIN */
+       MPTCP_MIB_JOINSYNTXBINDERR,     /* Not able to bind() the address when sending a SYN + MP_JOIN */
+       MPTCP_MIB_JOINSYNTXCONNECTERR,  /* Not able to connect() when sending a SYN + MP_JOIN */
        MPTCP_MIB_DSSNOMATCH,           /* Received a new mapping that did not match the previous one */
        MPTCP_MIB_INFINITEMAPTX,        /* Sent an infinite mapping */
        MPTCP_MIB_INFINITEMAPRX,        /* Received an infinite mapping */
index 0796122c9467025ac39bc9b7f7bc722fef57513f..b9b14e75e8c2ed62f27c61cb8cba0d6ca75f1eba 100644 (file)
@@ -1579,12 +1579,17 @@ int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_pm_local *local,
        u32 remote_token;
        int addrlen;
 
+       /* The userspace PM sent the request too early? */
        if (!mptcp_is_fully_established(sk))
                goto err_out;
 
        err = mptcp_subflow_create_socket(sk, local->addr.family, &sf);
-       if (err)
+       if (err) {
+               MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_JOINSYNTXCREATSKERR);
+               pr_debug("msk=%p local=%d remote=%d create sock error: %d\n",
+                        msk, local_id, remote_id, err);
                goto err_out;
+       }
 
        ssk = sf->sk;
        subflow = mptcp_subflow_ctx(ssk);
@@ -1619,8 +1624,12 @@ int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_pm_local *local,
 #endif
        ssk->sk_bound_dev_if = local->ifindex;
        err = kernel_bind(sf, (struct sockaddr *)&addr, addrlen);
-       if (err)
+       if (err) {
+               MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_JOINSYNTXBINDERR);
+               pr_debug("msk=%p local=%d remote=%d bind error: %d\n",
+                        msk, local_id, remote_id, err);
                goto failed;
+       }
 
        mptcp_crypto_key_sha(subflow->remote_key, &remote_token, NULL);
        pr_debug("msk=%p remote_token=%u local_id=%d remote_id=%d\n", msk,
@@ -1635,8 +1644,14 @@ int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_pm_local *local,
        sock_hold(ssk);
        list_add_tail(&subflow->node, &msk->conn_list);
        err = kernel_connect(sf, (struct sockaddr *)&addr, addrlen, O_NONBLOCK);
-       if (err && err != -EINPROGRESS)
+       if (err && err != -EINPROGRESS) {
+               MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_JOINSYNTXCONNECTERR);
+               pr_debug("msk=%p local=%d remote=%d connect error: %d\n",
+                        msk, local_id, remote_id, err);
                goto failed_unlink;
+       }
+
+       MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_JOINSYNTX);
 
        /* discard the subflow socket */
        mptcp_sock_graft(ssk, sk->sk_socket);