[ SYSTEM ]: Linux srv.persadacompanies.com 4.18.0-553.56.1.el8_10.x86_64 #1 SMP Tue Jun 10 05:00:59 EDT 2025 x86_64
[ SERVER ]: Apache | PHP: 8.4.19
[ USER ]: persadamedika | IP: 45.64.1.108
GEFORCE FILE MANAGER
/
usr
/
src
/
kernels
/
4.18.0-553.56.1.el8_10.x86_64
/
include
/
net
/
UPLOAD:
NAME
SIZE
QUICK PERMS
ACTIONS
📁 9p
SET
[ DEL ]
📁 bluetooth
SET
[ DEL ]
📁 caif
SET
[ DEL ]
📁 iucv
SET
[ DEL ]
📁 mana
SET
[ DEL ]
📁 netfilter
SET
[ DEL ]
📁 netns
SET
[ DEL ]
📁 nfc
SET
[ DEL ]
📁 phonet
SET
[ DEL ]
📁 sctp
SET
[ DEL ]
📁 tc_act
SET
[ DEL ]
📄 6lowpan.h
10,271 B
SET
[ EDIT ]
|
[ DEL ]
📄 Space.h
1,094 B
SET
[ EDIT ]
|
[ DEL ]
📄 act_api.h
9,478 B
SET
[ EDIT ]
|
[ DEL ]
📄 addrconf.h
13,826 B
SET
[ EDIT ]
|
[ DEL ]
📄 af_ieee802154.h
1,591 B
SET
[ EDIT ]
|
[ DEL ]
📄 af_rxrpc.h
2,976 B
SET
[ EDIT ]
|
[ DEL ]
📄 af_unix.h
2,272 B
SET
[ EDIT ]
|
[ DEL ]
📄 af_vsock.h
7,295 B
SET
[ EDIT ]
|
[ DEL ]
📄 ah.h
382 B
SET
[ EDIT ]
|
[ DEL ]
📄 arp.h
2,052 B
SET
[ EDIT ]
|
[ DEL ]
📄 atmclip.h
1,515 B
SET
[ EDIT ]
|
[ DEL ]
📄 ax25.h
14,999 B
SET
[ EDIT ]
|
[ DEL ]
📄 ax88796.h
1,488 B
SET
[ EDIT ]
|
[ DEL ]
📄 bareudp.h
333 B
SET
[ EDIT ]
|
[ DEL ]
📄 bond_3ad.h
9,629 B
SET
[ EDIT ]
|
[ DEL ]
📄 bond_alb.h
6,251 B
SET
[ EDIT ]
|
[ DEL ]
📄 bond_options.h
3,916 B
SET
[ EDIT ]
|
[ DEL ]
📄 bonding.h
20,225 B
SET
[ EDIT ]
|
[ DEL ]
📄 bpf_sk_storage.h
1,802 B
SET
[ EDIT ]
|
[ DEL ]
📄 busy_poll.h
4,973 B
SET
[ EDIT ]
|
[ DEL ]
📄 calipso.h
2,199 B
SET
[ EDIT ]
|
[ DEL ]
📄 cfg80211-wext.h
1,900 B
SET
[ EDIT ]
|
[ DEL ]
📄 cfg80211.h
325,844 B
SET
[ EDIT ]
|
[ DEL ]
📄 cfg802154.h
11,175 B
SET
[ EDIT ]
|
[ DEL ]
📄 checksum.h
4,850 B
SET
[ EDIT ]
|
[ DEL ]
📄 cipso_ipv4.h
8,399 B
SET
[ EDIT ]
|
[ DEL ]
📄 cls_cgroup.h
2,301 B
SET
[ EDIT ]
|
[ DEL ]
📄 codel.h
6,000 B
SET
[ EDIT ]
|
[ DEL ]
📄 codel_impl.h
8,500 B
SET
[ EDIT ]
|
[ DEL ]
📄 codel_qdisc.h
3,001 B
SET
[ EDIT ]
|
[ DEL ]
📄 compat.h
1,711 B
SET
[ EDIT ]
|
[ DEL ]
📄 datalink.h
619 B
SET
[ EDIT ]
|
[ DEL ]
📄 dcbevent.h
1,293 B
SET
[ EDIT ]
|
[ DEL ]
📄 dcbnl.h
5,267 B
SET
[ EDIT ]
|
[ DEL ]
📄 devlink.h
64,711 B
SET
[ EDIT ]
|
[ DEL ]
📄 dn.h
7,046 B
SET
[ EDIT ]
|
[ DEL ]
📄 dn_dev.h
5,488 B
SET
[ EDIT ]
|
[ DEL ]
📄 dn_fib.h
4,077 B
SET
[ EDIT ]
|
[ DEL ]
📄 dn_neigh.h
968 B
SET
[ EDIT ]
|
[ DEL ]
📄 dn_nsp.h
5,966 B
SET
[ EDIT ]
|
[ DEL ]
📄 dn_route.h
4,500 B
SET
[ EDIT ]
|
[ DEL ]
📄 drop_monitor.h
901 B
SET
[ EDIT ]
|
[ DEL ]
📄 dropreason-core.h
12,063 B
SET
[ EDIT ]
|
[ DEL ]
📄 dsa.h
16,605 B
SET
[ EDIT ]
|
[ DEL ]
📄 dsfield.h
1,139 B
SET
[ EDIT ]
|
[ DEL ]
📄 dst.h
13,989 B
SET
[ EDIT ]
|
[ DEL ]
📄 dst_cache.h
2,596 B
SET
[ EDIT ]
|
[ DEL ]
📄 dst_metadata.h
5,521 B
SET
[ EDIT ]
|
[ DEL ]
📄 dst_ops.h
2,564 B
SET
[ EDIT ]
|
[ DEL ]
📄 erspan.h
8,527 B
SET
[ EDIT ]
|
[ DEL ]
📄 esp.h
1,190 B
SET
[ EDIT ]
|
[ DEL ]
📄 espintcp.h
966 B
SET
[ EDIT ]
|
[ DEL ]
📄 ethoc.h
537 B
SET
[ EDIT ]
|
[ DEL ]
📄 failover.h
1,178 B
SET
[ EDIT ]
|
[ DEL ]
📄 fib_notifier.h
1,476 B
SET
[ EDIT ]
|
[ DEL ]
📄 fib_rules.h
5,728 B
SET
[ EDIT ]
|
[ DEL ]
📄 firewire.h
636 B
SET
[ EDIT ]
|
[ DEL ]
📄 flow.h
6,353 B
SET
[ EDIT ]
|
[ DEL ]
📄 flow_dissector.h
11,284 B
SET
[ EDIT ]
|
[ DEL ]
📄 flow_offload.h
17,797 B
SET
[ EDIT ]
|
[ DEL ]
📄 fou.h
549 B
SET
[ EDIT ]
|
[ DEL ]
📄 fq.h
2,497 B
SET
[ EDIT ]
|
[ DEL ]
📄 fq_impl.h
8,144 B
SET
[ EDIT ]
|
[ DEL ]
📄 garp.h
2,678 B
SET
[ EDIT ]
|
[ DEL ]
📄 gen_stats.h
3,034 B
SET
[ EDIT ]
|
[ DEL ]
📄 genetlink.h
14,647 B
SET
[ EDIT ]
|
[ DEL ]
📄 geneve.h
1,898 B
SET
[ EDIT ]
|
[ DEL ]
📄 gre.h
3,377 B
SET
[ EDIT ]
|
[ DEL ]
📄 gro_cells.h
443 B
SET
[ EDIT ]
|
[ DEL ]
📄 gtp.h
633 B
SET
[ EDIT ]
|
[ DEL ]
📄 gue.h
3,311 B
SET
[ EDIT ]
|
[ DEL ]
📄 hwbm.h
937 B
SET
[ EDIT ]
|
[ DEL ]
📄 icmp.h
1,765 B
SET
[ EDIT ]
|
[ DEL ]
📄 ieee80211_radiotap.h
23,017 B
SET
[ EDIT ]
|
[ DEL ]
📄 ieee802154_netdev.h
9,358 B
SET
[ EDIT ]
|
[ DEL ]
📄 if_inet6.h
6,591 B
SET
[ EDIT ]
|
[ DEL ]
📄 ife.h
1,057 B
SET
[ EDIT ]
|
[ DEL ]
📄 ila.h
498 B
SET
[ EDIT ]
|
[ DEL ]
📄 inet6_connection_sock.h
976 B
SET
[ EDIT ]
|
[ DEL ]
📄 inet6_hashtables.h
3,746 B
SET
[ EDIT ]
|
[ DEL ]
📄 inet_common.h
2,614 B
SET
[ EDIT ]
|
[ DEL ]
📄 inet_connection_sock.h
11,981 B
SET
[ EDIT ]
|
[ DEL ]
📄 inet_ecn.h
8,071 B
SET
[ EDIT ]
|
[ DEL ]
📄 inet_frag.h
4,816 B
SET
[ EDIT ]
|
[ DEL ]
📄 inet_hashtables.h
13,847 B
SET
[ EDIT ]
|
[ DEL ]
📄 inet_sock.h
9,828 B
SET
[ EDIT ]
|
[ DEL ]
📄 inet_timewait_sock.h
3,926 B
SET
[ EDIT ]
|
[ DEL ]
📄 inetpeer.h
3,372 B
SET
[ EDIT ]
|
[ DEL ]
📄 ip.h
21,221 B
SET
[ EDIT ]
|
[ DEL ]
📄 ip6_checksum.h
2,981 B
SET
[ EDIT ]
|
[ DEL ]
📄 ip6_fib.h
13,766 B
SET
[ EDIT ]
|
[ DEL ]
📄 ip6_route.h
9,220 B
SET
[ EDIT ]
|
[ DEL ]
📄 ip6_tunnel.h
5,096 B
SET
[ EDIT ]
|
[ DEL ]
📄 ip_fib.h
14,290 B
SET
[ EDIT ]
|
[ DEL ]
📄 ip_tunnels.h
14,697 B
SET
[ EDIT ]
|
[ DEL ]
📄 ip_vs.h
49,407 B
SET
[ EDIT ]
|
[ DEL ]
📄 ipcomp.h
659 B
SET
[ EDIT ]
|
[ DEL ]
📄 ipconfig.h
811 B
SET
[ EDIT ]
|
[ DEL ]
📄 ipv6.h
32,741 B
SET
[ EDIT ]
|
[ DEL ]
📄 ipv6_frag.h
3,321 B
SET
[ EDIT ]
|
[ DEL ]
📄 ipv6_stubs.h
2,671 B
SET
[ EDIT ]
|
[ DEL ]
📄 ipx.h
4,386 B
SET
[ EDIT ]
|
[ DEL ]
📄 iw_handler.h
21,413 B
SET
[ EDIT ]
|
[ DEL ]
📄 kcm.h
5,083 B
SET
[ EDIT ]
|
[ DEL ]
📄 l3mdev.h
6,743 B
SET
[ EDIT ]
|
[ DEL ]
📄 lag.h
409 B
SET
[ EDIT ]
|
[ DEL ]
📄 lapb.h
4,869 B
SET
[ EDIT ]
|
[ DEL ]
📄 lib80211.h
4,017 B
SET
[ EDIT ]
|
[ DEL ]
📄 llc.h
4,464 B
SET
[ EDIT ]
|
[ DEL ]
📄 llc_c_ac.h
9,537 B
SET
[ EDIT ]
|
[ DEL ]
📄 llc_c_ev.h
10,940 B
SET
[ EDIT ]
|
[ DEL ]
📄 llc_c_st.h
1,762 B
SET
[ EDIT ]
|
[ DEL ]
📄 llc_conn.h
4,155 B
SET
[ EDIT ]
|
[ DEL ]
📄 llc_if.h
2,210 B
SET
[ EDIT ]
|
[ DEL ]
📄 llc_pdu.h
14,783 B
SET
[ EDIT ]
|
[ DEL ]
📄 llc_s_ac.h
1,591 B
SET
[ EDIT ]
|
[ DEL ]
📄 llc_s_ev.h
2,255 B
SET
[ EDIT ]
|
[ DEL ]
📄 llc_s_st.h
947 B
SET
[ EDIT ]
|
[ DEL ]
📄 llc_sap.h
1,108 B
SET
[ EDIT ]
|
[ DEL ]
📄 lwtunnel.h
6,563 B
SET
[ EDIT ]
|
[ DEL ]
📄 mac80211.h
294,437 B
SET
[ EDIT ]
|
[ DEL ]
📄 mac802154.h
15,633 B
SET
[ EDIT ]
|
[ DEL ]
📄 mip6.h
1,617 B
SET
[ EDIT ]
|
[ DEL ]
📄 mld.h
2,870 B
SET
[ EDIT ]
|
[ DEL ]
📄 mpls.h
1,340 B
SET
[ EDIT ]
|
[ DEL ]
📄 mpls_iptunnel.h
827 B
SET
[ EDIT ]
|
[ DEL ]
📄 mptcp.h
6,242 B
SET
[ EDIT ]
|
[ DEL ]
📄 mrp.h
3,103 B
SET
[ EDIT ]
|
[ DEL ]
📄 ncsi.h
1,964 B
SET
[ EDIT ]
|
[ DEL ]
📄 ndisc.h
15,095 B
SET
[ EDIT ]
|
[ DEL ]
📄 neighbour.h
16,289 B
SET
[ EDIT ]
|
[ DEL ]
📄 net_failover.h
1,023 B
SET
[ EDIT ]
|
[ DEL ]
📄 net_namespace.h
13,957 B
SET
[ EDIT ]
|
[ DEL ]
📄 net_ratelimit.h
220 B
SET
[ EDIT ]
|
[ DEL ]
📄 netdev_queues.h
5,609 B
SET
[ EDIT ]
|
[ DEL ]
📄 netevent.h
1,044 B
SET
[ EDIT ]
|
[ DEL ]
📄 netlabel.h
21,236 B
SET
[ EDIT ]
|
[ DEL ]
📄 netlink.h
63,253 B
SET
[ EDIT ]
|
[ DEL ]
📄 netprio_cgroup.h
1,260 B
SET
[ EDIT ]
|
[ DEL ]
📄 netrom.h
7,896 B
SET
[ EDIT ]
|
[ DEL ]
📄 nexthop.h
865 B
SET
[ EDIT ]
|
[ DEL ]
📄 nl802154.h
12,385 B
SET
[ EDIT ]
|
[ DEL ]
📄 nsh.h
12,602 B
SET
[ EDIT ]
|
[ DEL ]
📄 p8022.h
447 B
SET
[ EDIT ]
|
[ DEL ]
📄 page_pool.h
6,985 B
SET
[ EDIT ]
|
[ DEL ]
📄 pie.h
3,684 B
SET
[ EDIT ]
|
[ DEL ]
📄 ping.h
3,197 B
SET
[ EDIT ]
|
[ DEL ]
📄 pkt_cls.h
26,178 B
SET
[ EDIT ]
|
[ DEL ]
📄 pkt_sched.h
6,543 B
SET
[ EDIT ]
|
[ DEL ]
📄 pptp.h
557 B
SET
[ EDIT ]
|
[ DEL ]
📄 protocol.h
4,320 B
SET
[ EDIT ]
|
[ DEL ]
📄 psample.h
1,083 B
SET
[ EDIT ]
|
[ DEL ]
📄 psnap.h
351 B
SET
[ EDIT ]
|
[ DEL ]
📄 raw.h
2,161 B
SET
[ EDIT ]
|
[ DEL ]
📄 rawv6.h
856 B
SET
[ EDIT ]
|
[ DEL ]
📄 red.h
11,600 B
SET
[ EDIT ]
|
[ DEL ]
📄 regulatory.h
10,961 B
SET
[ EDIT ]
|
[ DEL ]
📄 request_sock.h
6,871 B
SET
[ EDIT ]
|
[ DEL ]
📄 rose.h
7,802 B
SET
[ EDIT ]
|
[ DEL ]
📄 route.h
11,327 B
SET
[ EDIT ]
|
[ DEL ]
📄 rsi_91x.h
1,710 B
SET
[ EDIT ]
|
[ DEL ]
📄 rtnetlink.h
7,212 B
SET
[ EDIT ]
|
[ DEL ]
📄 sch_generic.h
33,841 B
SET
[ EDIT ]
|
[ DEL ]
📄 scm.h
3,671 B
SET
[ EDIT ]
|
[ DEL ]
📄 secure_seq.h
855 B
SET
[ EDIT ]
|
[ DEL ]
📄 seg6.h
1,874 B
SET
[ EDIT ]
|
[ DEL ]
📄 seg6_hmac.h
1,699 B
SET
[ EDIT ]
|
[ DEL ]
📄 seg6_local.h
870 B
SET
[ EDIT ]
|
[ DEL ]
📄 slhc_vj.h
6,831 B
SET
[ EDIT ]
|
[ DEL ]
📄 smc.h
2,155 B
SET
[ EDIT ]
|
[ DEL ]
📄 snmp.h
5,482 B
SET
[ EDIT ]
|
[ DEL ]
📄 sock.h
79,182 B
SET
[ EDIT ]
|
[ DEL ]
📄 sock_reuseport.h
1,565 B
SET
[ EDIT ]
|
[ DEL ]
📄 stp.h
383 B
SET
[ EDIT ]
|
[ DEL ]
📄 strparser.h
4,340 B
SET
[ EDIT ]
|
[ DEL ]
📄 switchdev.h
17,812 B
SET
[ EDIT ]
|
[ DEL ]
📄 tc_wrapper.h
7,033 B
SET
[ EDIT ]
|
[ DEL ]
📄 tcp.h
73,125 B
SET
[ EDIT ]
|
[ DEL ]
📄 tcp_states.h
1,540 B
SET
[ EDIT ]
|
[ DEL ]
📄 timewait_sock.h
1,136 B
SET
[ EDIT ]
|
[ DEL ]
📄 tipc.h
2,405 B
SET
[ EDIT ]
|
[ DEL ]
📄 tls.h
21,363 B
SET
[ EDIT ]
|
[ DEL ]
📄 tls_toe.h
3,006 B
SET
[ EDIT ]
|
[ DEL ]
📄 transp_v6.h
1,996 B
SET
[ EDIT ]
|
[ DEL ]
📄 tso.h
515 B
SET
[ EDIT ]
|
[ DEL ]
📄 tun_proto.h
988 B
SET
[ EDIT ]
|
[ DEL ]
📄 udp.h
16,481 B
SET
[ EDIT ]
|
[ DEL ]
📄 udp_tunnel.h
13,376 B
SET
[ EDIT ]
|
[ DEL ]
📄 udplite.h
3,762 B
SET
[ EDIT ]
|
[ DEL ]
📄 vsock_addr.h
662 B
SET
[ EDIT ]
|
[ DEL ]
📄 vxlan.h
13,541 B
SET
[ EDIT ]
|
[ DEL ]
📄 wext.h
1,510 B
SET
[ EDIT ]
|
[ DEL ]
📄 wimax.h
20,445 B
SET
[ EDIT ]
|
[ DEL ]
📄 x25.h
9,658 B
SET
[ EDIT ]
|
[ DEL ]
📄 x25device.h
387 B
SET
[ EDIT ]
|
[ DEL ]
📄 xdp.h
9,436 B
SET
[ EDIT ]
|
[ DEL ]
📄 xdp_priv.h
446 B
SET
[ EDIT ]
|
[ DEL ]
📄 xdp_sock.h
2,094 B
SET
[ EDIT ]
|
[ DEL ]
📄 xdp_sock_drv.h
6,423 B
SET
[ EDIT ]
|
[ DEL ]
📄 xfrm.h
59,628 B
SET
[ EDIT ]
|
[ DEL ]
📄 xsk_buff_pool.h
6,550 B
SET
[ EDIT ]
|
[ DEL ]
DELETE SELECTED
[ CLOSE ]
EDIT: 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 \ (FIELD_SIZEOF(struct ip_tunnel_key, u) - \ FIELD_SIZEOF(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((FIELD_SIZEOF(struct ip_tunnel_info, \ options_len) * BITS_PER_BYTE) - 1, 0) #define ip_tunnel_info_opts(info) \ _Generic(info, \ const struct ip_tunnel_info * : ((const void *)((info) + 1)),\ struct ip_tunnel_info * : ((void *)((info) + 1))\ ) 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; 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 */ atomic_t 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 */ unsigned int ip_tnl_net_id; struct gro_cells gro_cells; __u32 fwmark; bool collect_md; bool ignore_df; }; 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, struct net *net, int oif, __u32 mark, __u32 tun_inner_hash) { memset(fl4, 0, sizeof(*fl4)); if (oif) { fl4->flowi4_l3mdev = l3mdev_master_upper_ifindex_by_index_rcu(net, oif); /* Legacy VRF/l3mdev use case */ fl4->flowi4_oif = fl4->flowi4_l3mdev ? 0 : 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_ioctl(struct net_device *dev, struct ip_tunnel_parm *p, 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); void ip_tunnel_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *tot); 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); 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); } /* Variant of pskb_inet_may_pull(). */ static inline bool skb_vlan_inet_prepare(struct sk_buff *skb, bool inner_proto_inherit) { int nhlen = 0, maclen = inner_proto_inherit ? 0 : ETH_HLEN; __be16 type = skb->protocol; /* Essentially this is skb_protocol(skb, true) * And we get MAC len. */ if (eth_type_vlan(type)) type = __vlan_get_protocol(skb, type, &maclen); switch (type) { #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; } /* For ETH_P_IPV6/ETH_P_IP we make sure to pull * a base network header in skb->head. */ if (!pskb_may_pull(skb, maclen + nhlen)) return false; skb_set_network_header(skb, maclen); return true; } 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_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 */