Commit 91707779 authored by Jianbo Liu's avatar Jianbo Liu Committed by Saeed Mahameed
Browse files

net/mlx5: Add support EXECUTE_ASO action for flow entry



Attach flow meter to FTE with object id and index.
Use metadata register C5 to store the packet color meter result.

Signed-off-by: default avatarJianbo Liu <jianbol@nvidia.com>
Reviewed-by: default avatarRoi Dayan <roid@nvidia.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
parent 3e94e61b
Loading
Loading
Loading
Loading
+33 −0
Original line number Diff line number Diff line
@@ -479,6 +479,30 @@ static int mlx5_set_extended_dest(struct mlx5_core_dev *dev,

	return 0;
}

static void
mlx5_cmd_set_fte_flow_meter(struct fs_fte *fte, void *in_flow_context)
{
	void *exe_aso_ctrl;
	void *execute_aso;

	execute_aso = MLX5_ADDR_OF(flow_context, in_flow_context,
				   execute_aso[0]);
	MLX5_SET(execute_aso, execute_aso, valid, 1);
	MLX5_SET(execute_aso, execute_aso, aso_object_id,
		 fte->action.exe_aso.object_id);

	exe_aso_ctrl = MLX5_ADDR_OF(execute_aso, execute_aso, exe_aso_ctrl);
	MLX5_SET(exe_aso_ctrl_flow_meter, exe_aso_ctrl, return_reg_id,
		 fte->action.exe_aso.return_reg_id);
	MLX5_SET(exe_aso_ctrl_flow_meter, exe_aso_ctrl, aso_type,
		 fte->action.exe_aso.type);
	MLX5_SET(exe_aso_ctrl_flow_meter, exe_aso_ctrl, init_color,
		 fte->action.exe_aso.flow_meter.init_color);
	MLX5_SET(exe_aso_ctrl_flow_meter, exe_aso_ctrl, meter_id,
		 fte->action.exe_aso.flow_meter.meter_idx);
}

static int mlx5_cmd_set_fte(struct mlx5_core_dev *dev,
			    int opmod, int modify_mask,
			    struct mlx5_flow_table *ft,
@@ -663,6 +687,15 @@ static int mlx5_cmd_set_fte(struct mlx5_core_dev *dev,
			 list_size);
	}

	if (fte->action.action & MLX5_FLOW_CONTEXT_ACTION_EXECUTE_ASO) {
		if (fte->action.exe_aso.type == MLX5_EXE_ASO_FLOW_METER) {
			mlx5_cmd_set_fte_flow_meter(fte, in_flow_context);
		} else {
			err = -EOPNOTSUPP;
			goto err_out;
		}
	}

	err = mlx5_cmd_exec(dev, in, inlen, out, sizeof(out));
err_out:
	kvfree(in);
+14 −0
Original line number Diff line number Diff line
@@ -212,6 +212,19 @@ struct mlx5_flow_group *
mlx5_create_flow_group(struct mlx5_flow_table *ft, u32 *in);
void mlx5_destroy_flow_group(struct mlx5_flow_group *fg);

struct mlx5_exe_aso {
	u32 object_id;
	u8 type;
	u8 return_reg_id;
	union {
		u32 ctrl_data;
		struct {
			u8 meter_idx;
			u8 init_color;
		} flow_meter;
	};
};

struct mlx5_fs_vlan {
        u16 ethtype;
        u16 vid;
@@ -237,6 +250,7 @@ struct mlx5_flow_act {
	struct mlx5_fs_vlan vlan[MLX5_FS_VLAN_DEPTH];
	struct ib_counters *counters;
	struct mlx5_flow_group *fg;
	struct mlx5_exe_aso exe_aso;
};

#define MLX5_DECLARE_FLOW_ACT(name) \