Skip to content

Commit 164f16f

Browse files
ilantayariSaeed Mahameed
authored andcommitted
net/mlx5e: IPSec, Add IPSec ethtool stats
Add Innova IPSec SBU counters to the ethtool -S stats. Add IPSec offload error counters to the ethtool -S stats. Signed-off-by: Ilan Tayari <[email protected]> Reviewed-by: Boris Pismenny <[email protected]> Reviewed-by: Gal Pressman <[email protected]> Signed-off-by: Saeed Mahameed <[email protected]>
1 parent 2ac9cfe commit 164f16f

File tree

5 files changed

+190
-3
lines changed

5 files changed

+190
-3
lines changed

drivers/net/ethernet/mellanox/mlx5/core/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,5 @@ mlx5_core-$(CONFIG_MLX5_CORE_EN_DCB) += en_dcbnl.o
2020

2121
mlx5_core-$(CONFIG_MLX5_CORE_IPOIB) += ipoib/ipoib.o ipoib/ethtool.o
2222

23-
mlx5_core-$(CONFIG_MLX5_EN_IPSEC) += en_accel/ipsec.o en_accel/ipsec_rxtx.o
23+
mlx5_core-$(CONFIG_MLX5_EN_IPSEC) += en_accel/ipsec.o en_accel/ipsec_rxtx.o \
24+
en_accel/ipsec_stats.o

drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.h

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,19 +57,42 @@ struct mlx5e_ipsec_sw_stats {
5757
atomic64_t ipsec_tx_drop_metadata;
5858
};
5959

60+
struct mlx5e_ipsec_stats {
61+
u64 ipsec_dec_in_packets;
62+
u64 ipsec_dec_out_packets;
63+
u64 ipsec_dec_bypass_packets;
64+
u64 ipsec_enc_in_packets;
65+
u64 ipsec_enc_out_packets;
66+
u64 ipsec_enc_bypass_packets;
67+
u64 ipsec_dec_drop_packets;
68+
u64 ipsec_dec_auth_fail_packets;
69+
u64 ipsec_enc_drop_packets;
70+
u64 ipsec_add_sa_success;
71+
u64 ipsec_add_sa_fail;
72+
u64 ipsec_del_sa_success;
73+
u64 ipsec_del_sa_fail;
74+
u64 ipsec_cmd_drop;
75+
};
76+
6077
struct mlx5e_ipsec {
6178
struct mlx5e_priv *en_priv;
6279
DECLARE_HASHTABLE(sadb_rx, MLX5E_IPSEC_SADB_RX_BITS);
6380
spinlock_t sadb_rx_lock; /* Protects sadb_rx and halloc */
6481
struct ida halloc;
6582
struct mlx5e_ipsec_sw_stats sw_stats;
83+
struct mlx5e_ipsec_stats stats;
6684
};
6785

6886
void mlx5e_ipsec_build_inverse_table(void);
6987
int mlx5e_ipsec_init(struct mlx5e_priv *priv);
7088
void mlx5e_ipsec_cleanup(struct mlx5e_priv *priv);
7189
void mlx5e_ipsec_build_netdev(struct mlx5e_priv *priv);
7290

91+
int mlx5e_ipsec_get_count(struct mlx5e_priv *priv);
92+
int mlx5e_ipsec_get_strings(struct mlx5e_priv *priv, uint8_t *data);
93+
void mlx5e_ipsec_update_stats(struct mlx5e_priv *priv);
94+
int mlx5e_ipsec_get_stats(struct mlx5e_priv *priv, u64 *data);
95+
7396
struct xfrm_state *mlx5e_ipsec_sadb_rx_lookup(struct mlx5e_ipsec *dev,
7497
unsigned int handle);
7598

@@ -92,6 +115,26 @@ static inline void mlx5e_ipsec_build_netdev(struct mlx5e_priv *priv)
92115
{
93116
}
94117

118+
static inline int mlx5e_ipsec_get_count(struct mlx5e_priv *priv)
119+
{
120+
return 0;
121+
}
122+
123+
static inline int mlx5e_ipsec_get_strings(struct mlx5e_priv *priv,
124+
uint8_t *data)
125+
{
126+
return 0;
127+
}
128+
129+
static inline void mlx5e_ipsec_update_stats(struct mlx5e_priv *priv)
130+
{
131+
}
132+
133+
static inline int mlx5e_ipsec_get_stats(struct mlx5e_priv *priv, u64 *data)
134+
{
135+
return 0;
136+
}
137+
95138
#endif
96139

