mptcp: add the mibs for ADD_ADDR with port
authorGeliang Tang <geliangtang@gmail.com>
Mon, 1 Feb 2021 23:09:19 +0000 (15:09 -0800)
committerJakub Kicinski <kuba@kernel.org>
Wed, 3 Feb 2021 02:37:20 +0000 (18:37 -0800)
This patch adds the mibs for ADD_ADDR with port:

MPTCP_MIB_PORTADD for received ADD_ADDR suboption with a port number.

MPTCP_MIB_PORTSYNRX, MPTCP_MIB_PORTSYNACKRX, MPTCP_MIB_PORTACKRX, for
received MP_JOIN's SYN or SYN/ACK or ACK with a port number which is
different from the msk's port number.

MPTCP_MIB_MISMATCHPORTSYNRX and MPTCP_MIB_MISMATCHPORTACKRX, for
received SYN or ACK MP_JOIN with a mismatched port-number.

Signed-off-by: Geliang Tang <geliangtang@gmail.com>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/mptcp/mib.c
net/mptcp/mib.h
net/mptcp/options.c
net/mptcp/subflow.c

index 8ca196489893f3fd12853834567f20d3ebfe43bc..3780c29c321d1152e1e7e6bce8ea5b33e2df0527 100644 (file)
@@ -29,6 +29,12 @@ static const struct snmp_mib mptcp_snmp_list[] = {
        SNMP_MIB_ITEM("DuplicateData", MPTCP_MIB_DUPDATA),
        SNMP_MIB_ITEM("AddAddr", MPTCP_MIB_ADDADDR),
        SNMP_MIB_ITEM("EchoAdd", MPTCP_MIB_ECHOADD),
+       SNMP_MIB_ITEM("PortAdd", MPTCP_MIB_PORTADD),
+       SNMP_MIB_ITEM("MPJoinPortSynRx", MPTCP_MIB_JOINPORTSYNRX),
+       SNMP_MIB_ITEM("MPJoinPortSynAckRx", MPTCP_MIB_JOINPORTSYNACKRX),
+       SNMP_MIB_ITEM("MPJoinPortAckRx", MPTCP_MIB_JOINPORTACKRX),
+       SNMP_MIB_ITEM("MismatchPortSynRx", MPTCP_MIB_MISMATCHPORTSYNRX),
+       SNMP_MIB_ITEM("MismatchPortAckRx", MPTCP_MIB_MISMATCHPORTACKRX),
        SNMP_MIB_ITEM("RmAddr", MPTCP_MIB_RMADDR),
        SNMP_MIB_ITEM("RmSubflow", MPTCP_MIB_RMSUBFLOW),
        SNMP_MIB_ITEM("MPPrioTx", MPTCP_MIB_MPPRIOTX),
index 63914a5ef6a5dae8951553dc2038dc14c5371181..72afbc135f8e76322324f2ef89b056f9740cbe05 100644 (file)
@@ -22,6 +22,12 @@ enum linux_mptcp_mib_field {
        MPTCP_MIB_DUPDATA,              /* Segments discarded due to duplicate DSS */
        MPTCP_MIB_ADDADDR,              /* Received ADD_ADDR with echo-flag=0 */
        MPTCP_MIB_ECHOADD,              /* Received ADD_ADDR with echo-flag=1 */
+       MPTCP_MIB_PORTADD,              /* Received ADD_ADDR with a port-number */
+       MPTCP_MIB_JOINPORTSYNRX,        /* Received a SYN MP_JOIN with a different port-number */
+       MPTCP_MIB_JOINPORTSYNACKRX,     /* Received a SYNACK MP_JOIN with a different port-number */
+       MPTCP_MIB_JOINPORTACKRX,        /* Received an ACK MP_JOIN with a different port-number */
+       MPTCP_MIB_MISMATCHPORTSYNRX,    /* Received a SYN MP_JOIN with a mismatched port-number */
+       MPTCP_MIB_MISMATCHPORTACKRX,    /* Received an ACK MP_JOIN with a mismatched port-number */
        MPTCP_MIB_RMADDR,               /* Received RM_ADDR */
        MPTCP_MIB_RMSUBFLOW,            /* Remove a subflow */
        MPTCP_MIB_MPPRIOTX,             /* Transmit a MP_PRIO */
index 17ad42c65087de019b94d2b969adb4963387f4c4..3b71d68b3863dac0e525adcbac3c1a78a0707e22 100644 (file)
@@ -1025,6 +1025,10 @@ void mptcp_incoming_options(struct sock *sk, struct sk_buff *skb)
                        mptcp_pm_del_add_timer(msk, &addr);
                        MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_ECHOADD);
                }
+
+               if (mp_opt.port)
+                       MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_PORTADD);
+
                mp_opt.add_addr = 0;
        }
 
index ebfbf6a9b669c23d7f2475c7ddd4b695894e873c..280da418d60b6898de7cdb4cd9755f52403374da 100644 (file)
@@ -207,8 +207,10 @@ again:
                                tcp_request_sock_ops.destructor(req);
                                subflow_req->msk = NULL;
                                subflow_req->mp_join = 0;
+                               SUBFLOW_REQ_INC_STATS(req, MPTCP_MIB_MISMATCHPORTSYNRX);
                                return -EPERM;
                        }
+                       SUBFLOW_REQ_INC_STATS(req, MPTCP_MIB_JOINPORTSYNRX);
                }
 
                subflow_req_create_thmac(subflow_req);
@@ -431,6 +433,7 @@ static void subflow_finish_connect(struct sock *sk, const struct sk_buff *skb)
                        pr_debug("synack inet_dport=%d %d",
                                 ntohs(inet_sk(sk)->inet_dport),
                                 ntohs(inet_sk(parent)->inet_dport));
+                       MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_JOINPORTSYNACKRX);
                }
        } else if (mptcp_check_fallback(sk)) {
 fallback:
@@ -702,8 +705,11 @@ create_child:
                                pr_debug("ack inet_sport=%d %d",
                                         ntohs(inet_sk(sk)->inet_sport),
                                         ntohs(inet_sk((struct sock *)owner)->inet_sport));
-                               if (!mptcp_pm_sport_in_anno_list(owner, sk))
+                               if (!mptcp_pm_sport_in_anno_list(owner, sk)) {
+                                       SUBFLOW_REQ_INC_STATS(req, MPTCP_MIB_MISMATCHPORTACKRX);
                                        goto out;
+                               }
+                               SUBFLOW_REQ_INC_STATS(req, MPTCP_MIB_JOINPORTACKRX);
                        }
                }
        }