Commit | Line | Data |
---|---|---|
cc85a685 SZ |
1 | /* |
2 | * Copyright (c) 2009 The DragonFly Project. All rights reserved. | |
3 | * | |
4 | * This code is derived from software contributed to The DragonFly Project | |
5 | * by Sepherosa Ziehau <sepherosa@gmail.com> | |
6 | * | |
7 | * Redistribution and use in source and binary forms, with or without | |
8 | * modification, are permitted provided that the following conditions | |
9 | * are met: | |
10 | * | |
11 | * 1. Redistributions of source code must retain the above copyright | |
12 | * notice, this list of conditions and the following disclaimer. | |
13 | * 2. Redistributions in binary form must reproduce the above copyright | |
14 | * notice, this list of conditions and the following disclaimer in | |
15 | * the documentation and/or other materials provided with the | |
16 | * distribution. | |
17 | * 3. Neither the name of The DragonFly Project nor the names of its | |
18 | * contributors may be used to endorse or promote products derived | |
19 | * from this software without specific, prior written permission. | |
20 | * | |
21 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
22 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
23 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | |
24 | * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | |
25 | * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | |
26 | * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, | |
27 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
28 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED | |
29 | * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |
30 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |
31 | * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
32 | * SUCH DAMAGE. | |
33 | */ | |
34 | ||
35 | #ifndef _NET_TOEPLITZ2_H_ | |
36 | #define _NET_TOEPLITZ2_H_ | |
37 | ||
38 | #ifndef _KERNEL | |
39 | #error "kernel only header file" | |
40 | #endif | |
41 | ||
42 | #define TOEPLITZ_KEYSEED_CNT 2 | |
43 | ||
44 | extern uint32_t toeplitz_cache[TOEPLITZ_KEYSEED_CNT][256]; | |
45 | ||
46 | static __inline uint32_t | |
b73d4152 SZ |
47 | toeplitz_rawhash_addrport(in_addr_t _faddr, in_addr_t _laddr, |
48 | in_port_t _fport, in_port_t _lport) | |
cc85a685 SZ |
49 | { |
50 | uint32_t _res; | |
51 | ||
52 | _res = toeplitz_cache[0][_faddr & 0xff]; | |
53 | _res ^= toeplitz_cache[0][(_faddr >> 16) & 0xff]; | |
54 | _res ^= toeplitz_cache[0][_laddr & 0xff]; | |
55 | _res ^= toeplitz_cache[0][(_laddr >> 16) & 0xff]; | |
56 | _res ^= toeplitz_cache[0][_fport & 0xff]; | |
57 | _res ^= toeplitz_cache[0][_lport & 0xff]; | |
58 | ||
59 | _res ^= toeplitz_cache[1][(_faddr >> 8) & 0xff]; | |
60 | _res ^= toeplitz_cache[1][(_faddr >> 24) & 0xff]; | |
61 | _res ^= toeplitz_cache[1][(_laddr >> 8) & 0xff]; | |
62 | _res ^= toeplitz_cache[1][(_laddr >> 24) & 0xff]; | |
63 | _res ^= toeplitz_cache[1][(_fport >> 8) & 0xff]; | |
64 | _res ^= toeplitz_cache[1][(_lport >> 8) & 0xff]; | |
65 | ||
66 | return _res; | |
67 | } | |
68 | ||
69 | static __inline uint32_t | |
b73d4152 | 70 | toeplitz_rawhash_addr(in_addr_t _faddr, in_addr_t _laddr) |
cc85a685 SZ |
71 | { |
72 | uint32_t _res; | |
73 | ||
74 | _res = toeplitz_cache[0][_faddr & 0xff]; | |
75 | _res ^= toeplitz_cache[0][(_faddr >> 16) & 0xff]; | |
76 | _res ^= toeplitz_cache[0][_laddr & 0xff]; | |
77 | _res ^= toeplitz_cache[0][(_laddr >> 16) & 0xff]; | |
78 | ||
79 | _res ^= toeplitz_cache[1][(_faddr >> 8) & 0xff]; | |
80 | _res ^= toeplitz_cache[1][(_faddr >> 24) & 0xff]; | |
81 | _res ^= toeplitz_cache[1][(_laddr >> 8) & 0xff]; | |
82 | _res ^= toeplitz_cache[1][(_laddr >> 24) & 0xff]; | |
83 | ||
84 | return _res; | |
85 | } | |
86 | ||
b73d4152 SZ |
87 | static __inline int |
88 | toeplitz_hash(uint32_t _rawhash) | |
89 | { | |
a3878651 | 90 | return (_rawhash & 0xffff); |
b73d4152 SZ |
91 | } |
92 | ||
36f372d9 MD |
93 | static __inline uint32_t |
94 | toeplitz_piecemeal_addr(in_addr_t _faddr) | |
95 | { | |
96 | uint32_t _res; | |
97 | ||
98 | _res = toeplitz_cache[0][_faddr & 0xff]; | |
99 | _res ^= toeplitz_cache[0][(_faddr >> 16) & 0xff]; | |
100 | _res ^= toeplitz_cache[1][(_faddr >> 8) & 0xff]; | |
101 | _res ^= toeplitz_cache[1][(_faddr >> 24) & 0xff]; | |
102 | return _res; | |
103 | } | |
104 | ||
105 | static __inline uint32_t | |
106 | toeplitz_piecemeal_port(in_port_t _fport) | |
107 | { | |
108 | uint32_t _res; | |
109 | ||
110 | _res = toeplitz_cache[0][_fport & 0xff]; | |
111 | _res ^= toeplitz_cache[1][(_fport >> 8) & 0xff]; | |
112 | ||
113 | return _res; | |
114 | } | |
115 | ||
cc85a685 | 116 | #endif /* !_NET_TOEPLITZ2_H_ */ |