net/sched: act_ct: Enable hardware offload of flow table entires
authorPaul Blakey <paulb@mellanox.com>
Thu, 12 Mar 2020 10:23:09 +0000 (12:23 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 12 Mar 2020 22:00:39 +0000 (15:00 -0700)
Pass the zone's flow table instance on the flow action to the drivers.
Thus, allowing drivers to register FT add/del/stats callbacks.

Finally, enable hardware offload on the flow table instance.

Signed-off-by: Paul Blakey <paulb@mellanox.com>
Reviewed-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/flow_offload.h
include/net/tc_act/tc_ct.h
net/sched/act_ct.c
net/sched/cls_api.c

index a039c90..ceaa362 100644 (file)
@@ -225,6 +225,7 @@ struct flow_action_entry {
                struct {                                /* FLOW_ACTION_CT */
                        int action;
                        u16 zone;
+                       struct nf_flowtable *flow_table;
                } ct;
                struct {
                        unsigned long cookie;
index 735da59..79654bc 100644 (file)
@@ -27,6 +27,7 @@ struct tcf_ct_params {
        struct rcu_head rcu;
 
        struct tcf_ct_flow_table *ct_ft;
+       struct nf_flowtable *nf_ft;
 };
 
 struct tcf_ct {
@@ -50,9 +51,18 @@ static inline int tcf_ct_action(const struct tc_action *a)
        return to_ct_params(a)->ct_action;
 }
 
+static inline struct nf_flowtable *tcf_ct_ft(const struct tc_action *a)
+{
+       return to_ct_params(a)->nf_ft;
+}
+
 #else
 static inline uint16_t tcf_ct_zone(const struct tc_action *a) { return 0; }
 static inline int tcf_ct_action(const struct tc_action *a) { return 0; }
+static inline struct nf_flowtable *tcf_ct_ft(const struct tc_action *a)
+{
+       return NULL;
+}
 #endif /* CONFIG_NF_CONNTRACK */
 
 #if IS_ENABLED(CONFIG_NET_ACT_CT)
index 16fc731..56b66d2 100644 (file)
@@ -292,6 +292,7 @@ static int tcf_ct_flow_table_get(struct tcf_ct_params *params)
                goto err_insert;
 
        ct_ft->nf_ft.type = &flowtable_ct;
+       ct_ft->nf_ft.flags |= NF_FLOWTABLE_HW_OFFLOAD;
        err = nf_flow_table_init(&ct_ft->nf_ft);
        if (err)
                goto err_init;
@@ -299,6 +300,7 @@ static int tcf_ct_flow_table_get(struct tcf_ct_params *params)
        __module_get(THIS_MODULE);
 out_unlock:
        params->ct_ft = ct_ft;
+       params->nf_ft = &ct_ft->nf_ft;
        mutex_unlock(&zones_mutex);
 
        return 0;
index 2b5b4eb..2046102 100644 (file)
@@ -3636,6 +3636,7 @@ int tc_setup_flow_action(struct flow_action *flow_action,
                        entry->id = FLOW_ACTION_CT;
                        entry->ct.action = tcf_ct_action(act);
                        entry->ct.zone = tcf_ct_zone(act);
+                       entry->ct.flow_table = tcf_ct_ft(act);
                } else if (is_tcf_mpls(act)) {
                        switch (tcf_mpls_action(act)) {
                        case TCA_MPLS_ACT_PUSH: