diff options
Diffstat (limited to 'include/net/inet_hashtables.h')
-rw-r--r-- | include/net/inet_hashtables.h | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/include/net/inet_hashtables.h b/include/net/inet_hashtables.h new file mode 100644 index 000000000000..c4c9e39f4505 --- /dev/null +++ b/include/net/inet_hashtables.h | |||
@@ -0,0 +1,40 @@ | |||
1 | /* | ||
2 | * INET An implementation of the TCP/IP protocol suite for the LINUX | ||
3 | * operating system. INET is implemented using the BSD Socket | ||
4 | * interface as the means of communication with the user level. | ||
5 | * | ||
6 | * Authors: Lotsa people, from code originally in tcp | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or | ||
9 | * modify it under the terms of the GNU General Public License | ||
10 | * as published by the Free Software Foundation; either version | ||
11 | * 2 of the License, or (at your option) any later version. | ||
12 | */ | ||
13 | |||
14 | #ifndef _INET_HASHTABLES_H | ||
15 | #define _INET_HASHTABLES_H | ||
16 | |||
17 | #include <linux/types.h> | ||
18 | |||
19 | static inline int inet_ehashfn(const __u32 laddr, const __u16 lport, | ||
20 | const __u32 faddr, const __u16 fport, | ||
21 | const int ehash_size) | ||
22 | { | ||
23 | int h = (laddr ^ lport) ^ (faddr ^ fport); | ||
24 | h ^= h >> 16; | ||
25 | h ^= h >> 8; | ||
26 | return h & (ehash_size - 1); | ||
27 | } | ||
28 | |||
29 | static inline int inet_sk_ehashfn(const struct sock *sk, const int ehash_size) | ||
30 | { | ||
31 | const struct inet_sock *inet = inet_sk(sk); | ||
32 | const __u32 laddr = inet->rcv_saddr; | ||
33 | const __u16 lport = inet->num; | ||
34 | const __u32 faddr = inet->daddr; | ||
35 | const __u16 fport = inet->dport; | ||
36 | |||
37 | return inet_ehashfn(laddr, lport, faddr, fport, ehash_size); | ||
38 | } | ||
39 | |||
40 | #endif /* _INET_HASHTABLES_H */ | ||