mlxsw: core_acl_flex_actions: Return error for conflicting actions
Spectrum switch ACL action set is built in groups of three actions
which may point to additional actions. A group holds a single record
which can be set as goto record for pointing at a following group
or can be set to mark the termination of the lookup. This is perfectly
adequate for handling a series of actions to be executed on a packet.
While the SW model allows configuration of conflicting actions
where it is clear that some actions will never execute, the mlxsw
driver must block such configurations as it creates a conflict
over the single terminate/goto record value.
For a conflicting actions configuration such as:
# tc filter add dev swp49 parent ffff: \
protocol ip pref 10 \
flower skip_sw dst_ip 192.168.101.1 \
action goto chain 100 \
action mirred egress mirror dev swp4
Where it is clear that the last action will never execute, the
mlxsw driver was issuing a warning instead of returning an error.
Therefore replace that warning with an error for this specific
case.
Fixes: 4cda7d8d70
("mlxsw: core: Introduce flexible actions support")
Signed-off-by: Nir Dotan <nird@mellanox.com>
Reviewed-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
afb41bb039
commit
3757b255bf
@ -626,8 +626,8 @@ static char *mlxsw_afa_block_append_action(struct mlxsw_afa_block *block,
|
||||
char *oneact;
|
||||
char *actions;
|
||||
|
||||
if (WARN_ON(block->finished))
|
||||
return NULL;
|
||||
if (block->finished)
|
||||
return ERR_PTR(-EINVAL);
|
||||
if (block->cur_act_index + action_size >
|
||||
block->afa->max_acts_per_set) {
|
||||
struct mlxsw_afa_set *set;
|
||||
@ -637,7 +637,7 @@ static char *mlxsw_afa_block_append_action(struct mlxsw_afa_block *block,
|
||||
*/
|
||||
set = mlxsw_afa_set_create(false);
|
||||
if (!set)
|
||||
return NULL;
|
||||
return ERR_PTR(-ENOBUFS);
|
||||
set->prev = block->cur_set;
|
||||
block->cur_act_index = 0;
|
||||
block->cur_set->next = set;
|
||||
@ -724,8 +724,8 @@ int mlxsw_afa_block_append_vlan_modify(struct mlxsw_afa_block *block,
|
||||
MLXSW_AFA_VLAN_CODE,
|
||||
MLXSW_AFA_VLAN_SIZE);
|
||||
|
||||
if (!act)
|
||||
return -ENOBUFS;
|
||||
if (IS_ERR(act))
|
||||
return PTR_ERR(act);
|
||||
mlxsw_afa_vlan_pack(act, MLXSW_AFA_VLAN_VLAN_TAG_CMD_NOP,
|
||||
MLXSW_AFA_VLAN_CMD_SET_OUTER, vid,
|
||||
MLXSW_AFA_VLAN_CMD_SET_OUTER, pcp,
|
||||
@ -806,8 +806,8 @@ int mlxsw_afa_block_append_drop(struct mlxsw_afa_block *block)
|
||||
MLXSW_AFA_TRAPDISC_CODE,
|
||||
MLXSW_AFA_TRAPDISC_SIZE);
|
||||
|
||||
if (!act)
|
||||
return -ENOBUFS;
|
||||
if (IS_ERR(act))
|
||||
return PTR_ERR(act);
|
||||
mlxsw_afa_trapdisc_pack(act, MLXSW_AFA_TRAPDISC_TRAP_ACTION_NOP,
|
||||
MLXSW_AFA_TRAPDISC_FORWARD_ACTION_DISCARD, 0);
|
||||
return 0;
|
||||
@ -820,8 +820,8 @@ int mlxsw_afa_block_append_trap(struct mlxsw_afa_block *block, u16 trap_id)
|
||||
MLXSW_AFA_TRAPDISC_CODE,
|
||||
MLXSW_AFA_TRAPDISC_SIZE);
|
||||
|
||||
if (!act)
|
||||
return -ENOBUFS;
|
||||
if (IS_ERR(act))
|
||||
return PTR_ERR(act);
|
||||
mlxsw_afa_trapdisc_pack(act, MLXSW_AFA_TRAPDISC_TRAP_ACTION_TRAP,
|
||||
MLXSW_AFA_TRAPDISC_FORWARD_ACTION_DISCARD,
|
||||
trap_id);
|
||||
@ -836,8 +836,8 @@ int mlxsw_afa_block_append_trap_and_forward(struct mlxsw_afa_block *block,
|
||||
MLXSW_AFA_TRAPDISC_CODE,
|
||||
MLXSW_AFA_TRAPDISC_SIZE);
|
||||
|
||||
if (!act)
|
||||
return -ENOBUFS;
|
||||
if (IS_ERR(act))
|
||||
return PTR_ERR(act);
|
||||
mlxsw_afa_trapdisc_pack(act, MLXSW_AFA_TRAPDISC_TRAP_ACTION_TRAP,
|
||||
MLXSW_AFA_TRAPDISC_FORWARD_ACTION_FORWARD,
|
||||
trap_id);
|
||||
@ -908,8 +908,8 @@ mlxsw_afa_block_append_allocated_mirror(struct mlxsw_afa_block *block,
|
||||
char *act = mlxsw_afa_block_append_action(block,
|
||||
MLXSW_AFA_TRAPDISC_CODE,
|
||||
MLXSW_AFA_TRAPDISC_SIZE);
|
||||
if (!act)
|
||||
return -ENOBUFS;
|
||||
if (IS_ERR(act))
|
||||
return PTR_ERR(act);
|
||||
mlxsw_afa_trapdisc_pack(act, MLXSW_AFA_TRAPDISC_TRAP_ACTION_NOP,
|
||||
MLXSW_AFA_TRAPDISC_FORWARD_ACTION_FORWARD, 0);
|
||||
mlxsw_afa_trapdisc_mirror_pack(act, true, mirror_agent);
|
||||
@ -996,8 +996,8 @@ int mlxsw_afa_block_append_fwd(struct mlxsw_afa_block *block,
|
||||
|
||||
act = mlxsw_afa_block_append_action(block, MLXSW_AFA_FORWARD_CODE,
|
||||
MLXSW_AFA_FORWARD_SIZE);
|
||||
if (!act) {
|
||||
err = -ENOBUFS;
|
||||
if (IS_ERR(act)) {
|
||||
err = PTR_ERR(act);
|
||||
goto err_append_action;
|
||||
}
|
||||
mlxsw_afa_forward_pack(act, MLXSW_AFA_FORWARD_TYPE_PBS,
|
||||
@ -1052,8 +1052,8 @@ int mlxsw_afa_block_append_allocated_counter(struct mlxsw_afa_block *block,
|
||||
{
|
||||
char *act = mlxsw_afa_block_append_action(block, MLXSW_AFA_POLCNT_CODE,
|
||||
MLXSW_AFA_POLCNT_SIZE);
|
||||
if (!act)
|
||||
return -ENOBUFS;
|
||||
if (IS_ERR(act))
|
||||
return PTR_ERR(act);
|
||||
mlxsw_afa_polcnt_pack(act, MLXSW_AFA_POLCNT_COUNTER_SET_TYPE_PACKETS_BYTES,
|
||||
counter_index);
|
||||
return 0;
|
||||
@ -1123,8 +1123,8 @@ int mlxsw_afa_block_append_fid_set(struct mlxsw_afa_block *block, u16 fid)
|
||||
char *act = mlxsw_afa_block_append_action(block,
|
||||
MLXSW_AFA_VIRFWD_CODE,
|
||||
MLXSW_AFA_VIRFWD_SIZE);
|
||||
if (!act)
|
||||
return -ENOBUFS;
|
||||
if (IS_ERR(act))
|
||||
return PTR_ERR(act);
|
||||
mlxsw_afa_virfwd_pack(act, MLXSW_AFA_VIRFWD_FID_CMD_SET, fid);
|
||||
return 0;
|
||||
}
|
||||
@ -1193,8 +1193,8 @@ int mlxsw_afa_block_append_mcrouter(struct mlxsw_afa_block *block,
|
||||
char *act = mlxsw_afa_block_append_action(block,
|
||||
MLXSW_AFA_MCROUTER_CODE,
|
||||
MLXSW_AFA_MCROUTER_SIZE);
|
||||
if (!act)
|
||||
return -ENOBUFS;
|
||||
if (IS_ERR(act))
|
||||
return PTR_ERR(act);
|
||||
mlxsw_afa_mcrouter_pack(act, MLXSW_AFA_MCROUTER_RPF_ACTION_TRAP,
|
||||
expected_irif, min_mtu, rmid_valid, kvdl_index);
|
||||
return 0;
|
||||
|
Loading…
Reference in New Issue
Block a user