--- 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 @@ -553,4 +553,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 @@ -2398,6 +2398,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 @@ -1733,6 +1733,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 },