Updated iptunnel patches. Switch to codelinaro.org source.

Minor fixes and patch sorting.
This commit is contained in:
SqTER-PL
2025-03-05 18:51:08 +01:00
committed by Lucas Asvio
parent abc096ab76
commit 056b68da27
21 changed files with 563 additions and 77 deletions

View File

@@ -1,77 +0,0 @@
--- a/include/net/ip6_tunnel.h
+++ b/include/net/ip6_tunnel.h
@@ -36,6 +36,7 @@ struct __ip6_tnl_parm {
__u8 proto; /* tunnel protocol */
__u8 encap_limit; /* encapsulation limit for tunnel */
__u8 hop_limit; /* hop limit for tunnel */
+ __u8 draft03; /* FMR using draft03 of map-e - QCA NSS Clients Support */
bool collect_md;
__be32 flowinfo; /* traffic class and flowlabel for tunnel */
__u32 flags; /* tunnel flags */
--- a/include/net/ip_tunnels.h
+++ b/include/net/ip_tunnels.h
@@ -592,4 +592,9 @@ static inline void ip_tunnel_info_opts_s
#endif /* CONFIG_INET */
+/* QCA NSS Clients Support - Start */
+void ipip6_update_offload_stats(struct net_device *dev, void *ptr);
+void ip6_update_offload_stats(struct net_device *dev, void *ptr);
+/* QCA NSS Clients Support - End */
+
#endif /* __NET_IP_TUNNELS_H */
--- a/net/ipv6/ip6_tunnel.c
+++ b/net/ipv6/ip6_tunnel.c
@@ -2414,6 +2414,26 @@ nla_put_failure:
return -EMSGSIZE;
}
+/* QCA NSS Client Support - Start */
+/*
+ * Update offload stats
+ */
+void ip6_update_offload_stats(struct net_device *dev, void *ptr)
+{
+ struct pcpu_sw_netstats *tstats = per_cpu_ptr(dev->tstats, 0);
+ const struct pcpu_sw_netstats *offload_stats =
+ (struct pcpu_sw_netstats *)ptr;
+
+ u64_stats_update_begin(&tstats->syncp);
+ u64_stats_add(&tstats->tx_packets, u64_stats_read(&offload_stats->tx_packets));
+ u64_stats_add(&tstats->tx_bytes, u64_stats_read(&offload_stats->tx_bytes));
+ u64_stats_add(&tstats->rx_packets, u64_stats_read(&offload_stats->rx_packets));
+ u64_stats_add(&tstats->rx_bytes, u64_stats_read(&offload_stats->rx_bytes));
+ u64_stats_update_end(&tstats->syncp);
+}
+EXPORT_SYMBOL(ip6_update_offload_stats);
+/* QCA NSS Client Support - End */
+
struct net *ip6_tnl_get_link_net(const struct net_device *dev)
{
struct ip6_tnl *tunnel = netdev_priv(dev);
--- a/net/ipv6/sit.c
+++ b/net/ipv6/sit.c
@@ -1734,6 +1734,23 @@ nla_put_failure:
return -EMSGSIZE;
}
+/* QCA NSS Clients Support - Start */
+void ipip6_update_offload_stats(struct net_device *dev, void *ptr)
+{
+ struct pcpu_sw_netstats *tstats = per_cpu_ptr(dev->tstats, 0);
+ const struct pcpu_sw_netstats *offload_stats =
+ (struct pcpu_sw_netstats *)ptr;
+
+ u64_stats_update_begin(&tstats->syncp);
+ u64_stats_add(&tstats->tx_packets, u64_stats_read(&offload_stats->tx_packets));
+ u64_stats_add(&tstats->tx_bytes, u64_stats_read(&offload_stats->tx_bytes));
+ u64_stats_add(&tstats->rx_packets, u64_stats_read(&offload_stats->rx_packets));
+ u64_stats_add(&tstats->rx_bytes, u64_stats_read(&offload_stats->rx_bytes));
+ u64_stats_update_end(&tstats->syncp);
+}
+EXPORT_SYMBOL(ipip6_update_offload_stats);
+/* QCA NSS Clients Support - End */
+
static const struct nla_policy ipip6_policy[IFLA_IPTUN_MAX + 1] = {
[IFLA_IPTUN_LINK] = { .type = NLA_U32 },
[IFLA_IPTUN_LOCAL] = { .type = NLA_U32 },

View File

@@ -0,0 +1,113 @@
From bd7f46b6e8b0ef8a0e74277b9528e27a39af4ea2 Mon Sep 17 00:00:00 2001
From: Sachin Kohli <quic_sachkohl@quicinc.com>
Date: Tue, 19 Dec 2023 10:17:14 +0530
Subject: [PATCH 207/500] ip_tunnel_core: NULL pointer check before
netif_is_vxlan
We need to check if in_dev is NULL before calling netif_is_vxlan
Change-Id: Ia1d38441bf37af691d2afab7f5545a721192e83e
Signed-off-by: Tian Yang <quic_tiany@quicinc.com>
Signed-off-by: Vishnu Vardhan Bantanahal <quic_vishvard@quicinc.com>
net: Setting skb input interface to vxlan during encapsulation.
Setting skb_iif to vxlan when encapsulating with IP/IPv6 header.
Also removed the is_vxlan_dev() API support, as it can be replaced
by in-built API netif_is_vxlan().
Change-Id: I480d15b2ef2e91038676c620a98217e35e29b002
Signed-off-by: Apoorv Gupta <apoogupt@codeaurora.org>
Signed-off-by: Vishnu Vardhan Bantanahal <quic_vishvard@quicinc.com>
---
drivers/net/vxlan/vxlan_core.c | 6 ++++++
include/net/vxlan.h | 15 ++++-----------
net/ipv4/ip_tunnel_core.c | 15 +++++++++++++++
3 files changed, 25 insertions(+), 11 deletions(-)
--- a/drivers/net/vxlan/vxlan_core.c
+++ b/drivers/net/vxlan/vxlan_core.c
@@ -2631,6 +2631,9 @@ void vxlan_xmit_one(struct sk_buff *skb,
goto out_unlock;
}
+ /* Reset the skb_iif to Tunnels interface index */
+ skb->skb_iif = dev->ifindex;
+
tos = ip_tunnel_ecn_encap(tos, old_iph, skb);
ttl = ttl ? : ip4_dst_hoplimit(&rt->dst);
err = vxlan_build_skb(skb, ndst, sizeof(struct iphdr),
@@ -2702,6 +2705,9 @@ void vxlan_xmit_one(struct sk_buff *skb,
if (err < 0)
goto tx_error;
+ /* Reset the skb_iif to Tunnels interface index */
+ skb->skb_iif = dev->ifindex;
+
udp_tunnel6_xmit_skb(ndst, sock6->sock->sk, skb, dev,
&local_ip.sin6.sin6_addr,
&dst->sin6.sin6_addr, tos, ttl,
--- a/include/net/vxlan.h
+++ b/include/net/vxlan.h
@@ -454,19 +454,12 @@ static inline __be32 vxlan_compute_rco(u
}
/*
- * is_vxlan_dev()
- * Check if it is a VxLAN netdevice.
+ * vxlan_get_vni()
+ * Returns the vni corresponding to tunnel
*/
-static inline bool is_vxlan_dev(const struct net_device *dev)
+static inline u32 vxlan_get_vni(struct vxlan_dev *vxlan_tun)
{
- if (!dev)
- return false;
-
- if ((dev->dev.type) &&
- !strncmp(dev->dev.type->name, "vxlan", sizeof("vxlan"))) {
- return true;
- }
- return false;
+ return be32_to_cpu(vxlan_tun->cfg.vni);
}
static inline unsigned short vxlan_get_sk_family(struct vxlan_sock *vs)
--- a/net/ipv4/ip_tunnel_core.c
+++ b/net/ipv4/ip_tunnel_core.c
@@ -38,6 +38,7 @@
#include <net/geneve.h>
#include <net/vxlan.h>
#include <net/erspan.h>
+#include <net/vxlan.h>
const struct ip_tunnel_encap_ops __rcu *
iptun_encaps[MAX_IPTUN_ENCAP_OPS] __read_mostly;
@@ -55,7 +56,12 @@ void iptunnel_xmit(struct sock *sk, stru
struct net *net = dev_net(rt->dst.dev);
struct net_device *dev = skb->dev;
struct iphdr *iph;
+ struct net_device *in_dev = NULL;
int err;
+ int skb_iif;
+
+ /* Save input interface index */
+ skb_iif = skb->skb_iif;
skb_scrub_packet(skb, xnet);
@@ -79,6 +85,15 @@ void iptunnel_xmit(struct sock *sk, stru
iph->ttl = ttl;
__ip_select_ident(net, iph, skb_shinfo(skb)->gso_segs ?: 1);
+ /* Get input interface */
+ if (skb_iif) {
+ in_dev = __dev_get_by_index(&init_net, skb_iif);
+ }
+
+ if (proto == IPPROTO_IPV6 || proto == IPPROTO_GRE || (in_dev && netif_is_vxlan(in_dev))) {
+ skb->skb_iif = skb_iif;
+ }
+
err = ip_local_out(net, sk, skb);
if (dev) {

View File

@@ -0,0 +1,110 @@
From 365bac798ea16e3eb34d8c164b94bc3a4c1fcc51 Mon Sep 17 00:00:00 2001
From: Murat Sezgin <quic_msezgin@quicinc.com>
Date: Tue, 20 Jun 2023 13:19:29 -0700
Subject: [PATCH 274/500] net: Enable fast path support for 6RD, DS-Lite
1). Added stats update function
2). Added changes to set the skb->skb_iif to tunnel dev
Change-Id: I7f43746436b4f6483952997fdf91180096d3ed62
Signed-off-by: Shyam Sunder <ssunde@codeaurora.org>
Signed-off-by: Murat Sezgin <msezgin@codeaurora.org>
Signed-off-by: John Sanli <quic_jsanli@quicinc.com>
Signed-off-by: Pavithra R <quic_pavir@quicinc.com>
---
--- a/net/ipv6/ip6_tunnel.c
+++ b/net/ipv6/ip6_tunnel.c
@@ -100,6 +100,23 @@ static inline int ip6_tnl_mpls_supported
#define for_each_ip6_tunnel_rcu(start) \
for (t = rcu_dereference(start); t; t = rcu_dereference(t->next))
+/*
+ * Update offload stats
+ */
+void ip6_update_offload_stats(struct net_device *dev, void *ptr)
+{
+ struct pcpu_sw_netstats *tstats = this_cpu_ptr(dev->tstats);
+ const struct pcpu_sw_netstats *offload_stats =
+ (struct pcpu_sw_netstats *)ptr;
+
+ u64_stats_update_begin(&tstats->syncp);
+ u64_stats_add(&tstats->tx_packets, u64_stats_read(&offload_stats->tx_packets));
+ u64_stats_add(&tstats->tx_bytes, u64_stats_read(&offload_stats->tx_bytes));
+ u64_stats_add(&tstats->rx_packets, u64_stats_read(&offload_stats->rx_packets));
+ u64_stats_add(&tstats->rx_bytes, u64_stats_read(&offload_stats->rx_bytes));
+ u64_stats_update_end(&tstats->syncp);
+}
+EXPORT_SYMBOL(ip6_update_offload_stats);
/**
* ip6_tnl_lookup - fetch tunnel matching the end-point addresses
* @net: network namespace
@@ -1024,6 +1041,9 @@ static int __ip6_tnl_rcv(struct ip6_tnl
if (tun_dst)
skb_dst_set(skb, (struct dst_entry *)tun_dst);
+ /* Reset the skb_iif to Tunnels interface index */
+ skb->skb_iif = tunnel->dev->ifindex;
+
gro_cells_receive(&tunnel->gro_cells, skb);
return 0;
@@ -1105,7 +1125,6 @@ static int ipxip6_rcv(struct sk_buff *sk
rcu_read_unlock();
return ret;
-
drop:
rcu_read_unlock();
kfree_skb(skb);
@@ -1424,6 +1443,9 @@ route_lookup:
ipv6h->nexthdr = proto;
ipv6h->saddr = fl6->saddr;
ipv6h->daddr = fl6->daddr;
+
+ /* Reset the skb_iif to Tunnels interface index */
+ skb->skb_iif = dev->ifindex;
ip6tunnel_xmit(NULL, skb, dev);
return 0;
tx_err_link_failure:
--- a/net/ipv6/sit.c
+++ b/net/ipv6/sit.c
@@ -90,6 +90,20 @@ static inline struct sit_net *dev_to_sit
return net_generic(t->net, sit_net_id);
}
+void ipip6_update_offload_stats(struct net_device *dev, void *ptr)
+{
+ struct pcpu_sw_netstats *tstats = this_cpu_ptr(dev->tstats);
+ const struct pcpu_sw_netstats *offload_stats =
+ (struct pcpu_sw_netstats *)ptr;
+
+ u64_stats_update_begin(&tstats->syncp);
+ u64_stats_add(&tstats->tx_packets, u64_stats_read(&offload_stats->tx_packets));
+ u64_stats_add(&tstats->tx_bytes, u64_stats_read(&offload_stats->tx_bytes));
+ u64_stats_add(&tstats->rx_packets, u64_stats_read(&offload_stats->rx_packets));
+ u64_stats_add(&tstats->rx_bytes, u64_stats_read(&offload_stats->rx_bytes));
+ u64_stats_update_end(&tstats->syncp);
+}
+EXPORT_SYMBOL(ipip6_update_offload_stats);
/*
* Must be invoked with rcu_read_lock
*/
@@ -722,6 +736,8 @@ static int ipip6_rcv(struct sk_buff *skb
dev_sw_netstats_rx_add(tunnel->dev, skb->len);
+ /* Reset the skb_iif to Tunnels interface index */
+ skb->skb_iif = tunnel->dev->ifindex;
netif_rx(skb);
return 0;
@@ -1031,6 +1047,8 @@ static netdev_tx_t ipip6_tunnel_xmit(str
skb_set_inner_ipproto(skb, IPPROTO_IPV6);
+ /* Reset the skb_iif to Tunnels interface index */
+ skb->skb_iif = tunnel->dev->ifindex;
iptunnel_xmit(NULL, rt, skb, fl4.saddr, fl4.daddr, protocol, tos, ttl,
df, !net_eq(tunnel->net, dev_net(dev)));
return NETDEV_TX_OK;

View File

@@ -0,0 +1,28 @@
From e3e9167247b3e234d915e25a4692ed6c6ec11935 Mon Sep 17 00:00:00 2001
From: Vishnu Vardhan Bantanahal <quic_vishvard@quicinc.com>
Date: Thu, 1 Jun 2023 17:55:00 +0530
Subject: [PATCH 271/500] net: added a new netdevice priv flag for soft tunnel
This flag can be used by flow acceleration managers
to identify whether a flow is originated from or
destined to a tun/tap device
Change-Id: I9631a13f083f5096be2c0046eedd277b9971c72d
Signed-off-by: Amit Gupta <amitgupt@codeaurora.org>
Signed-off-by: Pavithra R <pavir@codeaurora.org>
Signed-off-by: Vishnu Vardhan Bantanahal <quic_vishvard@quicinc.com>
Signed-off-by: Pavithra R <quic_pavir@quicinc.com>
---
drivers/net/tun.c | 1 +
1 file changed, 1 insertion(+)
--- a/drivers/net/tun.c
+++ b/drivers/net/tun.c
@@ -999,6 +999,7 @@ static int tun_net_init(struct net_devic
dev->vlan_features = dev->features &
~(NETIF_F_HW_VLAN_CTAG_TX |
NETIF_F_HW_VLAN_STAG_TX);
+ dev->priv_flags_ext |= IFF_EXT_TUN_TAP;
tun->flags = (tun->flags & ~TUN_FEATURES) |
(ifr->ifr_flags & TUN_FEATURES);

View File

@@ -0,0 +1,49 @@
From 3d55122c4a9bab65e4e9652e72155d1e20b3d27d Mon Sep 17 00:00:00 2001
From: John Sanli <quic_jsanli@quicinc.com>
Date: Tue, 20 Jun 2023 13:03:01 -0700
Subject: [PATCH 239/500] net: Correct FMR Calculation in Linux 6.1
Previously FMR calculation was set to only occur in ip4ip6_tnl_xmit()
Linux 6.1 replaces this with ipxip6_tnl_xmit()
There is one tnl_xmit function for both ipv4 and ipv6 in this kernel.
This patch ensures FMR calculation is only performed in outbound direction.
Change-Id: If36e1033be7f8b9fbea4e1d9a3664c1d8b41c666
Signed-off-by: John Sanli <quic_jsanli@quicinc.com>
---
net/ipv6/ip6_tunnel.c | 22 ++++++++++++----------
1 file changed, 12 insertions(+), 10 deletions(-)
--- a/net/ipv6/ip6_tunnel.c
+++ b/net/ipv6/ip6_tunnel.c
@@ -1562,17 +1562,19 @@ ipxip6_tnl_xmit(struct sk_buff *skb, str
fl6.flowi6_uid = sock_net_uid(dev_net(dev), NULL);
dsfield = INET_ECN_encapsulate(dsfield, orig_dsfield);
- /* try to find matching FMR */
- for (fmr = t->parms.fmrs; fmr; fmr = fmr->next) {
- unsigned mshift = 32 - fmr->ip4_prefix_len;
- if (ntohl(fmr->ip4_prefix.s_addr) >> mshift ==
- ntohl(ip_hdr(skb)->daddr) >> mshift)
- break;
- }
+ if (protocol == IPPROTO_IPIP) {
+ /* try to find matching FMR */
+ for (fmr = t->parms.fmrs; fmr; fmr = fmr->next) {
+ unsigned mshift = 32 - fmr->ip4_prefix_len;
+ if (ntohl(fmr->ip4_prefix.s_addr) >> mshift ==
+ ntohl(ip_hdr(skb)->daddr) >> mshift)
+ break;
+ }
- /* change dstaddr according to FMR */
- if (fmr)
- ip4ip6_fmr_calc(&fl6.daddr, ip_hdr(skb), skb_tail_pointer(skb), fmr, true);
+ /* change dstaddr according to FMR */
+ if (fmr)
+ ip4ip6_fmr_calc(&fl6.daddr, ip_hdr(skb), skb_tail_pointer(skb), fmr, true);
+ }
if (iptunnel_handle_offloads(skb, SKB_GSO_IPXIP6))
return -1;

View File

@@ -0,0 +1,126 @@
From 926028b718c2a79b02365698fbac658b2ec5d297 Mon Sep 17 00:00:00 2001
From: Ramkishan Gurjar <quic_rgurjar@quicinc.com>
Date: Tue, 3 Oct 2023 09:42:20 +0530
Subject: [PATCH 240/500] Squashed commit of the following:
commit cde5e3757488b6753036c3e31a124b25f50a93fd
Author: Ken Zhu <guigenz@codeaurora.org>
Date: Mon Mar 12 11:21:31 2018 -0700
linux: fix the memory is not clean after memmove
the memory won't be set to zero after memmove, set it
to zero.
Change-Id: I9996aa5fa56a41967e31ec4df9820932feec6256
Signed-off-by: Ken Zhu <guigenz@codeaurora.org>
commit a81e33134a7d14a8fb9e1f636b946affb2c8fc80
Author: Himanshu Joshi <himajosh@codeaurora.org>
Date: Fri Apr 24 12:12:10 2020 +0530
net: add draft03 specification support for tunipip6
draft03 of map-e is used in some environment, we add this supported
Change-Id: I81462632f0e6f2b5af0b1f8229c42572892c5972
Signed-off-by: Zhu Ken <guigenz@codeaurora.org>
Change-Id: I3569082ddbdf3f30b8ab273cb7dc9ab2bfbc886c
---
include/net/ip6_tunnel.h | 1 +
include/uapi/linux/if_tunnel.h | 1 +
net/ipv6/ip6_tunnel.c | 31 +++++++++++++++++++++++++++----
3 files changed, 29 insertions(+), 4 deletions(-)
--- a/include/net/ip6_tunnel.h
+++ b/include/net/ip6_tunnel.h
@@ -37,6 +37,7 @@ struct __ip6_tnl_parm {
__u8 encap_limit; /* encapsulation limit for tunnel */
__u8 hop_limit; /* hop limit for tunnel */
bool collect_md;
+ __u8 draft03; /* FMR using draft03 of map-e */
__be32 flowinfo; /* traffic class and flowlabel for tunnel */
__u32 flags; /* tunnel flags */
struct in6_addr laddr; /* local tunnel end-point address */
--- a/include/uapi/linux/if_tunnel.h
+++ b/include/uapi/linux/if_tunnel.h
@@ -78,6 +78,7 @@ enum {
IFLA_IPTUN_COLLECT_METADATA,
IFLA_IPTUN_FWMARK,
IFLA_IPTUN_FMRS,
+ IFLA_IPTUN_DRAFT03,
__IFLA_IPTUN_MAX,
};
#define IFLA_IPTUN_MAX (__IFLA_IPTUN_MAX - 1)
--- a/net/ipv6/ip6_tunnel.c
+++ b/net/ipv6/ip6_tunnel.c
@@ -839,7 +839,7 @@ EXPORT_SYMBOL_GPL(ip6_tnl_rcv_ctl);
**/
static void ip4ip6_fmr_calc(struct in6_addr *dest,
const struct iphdr *iph, const uint8_t *end,
- const struct __ip6_tnl_fmr *fmr, bool xmit)
+ const struct __ip6_tnl_fmr *fmr, bool xmit, bool draft03)
{
int psidlen = fmr->ea_len - (32 - fmr->ip4_prefix_len);
u8 *portp = NULL;
@@ -927,10 +927,28 @@ static void ip4ip6_fmr_calc(struct in6_a
<< (64 - fmr->ea_len - fromrem));
t = cpu_to_be64(t | (eabits >> fromrem));
memcpy(&dest->s6_addr[frombyte], &t, bytes);
+ if (draft03) {
+ /**
+ * Draft03 IPv6 address format
+ * +--+---+---+---+---+---+---+---+---+
+ * |PL| 8 16 24 32 40 48 56 |
+ * +--+---+---+---+---+---+---+---+---+
+ * |64| u | IPv4 address |PSID |0 |
+ * +--+---+---+---+---+---+---+---+---+
+ * Final specification IPv6 address format
+ * +--+---+---+---+---+---+---+---+---+
+ * |PL| 8 16 24 32 40 48 56 |
+ * +--+---+---+---+---+---+---+---+---+
+ * |64| 0 | IPv4 address |PSID |
+ * +--+---+---+---+---+---+---+---+---+
+ * We need move last six Bytes 1 byte forward
+ */
+ memmove(&dest->s6_addr[9], &dest->s6_addr[10], 6);
+ dest->s6_addr[15] = 0;
+ }
}
}
-
static int __ip6_tnl_rcv(struct ip6_tnl *tunnel, struct sk_buff *skb,
const struct tnl_ptk_info *tpi,
struct metadata_dst *tun_dst,
@@ -1011,7 +1029,8 @@ static int __ip6_tnl_rcv(struct ip6_tnl
/* Check that IPv6 matches IPv4 source to prevent spoofing */
if (fmr)
ip4ip6_fmr_calc(&expected, ip_hdr(skb),
- skb_tail_pointer(skb), fmr, false);
+ skb_tail_pointer(skb), fmr, false,
+ tunnel->parms.draft03);
if (!ipv6_addr_equal(&ipv6h->saddr, &expected)) {
rcu_read_unlock();
@@ -1573,7 +1592,8 @@ ipxip6_tnl_xmit(struct sk_buff *skb, str
/* change dstaddr according to FMR */
if (fmr)
- ip4ip6_fmr_calc(&fl6.daddr, ip_hdr(skb), skb_tail_pointer(skb), fmr, true);
+ ip4ip6_fmr_calc(&fl6.daddr, ip_hdr(skb), skb_tail_pointer(skb), fmr,
+ true, t->parms.draft03);
}
if (iptunnel_handle_offloads(skb, SKB_GSO_IPXIP6))
@@ -2207,6 +2227,9 @@ static void ip6_tnl_netlink_parms(struct
if (data[IFLA_IPTUN_FWMARK])
parms->fwmark = nla_get_u32(data[IFLA_IPTUN_FWMARK]);
+ if (data[IFLA_IPTUN_DRAFT03])
+ parms->draft03 = nla_get_u8(data[IFLA_IPTUN_DRAFT03]);
+
if (data[IFLA_IPTUN_FMRS]) {
unsigned rem;
struct nlattr *fmr;

View File

@@ -0,0 +1,41 @@
From 9d5acd39ef0579f27dcd2ce44316f3a4df973fa1 Mon Sep 17 00:00:00 2001
From: Nitin Shetty <quic_nitinsj@quicinc.com>
Date: Wed, 12 Jan 2022 00:06:57 +0530
Subject: [PATCH 299/500] net: gre: adding API to check GRE net device
adding support to check if the net device
is GRE.
Change-Id: Ic50f41299b19939fb8313667e4b8c9c571432235
Signed-off-by: Nitin Shetty <quic_nitinsj@quicinc.com>
---
include/net/gre.h | 12 ++++++++++++
1 file changed, 12 insertions(+)
--- a/include/net/gre.h
+++ b/include/net/gre.h
@@ -43,12 +43,24 @@ static inline bool netif_is_gretap(const
!strcmp(dev->rtnl_link_ops->kind, "gretap");
}
+static inline bool netif_is_gre(const struct net_device *dev)
+{
+ return dev->rtnl_link_ops &&
+ !strcmp(dev->rtnl_link_ops->kind, "gre");
+}
+
static inline bool netif_is_ip6gretap(const struct net_device *dev)
{
return dev->rtnl_link_ops &&
!strcmp(dev->rtnl_link_ops->kind, "ip6gretap");
}
+static inline bool netif_is_ip6gre(const struct net_device *dev)
+{
+ return dev->rtnl_link_ops &&
+ !strcmp(dev->rtnl_link_ops->kind, "ip6gre");
+}
+
static inline int gre_calc_hlen(__be16 o_flags)
{
int addend = 4;

View File

@@ -0,0 +1,96 @@
From 512681ea05f185d80a6511407ccefacda94cfe21 Mon Sep 17 00:00:00 2001
From: Swati Singh <quic_swasing@quicinc.com>
Date: Wed, 24 Aug 2022 09:37:33 -0700
Subject: [PATCH 300/500] net:gre: Adding support to detect fb netdev
adding support to detect whether the
given netdevice is fallback device
for gretap and ipv6 tunnel.
Change-Id: Idf275af604ea56061e48f45c89154ef1d20c902a
Signed-off-by: Swati Singh <quic_swasing@quicinc.com>
---
include/net/gre.h | 1 +
include/net/ip_tunnels.h | 3 +++
net/ipv4/ip_gre.c | 20 ++++++++++++++++++++
net/ipv6/ip6_tunnel.c | 20 ++++++++++++++++++++
4 files changed, 44 insertions(+)
--- a/include/net/gre.h
+++ b/include/net/gre.h
@@ -31,6 +31,7 @@ struct gre_protocol {
int gre_add_protocol(const struct gre_protocol *proto, u8 version);
int gre_del_protocol(const struct gre_protocol *proto, u8 version);
+bool gre_tunnel_is_fallback_dev(struct net_device *dev);
struct net_device *gretap_fb_dev_create(struct net *net, const char *name,
u8 name_assign_type);
--- a/include/net/ip_tunnels.h
+++ b/include/net/ip_tunnels.h
@@ -592,4 +592,7 @@ static inline void ip_tunnel_info_opts_s
#endif /* CONFIG_INET */
+void ipip6_update_offload_stats(struct net_device *dev, void *ptr);
+void ip6_update_offload_stats(struct net_device *dev, void *ptr);
+bool ip6_tunnel_is_fallback_dev(struct net_device *dev);
#endif /* __NET_IP_TUNNELS_H */
--- a/net/ipv4/ip_gre.c
+++ b/net/ipv4/ip_gre.c
@@ -459,6 +459,26 @@ drop:
return 0;
}
+bool gre_tunnel_is_fallback_dev(struct net_device *dev)
+{
+ struct net *net;
+ struct ip_tunnel_net *itn;
+ struct net_device *fb_tunnel_dev;
+
+ net = dev_net(dev);
+ if (!net)
+ return false;
+
+ itn = net_generic(net, gre_tap_net_id);
+ if (!itn)
+ return false;
+
+ fb_tunnel_dev = itn->fb_tunnel_dev;
+
+ return (fb_tunnel_dev == dev);
+}
+EXPORT_SYMBOL(gre_tunnel_is_fallback_dev);
+
static void __gre_xmit(struct sk_buff *skb, struct net_device *dev,
const struct iphdr *tnl_params,
__be16 proto)
--- a/net/ipv6/ip6_tunnel.c
+++ b/net/ipv6/ip6_tunnel.c
@@ -2469,6 +2469,26 @@ struct net *ip6_tnl_get_link_net(const s
}
EXPORT_SYMBOL(ip6_tnl_get_link_net);
+bool ip6_tunnel_is_fallback_dev(struct net_device *dev)
+{
+ struct net *net;
+ struct ip6_tnl_net *ip6n;
+ struct net_device *fb_tnl_dev;
+
+ net = dev_net(dev);
+ if (!net)
+ return false;
+
+ ip6n = net_generic(net, ip6_tnl_net_id);
+ if (!ip6n)
+ return false;
+
+ fb_tnl_dev = ip6n->fb_tnl_dev;
+
+ return (fb_tnl_dev == dev);
+}
+EXPORT_SYMBOL(ip6_tunnel_is_fallback_dev);
+
static const struct nla_policy ip6_tnl_policy[IFLA_IPTUN_MAX + 1] = {
[IFLA_IPTUN_LINK] = { .type = NLA_U32 },
[IFLA_IPTUN_LOCAL] = { .len = sizeof(struct in6_addr) },