Linux cpanel.rrshost.in 5.15.0-25-generic #25-Ubuntu SMP Wed Mar 30 15:54:22 UTC 2022 x86_64
Apache
: 109.123.238.221 | : 108.162.241.156
128 Domain
8.2.28
aev999
Terminal
AUTO ROOT
Adminer
Backdoor Destroyer
Linux Exploit
Lock Shell
Lock File
Create User
CREATE RDP
PHP Mailer
BACKCONNECT
HASH IDENTIFIER
README
+ Create Folder
+ Create File
/
usr /
src /
linux-headers-5.15.0-25 /
include /
net /
[ HOME SHELL ]
Name
Size
Permission
Action
9p
[ DIR ]
drwxr-xr-x
bluetooth
[ DIR ]
drwxr-xr-x
caif
[ DIR ]
drwxr-xr-x
iucv
[ DIR ]
drwxr-xr-x
netfilter
[ DIR ]
drwxr-xr-x
netns
[ DIR ]
drwxr-xr-x
nfc
[ DIR ]
drwxr-xr-x
phonet
[ DIR ]
drwxr-xr-x
sctp
[ DIR ]
drwxr-xr-x
tc_act
[ DIR ]
drwxr-xr-x
6lowpan.h
10.03
KB
-rw-r--r--
Space.h
737
B
-rw-r--r--
act_api.h
8.42
KB
-rw-r--r--
addrconf.h
13.95
KB
-rw-r--r--
af_ieee802154.h
1.19
KB
-rw-r--r--
af_rxrpc.h
2.73
KB
-rw-r--r--
af_unix.h
2.92
KB
-rw-r--r--
af_vsock.h
7.37
KB
-rw-r--r--
ah.h
382
B
-rw-r--r--
arp.h
2.03
KB
-rw-r--r--
atmclip.h
1.48
KB
-rw-r--r--
ax25.h
14.84
KB
-rw-r--r--
ax88796.h
1.41
KB
-rw-r--r--
bareudp.h
572
B
-rw-r--r--
bond_3ad.h
9.49
KB
-rw-r--r--
bond_alb.h
6.09
KB
-rw-r--r--
bond_options.h
3.76
KB
-rw-r--r--
bonding.h
20.18
KB
-rw-r--r--
bpf_sk_storage.h
1.74
KB
-rw-r--r--
busy_poll.h
3.85
KB
-rw-r--r--
calipso.h
1.55
KB
-rw-r--r--
cfg80211-wext.h
1.81
KB
-rw-r--r--
cfg80211.h
291.42
KB
-rw-r--r--
cfg802154.h
10.5
KB
-rw-r--r--
checksum.h
4.74
KB
-rw-r--r--
cipso_ipv4.h
7.37
KB
-rw-r--r--
cls_cgroup.h
2.04
KB
-rw-r--r--
codel.h
5.65
KB
-rw-r--r--
codel_impl.h
7.98
KB
-rw-r--r--
codel_qdisc.h
2.9
KB
-rw-r--r--
compat.h
2.53
KB
-rw-r--r--
datalink.h
619
B
-rw-r--r--
dcbevent.h
742
B
-rw-r--r--
dcbnl.h
4.22
KB
-rw-r--r--
devlink.h
62.1
KB
-rw-r--r--
dn.h
6.88
KB
-rw-r--r--
dn_dev.h
5.36
KB
-rw-r--r--
dn_fib.h
3.99
KB
-rw-r--r--
dn_neigh.h
968
B
-rw-r--r--
dn_nsp.h
5.39
KB
-rw-r--r--
dn_route.h
3.96
KB
-rw-r--r--
dsa.h
34.12
KB
-rw-r--r--
dsfield.h
1.12
KB
-rw-r--r--
dst.h
14.46
KB
-rw-r--r--
dst_cache.h
2.96
KB
-rw-r--r--
dst_metadata.h
5.39
KB
-rw-r--r--
dst_ops.h
2.07
KB
-rw-r--r--
erspan.h
8.96
KB
-rw-r--r--
esp.h
1.23
KB
-rw-r--r--
espintcp.h
966
B
-rw-r--r--
ethoc.h
391
B
-rw-r--r--
failover.h
1.15
KB
-rw-r--r--
fib_notifier.h
1.35
KB
-rw-r--r--
fib_rules.h
6.3
KB
-rw-r--r--
firewire.h
636
B
-rw-r--r--
flow.h
5.53
KB
-rw-r--r--
flow_dissector.h
9.89
KB
-rw-r--r--
flow_offload.h
15.34
KB
-rw-r--r--
fou.h
549
B
-rw-r--r--
fq.h
2.47
KB
-rw-r--r--
fq_impl.h
7.89
KB
-rw-r--r--
garp.h
2.62
KB
-rw-r--r--
gen_stats.h
2.82
KB
-rw-r--r--
genetlink.h
13.32
KB
-rw-r--r--
geneve.h
1.85
KB
-rw-r--r--
gre.h
3.29
KB
-rw-r--r--
gro.h
783
B
-rw-r--r--
gro_cells.h
443
B
-rw-r--r--
gtp.h
633
B
-rw-r--r--
gue.h
3.24
KB
-rw-r--r--
hwbm.h
969
B
-rw-r--r--
icmp.h
1.87
KB
-rw-r--r--
ieee80211_radiotap.h
13.2
KB
-rw-r--r--
ieee802154_netdev.h
8.75
KB
-rw-r--r--
if_inet6.h
6.3
KB
-rw-r--r--
ife.h
1.03
KB
-rw-r--r--
ila.h
291
B
-rw-r--r--
inet6_connection_sock.h
765
B
-rw-r--r--
inet6_hashtables.h
3.44
KB
-rw-r--r--
inet_common.h
2.55
KB
-rw-r--r--
inet_connection_sock.h
11.06
KB
-rw-r--r--
inet_ecn.h
7.45
KB
-rw-r--r--
inet_frag.h
4.93
KB
-rw-r--r--
inet_hashtables.h
13.99
KB
-rw-r--r--
inet_sock.h
9.25
KB
-rw-r--r--
inet_timewait_sock.h
3.65
KB
-rw-r--r--
inetpeer.h
3.29
KB
-rw-r--r--
ioam6.h
1.17
KB
-rw-r--r--
ip.h
22.08
KB
-rw-r--r--
ip6_checksum.h
2.71
KB
-rw-r--r--
ip6_fib.h
15.82
KB
-rw-r--r--
ip6_route.h
9.99
KB
-rw-r--r--
ip6_tunnel.h
4.97
KB
-rw-r--r--
ip_fib.h
15.86
KB
-rw-r--r--
ip_tunnels.h
14.14
KB
-rw-r--r--
ip_vs.h
49.38
KB
-rw-r--r--
ipcomp.h
659
B
-rw-r--r--
ipconfig.h
811
B
-rw-r--r--
ipv6.h
35.34
KB
-rw-r--r--
ipv6_frag.h
3.28
KB
-rw-r--r--
ipv6_stubs.h
3.23
KB
-rw-r--r--
iw_handler.h
20.91
KB
-rw-r--r--
kcm.h
4.82
KB
-rw-r--r--
l3mdev.h
6.99
KB
-rw-r--r--
lag.h
409
B
-rw-r--r--
lapb.h
4.81
KB
-rw-r--r--
lib80211.h
3.92
KB
-rw-r--r--
llc.h
4.41
KB
-rw-r--r--
llc_c_ac.h
9.31
KB
-rw-r--r--
llc_c_ev.h
10.68
KB
-rw-r--r--
llc_c_st.h
1.72
KB
-rw-r--r--
llc_conn.h
4.06
KB
-rw-r--r--
llc_if.h
2.16
KB
-rw-r--r--
llc_pdu.h
14.44
KB
-rw-r--r--
llc_s_ac.h
1.55
KB
-rw-r--r--
llc_s_ev.h
2.2
KB
-rw-r--r--
llc_s_st.h
947
B
-rw-r--r--
llc_sap.h
1.08
KB
-rw-r--r--
lwtunnel.h
6.49
KB
-rw-r--r--
mac80211.h
266.84
KB
-rw-r--r--
mac802154.h
14.88
KB
-rw-r--r--
macsec.h
6.9
KB
-rw-r--r--
mctp.h
6.01
KB
-rw-r--r--
mctpdevice.h
735
B
-rw-r--r--
mip6.h
1016
B
-rw-r--r--
mld.h
2.85
KB
-rw-r--r--
mpls.h
943
B
-rw-r--r--
mpls_iptunnel.h
429
B
-rw-r--r--
mptcp.h
6.34
KB
-rw-r--r--
mrp.h
3.03
KB
-rw-r--r--
ncsi.h
1.92
KB
-rw-r--r--
ndisc.h
14.79
KB
-rw-r--r--
neighbour.h
15.97
KB
-rw-r--r--
net_failover.h
1023
B
-rw-r--r--
net_namespace.h
11.87
KB
-rw-r--r--
net_ratelimit.h
220
B
-rw-r--r--
netevent.h
1.02
KB
-rw-r--r--
netlabel.h
20.19
KB
-rw-r--r--
netlink.h
60.21
KB
-rw-r--r--
netprio_cgroup.h
1.02
KB
-rw-r--r--
netrom.h
7.71
KB
-rw-r--r--
nexthop.h
12.27
KB
-rw-r--r--
nl802154.h
12.09
KB
-rw-r--r--
nsh.h
12.31
KB
-rw-r--r--
p8022.h
447
B
-rw-r--r--
page_pool.h
8.88
KB
-rw-r--r--
pie.h
3.6
KB
-rw-r--r--
ping.h
2.9
KB
-rw-r--r--
pkt_cls.h
23.86
KB
-rw-r--r--
pkt_sched.h
5.37
KB
-rw-r--r--
pptp.h
557
B
-rw-r--r--
protocol.h
4
KB
-rw-r--r--
psample.h
1.06
KB
-rw-r--r--
psnap.h
351
B
-rw-r--r--
raw.h
2.08
KB
-rw-r--r--
rawv6.h
854
B
-rw-r--r--
red.h
11.38
KB
-rw-r--r--
regulatory.h
10.65
KB
-rw-r--r--
request_sock.h
6.47
KB
-rw-r--r--
rose.h
7.62
KB
-rw-r--r--
route.h
11.24
KB
-rw-r--r--
rpl.h
972
B
-rw-r--r--
rsi_91x.h
1.67
KB
-rw-r--r--
rtnetlink.h
6.72
KB
-rw-r--r--
rtnh.h
859
B
-rw-r--r--
sch_generic.h
33.86
KB
-rw-r--r--
scm.h
3.58
KB
-rw-r--r--
secure_seq.h
855
B
-rw-r--r--
seg6.h
2.18
KB
-rw-r--r--
seg6_hmac.h
1.44
KB
-rw-r--r--
seg6_local.h
644
B
-rw-r--r--
selftests.h
582
B
-rw-r--r--
slhc_vj.h
6.67
KB
-rw-r--r--
smc.h
2.45
KB
-rw-r--r--
snmp.h
5.14
KB
-rw-r--r--
sock.h
79.96
KB
-rw-r--r--
sock_reuseport.h
1.74
KB
-rw-r--r--
stp.h
383
B
-rw-r--r--
strparser.h
4.1
KB
-rw-r--r--
switchdev.h
13.96
KB
-rw-r--r--
tcp.h
71.78
KB
-rw-r--r--
tcp_states.h
1.2
KB
-rw-r--r--
timewait_sock.h
925
B
-rw-r--r--
tipc.h
2.35
KB
-rw-r--r--
tls.h
20.91
KB
-rw-r--r--
tls_toe.h
2.94
KB
-rw-r--r--
transp_v6.h
1.95
KB
-rw-r--r--
tso.h
566
B
-rw-r--r--
tun_proto.h
988
B
-rw-r--r--
udp.h
16.42
KB
-rw-r--r--
udp_tunnel.h
11.75
KB
-rw-r--r--
udplite.h
3.83
KB
-rw-r--r--
vsock_addr.h
662
B
-rw-r--r--
vxlan.h
13.91
KB
-rw-r--r--
wext.h
1.47
KB
-rw-r--r--
x25.h
9.49
KB
-rw-r--r--
x25device.h
387
B
-rw-r--r--
xdp.h
8.48
KB
-rw-r--r--
xdp_priv.h
446
B
-rw-r--r--
xdp_sock.h
2.04
KB
-rw-r--r--
xdp_sock_drv.h
5.53
KB
-rw-r--r--
xfrm.h
55.02
KB
-rw-r--r--
xsk_buff_pool.h
4.98
KB
-rw-r--r--
Delete
Unzip
Zip
${this.title}
Close
Code Editor : ip_tunnels.h
/* SPDX-License-Identifier: GPL-2.0 */ #ifndef __NET_IP_TUNNELS_H #define __NET_IP_TUNNELS_H 1 #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 /* Keep error state on tunnel for 30 sec */ #define IPTUNNEL_ERR_TIMEO (30*HZ) /* Used to memset ip_tunnel padding. */ #define IP_TUNNEL_KEY_SIZE offsetofend(struct ip_tunnel_key, tp_dst) /* Used to memset ipv4 address padding. */ #define IP_TUNNEL_KEY_IPV4_PAD offsetofend(struct ip_tunnel_key, u.ipv4.dst) #define IP_TUNNEL_KEY_IPV4_PAD_LEN \ (sizeof_field(struct ip_tunnel_key, u) - \ sizeof_field(struct ip_tunnel_key, u.ipv4)) struct ip_tunnel_key { __be64 tun_id; union { struct { __be32 src; __be32 dst; } ipv4; struct { struct in6_addr src; struct in6_addr dst; } ipv6; } u; __be16 tun_flags; u8 tos; /* TOS for IPv4, TC for IPv6 */ u8 ttl; /* TTL for IPv4, HL for IPv6 */ __be32 label; /* Flow Label for IPv6 */ __be16 tp_src; __be16 tp_dst; }; /* Flags for ip_tunnel_info mode. */ #define IP_TUNNEL_INFO_TX 0x01 /* represents tx tunnel parameters */ #define IP_TUNNEL_INFO_IPV6 0x02 /* key contains IPv6 addresses */ #define IP_TUNNEL_INFO_BRIDGE 0x04 /* represents a bridged tunnel id */ /* Maximum tunnel options length. */ #define IP_TUNNEL_OPTS_MAX \ GENMASK((sizeof_field(struct ip_tunnel_info, \ options_len) * BITS_PER_BYTE) - 1, 0) struct ip_tunnel_info { struct ip_tunnel_key key; #ifdef CONFIG_DST_CACHE struct dst_cache dst_cache; #endif u8 options_len; u8 mode; }; /* 6rd prefix/relay information */ #ifdef CONFIG_IPV6_SIT_6RD struct ip_tunnel_6rd_parm { struct in6_addr prefix; __be32 relay_prefix; u16 prefixlen; u16 relay_prefixlen; }; #endif struct ip_tunnel_encap { u16 type; u16 flags; __be16 sport; __be16 dport; }; struct ip_tunnel_prl_entry { struct ip_tunnel_prl_entry __rcu *next; __be32 addr; u16 flags; struct rcu_head rcu_head; }; struct metadata_dst; /* A fan overlay /8 (250.0.0.0/8, for example) maps to exactly one /16 * underlay (10.88.0.0/16, for example). Multiple local addresses within * the /16 may be used, but a particular overlay may not span * multiple underlay subnets. * * We store one underlay, indexed by the overlay's high order octet. */ #define FAN_OVERLAY_CNT 256 struct ip_fan_map { __be32 underlay; __be32 overlay; u16 underlay_prefix; u16 overlay_prefix; u32 overlay_mask; struct list_head list; struct rcu_head rcu; }; struct ip_tunnel_fan { struct list_head fan_maps; }; struct ip_tunnel { struct ip_tunnel __rcu *next; struct hlist_node hash_node; struct net_device *dev; struct net *net; /* netns for packet i/o */ unsigned long err_time; /* Time when the last ICMP error * arrived */ int err_count; /* Number of arrived ICMP errors */ /* These four fields used only by GRE */ u32 i_seqno; /* The last seen seqno */ u32 o_seqno; /* The last output seqno */ int tun_hlen; /* Precalculated header length */ /* These four fields used only by ERSPAN */ u32 index; /* ERSPAN type II index */ u8 erspan_ver; /* ERSPAN version */ u8 dir; /* ERSPAN direction */ u16 hwid; /* ERSPAN hardware ID */ struct dst_cache dst_cache; struct ip_tunnel_parm parms; int mlink; int encap_hlen; /* Encap header length (FOU,GUE) */ int hlen; /* tun_hlen + encap_hlen */ struct ip_tunnel_encap encap; /* for SIT */ #ifdef CONFIG_IPV6_SIT_6RD struct ip_tunnel_6rd_parm ip6rd; #endif struct ip_tunnel_prl_entry __rcu *prl; /* potential router list */ unsigned int prl_count; /* # of entries in PRL */ struct ip_tunnel_fan fan; unsigned int ip_tnl_net_id; struct gro_cells gro_cells; __u32 fwmark; bool collect_md; bool ignore_df; }; static inline int fan_has_map(const struct ip_tunnel_fan *fan) { return !list_empty(&fan->fan_maps); } struct tnl_ptk_info { __be16 flags; __be16 proto; __be32 key; __be32 seq; int hdr_len; }; #define PACKET_RCVD 0 #define PACKET_REJECT 1 #define PACKET_NEXT 2 #define IP_TNL_HASH_BITS 7 #define IP_TNL_HASH_SIZE (1 << IP_TNL_HASH_BITS) struct ip_tunnel_net { struct net_device *fb_tunnel_dev; struct rtnl_link_ops *rtnl_link_ops; struct hlist_head tunnels[IP_TNL_HASH_SIZE]; struct ip_tunnel __rcu *collect_md_tun; int type; }; 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, __be16 tun_flags) { key->tun_id = tun_id; key->u.ipv4.src = saddr; key->u.ipv4.dst = daddr; memset((unsigned char *)key + IP_TUNNEL_KEY_IPV4_PAD, 0, IP_TUNNEL_KEY_IPV4_PAD_LEN); key->tos = tos; key->ttl = ttl; key->label = label; key->tun_flags = tun_flags; /* For the tunnel types on the top of IPsec, the tp_src and tp_dst of * the upper tunnel are used. * E.g: GRE over IPSEC, the tp_src and tp_port are zero. */ key->tp_src = tp_src; key->tp_dst = tp_dst; /* Clear struct padding. */ if (sizeof(*key) != IP_TUNNEL_KEY_SIZE) memset((unsigned char *)key + IP_TUNNEL_KEY_SIZE, 0, sizeof(*key) - IP_TUNNEL_KEY_SIZE); } static inline bool ip_tunnel_dst_cache_usable(const struct sk_buff *skb, const struct ip_tunnel_info *info) { if (skb->mark) return false; if (!info) return true; if (info->key.tun_flags & TUNNEL_NOCACHE) return false; return true; } static inline unsigned short ip_tunnel_info_af(const struct ip_tunnel_info *tun_info) { return tun_info->mode & IP_TUNNEL_INFO_IPV6 ? AF_INET6 : AF_INET; } static inline __be64 key32_to_tunnel_id(__be32 key) { #ifdef __BIG_ENDIAN return (__force __be64)key; #else return (__force __be64)((__force u64)key << 32); #endif } /* Returns the least-significant 32 bits of a __be64. */ static inline __be32 tunnel_id_to_key32(__be64 tun_id) { #ifdef __BIG_ENDIAN return (__force __be32)tun_id; #else return (__force __be32)((__force u64)tun_id >> 32); #endif } #ifdef CONFIG_INET static inline void ip_tunnel_init_flow(struct flowi4 *fl4, int proto, __be32 daddr, __be32 saddr, __be32 key, __u8 tos, int oif, __u32 mark, __u32 tun_inner_hash) { memset(fl4, 0, sizeof(*fl4)); fl4->flowi4_oif = oif; fl4->daddr = daddr; fl4->saddr = saddr; fl4->flowi4_tos = tos; fl4->flowi4_proto = proto; fl4->fl4_gre_key = key; fl4->flowi4_mark = mark; fl4->flowi4_multipath_hash = tun_inner_hash; } 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); 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 *p, int cmd); 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, __be16 flags, __be32 remote, __be32 local, __be32 key); 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 *p, __u32 fwmark); int ip_tunnel_newlink(struct net_device *dev, struct nlattr *tb[], struct ip_tunnel_parm *p, __u32 fwmark); void ip_tunnel_setup(struct net_device *dev, unsigned int net_id); extern const struct header_ops ip_tunnel_header_ops; __be16 ip_tunnel_parse_protocol(const struct sk_buff *skb); struct ip_tunnel_encap_ops { size_t (*encap_hlen)(struct ip_tunnel_encap *e); int (*build_header)(struct sk_buff *skb, struct ip_tunnel_encap *e, u8 *protocol, struct flowi4 *fl4); int (*err_handler)(struct sk_buff *skb, u32 info); }; #define MAX_IPTUN_ENCAP_OPS 8 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) { int nhlen; switch (skb->protocol) { #if IS_ENABLED(CONFIG_IPV6) case htons(ETH_P_IPV6): nhlen = sizeof(struct ipv6hdr); break; #endif case htons(ETH_P_IP): nhlen = sizeof(struct iphdr); break; default: nhlen = 0; } return pskb_network_may_pull(skb, nhlen); } static inline int ip_encap_hlen(struct ip_tunnel_encap *e) { const struct ip_tunnel_encap_ops *ops; int hlen = -EINVAL; if (e->type == TUNNEL_ENCAP_NONE) return 0; if (e->type >= MAX_IPTUN_ENCAP_OPS) return -EINVAL; rcu_read_lock(); ops = rcu_dereference(iptun_encaps[e->type]); if (likely(ops && ops->encap_hlen)) hlen = ops->encap_hlen(e); rcu_read_unlock(); return hlen; } static inline int ip_tunnel_encap(struct sk_buff *skb, struct ip_tunnel *t, u8 *protocol, struct flowi4 *fl4) { const struct ip_tunnel_encap_ops *ops; int ret = -EINVAL; if (t->encap.type == TUNNEL_ENCAP_NONE) return 0; if (t->encap.type >= MAX_IPTUN_ENCAP_OPS) return -EINVAL; rcu_read_lock(); ops = rcu_dereference(iptun_encaps[t->encap.type]); if (likely(ops && ops->build_header)) ret = ops->build_header(skb, &t->encap, protocol, fl4); rcu_read_unlock(); return ret; } /* Extract dsfield from inner protocol */ static inline u8 ip_tunnel_get_dsfield(const struct iphdr *iph, const struct sk_buff *skb) { if (skb->protocol == htons(ETH_P_IP)) return iph->tos; else if (skb->protocol == htons(ETH_P_IPV6)) return ipv6_get_dsfield((const struct ipv6hdr *)iph); else return 0; } static inline u8 ip_tunnel_get_ttl(const struct iphdr *iph, const struct sk_buff *skb) { if (skb->protocol == htons(ETH_P_IP)) return iph->ttl; else if (skb->protocol == htons(ETH_P_IPV6)) return ((const struct ipv6hdr *)iph)->hop_limit; else return 0; } /* Propogate ECN bits out */ static inline u8 ip_tunnel_ecn_encap(u8 tos, const struct iphdr *iph, const struct sk_buff *skb) { u8 inner = ip_tunnel_get_dsfield(iph, skb); return INET_ECN_encapsulate(tos, inner); } 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) { return __iptunnel_pull_header(skb, hdr_len, inner_proto, false, 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) { if (skb_is_gso(skb)) { int err; err = skb_unclone(skb, GFP_ATOMIC); if (unlikely(err)) return err; skb_shinfo(skb)->gso_type &= ~(NETIF_F_GSO_ENCAP_ALL >> NETIF_F_GSO_SHIFT); } skb->encapsulation = 0; return 0; } static inline void iptunnel_xmit_stats(struct net_device *dev, int pkt_len) { if (pkt_len > 0) { struct pcpu_sw_netstats *tstats = get_cpu_ptr(dev->tstats); u64_stats_update_begin(&tstats->syncp); tstats->tx_bytes += pkt_len; tstats->tx_packets++; u64_stats_update_end(&tstats->syncp); put_cpu_ptr(tstats); } else { struct net_device_stats *err_stats = &dev->stats; if (pkt_len < 0) { err_stats->tx_errors++; err_stats->tx_aborted_errors++; } else { err_stats->tx_dropped++; } } } static inline void *ip_tunnel_info_opts(struct ip_tunnel_info *info) { return info + 1; } static inline void ip_tunnel_info_opts_get(void *to, const struct ip_tunnel_info *info) { memcpy(to, info + 1, info->options_len); } static inline void ip_tunnel_info_opts_set(struct ip_tunnel_info *info, const void *from, int len, __be16 flags) { info->options_len = len; if (len > 0) { memcpy(ip_tunnel_info_opts(info), from, len); info->key.tun_flags |= flags; } } static inline struct ip_tunnel_info *lwt_tun_info(struct lwtunnel_state *lwtstate) { return (struct ip_tunnel_info *)lwtstate->data; } DECLARE_STATIC_KEY_FALSE(ip_tunnel_metadata_cnt); /* Returns > 0 if metadata should be collected */ static inline int ip_tunnel_collect_metadata(void) { return static_branch_unlikely(&ip_tunnel_metadata_cnt); } void __init ip_tunnel_core_init(void); void ip_tunnel_need_metadata(void); void ip_tunnel_unneed_metadata(void); #else /* CONFIG_INET */ 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, __be16 flags) { info->options_len = 0; } #endif /* CONFIG_INET */ #endif /* __NET_IP_TUNNELS_H */
Close