97140
#endif /* __MLX5E_IPSEC_H__ */
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
/*
2+
* Copyright (c) 2017 Mellanox Technologies. All rights reserved.
3+
*
4+
* This software is available to you under a choice of one of two
5+
* licenses. You may choose to be licensed under the terms of the GNU
6+
* General Public License (GPL) Version 2, available from the file
7+
* COPYING in the main directory of this source tree, or the
8+
* OpenIB.org BSD license below:
9+
*
10+
* Redistribution and use in source and binary forms, with or
11+
* without modification, are permitted provided that the following
12+
* conditions are met:
13+
*
14+
* - Redistributions of source code must retain the above
15+
* copyright notice, this list of conditions and the following
16+
* disclaimer.
17+
*
18+
* - Redistributions in binary form must reproduce the above
19+
* copyright notice, this list of conditions and the following
20+
* disclaimer in the documentation and/or other materials
21+
* provided with the distribution.
22+
*
23+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24+
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25+
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26+
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27+
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28+
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29+
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30+
* SOFTWARE.
31+
*
32+
*/
33+
34+
#include <linux/ethtool.h>
35+
#include <net/sock.h>
36+
37+
#include "en.h"
38+
#include "accel/ipsec.h"
39+
#include "fpga/sdk.h"
40+
#include "en_accel/ipsec.h"
41+
42+
static const struct counter_desc mlx5e_ipsec_hw_stats_desc[] = {
43+
{ MLX5E_DECLARE_STAT(struct mlx5e_ipsec_stats, ipsec_dec_in_packets) },
44+
{ MLX5E_DECLARE_STAT(struct mlx5e_ipsec_stats, ipsec_dec_out_packets) },
45+
{ MLX5E_DECLARE_STAT(struct mlx5e_ipsec_stats, ipsec_dec_bypass_packets) },
46+
{ MLX5E_DECLARE_STAT(struct mlx5e_ipsec_stats, ipsec_enc_in_packets) },
47+
{ MLX5E_DECLARE_STAT(struct mlx5e_ipsec_stats, ipsec_enc_out_packets) },
48+
{ MLX5E_DECLARE_STAT(struct mlx5e_ipsec_stats, ipsec_enc_bypass_packets) },
49+
{ MLX5E_DECLARE_STAT(struct mlx5e_ipsec_stats, ipsec_dec_drop_packets) },
50+
{ MLX5E_DECLARE_STAT(struct mlx5e_ipsec_stats, ipsec_dec_auth_fail_packets) },
51+
{ MLX5E_DECLARE_STAT(struct mlx5e_ipsec_stats, ipsec_enc_drop_packets) },
52+
{ MLX5E_DECLARE_STAT(struct mlx5e_ipsec_stats, ipsec_add_sa_success) },
53+
{ MLX5E_DECLARE_STAT(struct mlx5e_ipsec_stats, ipsec_add_sa_fail) },
54+
{ MLX5E_DECLARE_STAT(struct mlx5e_ipsec_stats, ipsec_del_sa_success) },
55+
{ MLX5E_DECLARE_STAT(struct mlx5e_ipsec_stats, ipsec_del_sa_fail) },
56+
{ MLX5E_DECLARE_STAT(struct mlx5e_ipsec_stats, ipsec_cmd_drop) },
57+
};
58+
59+
static const struct counter_desc mlx5e_ipsec_sw_stats_desc[] = {
60+
{ MLX5E_DECLARE_STAT(struct mlx5e_ipsec_sw_stats, ipsec_rx_drop_sp_alloc) },
61+
{ MLX5E_DECLARE_STAT(struct mlx5e_ipsec_sw_stats, ipsec_rx_drop_sadb_miss) },
62+
{ MLX5E_DECLARE_STAT(struct mlx5e_ipsec_sw_stats, ipsec_rx_drop_syndrome) },
63+
{ MLX5E_DECLARE_STAT(struct mlx5e_ipsec_sw_stats, ipsec_tx_drop_bundle) },
64+
{ MLX5E_DECLARE_STAT(struct mlx5e_ipsec_sw_stats, ipsec_tx_drop_no_state) },
65+
{ MLX5E_DECLARE_STAT(struct mlx5e_ipsec_sw_stats, ipsec_tx_drop_not_ip) },
66+
{ MLX5E_DECLARE_STAT(struct mlx5e_ipsec_sw_stats, ipsec_tx_drop_trailer) },
67+
{ MLX5E_DECLARE_STAT(struct mlx5e_ipsec_sw_stats, ipsec_tx_drop_metadata) },
68+
};
69+
70+
#define MLX5E_READ_CTR_ATOMIC64(ptr, dsc, i) \
71+
atomic64_read((atomic64_t *)((char *)(ptr) + (dsc)[i].offset))
72+
73+
#define NUM_IPSEC_HW_COUNTERS ARRAY_SIZE(mlx5e_ipsec_hw_stats_desc)
74+
#define NUM_IPSEC_SW_COUNTERS ARRAY_SIZE(mlx5e_ipsec_sw_stats_desc)
75+
76+
#define NUM_IPSEC_COUNTERS (NUM_IPSEC_HW_COUNTERS + NUM_IPSEC_SW_COUNTERS)
77+
78+
int mlx5e_ipsec_get_count(struct mlx5e_priv *priv)
79+
{
80+
if (!priv->ipsec)
81+
return 0;
82+
83+
return NUM_IPSEC_COUNTERS;
84+
}
85+
86+
int mlx5e_ipsec_get_strings(struct mlx5e_priv *priv, uint8_t *data)
87+
{
88+
unsigned int i, idx = 0;
89+
90+
if (!priv->ipsec)
91+
return 0;
92+
93+
for (i = 0; i < NUM_IPSEC_HW_COUNTERS; i++)
94+
strcpy(data + (idx++) * ETH_GSTRING_LEN,
95+
mlx5e_ipsec_hw_stats_desc[i].format);
96+
97+
for (i = 0; i < NUM_IPSEC_SW_COUNTERS; i++)
98+
strcpy(data + (idx++) * ETH_GSTRING_LEN,
99+
mlx5e_ipsec_sw_stats_desc[i].format);
100+
101+
return NUM_IPSEC_COUNTERS;
102+
}
103+
104+
void mlx5e_ipsec_update_stats(struct mlx5e_priv *priv)
105+
{
106+
int ret;
107+
108+
if (!priv->ipsec)
109+
return;
110+
111+
ret = mlx5_accel_ipsec_counters_read(priv->mdev, (u64 *)&priv->ipsec->stats,
112+
NUM_IPSEC_HW_COUNTERS);
113+
if (ret)
114+
memset(&priv->ipsec->stats, 0, sizeof(priv->ipsec->stats));
115+
}
116+
117+
int mlx5e_ipsec_get_stats(struct mlx5e_priv *priv, u64 *data)
118+
{
119+
int i, idx = 0;
120+
121+
if (!priv->ipsec)
122+
return 0;
123+
124+
for (i = 0; i < NUM_IPSEC_HW_COUNTERS; i++)
125+
data[idx++] = MLX5E_READ_CTR64_CPU(&priv->ipsec->stats,
126+
mlx5e_ipsec_hw_stats_desc, i);
127+
128+
for (i = 0; i < NUM_IPSEC_SW_COUNTERS; i++)
129+
data[idx++] = MLX5E_READ_CTR_ATOMIC64(&priv->ipsec->sw_stats,
130+
mlx5e_ipsec_sw_stats_desc, i);
131+
132+
return NUM_IPSEC_COUNTERS;
133+
}

drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
*/
3232

3333
#include "en.h"
34+
#include "en_accel/ipsec.h"
3435

3536
void mlx5e_ethtool_get_drvinfo(struct mlx5e_priv *priv,
3637
struct ethtool_drvinfo *drvinfo)
@@ -186,7 +187,8 @@ int mlx5e_ethtool_get_sset_count(struct mlx5e_priv *priv, int sset)
186187
MLX5E_NUM_SQ_STATS(priv) +
187188
MLX5E_NUM_PFC_COUNTERS(priv) +
188189
ARRAY_SIZE(mlx5e_pme_status_desc) +
189-
ARRAY_SIZE(mlx5e_pme_error_desc);
190+
ARRAY_SIZE(mlx5e_pme_error_desc) +
191+
mlx5e_ipsec_get_count(priv);
190192

191193
case ETH_SS_PRIV_FLAGS:
192194
return ARRAY_SIZE(mlx5e_priv_flags);
@@ -275,6 +277,9 @@ static void mlx5e_fill_stats_strings(struct mlx5e_priv *priv, uint8_t *data)
275277
for (i = 0; i < ARRAY_SIZE(mlx5e_pme_error_desc); i++)
276278
strcpy(data + (idx++) * ETH_GSTRING_LEN, mlx5e_pme_error_desc[i].format);
277279

280+
/* IPSec counters */
281+
idx += mlx5e_ipsec_get_strings(priv, data + idx * ETH_GSTRING_LEN);
282+
278283
if (!test_bit(MLX5E_STATE_OPENED, &priv->state))
279284
return;
280285

@@ -403,6 +408,9 @@ void mlx5e_ethtool_get_ethtool_stats(struct mlx5e_priv *priv,
403408
data[idx++] = MLX5E_READ_CTR64_CPU(mlx5_priv->pme_stats.error_counters,
404409
mlx5e_pme_error_desc, i);
405410

411+
/* IPSec counters */
412+
idx += mlx5e_ipsec_get_stats(priv, data + idx);
413+
406414
if (!test_bit(MLX5E_STATE_OPENED, &priv->state))
407415
return;
408416

drivers/net/ethernet/mellanox/mlx5/core/en_main.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -331,8 +331,10 @@ static void mlx5e_update_pcie_counters(struct mlx5e_priv *priv)
331331

332332
void mlx5e_update_stats(struct mlx5e_priv *priv, bool full)
333333
{
334-
if (full)
334+
if (full) {
335335
mlx5e_update_pcie_counters(priv);
336+
mlx5e_ipsec_update_stats(priv);
337+
}
336338
mlx5e_update_pport_counters(priv, full);
337339
mlx5e_update_vport_counters(priv);
338340
mlx5e_update_q_counter(priv);

0 commit comments

Comments
 (0)