Commit edd5861e authored by Paul Blakey's avatar Paul Blakey Committed by David S. Miller

net/sched: act_ct: Enable hardware offload of flow table entires

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: default avatarPaul Blakey <paulb@mellanox.com>
Reviewed-by: default avatarJiri Pirko <jiri@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 8b3646d6
...@@ -225,6 +225,7 @@ struct flow_action_entry { ...@@ -225,6 +225,7 @@ struct flow_action_entry {
struct { /* FLOW_ACTION_CT */ struct { /* FLOW_ACTION_CT */
int action; int action;
u16 zone; u16 zone;
struct nf_flowtable *flow_table;
} ct; } ct;
struct { struct {
unsigned long cookie; unsigned long cookie;
......
...@@ -27,6 +27,7 @@ struct tcf_ct_params { ...@@ -27,6 +27,7 @@ struct tcf_ct_params {
struct rcu_head rcu; struct rcu_head rcu;
struct tcf_ct_flow_table *ct_ft; struct tcf_ct_flow_table *ct_ft;
struct nf_flowtable *nf_ft;
}; };
struct tcf_ct { struct tcf_ct {
...@@ -50,9 +51,18 @@ static inline int tcf_ct_action(const struct tc_action *a) ...@@ -50,9 +51,18 @@ static inline int tcf_ct_action(const struct tc_action *a)
return to_ct_params(a)->ct_action; 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 #else
static inline uint16_t tcf_ct_zone(const struct tc_action *a) { return 0; } 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 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 */ #endif /* CONFIG_NF_CONNTRACK */
#if IS_ENABLED(CONFIG_NET_ACT_CT) #if IS_ENABLED(CONFIG_NET_ACT_CT)
......
...@@ -292,6 +292,7 @@ static int tcf_ct_flow_table_get(struct tcf_ct_params *params) ...@@ -292,6 +292,7 @@ static int tcf_ct_flow_table_get(struct tcf_ct_params *params)
goto err_insert; goto err_insert;
ct_ft->nf_ft.type = &flowtable_ct; 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); err = nf_flow_table_init(&ct_ft->nf_ft);
if (err) if (err)
goto err_init; goto err_init;
...@@ -299,6 +300,7 @@ static int tcf_ct_flow_table_get(struct tcf_ct_params *params) ...@@ -299,6 +300,7 @@ static int tcf_ct_flow_table_get(struct tcf_ct_params *params)
__module_get(THIS_MODULE); __module_get(THIS_MODULE);
out_unlock: out_unlock:
params->ct_ft = ct_ft; params->ct_ft = ct_ft;
params->nf_ft = &ct_ft->nf_ft;
mutex_unlock(&zones_mutex); mutex_unlock(&zones_mutex);
return 0; return 0;
......
...@@ -3636,6 +3636,7 @@ int tc_setup_flow_action(struct flow_action *flow_action, ...@@ -3636,6 +3636,7 @@ int tc_setup_flow_action(struct flow_action *flow_action,
entry->id = FLOW_ACTION_CT; entry->id = FLOW_ACTION_CT;
entry->ct.action = tcf_ct_action(act); entry->ct.action = tcf_ct_action(act);
entry->ct.zone = tcf_ct_zone(act); entry->ct.zone = tcf_ct_zone(act);
entry->ct.flow_table = tcf_ct_ft(act);
} else if (is_tcf_mpls(act)) { } else if (is_tcf_mpls(act)) {
switch (tcf_mpls_action(act)) { switch (tcf_mpls_action(act)) {
case TCA_MPLS_ACT_PUSH: case TCA_MPLS_ACT_PUSH:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment