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: Paul Blakey <paulb@mellanox.com> Reviewed-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
8b3646d6e0
Коммит
edd5861e59
|
@ -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 {
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
__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,
|
||||||
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:
|
||||||
|
|
Загрузка…
Ссылка в новой задаче