OXIESEC PANEL
- Current Dir:
/
/
usr
/
src
/
linux-headers-4.15.0-197
/
include
/
net
Server IP: 139.59.38.164
Upload:
Create Dir:
Name
Size
Modified
Perms
📁
..
-
11/17/2022 06:42:18 AM
rwxr-xr-x
📄
6lowpan.h
10.03 KB
01/28/2018 09:20:33 PM
rw-r--r--
📁
9p
-
11/17/2022 06:42:23 AM
rwxr-xr-x
📄
Space.h
1.15 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
act_api.h
6.38 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
addrconf.h
12.63 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
af_ieee802154.h
1.55 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
af_rxrpc.h
2.79 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
af_unix.h
2.22 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
af_vsock.h
7.21 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
ah.h
382 bytes
01/28/2018 09:20:33 PM
rw-r--r--
📄
arp.h
2 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
atmclip.h
1.48 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
ax25.h
15.02 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
ax88796.h
998 bytes
01/28/2018 09:20:33 PM
rw-r--r--
📁
bluetooth
-
11/17/2022 06:42:23 AM
rwxr-xr-x
📄
bond_3ad.h
9.79 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
bond_alb.h
6.6 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
bond_options.h
3.92 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
bonding.h
19.1 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
busy_poll.h
3.8 KB
11/01/2022 04:52:05 PM
rw-r--r--
📁
caif
-
11/17/2022 06:42:23 AM
rwxr-xr-x
📄
calipso.h
2.15 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
cfg80211-wext.h
1.95 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
cfg80211.h
221.24 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
cfg802154.h
10.89 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
checksum.h
4.76 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
cipso_ipv4.h
8.2 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
cls_cgroup.h
2.15 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
codel.h
5.65 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
codel_impl.h
7.98 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
codel_qdisc.h
2.9 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
compat.h
2.11 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
datalink.h
619 bytes
01/28/2018 09:20:33 PM
rw-r--r--
📄
dcbevent.h
1.26 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
dcbnl.h
4.2 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
devlink.h
13.25 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
dn.h
6.88 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
dn_dev.h
5.36 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
dn_fib.h
3.98 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
dn_neigh.h
968 bytes
01/28/2018 09:20:33 PM
rw-r--r--
📄
dn_nsp.h
5.83 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
dn_route.h
4.36 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
dsa.h
13.94 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
dsfield.h
1.11 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
dst.h
13.48 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
dst_cache.h
2.53 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
dst_metadata.h
5.39 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
dst_ops.h
2 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
erspan.h
2.11 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
esp.h
877 bytes
01/28/2018 09:20:33 PM
rw-r--r--
📄
ethoc.h
538 bytes
01/28/2018 09:20:33 PM
rw-r--r--
📄
fib_notifier.h
1.29 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
fib_rules.h
4.18 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
firewire.h
636 bytes
01/28/2018 09:20:33 PM
rw-r--r--
📄
flow.h
6.16 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
flow_dissector.h
7.55 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
fou.h
549 bytes
01/28/2018 09:20:33 PM
rw-r--r--
📄
fq.h
2.67 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
fq_impl.h
6.9 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
garp.h
2.62 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
gen_stats.h
2.34 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
genetlink.h
11.3 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
geneve.h
1.67 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
gre.h
2.99 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
gro_cells.h
443 bytes
01/28/2018 09:20:33 PM
rw-r--r--
📄
gtp.h
633 bytes
01/28/2018 09:20:33 PM
rw-r--r--
📄
gue.h
3.23 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
hwbm.h
937 bytes
01/28/2018 09:20:33 PM
rw-r--r--
📄
icmp.h
2.01 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
ieee80211_radiotap.h
6.63 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
ieee802154_netdev.h
9.14 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
if_inet6.h
6.13 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
ife.h
1.06 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
ila.h
498 bytes
01/28/2018 09:20:33 PM
rw-r--r--
📄
inet6_connection_sock.h
976 bytes
01/28/2018 09:20:33 PM
rw-r--r--
📄
inet6_hashtables.h
3.7 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
inet_common.h
1.89 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
inet_connection_sock.h
10.48 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
inet_ecn.h
6.02 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
inet_frag.h
4.51 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
inet_hashtables.h
12.91 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
inet_sock.h
8.25 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
inet_timewait_sock.h
3.82 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
inetpeer.h
3.29 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
ip.h
18.51 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
ip6_checksum.h
2.89 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
ip6_fib.h
10.04 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
ip6_route.h
7.63 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
ip6_tunnel.h
4.72 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
ip_fib.h
10.72 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
ip_tunnels.h
13.61 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
ip_vs.h
46.78 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
ipcomp.h
659 bytes
01/28/2018 09:20:33 PM
rw-r--r--
📄
ipconfig.h
811 bytes
01/28/2018 09:20:33 PM
rw-r--r--
📄
ipv6.h
29.97 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
ipv6_frag.h
2.54 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
ipx.h
4.4 KB
01/28/2018 09:20:33 PM
rw-r--r--
📁
iucv
-
11/17/2022 06:42:23 AM
rwxr-xr-x
📄
iw_handler.h
20.91 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
kcm.h
4.96 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
l3mdev.h
5.86 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
lapb.h
4.75 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
lib80211.h
3.92 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
llc.h
4.41 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
llc_c_ac.h
9.31 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
llc_c_ev.h
10.68 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
llc_c_st.h
1.72 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
llc_conn.h
4.06 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
llc_if.h
2.16 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
llc_pdu.h
14.44 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
llc_s_ac.h
1.55 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
llc_s_ev.h
2.2 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
llc_s_st.h
947 bytes
01/28/2018 09:20:33 PM
rw-r--r--
📄
llc_sap.h
1.08 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
lwtunnel.h
5.84 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
mac80211.h
230.36 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
mac802154.h
15.27 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
mip6.h
1.58 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
mld.h
2.8 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
mpls.h
932 bytes
01/28/2018 09:20:33 PM
rw-r--r--
📄
mpls_iptunnel.h
827 bytes
01/28/2018 09:20:33 PM
rw-r--r--
📄
mrp.h
3.03 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
ncsi.h
1.92 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
ndisc.h
13.77 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
neighbour.h
15.06 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
net_namespace.h
10.08 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
net_ratelimit.h
220 bytes
01/28/2018 09:20:33 PM
rw-r--r--
📄
netevent.h
910 bytes
01/28/2018 09:20:33 PM
rw-r--r--
📁
netfilter
-
11/17/2022 06:42:23 AM
rwxr-xr-x
📄
netlabel.h
20.74 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
netlink.h
40.39 KB
01/28/2018 09:20:33 PM
rw-r--r--
📁
netns
-
11/17/2022 06:42:23 AM
rwxr-xr-x
📄
netprio_cgroup.h
1.24 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
netrom.h
7.68 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
nexthop.h
865 bytes
11/01/2022 04:52:05 PM
rw-r--r--
📁
nfc
-
11/17/2022 06:42:23 AM
rwxr-xr-x
📄
nl802154.h
12.09 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
nsh.h
12.31 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
p8022.h
447 bytes
01/28/2018 09:20:33 PM
rw-r--r--
📁
phonet
-
11/17/2022 06:42:23 AM
rwxr-xr-x
📄
ping.h
3.45 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
pkt_cls.h
17.34 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
pkt_sched.h
4.05 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
pptp.h
557 bytes
01/28/2018 09:20:33 PM
rw-r--r--
📄
protocol.h
4.08 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
psample.h
860 bytes
11/01/2022 04:52:05 PM
rw-r--r--
📄
psnap.h
351 bytes
01/28/2018 09:20:33 PM
rw-r--r--
📄
raw.h
2.07 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
rawv6.h
854 bytes
01/28/2018 09:20:33 PM
rw-r--r--
📄
red.h
10.45 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
regulatory.h
10.12 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
request_sock.h
6.46 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
rose.h
7.62 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
route.h
10.02 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
rtnetlink.h
6.13 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
sch_generic.h
23.3 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
scm.h
3.5 KB
01/28/2018 09:20:33 PM
rw-r--r--
📁
sctp
-
11/17/2022 06:42:23 AM
rwxr-xr-x
📄
secure_seq.h
855 bytes
11/01/2022 04:52:05 PM
rw-r--r--
📄
seg6.h
1.66 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
seg6_hmac.h
1.65 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
slhc_vj.h
6.67 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
smc.h
440 bytes
01/28/2018 09:20:33 PM
rw-r--r--
📄
snmp.h
5.23 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
sock.h
69.75 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
sock_reuseport.h
863 bytes
01/28/2018 09:20:33 PM
rw-r--r--
📄
stp.h
383 bytes
01/28/2018 09:20:33 PM
rw-r--r--
📄
strparser.h
3.75 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
switchdev.h
6.52 KB
01/28/2018 09:20:33 PM
rw-r--r--
📁
tc_act
-
11/17/2022 06:42:23 AM
rwxr-xr-x
📄
tcp.h
62.8 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
tcp_states.h
1.26 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
timewait_sock.h
1.11 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
tipc.h
2.34 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
tls.h
7.12 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
transp_v6.h
2.08 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
tso.h
515 bytes
01/28/2018 09:20:33 PM
rw-r--r--
📄
tun_proto.h
988 bytes
01/28/2018 09:20:33 PM
rw-r--r--
📄
udp.h
12.82 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
udp_tunnel.h
5.12 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
udplite.h
3.83 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
vsock_addr.h
1.05 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
vxlan.h
10.43 KB
11/01/2022 04:52:05 PM
rw-r--r--
📄
wext.h
1.51 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
wimax.h
19.97 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
x25.h
9.43 KB
01/28/2018 09:20:33 PM
rw-r--r--
📄
x25device.h
387 bytes
01/28/2018 09:20:33 PM
rw-r--r--
📄
xfrm.h
53.72 KB
11/01/2022 04:52:05 PM
rw-r--r--
Editing: inet_hashtables.h
Close
/* * INET An implementation of the TCP/IP protocol suite for the LINUX * operating system. INET is implemented using the BSD Socket * interface as the means of communication with the user level. * * Authors: Lotsa people, from code originally in tcp * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. */ #ifndef _INET_HASHTABLES_H #define _INET_HASHTABLES_H #include <linux/interrupt.h> #include <linux/ip.h> #include <linux/ipv6.h> #include <linux/list.h> #include <linux/slab.h> #include <linux/socket.h> #include <linux/spinlock.h> #include <linux/types.h> #include <linux/wait.h> #include <net/inet_connection_sock.h> #include <net/inet_sock.h> #include <net/sock.h> #include <net/route.h> #include <net/tcp_states.h> #include <net/netns/hash.h> #include <linux/refcount.h> #include <asm/byteorder.h> /* This is for all connections with a full identity, no wildcards. * The 'e' prefix stands for Establish, but we really put all sockets * but LISTEN ones. */ struct inet_ehash_bucket { struct hlist_nulls_head chain; }; /* There are a few simple rules, which allow for local port reuse by * an application. In essence: * * 1) Sockets bound to different interfaces may share a local port. * Failing that, goto test 2. * 2) If all sockets have sk->sk_reuse set, and none of them are in * TCP_LISTEN state, the port may be shared. * Failing that, goto test 3. * 3) If all sockets are bound to a specific inet_sk(sk)->rcv_saddr local * address, and none of them are the same, the port may be * shared. * Failing this, the port cannot be shared. * * The interesting point, is test #2. This is what an FTP server does * all day. To optimize this case we use a specific flag bit defined * below. As we add sockets to a bind bucket list, we perform a * check of: (newsk->sk_reuse && (newsk->sk_state != TCP_LISTEN)) * As long as all sockets added to a bind bucket pass this test, * the flag bit will be set. * The resulting situation is that tcp_v[46]_verify_bind() can just check * for this flag bit, if it is set and the socket trying to bind has * sk->sk_reuse set, we don't even have to walk the owners list at all, * we return that it is ok to bind this socket to the requested local port. * * Sounds like a lot of work, but it is worth it. In a more naive * implementation (ie. current FreeBSD etc.) the entire list of ports * must be walked for each data port opened by an ftp server. Needless * to say, this does not scale at all. With a couple thousand FTP * users logged onto your box, isn't it nice to know that new data * ports are created in O(1) time? I thought so. ;-) -DaveM */ #define FASTREUSEPORT_ANY 1 #define FASTREUSEPORT_STRICT 2 struct inet_bind_bucket { possible_net_t ib_net; unsigned short port; signed char fastreuse; signed char fastreuseport; kuid_t fastuid; #if IS_ENABLED(CONFIG_IPV6) struct in6_addr fast_v6_rcv_saddr; #endif __be32 fast_rcv_saddr; unsigned short fast_sk_family; bool fast_ipv6_only; struct hlist_node node; struct hlist_head owners; }; static inline struct net *ib_net(struct inet_bind_bucket *ib) { return read_pnet(&ib->ib_net); } #define inet_bind_bucket_for_each(tb, head) \ hlist_for_each_entry(tb, head, node) struct inet_bind_hashbucket { spinlock_t lock; struct hlist_head chain; }; /* Sockets can be hashed in established or listening table. * We must use different 'nulls' end-of-chain value for all hash buckets : * A socket might transition from ESTABLISH to LISTEN state without * RCU grace period. A lookup in ehash table needs to handle this case. */ #define LISTENING_NULLS_BASE (1U << 29) struct inet_listen_hashbucket { spinlock_t lock; union { struct hlist_head head; struct hlist_nulls_head nulls_head; }; }; /* This is for listening sockets, thus all sockets which possess wildcards. */ #define INET_LHTABLE_SIZE 32 /* Yes, really, this is all you need. */ struct inet_hashinfo { /* This is for sockets with full identity only. Sockets here will * always be without wildcards and will have the following invariant: * * TCP_ESTABLISHED <= sk->sk_state < TCP_CLOSE * */ struct inet_ehash_bucket *ehash; spinlock_t *ehash_locks; unsigned int ehash_mask; unsigned int ehash_locks_mask; /* Ok, let's try this, I give up, we do need a local binding * TCP hash as well as the others for fast bind/connect. */ struct inet_bind_hashbucket *bhash; unsigned int bhash_size; /* 4 bytes hole on 64 bit */ struct kmem_cache *bind_bucket_cachep; /* All the above members are written once at bootup and * never written again _or_ are predominantly read-access. * * Now align to a new cache line as all the following members * might be often dirty. */ /* All sockets in TCP_LISTEN state will be in here. This is the only * table where wildcard'd TCP sockets can exist. Hash function here * is just local port number. */ struct inet_listen_hashbucket listening_hash[INET_LHTABLE_SIZE] ____cacheline_aligned_in_smp; }; static inline struct inet_ehash_bucket *inet_ehash_bucket( struct inet_hashinfo *hashinfo, unsigned int hash) { return &hashinfo->ehash[hash & hashinfo->ehash_mask]; } static inline spinlock_t *inet_ehash_lockp( struct inet_hashinfo *hashinfo, unsigned int hash) { return &hashinfo->ehash_locks[hash & hashinfo->ehash_locks_mask]; } int inet_ehash_locks_alloc(struct inet_hashinfo *hashinfo); static inline void inet_ehash_locks_free(struct inet_hashinfo *hashinfo) { kvfree(hashinfo->ehash_locks); hashinfo->ehash_locks = NULL; } struct inet_bind_bucket * inet_bind_bucket_create(struct kmem_cache *cachep, struct net *net, struct inet_bind_hashbucket *head, const unsigned short snum); void inet_bind_bucket_destroy(struct kmem_cache *cachep, struct inet_bind_bucket *tb); static inline u32 inet_bhashfn(const struct net *net, const __u16 lport, const u32 bhash_size) { return (lport + net_hash_mix(net)) & (bhash_size - 1); } void inet_bind_hash(struct sock *sk, struct inet_bind_bucket *tb, const unsigned short snum); /* These can have wildcards, don't try too hard. */ static inline u32 inet_lhashfn(const struct net *net, const unsigned short num) { return (num + net_hash_mix(net)) & (INET_LHTABLE_SIZE - 1); } static inline int inet_sk_listen_hashfn(const struct sock *sk) { return inet_lhashfn(sock_net(sk), inet_sk(sk)->inet_num); } /* Caller must disable local BH processing. */ int __inet_inherit_port(const struct sock *sk, struct sock *child); void inet_put_port(struct sock *sk); void inet_hashinfo_init(struct inet_hashinfo *h); bool inet_ehash_insert(struct sock *sk, struct sock *osk, bool *found_dup_sk); bool inet_ehash_nolisten(struct sock *sk, struct sock *osk, bool *found_dup_sk); int __inet_hash(struct sock *sk, struct sock *osk); int inet_hash(struct sock *sk); void inet_unhash(struct sock *sk); struct sock *__inet_lookup_listener(struct net *net, struct inet_hashinfo *hashinfo, struct sk_buff *skb, int doff, const __be32 saddr, const __be16 sport, const __be32 daddr, const unsigned short hnum, const int dif, const int sdif); static inline struct sock *inet_lookup_listener(struct net *net, struct inet_hashinfo *hashinfo, struct sk_buff *skb, int doff, __be32 saddr, __be16 sport, __be32 daddr, __be16 dport, int dif, int sdif) { return __inet_lookup_listener(net, hashinfo, skb, doff, saddr, sport, daddr, ntohs(dport), dif, sdif); } /* Socket demux engine toys. */ /* What happens here is ugly; there's a pair of adjacent fields in struct inet_sock; __be16 dport followed by __u16 num. We want to search by pair, so we combine the keys into a single 32bit value and compare with 32bit value read from &...->dport. Let's at least make sure that it's not mixed with anything else... On 64bit targets we combine comparisons with pair of adjacent __be32 fields in the same way. */ #ifdef __BIG_ENDIAN #define INET_COMBINED_PORTS(__sport, __dport) \ ((__force __portpair)(((__force __u32)(__be16)(__sport) << 16) | (__u32)(__dport))) #else /* __LITTLE_ENDIAN */ #define INET_COMBINED_PORTS(__sport, __dport) \ ((__force __portpair)(((__u32)(__dport) << 16) | (__force __u32)(__be16)(__sport))) #endif #if (BITS_PER_LONG == 64) #ifdef __BIG_ENDIAN #define INET_ADDR_COOKIE(__name, __saddr, __daddr) \ const __addrpair __name = (__force __addrpair) ( \ (((__force __u64)(__be32)(__saddr)) << 32) | \ ((__force __u64)(__be32)(__daddr))) #else /* __LITTLE_ENDIAN */ #define INET_ADDR_COOKIE(__name, __saddr, __daddr) \ const __addrpair __name = (__force __addrpair) ( \ (((__force __u64)(__be32)(__daddr)) << 32) | \ ((__force __u64)(__be32)(__saddr))) #endif /* __BIG_ENDIAN */ #define INET_MATCH(__sk, __net, __cookie, __saddr, __daddr, __ports, __dif, __sdif) \ (((__sk)->sk_portpair == (__ports)) && \ ((__sk)->sk_addrpair == (__cookie)) && \ (!(__sk)->sk_bound_dev_if || \ ((__sk)->sk_bound_dev_if == (__dif)) || \ ((__sk)->sk_bound_dev_if == (__sdif))) && \ net_eq(sock_net(__sk), (__net))) #else /* 32-bit arch */ #define INET_ADDR_COOKIE(__name, __saddr, __daddr) \ const int __name __deprecated __attribute__((unused)) #define INET_MATCH(__sk, __net, __cookie, __saddr, __daddr, __ports, __dif, __sdif) \ (((__sk)->sk_portpair == (__ports)) && \ ((__sk)->sk_daddr == (__saddr)) && \ ((__sk)->sk_rcv_saddr == (__daddr)) && \ (!(__sk)->sk_bound_dev_if || \ ((__sk)->sk_bound_dev_if == (__dif)) || \ ((__sk)->sk_bound_dev_if == (__sdif))) && \ net_eq(sock_net(__sk), (__net))) #endif /* 64-bit arch */ /* Sockets in TCP_CLOSE state are _always_ taken out of the hash, so we need * not check it for lookups anymore, thanks Alexey. -DaveM */ struct sock *__inet_lookup_established(struct net *net, struct inet_hashinfo *hashinfo, const __be32 saddr, const __be16 sport, const __be32 daddr, const u16 hnum, const int dif, const int sdif); static inline struct sock * inet_lookup_established(struct net *net, struct inet_hashinfo *hashinfo, const __be32 saddr, const __be16 sport, const __be32 daddr, const __be16 dport, const int dif) { return __inet_lookup_established(net, hashinfo, saddr, sport, daddr, ntohs(dport), dif, 0); } static inline struct sock *__inet_lookup(struct net *net, struct inet_hashinfo *hashinfo, struct sk_buff *skb, int doff, const __be32 saddr, const __be16 sport, const __be32 daddr, const __be16 dport, const int dif, const int sdif, bool *refcounted) { u16 hnum = ntohs(dport); struct sock *sk; sk = __inet_lookup_established(net, hashinfo, saddr, sport, daddr, hnum, dif, sdif); *refcounted = true; if (sk) return sk; *refcounted = false; return __inet_lookup_listener(net, hashinfo, skb, doff, saddr, sport, daddr, hnum, dif, sdif); } static inline struct sock *inet_lookup(struct net *net, struct inet_hashinfo *hashinfo, struct sk_buff *skb, int doff, const __be32 saddr, const __be16 sport, const __be32 daddr, const __be16 dport, const int dif) { struct sock *sk; bool refcounted; sk = __inet_lookup(net, hashinfo, skb, doff, saddr, sport, daddr, dport, dif, 0, &refcounted); if (sk && !refcounted && !refcount_inc_not_zero(&sk->sk_refcnt)) sk = NULL; return sk; } static inline struct sock *__inet_lookup_skb(struct inet_hashinfo *hashinfo, struct sk_buff *skb, int doff, const __be16 sport, const __be16 dport, const int sdif, bool *refcounted) { struct sock *sk = skb_steal_sock(skb); const struct iphdr *iph = ip_hdr(skb); *refcounted = true; if (sk) return sk; return __inet_lookup(dev_net(skb_dst(skb)->dev), hashinfo, skb, doff, iph->saddr, sport, iph->daddr, dport, inet_iif(skb), sdif, refcounted); } u32 inet6_ehashfn(const struct net *net, const struct in6_addr *laddr, const u16 lport, const struct in6_addr *faddr, const __be16 fport); static inline void sk_daddr_set(struct sock *sk, __be32 addr) { sk->sk_daddr = addr; /* alias of inet_daddr */ #if IS_ENABLED(CONFIG_IPV6) ipv6_addr_set_v4mapped(addr, &sk->sk_v6_daddr); #endif } static inline void sk_rcv_saddr_set(struct sock *sk, __be32 addr) { sk->sk_rcv_saddr = addr; /* alias of inet_rcv_saddr */ #if IS_ENABLED(CONFIG_IPV6) ipv6_addr_set_v4mapped(addr, &sk->sk_v6_rcv_saddr); #endif } int __inet_hash_connect(struct inet_timewait_death_row *death_row, struct sock *sk, u64 port_offset, int (*check_established)(struct inet_timewait_death_row *, struct sock *, __u16, struct inet_timewait_sock **)); int inet_hash_connect(struct inet_timewait_death_row *death_row, struct sock *sk); #endif /* _INET_HASHTABLES_H */