OSDN Git Service

flow_offload: add index to flow_action_entry structure
authorBaowen Zheng <baowen.zheng@corigine.com>
Fri, 17 Dec 2021 18:16:19 +0000 (19:16 +0100)
committerDavid S. Miller <davem@davemloft.net>
Sun, 19 Dec 2021 14:08:47 +0000 (14:08 +0000)
Add index to flow_action_entry structure and delete index from police and
gate child structure.

We make this change to offload tc action for driver to identify a tc
action.

Signed-off-by: Baowen Zheng <baowen.zheng@corigine.com>
Signed-off-by: Simon Horman <simon.horman@corigine.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/dsa/ocelot/felix_vsc9959.c
drivers/net/dsa/sja1105/sja1105_flower.c
drivers/net/ethernet/freescale/enetc/enetc_qos.c
drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c
drivers/net/ethernet/mscc/ocelot_flower.c
include/net/flow_offload.h
include/net/tc_act/tc_gate.h
net/sched/cls_api.c

index 110d6c4..4ffd303 100644 (file)
@@ -1745,7 +1745,7 @@ static void vsc9959_psfp_sfi_table_del(struct ocelot *ocelot, u32 index)
 static void vsc9959_psfp_parse_gate(const struct flow_action_entry *entry,
                                    struct felix_stream_gate *sgi)
 {
-       sgi->index = entry->gate.index;
+       sgi->index = entry->hw_index;
        sgi->ipv_valid = (entry->gate.prio < 0) ? 0 : 1;
        sgi->init_ipv = (sgi->ipv_valid) ? entry->gate.prio : 0;
        sgi->basetime = entry->gate.basetime;
@@ -1947,7 +1947,7 @@ static int vsc9959_psfp_filter_add(struct ocelot *ocelot, int port,
                        kfree(sgi);
                        break;
                case FLOW_ACTION_POLICE:
-                       index = a->police.index + VSC9959_PSFP_POLICER_BASE;
+                       index = a->hw_index + VSC9959_PSFP_POLICER_BASE;
                        if (index > VSC9959_PSFP_POLICER_MAX) {
                                ret = -EINVAL;
                                goto err;
index 72b9b39..7dcdd78 100644 (file)
@@ -379,7 +379,7 @@ int sja1105_cls_flower_add(struct dsa_switch *ds, int port,
                        vl_rule = true;
 
                        rc = sja1105_vl_gate(priv, port, extack, cookie,
-                                            &key, act->gate.index,
+                                            &key, act->hw_index,
                                             act->gate.prio,
                                             act->gate.basetime,
                                             act->gate.cycletime,
index 0536d2c..3555c12 100644 (file)
@@ -1182,7 +1182,7 @@ static int enetc_psfp_parse_clsflower(struct enetc_ndev_priv *priv,
        }
 
        /* parsing gate action */
-       if (entryg->gate.index >= priv->psfp_cap.max_psfp_gate) {
+       if (entryg->hw_index >= priv->psfp_cap.max_psfp_gate) {
                NL_SET_ERR_MSG_MOD(extack, "No Stream Gate resource!");
                err = -ENOSPC;
                goto free_filter;
@@ -1202,7 +1202,7 @@ static int enetc_psfp_parse_clsflower(struct enetc_ndev_priv *priv,
        }
 
        refcount_set(&sgi->refcount, 1);
-       sgi->index = entryg->gate.index;
+       sgi->index = entryg->hw_index;
        sgi->init_ipv = entryg->gate.prio;
        sgi->basetime = entryg->gate.basetime;
        sgi->cycletime = entryg->gate.cycletime;
@@ -1244,7 +1244,7 @@ static int enetc_psfp_parse_clsflower(struct enetc_ndev_priv *priv,
                        refcount_set(&fmi->refcount, 1);
                        fmi->cir = entryp->police.rate_bytes_ps;
                        fmi->cbs = entryp->police.burst;
-                       fmi->index = entryp->police.index;
+                       fmi->index = entryp->hw_index;
                        filter->flags |= ENETC_PSFP_FLAGS_FMI;
                        filter->fmi_index = fmi->index;
                        sfi->meter_id = fmi->index;
index be3791c..186c556 100644 (file)
@@ -203,7 +203,7 @@ static int mlxsw_sp_flower_parse_actions(struct mlxsw_sp *mlxsw_sp,
                         */
                        burst = roundup_pow_of_two(act->police.burst);
                        err = mlxsw_sp_acl_rulei_act_police(mlxsw_sp, rulei,
-                                                           act->police.index,
+                                                           act->hw_index,
                                                            act->police.rate_bytes_ps,
                                                            burst, extack);
                        if (err)
index 58fce17..beb9379 100644 (file)
@@ -303,7 +303,7 @@ static int ocelot_flower_parse_action(struct ocelot *ocelot, int port,
                        }
                        filter->action.police_ena = true;
 
-                       pol_ix = a->police.index + ocelot->vcap_pol.base;
+                       pol_ix = a->hw_index + ocelot->vcap_pol.base;
                        pol_max = ocelot->vcap_pol.max;
 
                        if (ocelot->vcap_pol.max2 && pol_ix > pol_max) {
index 3961461..2271da5 100644 (file)
@@ -197,6 +197,7 @@ void flow_action_cookie_destroy(struct flow_action_cookie *cookie);
 
 struct flow_action_entry {
        enum flow_action_id             id;
+       u32                             hw_index;
        enum flow_action_hw_stats       hw_stats;
        action_destr                    destructor;
        void                            *destructor_priv;
@@ -232,7 +233,6 @@ struct flow_action_entry {
                        bool                    truncate;
                } sample;
                struct {                                /* FLOW_ACTION_POLICE */
-                       u32                     index;
                        u32                     burst;
                        u64                     rate_bytes_ps;
                        u64                     burst_pkt;
@@ -267,7 +267,6 @@ struct flow_action_entry {
                        u8              ttl;
                } mpls_mangle;
                struct {
-                       u32             index;
                        s32             prio;
                        u64             basetime;
                        u64             cycletime;
index 8bc6be8..c8fa11e 100644 (file)
@@ -60,11 +60,6 @@ static inline bool is_tcf_gate(const struct tc_action *a)
        return false;
 }
 
-static inline u32 tcf_gate_index(const struct tc_action *a)
-{
-       return a->tcfa_index;
-}
-
 static inline s32 tcf_gate_prio(const struct tc_action *a)
 {
        s32 tcfg_prio;
index e54f0a4..dea1dca 100644 (file)
@@ -3568,6 +3568,7 @@ int tc_setup_flow_action(struct flow_action *flow_action,
                        goto err_out_locked;
 
                entry->hw_stats = tc_act_hw_stats(act->hw_stats);
+               entry->hw_index = act->tcfa_index;
 
                if (is_tcf_gact_ok(act)) {
                        entry->id = FLOW_ACTION_ACCEPT;
@@ -3659,7 +3660,6 @@ int tc_setup_flow_action(struct flow_action *flow_action,
                        entry->police.rate_pkt_ps =
                                tcf_police_rate_pkt_ps(act);
                        entry->police.mtu = tcf_police_tcfp_mtu(act);
-                       entry->police.index = act->tcfa_index;
                } else if (is_tcf_ct(act)) {
                        entry->id = FLOW_ACTION_CT;
                        entry->ct.action = tcf_ct_action(act);
@@ -3698,7 +3698,6 @@ int tc_setup_flow_action(struct flow_action *flow_action,
                        entry->priority = tcf_skbedit_priority(act);
                } else if (is_tcf_gate(act)) {
                        entry->id = FLOW_ACTION_GATE;
-                       entry->gate.index = tcf_gate_index(act);
                        entry->gate.prio = tcf_gate_prio(act);
                        entry->gate.basetime = tcf_gate_basetime(act);
                        entry->gate.cycletime = tcf_gate_cycletime(act);