return &esw->offloads.vport_reps[idx];
 }
 
+static void
+mlx5_eswitch_set_rule_flow_source(struct mlx5_eswitch *esw,
+                                 struct mlx5_flow_spec *spec,
+                                 struct mlx5_esw_flow_attr *attr)
+{
+       if (MLX5_CAP_ESW_FLOWTABLE(esw->dev, flow_source) &&
+           attr && attr->in_rep && attr->in_rep->vport == MLX5_VPORT_UPLINK)
+               spec->flow_context.flow_source = MLX5_FLOW_CONTEXT_FLOW_SOURCE_UPLINK;
+}
 
 static void
 mlx5_eswitch_set_rule_source_port(struct mlx5_eswitch *esw,
 
                spec->match_criteria_enable |= MLX5_MATCH_MISC_PARAMETERS;
        }
-
-       if (MLX5_CAP_ESW_FLOWTABLE(esw->dev, flow_source) &&
-           attr->in_rep->vport == MLX5_VPORT_UPLINK)
-               spec->flow_context.flow_source = MLX5_FLOW_CONTEXT_FLOW_SOURCE_UPLINK;
 }
 
 struct mlx5_flow_handle *
                flow_act.modify_hdr = attr->modify_hdr;
 
        if (split) {
-               if (MLX5_CAP_ESW_FLOWTABLE(esw->dev, flow_source) &&
-                   attr->in_rep->vport == MLX5_VPORT_UPLINK)
-                       spec->flow_context.flow_source = MLX5_FLOW_CONTEXT_FLOW_SOURCE_UPLINK;
                fdb = esw_vport_tbl_get(esw, attr);
        } else {
                if (attr->chain || attr->prio)
                goto err_esw_get;
        }
 
+       mlx5_eswitch_set_rule_flow_source(esw, spec, attr);
+
        if (mlx5_eswitch_termtbl_required(esw, attr, &flow_act, spec))
                rule = mlx5_eswitch_add_termtbl_rule(esw, fdb, spec, attr,
                                                     &flow_act, dest, i);
        i++;
 
        mlx5_eswitch_set_rule_source_port(esw, spec, attr);
+       mlx5_eswitch_set_rule_flow_source(esw, spec, attr);
 
        if (attr->outer_match_level != MLX5_MATCH_NONE)
                spec->match_criteria_enable |= MLX5_MATCH_OUTER_HEADERS;