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 85bd9d46b5a0..02f593397fad 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 b09c11c048d5..96e8ecf0f530 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 ff95b1b9908e..5425af051d5a 100644
--- a/net/ipv4/ipip.c
+++ b/net/ipv4/ipip.c
@@ -369,6 +369,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 3d64e672eeee..c99ed41bfc99 100644
--- a/net/ipv6/ip6_tunnel.c
+++ b/net/ipv6/ip6_tunnel.c
@@ -1851,6 +1851,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 fd56d663cb5b..9efd76b57847 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 df4e180ed3c2..5a5774d9b6f5 100644
--- a/net/netfilter/nf_flow_table_path.c
+++ b/net/netfilter/nf_flow_table_path.c
@@ -127,6 +127,7 @@ static void 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) {
@@ -270,6 +271,7 @@ static void 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.54.0


Reply via email to