mlxsw: spectrum_flower: Offload FLOW_ACTION_PRIORITY
Offload action skbedit priority when keyed to a flower classifier. The skb->priority field in Linux is very generic, so only allow setting the bottom 8 priorities and bounce anything else. Signed-off-by: Petr Machata <petrm@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
4d745f8cf5
commit
463957e3fb
5 changed files with 45 additions and 0 deletions
|
@ -1273,6 +1273,24 @@ mlxsw_afa_qos_switch_prio_pack(char *payload,
|
||||||
mlxsw_afa_qos_switch_prio_set(payload, prio);
|
mlxsw_afa_qos_switch_prio_set(payload, prio);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int mlxsw_afa_block_append_qos_switch_prio(struct mlxsw_afa_block *block,
|
||||||
|
u8 prio,
|
||||||
|
struct netlink_ext_ack *extack)
|
||||||
|
{
|
||||||
|
char *act = mlxsw_afa_block_append_action(block,
|
||||||
|
MLXSW_AFA_QOS_CODE,
|
||||||
|
MLXSW_AFA_QOS_SIZE);
|
||||||
|
|
||||||
|
if (IS_ERR(act)) {
|
||||||
|
NL_SET_ERR_MSG_MOD(extack, "Cannot append QOS action");
|
||||||
|
return PTR_ERR(act);
|
||||||
|
}
|
||||||
|
mlxsw_afa_qos_switch_prio_pack(act, MLXSW_AFA_QOS_CMD_SET,
|
||||||
|
prio);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(mlxsw_afa_block_append_qos_switch_prio);
|
||||||
|
|
||||||
/* Forwarding Action
|
/* Forwarding Action
|
||||||
* -----------------
|
* -----------------
|
||||||
* Forwarding Action can be used to implement Policy Based Switching (PBS)
|
* Forwarding Action can be used to implement Policy Based Switching (PBS)
|
||||||
|
|
|
@ -62,6 +62,9 @@ int mlxsw_afa_block_append_fwd(struct mlxsw_afa_block *block,
|
||||||
int mlxsw_afa_block_append_vlan_modify(struct mlxsw_afa_block *block,
|
int mlxsw_afa_block_append_vlan_modify(struct mlxsw_afa_block *block,
|
||||||
u16 vid, u8 pcp, u8 et,
|
u16 vid, u8 pcp, u8 et,
|
||||||
struct netlink_ext_ack *extack);
|
struct netlink_ext_ack *extack);
|
||||||
|
int mlxsw_afa_block_append_qos_switch_prio(struct mlxsw_afa_block *block,
|
||||||
|
u8 prio,
|
||||||
|
struct netlink_ext_ack *extack);
|
||||||
int mlxsw_afa_block_append_allocated_counter(struct mlxsw_afa_block *block,
|
int mlxsw_afa_block_append_allocated_counter(struct mlxsw_afa_block *block,
|
||||||
u32 counter_index);
|
u32 counter_index);
|
||||||
int mlxsw_afa_block_append_counter(struct mlxsw_afa_block *block,
|
int mlxsw_afa_block_append_counter(struct mlxsw_afa_block *block,
|
||||||
|
|
|
@ -746,6 +746,9 @@ int mlxsw_sp_acl_rulei_act_vlan(struct mlxsw_sp *mlxsw_sp,
|
||||||
struct mlxsw_sp_acl_rule_info *rulei,
|
struct mlxsw_sp_acl_rule_info *rulei,
|
||||||
u32 action, u16 vid, u16 proto, u8 prio,
|
u32 action, u16 vid, u16 proto, u8 prio,
|
||||||
struct netlink_ext_ack *extack);
|
struct netlink_ext_ack *extack);
|
||||||
|
int mlxsw_sp_acl_rulei_act_priority(struct mlxsw_sp *mlxsw_sp,
|
||||||
|
struct mlxsw_sp_acl_rule_info *rulei,
|
||||||
|
u32 prio, struct netlink_ext_ack *extack);
|
||||||
int mlxsw_sp_acl_rulei_act_count(struct mlxsw_sp *mlxsw_sp,
|
int mlxsw_sp_acl_rulei_act_count(struct mlxsw_sp *mlxsw_sp,
|
||||||
struct mlxsw_sp_acl_rule_info *rulei,
|
struct mlxsw_sp_acl_rule_info *rulei,
|
||||||
struct netlink_ext_ack *extack);
|
struct netlink_ext_ack *extack);
|
||||||
|
|
|
@ -638,6 +638,23 @@ int mlxsw_sp_acl_rulei_act_vlan(struct mlxsw_sp *mlxsw_sp,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int mlxsw_sp_acl_rulei_act_priority(struct mlxsw_sp *mlxsw_sp,
|
||||||
|
struct mlxsw_sp_acl_rule_info *rulei,
|
||||||
|
u32 prio, struct netlink_ext_ack *extack)
|
||||||
|
{
|
||||||
|
/* Even though both Linux and Spectrum switches support 16 priorities,
|
||||||
|
* spectrum_qdisc only processes the first eight priomap elements, and
|
||||||
|
* the DCB and PFC features are tied to 8 priorities as well. Therefore
|
||||||
|
* bounce attempts to prioritize packets to higher priorities.
|
||||||
|
*/
|
||||||
|
if (prio >= IEEE_8021QAZ_MAX_TCS) {
|
||||||
|
NL_SET_ERR_MSG_MOD(extack, "Only priorities 0..7 are supported");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
return mlxsw_afa_block_append_qos_switch_prio(rulei->act_block, prio,
|
||||||
|
extack);
|
||||||
|
}
|
||||||
|
|
||||||
int mlxsw_sp_acl_rulei_act_count(struct mlxsw_sp *mlxsw_sp,
|
int mlxsw_sp_acl_rulei_act_count(struct mlxsw_sp *mlxsw_sp,
|
||||||
struct mlxsw_sp_acl_rule_info *rulei,
|
struct mlxsw_sp_acl_rule_info *rulei,
|
||||||
struct netlink_ext_ack *extack)
|
struct netlink_ext_ack *extack)
|
||||||
|
|
|
@ -154,6 +154,10 @@ static int mlxsw_sp_flower_parse_actions(struct mlxsw_sp *mlxsw_sp,
|
||||||
act->id, vid,
|
act->id, vid,
|
||||||
proto, prio, extack);
|
proto, prio, extack);
|
||||||
}
|
}
|
||||||
|
case FLOW_ACTION_PRIORITY:
|
||||||
|
return mlxsw_sp_acl_rulei_act_priority(mlxsw_sp, rulei,
|
||||||
|
act->priority,
|
||||||
|
extack);
|
||||||
default:
|
default:
|
||||||
NL_SET_ERR_MSG_MOD(extack, "Unsupported action");
|
NL_SET_ERR_MSG_MOD(extack, "Unsupported action");
|
||||||
dev_err(mlxsw_sp->bus_info->dev, "Unsupported action\n");
|
dev_err(mlxsw_sp->bus_info->dev, "Unsupported action\n");
|
||||||
|
|
Loading…
Add table
Reference in a new issue