[SRU][F:linux-bluefield][PATCH] net/sched: act_ct: Fix flow table lookup failure with no originating ifindex
Kleber Souza
kleber.souza at canonical.com
Thu Apr 7 08:13:28 UTC 2022
On 05.04.22 17:45, Bodong Wang wrote:
> On 4/5/2022 10:38 AM, Bodong Wang wrote:
>> From: Paul Blakey <paulb at nvidia.com>
>>
>> BugLink: https://bugs.launchpad.net/bugs/1967892
>>
>> After cited commit optimizted hw insertion, flow table entries are
>> populated with ifindex information which was intended to only be used
>> for HW offload. This tuple ifindex is hashed in the flow table key, so
>> it must be filled for lookup to be successful. But tuple ifindex is only
>> relevant for the netfilter flowtables (nft), so it's not filled in
>> act_ct flow table lookup, resulting in lookup failure, and no SW
>> offload and no offload teardown for TCP connection FIN/RST packets.
>>
>> To fix this, add new tc ifindex field to tuple, which will
>> only be used for offloading, not for lookup, as it will not be
>> part of the tuple hash.
>>
>> Fixes: 9795ded7f924 ("net/sched: act_ct: Fill offloading tuple iifidx")
>> Signed-off-by: Paul Blakey <paulb at nvidia.com>
>> Signed-off-by: Pablo Neira Ayuso <pablo at netfilter.org>
>> (backported from commit db6140e5e35a48405e669353bd54042c1d4c3841)
>> [Oz: Add missing enum ]
>> Signed-off-by: Oz Shlomo <ozsh at nvidia.com>
>> Signed-off-by: Bodong Wang <bodong at nvidia.com>
>> ---
>> include/net/netfilter/nf_flow_table.h | 16 ++++++++++++++++
>> net/netfilter/nf_flow_table_offload.c | 6 +++++-
>> net/sched/act_ct.c | 13 +++++++++----
>> 3 files changed, 30 insertions(+), 5 deletions(-)
>>
>> diff --git a/include/net/netfilter/nf_flow_table.h b/include/net/netfilter/nf_flow_table.h
>> index b40772f..a0c11bc 100644
>> --- a/include/net/netfilter/nf_flow_table.h
>> +++ b/include/net/netfilter/nf_flow_table.h
>> @@ -88,6 +88,14 @@ enum flow_offload_tuple_dir {
>> FLOW_OFFLOAD_DIR_MAX = IP_CT_DIR_MAX
>> };
>>
>> +enum flow_offload_xmit_type {
>> + FLOW_OFFLOAD_XMIT_UNSPEC = 0,
>> + FLOW_OFFLOAD_XMIT_NEIGH,
>> + FLOW_OFFLOAD_XMIT_XFRM,
>> + FLOW_OFFLOAD_XMIT_DIRECT,
>> + FLOW_OFFLOAD_XMIT_TC,
>> +};
>> +
>> struct flow_offload_tuple {
>> union {
>> struct in_addr src_v4;
>> @@ -111,6 +119,14 @@ struct flow_offload_tuple {
>> u16 mtu;
>>
>> struct dst_entry *dst_cache;
>> +
>> + /* fix conflicting upstream commit db6140e5e35a48405e669353bd54042c1d4c3841 */
>> + u8 xmit_type;
>> + union {
>> + struct {
>> + u32 iifidx;
>> + } tc;
>> + };
>> };
>>
>> struct flow_offload_tuple_rhash {
>> diff --git a/net/netfilter/nf_flow_table_offload.c b/net/netfilter/nf_flow_table_offload.c
>> index b6421a8..e41b5c5 100644
>> --- a/net/netfilter/nf_flow_table_offload.c
>> +++ b/net/netfilter/nf_flow_table_offload.c
>> @@ -103,7 +103,11 @@ static int nf_flow_rule_match(struct nf_flow_match *match,
>> nf_flow_rule_lwt_match(match, tun_info);
>> }
>>
>> - key->meta.ingress_ifindex = tuple->iifidx;
>> + if (tuple->xmit_type == FLOW_OFFLOAD_XMIT_TC)
>> + key->meta.ingress_ifindex = tuple->tc.iifidx;
>> + else
>> + key->meta.ingress_ifindex = tuple->iifidx;
>> +
>> mask->meta.ingress_ifindex = 0xffffffff;
>>
>> switch (tuple->l3proto) {
>> diff --git a/net/sched/act_ct.c b/net/sched/act_ct.c
>> index a54ba2e..ed310be 100644
>> --- a/net/sched/act_ct.c
>> +++ b/net/sched/act_ct.c
>> @@ -356,6 +356,13 @@ static void tcf_ct_flow_table_put(struct tcf_ct_params *params)
>> }
>> }
>>
>> +static void tcf_ct_flow_tc_ifidx(struct flow_offload *entry,
>> + struct nf_conn_act_ct_ext *act_ct_ext, u8 dir)
>> +{
>> + entry->tuplehash[dir].tuple.xmit_type = FLOW_OFFLOAD_XMIT_TC;
>> + entry->tuplehash[dir].tuple.tc.iifidx = act_ct_ext->ifindex[dir];
>> +}
>> +
>> static void tcf_ct_flow_table_add(struct tcf_ct_flow_table *ct_ft,
>> struct nf_conn *ct,
>> bool tcp)
>> @@ -380,10 +387,8 @@ static void tcf_ct_flow_table_add(struct tcf_ct_flow_table *ct_ft,
>>
>> act_ct_ext = nf_conn_act_ct_ext_find(ct);
>> if (act_ct_ext) {
>> - entry->tuplehash[FLOW_OFFLOAD_DIR_ORIGINAL].tuple.iifidx =
>> - act_ct_ext->ifindex[IP_CT_DIR_ORIGINAL];
>> - entry->tuplehash[FLOW_OFFLOAD_DIR_REPLY].tuple.iifidx =
>> - act_ct_ext->ifindex[IP_CT_DIR_REPLY];
>> + tcf_ct_flow_tc_ifidx(entry, act_ct_ext, FLOW_OFFLOAD_DIR_ORIGINAL);
>> + tcf_ct_flow_tc_ifidx(entry, act_ct_ext, FLOW_OFFLOAD_DIR_REPLY);
>> }
>>
>> err = flow_offload_add(&ct_ft->nf_ft, entry);
>
> Tim, can we apply this critical fix asap? We're closing the release but
> current SRU cycle(April) is too late for us.
>
>
Hi Bodong,
The commit that this fix claims to address (9795ded7f924 "net/sched: act_ct: Fill offloading tuple iifidx")
is applied and queued to be added to a build in the current SRU cycle (2022.03.21 with release date scheduled
for Apr-18). So if this release date is too late we will need to actually pull that commit and other prerequisites
for a re-spin in the previous SRU cycle (2022.02.21) to be released asap, but the release wouldn't likely happen
more than a week earlier than Apr-18. Is the second option what you need?
Thank you,
Kleber
More information about the kernel-team
mailing list