TLS implementation exposes the following per-namespace statistics
 (``/proc/net/tls_stat``):
+
+- ``TlsCurrTxSw``, ``TlsCurrRxSw`` -
+  number of TX and RX sessions currently installed where host handles
+  cryptography
+
+- ``TlsCurrTxDevice``, ``TlsCurrRxDevice`` -
+  number of TX and RX sessions currently installed where NIC handles
+  cryptography
+
+- ``TlsTxSw``, ``TlsRxSw`` -
+  number of TX and RX sessions opened with host cryptography
+
+- ``TlsTxDevice``, ``TlsRxDevice`` -
+  number of TX and RX sessions opened with NIC cryptography
 
 enum
 {
        LINUX_MIB_TLSNUM = 0,
+       LINUX_MIB_TLSCURRTXSW,                  /* TlsCurrTxSw */
+       LINUX_MIB_TLSCURRRXSW,                  /* TlsCurrRxSw */
+       LINUX_MIB_TLSCURRTXDEVICE,              /* TlsCurrTxDevice */
+       LINUX_MIB_TLSCURRRXDEVICE,              /* TlsCurrRxDevice */
+       LINUX_MIB_TLSTXSW,                      /* TlsTxSw */
+       LINUX_MIB_TLSRXSW,                      /* TlsRxSw */
+       LINUX_MIB_TLSTXDEVICE,                  /* TlsTxDevice */
+       LINUX_MIB_TLSRXDEVICE,                  /* TlsRxDevice */
        __LINUX_MIB_TLSMAX
 };
 
 
                kfree(ctx->tx.rec_seq);
                kfree(ctx->tx.iv);
                tls_sw_release_resources_tx(sk);
+               TLS_DEC_STATS(sock_net(sk), LINUX_MIB_TLSCURRTXSW);
        } else if (ctx->tx_conf == TLS_HW) {
                tls_device_free_resources_tx(sk);
+               TLS_DEC_STATS(sock_net(sk), LINUX_MIB_TLSCURRTXDEVICE);
        }
 
-       if (ctx->rx_conf == TLS_SW)
+       if (ctx->rx_conf == TLS_SW) {
                tls_sw_release_resources_rx(sk);
-       else if (ctx->rx_conf == TLS_HW)
+               TLS_DEC_STATS(sock_net(sk), LINUX_MIB_TLSCURRRXSW);
+       } else if (ctx->rx_conf == TLS_HW) {
                tls_device_offload_cleanup_rx(sk);
+               TLS_DEC_STATS(sock_net(sk), LINUX_MIB_TLSCURRRXDEVICE);
+       }
 }
 
 static void tls_sk_proto_close(struct sock *sk, long timeout)
        if (tx) {
                rc = tls_set_device_offload(sk, ctx);
                conf = TLS_HW;
-               if (rc) {
+               if (!rc) {
+                       TLS_INC_STATS(sock_net(sk), LINUX_MIB_TLSTXDEVICE);
+                       TLS_INC_STATS(sock_net(sk), LINUX_MIB_TLSCURRTXDEVICE);
+               } else {
                        rc = tls_set_sw_offload(sk, ctx, 1);
                        if (rc)
                                goto err_crypto_info;
+                       TLS_INC_STATS(sock_net(sk), LINUX_MIB_TLSTXSW);
+                       TLS_INC_STATS(sock_net(sk), LINUX_MIB_TLSCURRTXSW);
                        conf = TLS_SW;
                }
        } else {
                rc = tls_set_device_offload_rx(sk, ctx);
                conf = TLS_HW;
-               if (rc) {
+               if (!rc) {
+                       TLS_INC_STATS(sock_net(sk), LINUX_MIB_TLSRXDEVICE);
+                       TLS_INC_STATS(sock_net(sk), LINUX_MIB_TLSCURRRXDEVICE);
+               } else {
                        rc = tls_set_sw_offload(sk, ctx, 0);
                        if (rc)
                                goto err_crypto_info;
+                       TLS_INC_STATS(sock_net(sk), LINUX_MIB_TLSRXSW);
+                       TLS_INC_STATS(sock_net(sk), LINUX_MIB_TLSCURRRXSW);
                        conf = TLS_SW;
                }
                tls_sw_strparser_arm(sk, ctx);
 
 #include <net/tls.h>
 
 static const struct snmp_mib tls_mib_list[] = {
+       SNMP_MIB_ITEM("TlsCurrTxSw", LINUX_MIB_TLSCURRTXSW),
+       SNMP_MIB_ITEM("TlsCurrRxSw", LINUX_MIB_TLSCURRRXSW),
+       SNMP_MIB_ITEM("TlsCurrTxDevice", LINUX_MIB_TLSCURRTXDEVICE),
+       SNMP_MIB_ITEM("TlsCurrRxDevice", LINUX_MIB_TLSCURRRXDEVICE),
+       SNMP_MIB_ITEM("TlsTxSw", LINUX_MIB_TLSTXSW),
+       SNMP_MIB_ITEM("TlsRxSw", LINUX_MIB_TLSRXSW),
+       SNMP_MIB_ITEM("TlsTxDevice", LINUX_MIB_TLSTXDEVICE),
+       SNMP_MIB_ITEM("TlsRxDevice", LINUX_MIB_TLSRXDEVICE),
        SNMP_MIB_SENTINEL
 };