#include <linux/kernel.h>
#include <linux/socket.h>
#include <linux/netdevice.h>
#include <linux/skbuff.h>
#include <linux/printk.h>
#include <net/protocol.h>
#include <net/ipv6.h>
#include <net/inet_common.h>
#include <net/tcp.h>
#include <net/udp.h>
#include <net/gro.h>
#include <net/gso.h>
#include "ip6_offload.h"
#if IS_BUILTIN(CONFIG_IPV6)
#define INDIRECT_CALL_L4(f, f2, f1, ...) …
#else
#define INDIRECT_CALL_L4 …
#endif
#define indirect_call_gro_receive_l4(f2, f1, cb, head, skb) …
static int ipv6_gro_pull_exthdrs(struct sk_buff *skb, int off, int proto)
{ … }
static int ipv6_gso_pull_exthdrs(struct sk_buff *skb, int proto)
{ … }
static struct sk_buff *ipv6_gso_segment(struct sk_buff *skb,
netdev_features_t features)
{ … }
static int ipv6_exthdrs_len(struct ipv6hdr *iph,
const struct net_offload **opps)
{ … }
INDIRECT_CALLABLE_SCOPE struct sk_buff *ipv6_gro_receive(struct list_head *head,
struct sk_buff *skb)
{ … }
static struct sk_buff *sit_ip6ip6_gro_receive(struct list_head *head,
struct sk_buff *skb)
{ … }
static struct sk_buff *ip4ip6_gro_receive(struct list_head *head,
struct sk_buff *skb)
{ … }
INDIRECT_CALLABLE_SCOPE int ipv6_gro_complete(struct sk_buff *skb, int nhoff)
{ … }
static int sit_gro_complete(struct sk_buff *skb, int nhoff)
{ … }
static int ip6ip6_gro_complete(struct sk_buff *skb, int nhoff)
{ … }
static int ip4ip6_gro_complete(struct sk_buff *skb, int nhoff)
{ … }
static struct sk_buff *sit_gso_segment(struct sk_buff *skb,
netdev_features_t features)
{ … }
static struct sk_buff *ip4ip6_gso_segment(struct sk_buff *skb,
netdev_features_t features)
{ … }
static struct sk_buff *ip6ip6_gso_segment(struct sk_buff *skb,
netdev_features_t features)
{ … }
static const struct net_offload sit_offload = …;
static const struct net_offload ip4ip6_offload = …;
static const struct net_offload ip6ip6_offload = …;
static int __init ipv6_offload_init(void)
{ … }
fs_initcall(ipv6_offload_init);