Add encap_proto (AF_INET or AF_INET6) to struct flow_offload_tunnel
to allow its use as part of the hash table key during flowtable entry
lookup.
This is a preliminary change to support IPv4 over IPv6 tunneling via
the flowtable infrastructure for software acceleration.

Signed-off-by: Lorenzo Bianconi <[email protected]>
---
 include/linux/netdevice.h             | 1 +
 include/net/netfilter/nf_flow_table.h | 1 +
 net/ipv4/ipip.c                       | 1 +
 net/ipv6/ip6_tunnel.c                 | 1 +
 net/netfilter/nf_flow_table_ip.c      | 2 ++
 net/netfilter/nf_flow_table_path.c    | 2 ++
 6 files changed, 8 insertions(+)

diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index a97aee0e49b2..45d99e11b06e 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -902,6 +902,7 @@ struct net_device_path {
                        };
 
                        u8      l3_proto;
+                       u8      encap_proto;
                } tun;
                struct {
                        enum {
diff --git a/include/net/netfilter/nf_flow_table.h 
b/include/net/netfilter/nf_flow_table.h
index 7b23b245a5a8..4d406801ec90 100644
--- a/include/net/netfilter/nf_flow_table.h
+++ b/include/net/netfilter/nf_flow_table.h
@@ -118,6 +118,7 @@ struct flow_offload_tunnel {
        };
 
        u8      l3_proto;
+       u8      encap_proto;
 };
 
 struct flow_offload_tuple {
diff --git a/net/ipv4/ipip.c b/net/ipv4/ipip.c
index d1aa048a6099..4d2195b4ae3e 100644
--- a/net/ipv4/ipip.c
+++ b/net/ipv4/ipip.c
@@ -370,6 +370,7 @@ static int ipip_fill_forward_path(struct 
net_device_path_ctx *ctx,
        path->tun.src_v4.s_addr = tiph->saddr;
        path->tun.dst_v4.s_addr = tiph->daddr;
        path->tun.l3_proto = IPPROTO_IPIP;
+       path->tun.encap_proto = AF_INET;
        path->dev = ctx->dev;
 
        ctx->dev = rt->dst.dev;
diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c
index 38da07101601..a121f715afd2 100644
--- a/net/ipv6/ip6_tunnel.c
+++ b/net/ipv6/ip6_tunnel.c
@@ -1863,6 +1863,7 @@ static int ip6_tnl_fill_forward_path(struct 
net_device_path_ctx *ctx,
                path->type = DEV_PATH_TUN;
                path->tun.src_v6 = t->parms.laddr;
                path->tun.dst_v6 = t->parms.raddr;
+               path->tun.encap_proto = AF_INET6;
                if (ctx->ether_type == cpu_to_be16(ETH_P_IP))
                        path->tun.l3_proto = IPPROTO_IPIP;
                else
diff --git a/net/netfilter/nf_flow_table_ip.c b/net/netfilter/nf_flow_table_ip.c
index 29e93ac1e2e4..cf2c74e3fd56 100644
--- a/net/netfilter/nf_flow_table_ip.c
+++ b/net/netfilter/nf_flow_table_ip.c
@@ -198,6 +198,7 @@ static void nf_flow_tuple_encap(struct nf_flowtable_ctx 
*ctx,
                        tuple->tun.dst_v4.s_addr = iph->daddr;
                        tuple->tun.src_v4.s_addr = iph->saddr;
                        tuple->tun.l3_proto = IPPROTO_IPIP;
+                       tuple->tun.encap_proto = AF_INET;
                }
                break;
        case htons(ETH_P_IPV6):
@@ -206,6 +207,7 @@ static void nf_flow_tuple_encap(struct nf_flowtable_ctx 
*ctx,
                        tuple->tun.dst_v6 = ip6h->daddr;
                        tuple->tun.src_v6 = ip6h->saddr;
                        tuple->tun.l3_proto = IPPROTO_IPV6;
+                       tuple->tun.encap_proto = AF_INET6;
                }
                break;
        default:
diff --git a/net/netfilter/nf_flow_table_path.c 
b/net/netfilter/nf_flow_table_path.c
index c8011ec36532..caaf48c5fd2a 100644
--- a/net/netfilter/nf_flow_table_path.c
+++ b/net/netfilter/nf_flow_table_path.c
@@ -129,6 +129,7 @@ static int nft_dev_path_info(const struct 
net_device_path_stack *stack,
                                info->tun.src_v6 = path->tun.src_v6;
                                info->tun.dst_v6 = path->tun.dst_v6;
                                info->tun.l3_proto = path->tun.l3_proto;
+                               info->tun.encap_proto = path->tun.encap_proto;
                                info->num_tuns++;
                        } else {
                                if (info->num_encaps >= NF_FLOW_TABLE_ENCAP_MAX)
@@ -278,6 +279,7 @@ static int nft_dev_forward_path(const struct nft_pktinfo 
*pkt,
                route->tuple[!dir].in.tun.src_v6 = info.tun.dst_v6;
                route->tuple[!dir].in.tun.dst_v6 = info.tun.src_v6;
                route->tuple[!dir].in.tun.l3_proto = info.tun.l3_proto;
+               route->tuple[!dir].in.tun.encap_proto = info.tun.encap_proto;
                route->tuple[!dir].in.num_tuns = info.num_tuns;
        }
 

-- 
2.55.0


Reply via email to