@@ -88,6 +88,53 @@ u16 mlx5_eswitch_get_prio_range(struct mlx5_eswitch *esw)
88
88
return 1 ;
89
89
}
90
90
91
+ static void
92
+ mlx5_eswitch_set_rule_source_port (struct mlx5_eswitch * esw ,
93
+ struct mlx5_flow_spec * spec ,
94
+ struct mlx5_esw_flow_attr * attr )
95
+ {
96
+ void * misc2 ;
97
+ void * misc ;
98
+
99
+ /* Use metadata matching because vport is not represented by single
100
+ * VHCA in dual-port RoCE mode, and matching on source vport may fail.
101
+ */
102
+ if (mlx5_eswitch_vport_match_metadata_enabled (esw )) {
103
+ misc2 = MLX5_ADDR_OF (fte_match_param , spec -> match_value , misc_parameters_2 );
104
+ MLX5_SET (fte_match_set_misc2 , misc2 , metadata_reg_c_0 ,
105
+ mlx5_eswitch_get_vport_metadata_for_match (attr -> in_mdev -> priv .eswitch ,
106
+ attr -> in_rep -> vport ));
107
+
108
+ misc2 = MLX5_ADDR_OF (fte_match_param , spec -> match_criteria , misc_parameters_2 );
109
+ MLX5_SET_TO_ONES (fte_match_set_misc2 , misc2 , metadata_reg_c_0 );
110
+
111
+ spec -> match_criteria_enable |= MLX5_MATCH_MISC_PARAMETERS_2 ;
112
+ misc = MLX5_ADDR_OF (fte_match_param , spec -> match_criteria , misc_parameters );
113
+ if (memchr_inv (misc , 0 , MLX5_ST_SZ_BYTES (fte_match_set_misc )))
114
+ spec -> match_criteria_enable |= MLX5_MATCH_MISC_PARAMETERS ;
115
+ } else {
116
+ misc = MLX5_ADDR_OF (fte_match_param , spec -> match_value , misc_parameters );
117
+ MLX5_SET (fte_match_set_misc , misc , source_port , attr -> in_rep -> vport );
118
+
119
+ if (MLX5_CAP_ESW (esw -> dev , merged_eswitch ))
120
+ MLX5_SET (fte_match_set_misc , misc ,
121
+ source_eswitch_owner_vhca_id ,
122
+ MLX5_CAP_GEN (attr -> in_mdev , vhca_id ));
123
+
124
+ misc = MLX5_ADDR_OF (fte_match_param , spec -> match_criteria , misc_parameters );
125
+ MLX5_SET_TO_ONES (fte_match_set_misc , misc , source_port );
126
+ if (MLX5_CAP_ESW (esw -> dev , merged_eswitch ))
127
+ MLX5_SET_TO_ONES (fte_match_set_misc , misc ,
128
+ source_eswitch_owner_vhca_id );
129
+
130
+ spec -> match_criteria_enable |= MLX5_MATCH_MISC_PARAMETERS ;
131
+ }
132
+
133
+ if (MLX5_CAP_ESW_FLOWTABLE (esw -> dev , flow_source ) &&
134
+ attr -> in_rep -> vport == MLX5_VPORT_UPLINK )
135
+ spec -> flow_context .flow_source = MLX5_FLOW_CONTEXT_FLOW_SOURCE_UPLINK ;
136
+ }
137
+
91
138
struct mlx5_flow_handle *
92
139
mlx5_eswitch_add_offloaded_rule (struct mlx5_eswitch * esw ,
93
140
struct mlx5_flow_spec * spec ,
@@ -99,7 +146,6 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
99
146
struct mlx5_flow_handle * rule ;
100
147
struct mlx5_flow_table * fdb ;
101
148
int j , i = 0 ;
102
- void * misc ;
103
149
104
150
if (esw -> mode != SRIOV_OFFLOADS )
105
151
return ERR_PTR (- EOPNOTSUPP );
@@ -159,21 +205,8 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
159
205
i ++ ;
160
206
}
161
207
162
- misc = MLX5_ADDR_OF (fte_match_param , spec -> match_value , misc_parameters );
163
- MLX5_SET (fte_match_set_misc , misc , source_port , attr -> in_rep -> vport );
164
-
165
- if (MLX5_CAP_ESW (esw -> dev , merged_eswitch ))
166
- MLX5_SET (fte_match_set_misc , misc ,
167
- source_eswitch_owner_vhca_id ,
168
- MLX5_CAP_GEN (attr -> in_mdev , vhca_id ));
208
+ mlx5_eswitch_set_rule_source_port (esw , spec , attr );
169
209
170
- misc = MLX5_ADDR_OF (fte_match_param , spec -> match_criteria , misc_parameters );
171
- MLX5_SET_TO_ONES (fte_match_set_misc , misc , source_port );
172
- if (MLX5_CAP_ESW (esw -> dev , merged_eswitch ))
173
- MLX5_SET_TO_ONES (fte_match_set_misc , misc ,
174
- source_eswitch_owner_vhca_id );
175
-
176
- spec -> match_criteria_enable = MLX5_MATCH_MISC_PARAMETERS ;
177
210
if (flow_act .action & MLX5_FLOW_CONTEXT_ACTION_DECAP ) {
178
211
if (attr -> tunnel_match_level != MLX5_MATCH_NONE )
179
212
spec -> match_criteria_enable |= MLX5_MATCH_OUTER_HEADERS ;
@@ -219,7 +252,6 @@ mlx5_eswitch_add_fwd_rule(struct mlx5_eswitch *esw,
219
252
struct mlx5_flow_table * fast_fdb ;
220
253
struct mlx5_flow_table * fwd_fdb ;
221
254
struct mlx5_flow_handle * rule ;
222
- void * misc ;
223
255
int i ;
224
256
225
257
fast_fdb = esw_get_prio_table (esw , attr -> chain , attr -> prio , 0 );
@@ -251,25 +283,10 @@ mlx5_eswitch_add_fwd_rule(struct mlx5_eswitch *esw,
251
283
dest [i ].ft = fwd_fdb ,
252
284
i ++ ;
253
285
254
- misc = MLX5_ADDR_OF (fte_match_param , spec -> match_value , misc_parameters );
255
- MLX5_SET (fte_match_set_misc , misc , source_port , attr -> in_rep -> vport );
256
-
257
- if (MLX5_CAP_ESW (esw -> dev , merged_eswitch ))
258
- MLX5_SET (fte_match_set_misc , misc ,
259
- source_eswitch_owner_vhca_id ,
260
- MLX5_CAP_GEN (attr -> in_mdev , vhca_id ));
261
-
262
- misc = MLX5_ADDR_OF (fte_match_param , spec -> match_criteria , misc_parameters );
263
- MLX5_SET_TO_ONES (fte_match_set_misc , misc , source_port );
264
- if (MLX5_CAP_ESW (esw -> dev , merged_eswitch ))
265
- MLX5_SET_TO_ONES (fte_match_set_misc , misc ,
266
- source_eswitch_owner_vhca_id );
286
+ mlx5_eswitch_set_rule_source_port (esw , spec , attr );
267
287
268
- if (attr -> match_level == MLX5_MATCH_NONE )
269
- spec -> match_criteria_enable = MLX5_MATCH_MISC_PARAMETERS ;
270
- else
271
- spec -> match_criteria_enable = MLX5_MATCH_OUTER_HEADERS |
272
- MLX5_MATCH_MISC_PARAMETERS ;
288
+ if (attr -> match_level != MLX5_MATCH_NONE )
289
+ spec -> match_criteria_enable |= MLX5_MATCH_OUTER_HEADERS ;
273
290
274
291
rule = mlx5_add_flow_rules (fast_fdb , spec , & flow_act , dest , i );
275
292
0 commit comments