Skip to content

Commit

Permalink
net/sched: act_ct: Enable hardware offload of flow table entires
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Paul Blakey authored and David S. Miller committed Mar 12, 2020
1 parent 8b3646d commit edd5861
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 0 deletions.
1 change: 1 addition & 0 deletions include/net/flow_offload.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
10 changes: 10 additions & 0 deletions include/net/tc_act/tc_ct.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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)
Expand Down
2 changes: 2 additions & 0 deletions net/sched/act_ct.c
Original file line number Diff line number Diff line change
Expand Up @@ -292,13 +292,15 @@ 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;

__module_get(THIS_MODULE);
out_unlock:
params->ct_ft = ct_ft;
params->nf_ft = &ct_ft->nf_ft;
mutex_unlock(&zones_mutex);

return 0;
Expand Down
1 change: 1 addition & 0 deletions net/sched/cls_api.c
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down

0 comments on commit edd5861

Please sign in to comment.