@@ -1213,3 +1213,70 @@ int mlx5_eswitch_set_vport_vlan(struct mlx5_eswitch *esw,
1213
1213
1214
1214
return modify_esw_vport_cvlan (esw -> dev , vport , vlan , qos , set );
1215
1215
}
1216
+
1217
+ int mlx5_eswitch_get_vport_stats (struct mlx5_eswitch * esw ,
1218
+ int vport ,
1219
+ struct ifla_vf_stats * vf_stats )
1220
+ {
1221
+ int outlen = MLX5_ST_SZ_BYTES (query_vport_counter_out );
1222
+ u32 in [MLX5_ST_SZ_DW (query_vport_counter_in )];
1223
+ int err = 0 ;
1224
+ u32 * out ;
1225
+
1226
+ if (!ESW_ALLOWED (esw ))
1227
+ return - EPERM ;
1228
+ if (!LEGAL_VPORT (esw , vport ))
1229
+ return - EINVAL ;
1230
+
1231
+ out = mlx5_vzalloc (outlen );
1232
+ if (!out )
1233
+ return - ENOMEM ;
1234
+
1235
+ memset (in , 0 , sizeof (in ));
1236
+
1237
+ MLX5_SET (query_vport_counter_in , in , opcode ,
1238
+ MLX5_CMD_OP_QUERY_VPORT_COUNTER );
1239
+ MLX5_SET (query_vport_counter_in , in , op_mod , 0 );
1240
+ MLX5_SET (query_vport_counter_in , in , vport_number , vport );
1241
+ if (vport )
1242
+ MLX5_SET (query_vport_counter_in , in , other_vport , 1 );
1243
+
1244
+ memset (out , 0 , outlen );
1245
+ err = mlx5_cmd_exec (esw -> dev , in , sizeof (in ), out , outlen );
1246
+ if (err )
1247
+ goto free_out ;
1248
+
1249
+ #define MLX5_GET_CTR (p , x ) \
1250
+ MLX5_GET64(query_vport_counter_out, p, x)
1251
+
1252
+ memset (vf_stats , 0 , sizeof (* vf_stats ));
1253
+ vf_stats -> rx_packets =
1254
+ MLX5_GET_CTR (out , received_eth_unicast .packets ) +
1255
+ MLX5_GET_CTR (out , received_eth_multicast .packets ) +
1256
+ MLX5_GET_CTR (out , received_eth_broadcast .packets );
1257
+
1258
+ vf_stats -> rx_bytes =
1259
+ MLX5_GET_CTR (out , received_eth_unicast .octets ) +
1260
+ MLX5_GET_CTR (out , received_eth_multicast .octets ) +
1261
+ MLX5_GET_CTR (out , received_eth_broadcast .octets );
1262
+
1263
+ vf_stats -> tx_packets =
1264
+ MLX5_GET_CTR (out , transmitted_eth_unicast .packets ) +
1265
+ MLX5_GET_CTR (out , transmitted_eth_multicast .packets ) +
1266
+ MLX5_GET_CTR (out , transmitted_eth_broadcast .packets );
1267
+
1268
+ vf_stats -> tx_bytes =
1269
+ MLX5_GET_CTR (out , transmitted_eth_unicast .octets ) +
1270
+ MLX5_GET_CTR (out , transmitted_eth_multicast .octets ) +
1271
+ MLX5_GET_CTR (out , transmitted_eth_broadcast .octets );
1272
+
1273
+ vf_stats -> multicast =
1274
+ MLX5_GET_CTR (out , received_eth_multicast .packets );
1275
+
1276
+ vf_stats -> broadcast =
1277
+ MLX5_GET_CTR (out , received_eth_broadcast .packets );
1278
+
1279
+ free_out :
1280
+ kvfree (out );
1281
+ return err ;
1282
+ }
0 commit comments