@@ -1289,19 +1289,18 @@ struct mlxsw_sp_qevent_binding {
1289
1289
1290
1290
static LIST_HEAD (mlxsw_sp_qevent_block_cb_list );
1291
1291
1292
- static int mlxsw_sp_qevent_mirror_configure (struct mlxsw_sp * mlxsw_sp ,
1293
- struct mlxsw_sp_mall_entry * mall_entry ,
1294
- struct mlxsw_sp_qevent_binding * qevent_binding )
1292
+ static int mlxsw_sp_qevent_span_configure (struct mlxsw_sp * mlxsw_sp ,
1293
+ struct mlxsw_sp_mall_entry * mall_entry ,
1294
+ struct mlxsw_sp_qevent_binding * qevent_binding ,
1295
+ const struct mlxsw_sp_span_agent_parms * agent_parms ,
1296
+ int * p_span_id )
1295
1297
{
1296
1298
struct mlxsw_sp_port * mlxsw_sp_port = qevent_binding -> mlxsw_sp_port ;
1297
1299
struct mlxsw_sp_span_trigger_parms trigger_parms = {};
1298
- struct mlxsw_sp_span_agent_parms agent_parms = {
1299
- .to_dev = mall_entry -> mirror .to_dev ,
1300
- };
1301
1300
int span_id ;
1302
1301
int err ;
1303
1302
1304
- err = mlxsw_sp_span_agent_get (mlxsw_sp , & span_id , & agent_parms );
1303
+ err = mlxsw_sp_span_agent_get (mlxsw_sp , & span_id , agent_parms );
1305
1304
if (err )
1306
1305
return err ;
1307
1306
@@ -1320,7 +1319,7 @@ static int mlxsw_sp_qevent_mirror_configure(struct mlxsw_sp *mlxsw_sp,
1320
1319
if (err )
1321
1320
goto err_trigger_enable ;
1322
1321
1323
- mall_entry -> mirror . span_id = span_id ;
1322
+ * p_span_id = span_id ;
1324
1323
return 0 ;
1325
1324
1326
1325
err_trigger_enable :
@@ -1333,21 +1332,65 @@ static int mlxsw_sp_qevent_mirror_configure(struct mlxsw_sp *mlxsw_sp,
1333
1332
return err ;
1334
1333
}
1335
1334
1336
- static void mlxsw_sp_qevent_mirror_deconfigure (struct mlxsw_sp * mlxsw_sp ,
1337
- struct mlxsw_sp_mall_entry * mall_entry ,
1338
- struct mlxsw_sp_qevent_binding * qevent_binding )
1335
+ static void mlxsw_sp_qevent_span_deconfigure (struct mlxsw_sp * mlxsw_sp ,
1336
+ struct mlxsw_sp_qevent_binding * qevent_binding ,
1337
+ int span_id )
1339
1338
{
1340
1339
struct mlxsw_sp_port * mlxsw_sp_port = qevent_binding -> mlxsw_sp_port ;
1341
1340
struct mlxsw_sp_span_trigger_parms trigger_parms = {
1342
- .span_id = mall_entry -> mirror . span_id ,
1341
+ .span_id = span_id ,
1343
1342
};
1344
1343
1345
1344
mlxsw_sp_span_trigger_disable (mlxsw_sp_port , qevent_binding -> span_trigger ,
1346
1345
qevent_binding -> tclass_num );
1347
1346
mlxsw_sp_span_agent_unbind (mlxsw_sp , qevent_binding -> span_trigger , mlxsw_sp_port ,
1348
1347
& trigger_parms );
1349
1348
mlxsw_sp_span_analyzed_port_put (mlxsw_sp_port , true);
1350
- mlxsw_sp_span_agent_put (mlxsw_sp , mall_entry -> mirror .span_id );
1349
+ mlxsw_sp_span_agent_put (mlxsw_sp , span_id );
1350
+ }
1351
+
1352
+ static int mlxsw_sp_qevent_mirror_configure (struct mlxsw_sp * mlxsw_sp ,
1353
+ struct mlxsw_sp_mall_entry * mall_entry ,
1354
+ struct mlxsw_sp_qevent_binding * qevent_binding )
1355
+ {
1356
+ struct mlxsw_sp_span_agent_parms agent_parms = {
1357
+ .to_dev = mall_entry -> mirror .to_dev ,
1358
+ };
1359
+
1360
+ return mlxsw_sp_qevent_span_configure (mlxsw_sp , mall_entry , qevent_binding ,
1361
+ & agent_parms , & mall_entry -> mirror .span_id );
1362
+ }
1363
+
1364
+ static void mlxsw_sp_qevent_mirror_deconfigure (struct mlxsw_sp * mlxsw_sp ,
1365
+ struct mlxsw_sp_mall_entry * mall_entry ,
1366
+ struct mlxsw_sp_qevent_binding * qevent_binding )
1367
+ {
1368
+ mlxsw_sp_qevent_span_deconfigure (mlxsw_sp , qevent_binding , mall_entry -> mirror .span_id );
1369
+ }
1370
+
1371
+ static int mlxsw_sp_qevent_trap_configure (struct mlxsw_sp * mlxsw_sp ,
1372
+ struct mlxsw_sp_mall_entry * mall_entry ,
1373
+ struct mlxsw_sp_qevent_binding * qevent_binding )
1374
+ {
1375
+ struct mlxsw_sp_span_agent_parms agent_parms = {};
1376
+ int err ;
1377
+
1378
+ err = mlxsw_sp_trap_group_policer_hw_id_get (mlxsw_sp ,
1379
+ DEVLINK_TRAP_GROUP_GENERIC_ID_BUFFER_DROPS ,
1380
+ & agent_parms .policer_enable ,
1381
+ & agent_parms .policer_id );
1382
+ if (err )
1383
+ return err ;
1384
+
1385
+ return mlxsw_sp_qevent_span_configure (mlxsw_sp , mall_entry , qevent_binding ,
1386
+ & agent_parms , & mall_entry -> trap .span_id );
1387
+ }
1388
+
1389
+ static void mlxsw_sp_qevent_trap_deconfigure (struct mlxsw_sp * mlxsw_sp ,
1390
+ struct mlxsw_sp_mall_entry * mall_entry ,
1391
+ struct mlxsw_sp_qevent_binding * qevent_binding )
1392
+ {
1393
+ mlxsw_sp_qevent_span_deconfigure (mlxsw_sp , qevent_binding , mall_entry -> trap .span_id );
1351
1394
}
1352
1395
1353
1396
static int mlxsw_sp_qevent_entry_configure (struct mlxsw_sp * mlxsw_sp ,
@@ -1357,6 +1400,8 @@ static int mlxsw_sp_qevent_entry_configure(struct mlxsw_sp *mlxsw_sp,
1357
1400
switch (mall_entry -> type ) {
1358
1401
case MLXSW_SP_MALL_ACTION_TYPE_MIRROR :
1359
1402
return mlxsw_sp_qevent_mirror_configure (mlxsw_sp , mall_entry , qevent_binding );
1403
+ case MLXSW_SP_MALL_ACTION_TYPE_TRAP :
1404
+ return mlxsw_sp_qevent_trap_configure (mlxsw_sp , mall_entry , qevent_binding );
1360
1405
default :
1361
1406
/* This should have been validated away. */
1362
1407
WARN_ON (1 );
@@ -1371,6 +1416,8 @@ static void mlxsw_sp_qevent_entry_deconfigure(struct mlxsw_sp *mlxsw_sp,
1371
1416
switch (mall_entry -> type ) {
1372
1417
case MLXSW_SP_MALL_ACTION_TYPE_MIRROR :
1373
1418
return mlxsw_sp_qevent_mirror_deconfigure (mlxsw_sp , mall_entry , qevent_binding );
1419
+ case MLXSW_SP_MALL_ACTION_TYPE_TRAP :
1420
+ return mlxsw_sp_qevent_trap_deconfigure (mlxsw_sp , mall_entry , qevent_binding );
1374
1421
default :
1375
1422
WARN_ON (1 );
1376
1423
return ;
@@ -1490,6 +1537,8 @@ static int mlxsw_sp_qevent_mall_replace(struct mlxsw_sp *mlxsw_sp,
1490
1537
if (act -> id == FLOW_ACTION_MIRRED ) {
1491
1538
mall_entry -> type = MLXSW_SP_MALL_ACTION_TYPE_MIRROR ;
1492
1539
mall_entry -> mirror .to_dev = act -> dev ;
1540
+ } else if (act -> id == FLOW_ACTION_TRAP ) {
1541
+ mall_entry -> type = MLXSW_SP_MALL_ACTION_TYPE_TRAP ;
1493
1542
} else {
1494
1543
NL_SET_ERR_MSG (f -> common .extack , "Unsupported action" );
1495
1544
err = - EOPNOTSUPP ;
0 commit comments