struct tc_cls_matchall_offload *cls,
bool ingress)
{
- struct tcf_exts *exts = cls->exts;
const struct tc_action *a;
int err;
- if (!list_is_singular(&exts->actions)) {
+ if (!tc_single_action(cls->exts)) {
netdev_err(mlxsw_sp_port->dev, "only singular actions are supported\n");
return -ENOTSUPP;
}
- a = list_first_entry(&exts->actions, struct tc_action, list);
- if (is_tcf_mirred_mirror(a) && protocol == htons(ETH_P_ALL)) {
+ tc_for_each_action(a, cls->exts) {
+ if (!is_tcf_mirred_mirror(a) || protocol != htons(ETH_P_ALL))
+ return -ENOTSUPP;
+
err = mlxsw_sp_port_add_cls_matchall_mirror(mlxsw_sp_port, cls,
a, ingress);
if (err)
return err;
- } else {
- return -ENOTSUPP;
}
return 0;
#define tc_for_each_action(_a, _exts) \
list_for_each_entry(a, &(_exts)->actions, list)
+#define tc_single_action(_exts) \
+ (list_is_singular(&(_exts)->actions))
+
static inline void tcf_action_stats_update(struct tc_action *a, u64 bytes,
u64 packets, u64 lastuse)
{
#define tc_no_actions(_exts) true
#define tc_for_each_action(_a, _exts) while ((void)(_a), 0)
+#define tc_single_action(_exts) false
#define tcf_action_stats_update(a, bytes, packets, lastuse)
#endif /* CONFIG_NET_CLS_ACT */