#ifndef __NET_IP_TUNNELS_H
#define __NET_IP_TUNNELS_H …
#include <linux/if_tunnel.h>
#include <linux/netdevice.h>
#include <linux/skbuff.h>
#include <linux/socket.h>
#include <linux/types.h>
#include <linux/u64_stats_sync.h>
#include <linux/bitops.h>
#include <net/dsfield.h>
#include <net/gro_cells.h>
#include <net/inet_ecn.h>
#include <net/netns/generic.h>
#include <net/rtnetlink.h>
#include <net/lwtunnel.h>
#include <net/dst_cache.h>
#if IS_ENABLED(CONFIG_IPV6)
#include <net/ipv6.h>
#include <net/ip6_fib.h>
#include <net/ip6_route.h>
#endif
#define IPTUNNEL_ERR_TIMEO …
#define IP_TUNNEL_KEY_SIZE …
#define IP_TUNNEL_KEY_IPV4_PAD …
#define IP_TUNNEL_KEY_IPV4_PAD_LEN …
#define __ipt_flag_op(op, ...) …
#define IP_TUNNEL_DECLARE_FLAGS(...) …
#define ip_tunnel_flags_zero(...) …
#define ip_tunnel_flags_copy(...) …
#define ip_tunnel_flags_and(...) …
#define ip_tunnel_flags_or(...) …
#define ip_tunnel_flags_empty(...) …
#define ip_tunnel_flags_intersect(...) …
#define ip_tunnel_flags_subset(...) …
struct ip_tunnel_key { … };
struct ip_tunnel_encap { … };
#define IP_TUNNEL_INFO_TX …
#define IP_TUNNEL_INFO_IPV6 …
#define IP_TUNNEL_INFO_BRIDGE …
#define IP_TUNNEL_OPTS_MAX …
#define ip_tunnel_info_opts(info) …
struct ip_tunnel_info { … };
#ifdef CONFIG_IPV6_SIT_6RD
struct ip_tunnel_6rd_parm { … };
#endif
struct ip_tunnel_prl_entry { … };
struct metadata_dst;
struct ip_tunnel_parm_kern { … };
struct ip_tunnel { … };
struct tnl_ptk_info { … };
#define PACKET_RCVD …
#define PACKET_REJECT …
#define PACKET_NEXT …
#define IP_TNL_HASH_BITS …
#define IP_TNL_HASH_SIZE …
struct ip_tunnel_net { … };
static inline void ip_tunnel_set_options_present(unsigned long *flags)
{ … }
static inline void ip_tunnel_clear_options_present(unsigned long *flags)
{ … }
static inline bool ip_tunnel_is_options_present(const unsigned long *flags)
{ … }
static inline bool ip_tunnel_flags_is_be16_compat(const unsigned long *flags)
{ … }
static inline void ip_tunnel_flags_from_be16(unsigned long *dst, __be16 flags)
{ … }
static inline __be16 ip_tunnel_flags_to_be16(const unsigned long *flags)
{ … }
static inline void ip_tunnel_key_init(struct ip_tunnel_key *key,
__be32 saddr, __be32 daddr,
u8 tos, u8 ttl, __be32 label,
__be16 tp_src, __be16 tp_dst,
__be64 tun_id,
const unsigned long *tun_flags)
{ … }
static inline bool
ip_tunnel_dst_cache_usable(const struct sk_buff *skb,
const struct ip_tunnel_info *info)
{ … }
static inline unsigned short ip_tunnel_info_af(const struct ip_tunnel_info
*tun_info)
{ … }
static inline __be64 key32_to_tunnel_id(__be32 key)
{ … }
static inline __be32 tunnel_id_to_key32(__be64 tun_id)
{ … }
#ifdef CONFIG_INET
static inline void ip_tunnel_init_flow(struct flowi4 *fl4,
int proto,
__be32 daddr, __be32 saddr,
__be32 key, __u8 tos,
struct net *net, int oif,
__u32 mark, __u32 tun_inner_hash,
__u8 flow_flags)
{ … }
int ip_tunnel_init(struct net_device *dev);
void ip_tunnel_uninit(struct net_device *dev);
void ip_tunnel_dellink(struct net_device *dev, struct list_head *head);
struct net *ip_tunnel_get_link_net(const struct net_device *dev);
int ip_tunnel_get_iflink(const struct net_device *dev);
int ip_tunnel_init_net(struct net *net, unsigned int ip_tnl_net_id,
struct rtnl_link_ops *ops, char *devname);
void ip_tunnel_delete_nets(struct list_head *list_net, unsigned int id,
struct rtnl_link_ops *ops,
struct list_head *dev_to_kill);
void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev,
const struct iphdr *tnl_params, const u8 protocol);
void ip_md_tunnel_xmit(struct sk_buff *skb, struct net_device *dev,
const u8 proto, int tunnel_hlen);
int ip_tunnel_ctl(struct net_device *dev, struct ip_tunnel_parm_kern *p,
int cmd);
bool ip_tunnel_parm_from_user(struct ip_tunnel_parm_kern *kp,
const void __user *data);
bool ip_tunnel_parm_to_user(void __user *data, struct ip_tunnel_parm_kern *kp);
int ip_tunnel_siocdevprivate(struct net_device *dev, struct ifreq *ifr,
void __user *data, int cmd);
int __ip_tunnel_change_mtu(struct net_device *dev, int new_mtu, bool strict);
int ip_tunnel_change_mtu(struct net_device *dev, int new_mtu);
struct ip_tunnel *ip_tunnel_lookup(struct ip_tunnel_net *itn,
int link, const unsigned long *flags,
__be32 remote, __be32 local,
__be32 key);
void ip_tunnel_md_udp_encap(struct sk_buff *skb, struct ip_tunnel_info *info);
int ip_tunnel_rcv(struct ip_tunnel *tunnel, struct sk_buff *skb,
const struct tnl_ptk_info *tpi, struct metadata_dst *tun_dst,
bool log_ecn_error);
int ip_tunnel_changelink(struct net_device *dev, struct nlattr *tb[],
struct ip_tunnel_parm_kern *p, __u32 fwmark);
int ip_tunnel_newlink(struct net_device *dev, struct nlattr *tb[],
struct ip_tunnel_parm_kern *p, __u32 fwmark);
void ip_tunnel_setup(struct net_device *dev, unsigned int net_id);
bool ip_tunnel_netlink_encap_parms(struct nlattr *data[],
struct ip_tunnel_encap *encap);
void ip_tunnel_netlink_parms(struct nlattr *data[],
struct ip_tunnel_parm_kern *parms);
extern const struct header_ops ip_tunnel_header_ops;
__be16 ip_tunnel_parse_protocol(const struct sk_buff *skb);
struct ip_tunnel_encap_ops { … };
#define MAX_IPTUN_ENCAP_OPS …
extern const struct ip_tunnel_encap_ops __rcu *
iptun_encaps[MAX_IPTUN_ENCAP_OPS];
int ip_tunnel_encap_add_ops(const struct ip_tunnel_encap_ops *op,
unsigned int num);
int ip_tunnel_encap_del_ops(const struct ip_tunnel_encap_ops *op,
unsigned int num);
int ip_tunnel_encap_setup(struct ip_tunnel *t,
struct ip_tunnel_encap *ipencap);
static inline bool pskb_inet_may_pull(struct sk_buff *skb)
{ … }
static inline bool skb_vlan_inet_prepare(struct sk_buff *skb,
bool inner_proto_inherit)
{ … }
static inline int ip_encap_hlen(struct ip_tunnel_encap *e)
{ … }
static inline int ip_tunnel_encap(struct sk_buff *skb,
struct ip_tunnel_encap *e,
u8 *protocol, struct flowi4 *fl4)
{ … }
static inline u8 ip_tunnel_get_dsfield(const struct iphdr *iph,
const struct sk_buff *skb)
{ … }
static inline __be32 ip_tunnel_get_flowlabel(const struct iphdr *iph,
const struct sk_buff *skb)
{ … }
static inline u8 ip_tunnel_get_ttl(const struct iphdr *iph,
const struct sk_buff *skb)
{ … }
static inline u8 ip_tunnel_ecn_encap(u8 tos, const struct iphdr *iph,
const struct sk_buff *skb)
{ … }
int __iptunnel_pull_header(struct sk_buff *skb, int hdr_len,
__be16 inner_proto, bool raw_proto, bool xnet);
static inline int iptunnel_pull_header(struct sk_buff *skb, int hdr_len,
__be16 inner_proto, bool xnet)
{ … }
void iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb,
__be32 src, __be32 dst, u8 proto,
u8 tos, u8 ttl, __be16 df, bool xnet);
struct metadata_dst *iptunnel_metadata_reply(struct metadata_dst *md,
gfp_t flags);
int skb_tunnel_check_pmtu(struct sk_buff *skb, struct dst_entry *encap_dst,
int headroom, bool reply);
int iptunnel_handle_offloads(struct sk_buff *skb, int gso_type_mask);
static inline int iptunnel_pull_offloads(struct sk_buff *skb)
{ … }
static inline void iptunnel_xmit_stats(struct net_device *dev, int pkt_len)
{ … }
static inline void ip_tunnel_info_opts_get(void *to,
const struct ip_tunnel_info *info)
{ … }
static inline void ip_tunnel_info_opts_set(struct ip_tunnel_info *info,
const void *from, int len,
const unsigned long *flags)
{ … }
static inline struct ip_tunnel_info *lwt_tun_info(struct lwtunnel_state *lwtstate)
{ … }
DECLARE_STATIC_KEY_FALSE(ip_tunnel_metadata_cnt);
static inline int ip_tunnel_collect_metadata(void)
{ … }
void __init ip_tunnel_core_init(void);
void ip_tunnel_need_metadata(void);
void ip_tunnel_unneed_metadata(void);
#else
static inline struct ip_tunnel_info *lwt_tun_info(struct lwtunnel_state *lwtstate)
{
return NULL;
}
static inline void ip_tunnel_need_metadata(void)
{
}
static inline void ip_tunnel_unneed_metadata(void)
{
}
static inline void ip_tunnel_info_opts_get(void *to,
const struct ip_tunnel_info *info)
{
}
static inline void ip_tunnel_info_opts_set(struct ip_tunnel_info *info,
const void *from, int len,
const unsigned long *flags)
{
info->options_len = 0;
}
#endif
#endif