SNMP_MIB_ITEM("NoDSSInWindow", MPTCP_MIB_NODSSWINDOW),
        SNMP_MIB_ITEM("DuplicateData", MPTCP_MIB_DUPDATA),
        SNMP_MIB_ITEM("AddAddr", MPTCP_MIB_ADDADDR),
+       SNMP_MIB_ITEM("AddAddrTx", MPTCP_MIB_ADDADDRTX),
+       SNMP_MIB_ITEM("AddAddrTxDrop", MPTCP_MIB_ADDADDRTXDROP),
        SNMP_MIB_ITEM("EchoAdd", MPTCP_MIB_ECHOADD),
+       SNMP_MIB_ITEM("EchoAddTx", MPTCP_MIB_ECHOADDTX),
+       SNMP_MIB_ITEM("EchoAddTxDrop", MPTCP_MIB_ECHOADDTXDROP),
        SNMP_MIB_ITEM("PortAdd", MPTCP_MIB_PORTADD),
        SNMP_MIB_ITEM("AddAddrDrop", MPTCP_MIB_ADDADDRDROP),
        SNMP_MIB_ITEM("MPJoinPortSynRx", MPTCP_MIB_JOINPORTSYNRX),
        SNMP_MIB_ITEM("MismatchPortAckRx", MPTCP_MIB_MISMATCHPORTACKRX),
        SNMP_MIB_ITEM("RmAddr", MPTCP_MIB_RMADDR),
        SNMP_MIB_ITEM("RmAddrDrop", MPTCP_MIB_RMADDRDROP),
+       SNMP_MIB_ITEM("RmAddrTx", MPTCP_MIB_RMADDRTX),
+       SNMP_MIB_ITEM("RmAddrTxDrop", MPTCP_MIB_RMADDRTXDROP),
        SNMP_MIB_ITEM("RmSubflow", MPTCP_MIB_RMSUBFLOW),
        SNMP_MIB_ITEM("MPPrioTx", MPTCP_MIB_MPPRIOTX),
        SNMP_MIB_ITEM("MPPrioRx", MPTCP_MIB_MPPRIORX),
 
        MPTCP_MIB_NODSSWINDOW,          /* Segments not in MPTCP windows */
        MPTCP_MIB_DUPDATA,              /* Segments discarded due to duplicate DSS */
        MPTCP_MIB_ADDADDR,              /* Received ADD_ADDR with echo-flag=0 */
+       MPTCP_MIB_ADDADDRTX,            /* Sent ADD_ADDR with echo-flag=0 */
+       MPTCP_MIB_ADDADDRTXDROP,        /* ADD_ADDR with echo-flag=0 not send due to
+                                        * resource exhaustion
+                                        */
        MPTCP_MIB_ECHOADD,              /* Received ADD_ADDR with echo-flag=1 */
+       MPTCP_MIB_ECHOADDTX,            /* Send ADD_ADDR with echo-flag=1 */
+       MPTCP_MIB_ECHOADDTXDROP,        /* ADD_ADDR with echo-flag=1 not send due
+                                        * to resource exhaustion
+                                        */
        MPTCP_MIB_PORTADD,              /* Received ADD_ADDR with a port-number */
        MPTCP_MIB_ADDADDRDROP,          /* Dropped incoming ADD_ADDR */
        MPTCP_MIB_JOINPORTSYNRX,        /* Received a SYN MP_JOIN with a different port-number */
        MPTCP_MIB_MISMATCHPORTACKRX,    /* Received an ACK MP_JOIN with a mismatched port-number */
        MPTCP_MIB_RMADDR,               /* Received RM_ADDR */
        MPTCP_MIB_RMADDRDROP,           /* Dropped incoming RM_ADDR */
+       MPTCP_MIB_RMADDRTX,             /* Sent RM_ADDR */
+       MPTCP_MIB_RMADDRTXDROP,         /* RM_ADDR not sent due to resource exhaustion */
        MPTCP_MIB_RMSUBFLOW,            /* Remove a subflow */
        MPTCP_MIB_MPPRIOTX,             /* Transmit a MP_PRIO */
        MPTCP_MIB_MPPRIORX,             /* Received a MP_PRIO */
        unsigned long mibs[LINUX_MIB_MPTCP_MAX];
 };
 
+static inline void MPTCP_ADD_STATS(struct net *net,
+                                  enum linux_mptcp_mib_field field,
+                                  int val)
+{
+       if (likely(net->mib.mptcp_statistics))
+               SNMP_ADD_STATS(net->mib.mptcp_statistics, field, val);
+}
+
 static inline void MPTCP_INC_STATS(struct net *net,
                                   enum linux_mptcp_mib_field field)
 {
 
        }
        opts->suboptions |= OPTION_MPTCP_ADD_ADDR;
        if (!echo) {
+               MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_ADDADDRTX);
                opts->ahmac = add_addr_generate_hmac(msk->local_key,
                                                     msk->remote_key,
                                                     &opts->addr);
+       } else {
+               MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_ECHOADDTX);
        }
        pr_debug("addr_id=%d, ahmac=%llu, echo=%d, port=%d",
                 opts->addr.id, opts->ahmac, echo, ntohs(opts->addr.port));
 
        for (i = 0; i < opts->rm_list.nr; i++)
                pr_debug("rm_list_ids[%d]=%d", i, opts->rm_list.ids[i]);
-
+       MPTCP_ADD_STATS(sock_net(sk), MPTCP_MIB_RMADDRTX, opts->rm_list.nr);
        return true;
 }
 
 
 
        if (add_addr &
            (echo ? BIT(MPTCP_ADD_ADDR_ECHO) : BIT(MPTCP_ADD_ADDR_SIGNAL))) {
-               pr_warn("addr_signal error, add_addr=%d, echo=%d", add_addr, echo);
+               MPTCP_INC_STATS(sock_net((struct sock *)msk),
+                               echo ? MPTCP_MIB_ECHOADDTXDROP : MPTCP_MIB_ADDADDRTXDROP);
                return -EINVAL;
        }
 
        pr_debug("msk=%p, rm_list_nr=%d", msk, rm_list->nr);
 
        if (rm_addr) {
-               pr_warn("addr_signal error, rm_addr=%d", rm_addr);
+               MPTCP_ADD_STATS(sock_net((struct sock *)msk),
+                               MPTCP_MIB_RMADDRTXDROP, rm_list->nr);
                return -EINVAL;
        }
 
 
        fi
 
        echo -n " - echo  "
-       count=$(ip netns exec $ns1 nstat -as | grep MPTcpExtEchoAdd | awk '{print $2}')
+       count=$(ip netns exec $ns1 nstat -as MPTcpExtEchoAdd | grep MPTcpExtEchoAdd | awk '{print $2}')
        [ -z "$count" ] && count=0
        if [ "$count" != "$echo_nr" ]; then
                echo "[fail] got $count ADD_ADDR echo[s] expected $echo_nr"
        fi
 
        printf "%-${nr_blank}s %s" " " "rm "
-       count=$(ip netns exec $addr_ns nstat -as | grep MPTcpExtRmAddr | awk '{print $2}')
+       count=$(ip netns exec $addr_ns nstat -as MPTcpExtRmAddr | grep MPTcpExtRmAddr | awk '{print $2}')
        [ -z "$count" ] && count=0
        if [ "$count" != "$rm_addr_nr" ]; then
                echo "[fail] got $count RM_ADDR[s] expected $rm_addr_nr"