13
13
#define CREATE_TRACE_POINTS
14
14
#include "diag/bridge_tracepoint.h"
15
15
16
- #define MLX5_ESW_BRIDGE_INGRESS_TABLE_VLAN_GRP_SIZE 16000
17
- #define MLX5_ESW_BRIDGE_INGRESS_TABLE_UNTAGGED_GRP_SIZE 32000
16
+ #define MLX5_ESW_BRIDGE_INGRESS_TABLE_VLAN_GRP_SIZE 12000
17
+ #define MLX5_ESW_BRIDGE_INGRESS_TABLE_UNTAGGED_GRP_SIZE 16000
18
18
#define MLX5_ESW_BRIDGE_INGRESS_TABLE_VLAN_GRP_IDX_FROM 0
19
19
#define MLX5_ESW_BRIDGE_INGRESS_TABLE_VLAN_GRP_IDX_TO \
20
20
(MLX5_ESW_BRIDGE_INGRESS_TABLE_VLAN_GRP_SIZE - 1)
23
23
#define MLX5_ESW_BRIDGE_INGRESS_TABLE_VLAN_FILTER_GRP_IDX_TO \
24
24
(MLX5_ESW_BRIDGE_INGRESS_TABLE_VLAN_FILTER_GRP_IDX_FROM + \
25
25
MLX5_ESW_BRIDGE_INGRESS_TABLE_VLAN_GRP_SIZE - 1)
26
- #define MLX5_ESW_BRIDGE_INGRESS_TABLE_MAC_GRP_IDX_FROM \
26
+ #define MLX5_ESW_BRIDGE_INGRESS_TABLE_QINQ_GRP_IDX_FROM \
27
27
(MLX5_ESW_BRIDGE_INGRESS_TABLE_VLAN_FILTER_GRP_IDX_TO + 1)
28
+ #define MLX5_ESW_BRIDGE_INGRESS_TABLE_QINQ_GRP_IDX_TO \
29
+ (MLX5_ESW_BRIDGE_INGRESS_TABLE_QINQ_GRP_IDX_FROM + \
30
+ MLX5_ESW_BRIDGE_INGRESS_TABLE_VLAN_GRP_SIZE - 1)
31
+ #define MLX5_ESW_BRIDGE_INGRESS_TABLE_QINQ_FILTER_GRP_IDX_FROM \
32
+ (MLX5_ESW_BRIDGE_INGRESS_TABLE_QINQ_GRP_IDX_TO + 1)
33
+ #define MLX5_ESW_BRIDGE_INGRESS_TABLE_QINQ_FILTER_GRP_IDX_TO \
34
+ (MLX5_ESW_BRIDGE_INGRESS_TABLE_QINQ_FILTER_GRP_IDX_FROM + \
35
+ MLX5_ESW_BRIDGE_INGRESS_TABLE_VLAN_GRP_SIZE - 1)
36
+ #define MLX5_ESW_BRIDGE_INGRESS_TABLE_MAC_GRP_IDX_FROM \
37
+ (MLX5_ESW_BRIDGE_INGRESS_TABLE_QINQ_FILTER_GRP_IDX_TO + 1)
28
38
#define MLX5_ESW_BRIDGE_INGRESS_TABLE_MAC_GRP_IDX_TO \
29
39
(MLX5_ESW_BRIDGE_INGRESS_TABLE_MAC_GRP_IDX_FROM + \
30
40
MLX5_ESW_BRIDGE_INGRESS_TABLE_UNTAGGED_GRP_SIZE - 1)
31
41
#define MLX5_ESW_BRIDGE_INGRESS_TABLE_SIZE \
32
42
(MLX5_ESW_BRIDGE_INGRESS_TABLE_MAC_GRP_IDX_TO + 1)
33
43
static_assert (MLX5_ESW_BRIDGE_INGRESS_TABLE_SIZE == 64000 );
34
44
35
- #define MLX5_ESW_BRIDGE_EGRESS_TABLE_VLAN_GRP_SIZE 32000
45
+ #define MLX5_ESW_BRIDGE_EGRESS_TABLE_VLAN_GRP_SIZE 16000
36
46
#define MLX5_ESW_BRIDGE_EGRESS_TABLE_MAC_GRP_SIZE (32000 - 1)
37
47
#define MLX5_ESW_BRIDGE_EGRESS_TABLE_VLAN_GRP_IDX_FROM 0
38
48
#define MLX5_ESW_BRIDGE_EGRESS_TABLE_VLAN_GRP_IDX_TO \
39
49
(MLX5_ESW_BRIDGE_EGRESS_TABLE_VLAN_GRP_SIZE - 1)
40
- #define MLX5_ESW_BRIDGE_EGRESS_TABLE_MAC_GRP_IDX_FROM \
50
+ #define MLX5_ESW_BRIDGE_EGRESS_TABLE_QINQ_GRP_IDX_FROM \
41
51
(MLX5_ESW_BRIDGE_EGRESS_TABLE_VLAN_GRP_IDX_TO + 1)
52
+ #define MLX5_ESW_BRIDGE_EGRESS_TABLE_QINQ_GRP_IDX_TO \
53
+ (MLX5_ESW_BRIDGE_EGRESS_TABLE_QINQ_GRP_IDX_FROM + \
54
+ MLX5_ESW_BRIDGE_EGRESS_TABLE_VLAN_GRP_SIZE - 1)
55
+ #define MLX5_ESW_BRIDGE_EGRESS_TABLE_MAC_GRP_IDX_FROM \
56
+ (MLX5_ESW_BRIDGE_EGRESS_TABLE_QINQ_GRP_IDX_TO + 1)
42
57
#define MLX5_ESW_BRIDGE_EGRESS_TABLE_MAC_GRP_IDX_TO \
43
58
(MLX5_ESW_BRIDGE_EGRESS_TABLE_MAC_GRP_IDX_FROM + \
44
59
MLX5_ESW_BRIDGE_EGRESS_TABLE_MAC_GRP_SIZE - 1)
@@ -80,6 +95,7 @@ struct mlx5_esw_bridge {
80
95
81
96
struct mlx5_flow_table * egress_ft ;
82
97
struct mlx5_flow_group * egress_vlan_fg ;
98
+ struct mlx5_flow_group * egress_qinq_fg ;
83
99
struct mlx5_flow_group * egress_mac_fg ;
84
100
struct mlx5_flow_group * egress_miss_fg ;
85
101
struct mlx5_pkt_reformat * egress_miss_pkt_reformat ;
@@ -176,6 +192,8 @@ mlx5_esw_bridge_ingress_vlan_proto_fg_create(unsigned int from, unsigned int to,
176
192
MLX5_SET_TO_ONES (fte_match_param , match , outer_headers .smac_15_0 );
177
193
if (vlan_proto == ETH_P_8021Q )
178
194
MLX5_SET_TO_ONES (fte_match_param , match , outer_headers .cvlan_tag );
195
+ else if (vlan_proto == ETH_P_8021AD )
196
+ MLX5_SET_TO_ONES (fte_match_param , match , outer_headers .svlan_tag );
179
197
MLX5_SET_TO_ONES (fte_match_param , match , outer_headers .first_vid );
180
198
181
199
MLX5_SET (fte_match_param , match , misc_parameters_2 .metadata_reg_c_0 ,
@@ -204,6 +222,17 @@ mlx5_esw_bridge_ingress_vlan_fg_create(struct mlx5_eswitch *esw,
204
222
return mlx5_esw_bridge_ingress_vlan_proto_fg_create (from , to , ETH_P_8021Q , esw , ingress_ft );
205
223
}
206
224
225
+ static struct mlx5_flow_group *
226
+ mlx5_esw_bridge_ingress_qinq_fg_create (struct mlx5_eswitch * esw ,
227
+ struct mlx5_flow_table * ingress_ft )
228
+ {
229
+ unsigned int from = MLX5_ESW_BRIDGE_INGRESS_TABLE_QINQ_GRP_IDX_FROM ;
230
+ unsigned int to = MLX5_ESW_BRIDGE_INGRESS_TABLE_QINQ_GRP_IDX_TO ;
231
+
232
+ return mlx5_esw_bridge_ingress_vlan_proto_fg_create (from , to , ETH_P_8021AD , esw ,
233
+ ingress_ft );
234
+ }
235
+
207
236
static struct mlx5_flow_group *
208
237
mlx5_esw_bridge_ingress_vlan_proto_filter_fg_create (unsigned int from , unsigned int to ,
209
238
u16 vlan_proto , struct mlx5_eswitch * esw ,
@@ -225,6 +254,8 @@ mlx5_esw_bridge_ingress_vlan_proto_filter_fg_create(unsigned int from, unsigned
225
254
MLX5_SET_TO_ONES (fte_match_param , match , outer_headers .smac_15_0 );
226
255
if (vlan_proto == ETH_P_8021Q )
227
256
MLX5_SET_TO_ONES (fte_match_param , match , outer_headers .cvlan_tag );
257
+ else if (vlan_proto == ETH_P_8021AD )
258
+ MLX5_SET_TO_ONES (fte_match_param , match , outer_headers .svlan_tag );
228
259
MLX5_SET (fte_match_param , match , misc_parameters_2 .metadata_reg_c_0 ,
229
260
mlx5_eswitch_get_vport_metadata_mask ());
230
261
@@ -251,6 +282,17 @@ mlx5_esw_bridge_ingress_vlan_filter_fg_create(struct mlx5_eswitch *esw,
251
282
ingress_ft );
252
283
}
253
284
285
+ static struct mlx5_flow_group *
286
+ mlx5_esw_bridge_ingress_qinq_filter_fg_create (struct mlx5_eswitch * esw ,
287
+ struct mlx5_flow_table * ingress_ft )
288
+ {
289
+ unsigned int from = MLX5_ESW_BRIDGE_INGRESS_TABLE_QINQ_FILTER_GRP_IDX_FROM ;
290
+ unsigned int to = MLX5_ESW_BRIDGE_INGRESS_TABLE_QINQ_FILTER_GRP_IDX_TO ;
291
+
292
+ return mlx5_esw_bridge_ingress_vlan_proto_filter_fg_create (from , to , ETH_P_8021AD , esw ,
293
+ ingress_ft );
294
+ }
295
+
254
296
static struct mlx5_flow_group *
255
297
mlx5_esw_bridge_ingress_mac_fg_create (struct mlx5_eswitch * esw , struct mlx5_flow_table * ingress_ft )
256
298
{
@@ -307,6 +349,8 @@ mlx5_esw_bridge_egress_vlan_proto_fg_create(unsigned int from, unsigned int to,
307
349
MLX5_SET_TO_ONES (fte_match_param , match , outer_headers .dmac_15_0 );
308
350
if (vlan_proto == ETH_P_8021Q )
309
351
MLX5_SET_TO_ONES (fte_match_param , match , outer_headers .cvlan_tag );
352
+ else if (vlan_proto == ETH_P_8021AD )
353
+ MLX5_SET_TO_ONES (fte_match_param , match , outer_headers .svlan_tag );
310
354
MLX5_SET_TO_ONES (fte_match_param , match , outer_headers .first_vid );
311
355
312
356
MLX5_SET (create_flow_group_in , in , start_flow_index , from );
@@ -330,6 +374,16 @@ mlx5_esw_bridge_egress_vlan_fg_create(struct mlx5_eswitch *esw, struct mlx5_flow
330
374
return mlx5_esw_bridge_egress_vlan_proto_fg_create (from , to , ETH_P_8021Q , esw , egress_ft );
331
375
}
332
376
377
+ static struct mlx5_flow_group *
378
+ mlx5_esw_bridge_egress_qinq_fg_create (struct mlx5_eswitch * esw ,
379
+ struct mlx5_flow_table * egress_ft )
380
+ {
381
+ unsigned int from = MLX5_ESW_BRIDGE_EGRESS_TABLE_QINQ_GRP_IDX_FROM ;
382
+ unsigned int to = MLX5_ESW_BRIDGE_EGRESS_TABLE_QINQ_GRP_IDX_TO ;
383
+
384
+ return mlx5_esw_bridge_egress_vlan_proto_fg_create (from , to , ETH_P_8021AD , esw , egress_ft );
385
+ }
386
+
333
387
static struct mlx5_flow_group *
334
388
mlx5_esw_bridge_egress_mac_fg_create (struct mlx5_eswitch * esw , struct mlx5_flow_table * egress_ft )
335
389
{
@@ -394,7 +448,7 @@ mlx5_esw_bridge_egress_miss_fg_create(struct mlx5_eswitch *esw, struct mlx5_flow
394
448
static int
395
449
mlx5_esw_bridge_ingress_table_init (struct mlx5_esw_bridge_offloads * br_offloads )
396
450
{
397
- struct mlx5_flow_group * mac_fg , * vlan_filter_fg , * vlan_fg ;
451
+ struct mlx5_flow_group * mac_fg , * qinq_filter_fg , * qinq_fg , * vlan_filter_fg , * vlan_fg ;
398
452
struct mlx5_flow_table * ingress_ft , * skip_ft ;
399
453
struct mlx5_eswitch * esw = br_offloads -> esw ;
400
454
int err ;
@@ -428,6 +482,18 @@ mlx5_esw_bridge_ingress_table_init(struct mlx5_esw_bridge_offloads *br_offloads)
428
482
goto err_vlan_filter_fg ;
429
483
}
430
484
485
+ qinq_fg = mlx5_esw_bridge_ingress_qinq_fg_create (esw , ingress_ft );
486
+ if (IS_ERR (qinq_fg )) {
487
+ err = PTR_ERR (qinq_fg );
488
+ goto err_qinq_fg ;
489
+ }
490
+
491
+ qinq_filter_fg = mlx5_esw_bridge_ingress_qinq_filter_fg_create (esw , ingress_ft );
492
+ if (IS_ERR (qinq_filter_fg )) {
493
+ err = PTR_ERR (qinq_filter_fg );
494
+ goto err_qinq_filter_fg ;
495
+ }
496
+
431
497
mac_fg = mlx5_esw_bridge_ingress_mac_fg_create (esw , ingress_ft );
432
498
if (IS_ERR (mac_fg )) {
433
499
err = PTR_ERR (mac_fg );
@@ -438,10 +504,16 @@ mlx5_esw_bridge_ingress_table_init(struct mlx5_esw_bridge_offloads *br_offloads)
438
504
br_offloads -> skip_ft = skip_ft ;
439
505
br_offloads -> ingress_vlan_fg = vlan_fg ;
440
506
br_offloads -> ingress_vlan_filter_fg = vlan_filter_fg ;
507
+ br_offloads -> ingress_qinq_fg = qinq_fg ;
508
+ br_offloads -> ingress_qinq_filter_fg = qinq_filter_fg ;
441
509
br_offloads -> ingress_mac_fg = mac_fg ;
442
510
return 0 ;
443
511
444
512
err_mac_fg :
513
+ mlx5_destroy_flow_group (qinq_filter_fg );
514
+ err_qinq_filter_fg :
515
+ mlx5_destroy_flow_group (qinq_fg );
516
+ err_qinq_fg :
445
517
mlx5_destroy_flow_group (vlan_filter_fg );
446
518
err_vlan_filter_fg :
447
519
mlx5_destroy_flow_group (vlan_fg );
@@ -457,6 +529,10 @@ mlx5_esw_bridge_ingress_table_cleanup(struct mlx5_esw_bridge_offloads *br_offloa
457
529
{
458
530
mlx5_destroy_flow_group (br_offloads -> ingress_mac_fg );
459
531
br_offloads -> ingress_mac_fg = NULL ;
532
+ mlx5_destroy_flow_group (br_offloads -> ingress_qinq_filter_fg );
533
+ br_offloads -> ingress_qinq_filter_fg = NULL ;
534
+ mlx5_destroy_flow_group (br_offloads -> ingress_qinq_fg );
535
+ br_offloads -> ingress_qinq_fg = NULL ;
460
536
mlx5_destroy_flow_group (br_offloads -> ingress_vlan_filter_fg );
461
537
br_offloads -> ingress_vlan_filter_fg = NULL ;
462
538
mlx5_destroy_flow_group (br_offloads -> ingress_vlan_fg );
@@ -476,7 +552,7 @@ static int
476
552
mlx5_esw_bridge_egress_table_init (struct mlx5_esw_bridge_offloads * br_offloads ,
477
553
struct mlx5_esw_bridge * bridge )
478
554
{
479
- struct mlx5_flow_group * miss_fg = NULL , * mac_fg , * vlan_fg ;
555
+ struct mlx5_flow_group * miss_fg = NULL , * mac_fg , * vlan_fg , * qinq_fg ;
480
556
struct mlx5_pkt_reformat * miss_pkt_reformat = NULL ;
481
557
struct mlx5_flow_handle * miss_handle = NULL ;
482
558
struct mlx5_eswitch * esw = br_offloads -> esw ;
@@ -495,6 +571,12 @@ mlx5_esw_bridge_egress_table_init(struct mlx5_esw_bridge_offloads *br_offloads,
495
571
goto err_vlan_fg ;
496
572
}
497
573
574
+ qinq_fg = mlx5_esw_bridge_egress_qinq_fg_create (esw , egress_ft );
575
+ if (IS_ERR (qinq_fg )) {
576
+ err = PTR_ERR (qinq_fg );
577
+ goto err_qinq_fg ;
578
+ }
579
+
498
580
mac_fg = mlx5_esw_bridge_egress_mac_fg_create (esw , egress_ft );
499
581
if (IS_ERR (mac_fg )) {
500
582
err = PTR_ERR (mac_fg );
@@ -539,13 +621,16 @@ mlx5_esw_bridge_egress_table_init(struct mlx5_esw_bridge_offloads *br_offloads,
539
621
540
622
bridge -> egress_ft = egress_ft ;
541
623
bridge -> egress_vlan_fg = vlan_fg ;
624
+ bridge -> egress_qinq_fg = qinq_fg ;
542
625
bridge -> egress_mac_fg = mac_fg ;
543
626
bridge -> egress_miss_fg = miss_fg ;
544
627
bridge -> egress_miss_pkt_reformat = miss_pkt_reformat ;
545
628
bridge -> egress_miss_handle = miss_handle ;
546
629
return 0 ;
547
630
548
631
err_mac_fg :
632
+ mlx5_destroy_flow_group (qinq_fg );
633
+ err_qinq_fg :
549
634
mlx5_destroy_flow_group (vlan_fg );
550
635
err_vlan_fg :
551
636
mlx5_destroy_flow_table (egress_ft );
@@ -563,6 +648,7 @@ mlx5_esw_bridge_egress_table_cleanup(struct mlx5_esw_bridge *bridge)
563
648
if (bridge -> egress_miss_fg )
564
649
mlx5_destroy_flow_group (bridge -> egress_miss_fg );
565
650
mlx5_destroy_flow_group (bridge -> egress_mac_fg );
651
+ mlx5_destroy_flow_group (bridge -> egress_qinq_fg );
566
652
mlx5_destroy_flow_group (bridge -> egress_vlan_fg );
567
653
mlx5_destroy_flow_table (bridge -> egress_ft );
568
654
}
@@ -612,6 +698,11 @@ mlx5_esw_bridge_ingress_flow_with_esw_create(u16 vport_num, const unsigned char
612
698
outer_headers .cvlan_tag );
613
699
MLX5_SET_TO_ONES (fte_match_param , rule_spec -> match_value ,
614
700
outer_headers .cvlan_tag );
701
+ } else if (bridge -> vlan_proto == ETH_P_8021AD ) {
702
+ MLX5_SET_TO_ONES (fte_match_param , rule_spec -> match_criteria ,
703
+ outer_headers .svlan_tag );
704
+ MLX5_SET_TO_ONES (fte_match_param , rule_spec -> match_value ,
705
+ outer_headers .svlan_tag );
615
706
}
616
707
MLX5_SET_TO_ONES (fte_match_param , rule_spec -> match_criteria ,
617
708
outer_headers .first_vid );
@@ -700,6 +791,11 @@ mlx5_esw_bridge_ingress_filter_flow_create(u16 vport_num, const unsigned char *a
700
791
outer_headers .cvlan_tag );
701
792
MLX5_SET_TO_ONES (fte_match_param , rule_spec -> match_value ,
702
793
outer_headers .cvlan_tag );
794
+ } else if (bridge -> vlan_proto == ETH_P_8021AD ) {
795
+ MLX5_SET_TO_ONES (fte_match_param , rule_spec -> match_criteria ,
796
+ outer_headers .svlan_tag );
797
+ MLX5_SET_TO_ONES (fte_match_param , rule_spec -> match_value ,
798
+ outer_headers .svlan_tag );
703
799
}
704
800
705
801
handle = mlx5_add_flow_rules (br_offloads -> ingress_ft , rule_spec , & flow_act , & dest , 1 );
@@ -753,6 +849,11 @@ mlx5_esw_bridge_egress_flow_create(u16 vport_num, u16 esw_owner_vhca_id, const u
753
849
outer_headers .cvlan_tag );
754
850
MLX5_SET_TO_ONES (fte_match_param , rule_spec -> match_value ,
755
851
outer_headers .cvlan_tag );
852
+ } else if (bridge -> vlan_proto == ETH_P_8021AD ) {
853
+ MLX5_SET_TO_ONES (fte_match_param , rule_spec -> match_criteria ,
854
+ outer_headers .svlan_tag );
855
+ MLX5_SET_TO_ONES (fte_match_param , rule_spec -> match_value ,
856
+ outer_headers .svlan_tag );
756
857
}
757
858
MLX5_SET_TO_ONES (fte_match_param , rule_spec -> match_criteria ,
758
859
outer_headers .first_vid );
@@ -1421,7 +1522,7 @@ int mlx5_esw_bridge_vlan_proto_set(u16 vport_num, u16 esw_owner_vhca_id, u16 pro
1421
1522
bridge = port -> bridge ;
1422
1523
if (bridge -> vlan_proto == proto )
1423
1524
return 0 ;
1424
- if (proto != ETH_P_8021Q ) {
1525
+ if (proto != ETH_P_8021Q && proto != ETH_P_8021AD ) {
1425
1526
esw_warn (br_offloads -> esw -> dev , "Can't set unsupported VLAN protocol %x" , proto );
1426
1527
return - EOPNOTSUPP ;
1427
1528
}
0 commit comments