1*0f4c859eSApple OSS Distributions /*
2*0f4c859eSApple OSS Distributions * Copyright (c) 2011-2022 Apple Inc. All rights reserved.
3*0f4c859eSApple OSS Distributions *
4*0f4c859eSApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5*0f4c859eSApple OSS Distributions *
6*0f4c859eSApple OSS Distributions * This file contains Original Code and/or Modifications of Original Code
7*0f4c859eSApple OSS Distributions * as defined in and that are subject to the Apple Public Source License
8*0f4c859eSApple OSS Distributions * Version 2.0 (the 'License'). You may not use this file except in
9*0f4c859eSApple OSS Distributions * compliance with the License. The rights granted to you under the License
10*0f4c859eSApple OSS Distributions * may not be used to create, or enable the creation or redistribution of,
11*0f4c859eSApple OSS Distributions * unlawful or unlicensed copies of an Apple operating system, or to
12*0f4c859eSApple OSS Distributions * circumvent, violate, or enable the circumvention or violation of, any
13*0f4c859eSApple OSS Distributions * terms of an Apple operating system software license agreement.
14*0f4c859eSApple OSS Distributions *
15*0f4c859eSApple OSS Distributions * Please obtain a copy of the License at
16*0f4c859eSApple OSS Distributions * http://www.opensource.apple.com/apsl/ and read it before using this file.
17*0f4c859eSApple OSS Distributions *
18*0f4c859eSApple OSS Distributions * The Original Code and all software distributed under the License are
19*0f4c859eSApple OSS Distributions * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20*0f4c859eSApple OSS Distributions * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21*0f4c859eSApple OSS Distributions * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22*0f4c859eSApple OSS Distributions * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23*0f4c859eSApple OSS Distributions * Please see the License for the specific language governing rights and
24*0f4c859eSApple OSS Distributions * limitations under the License.
25*0f4c859eSApple OSS Distributions *
26*0f4c859eSApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27*0f4c859eSApple OSS Distributions */
28*0f4c859eSApple OSS Distributions
29*0f4c859eSApple OSS Distributions /*
30*0f4c859eSApple OSS Distributions * http://code.google.com/p/smhasher/
31*0f4c859eSApple OSS Distributions *
32*0f4c859eSApple OSS Distributions * Copyright (c) 2009-2011 Austin Appleby.
33*0f4c859eSApple OSS Distributions *
34*0f4c859eSApple OSS Distributions * MurmurHash3 was written by Austin Appleby, and is placed in the public
35*0f4c859eSApple OSS Distributions * domain. The author hereby disclaims copyright to this source code.
36*0f4c859eSApple OSS Distributions */
37*0f4c859eSApple OSS Distributions
38*0f4c859eSApple OSS Distributions /*
39*0f4c859eSApple OSS Distributions * http://burtleburtle.net/bob/hash/
40*0f4c859eSApple OSS Distributions *
41*0f4c859eSApple OSS Distributions * lookup3.c, by Bob Jenkins, May 2006, Public Domain.
42*0f4c859eSApple OSS Distributions *
43*0f4c859eSApple OSS Distributions * You can use this free for any purpose. It's in the public domain.
44*0f4c859eSApple OSS Distributions * It has no warranty.
45*0f4c859eSApple OSS Distributions */
46*0f4c859eSApple OSS Distributions
47*0f4c859eSApple OSS Distributions #include <stdbool.h>
48*0f4c859eSApple OSS Distributions #include <sys/types.h>
49*0f4c859eSApple OSS Distributions #include <machine/endian.h>
50*0f4c859eSApple OSS Distributions #include <net/flowhash.h>
51*0f4c859eSApple OSS Distributions #include <os/base.h>
52*0f4c859eSApple OSS Distributions
53*0f4c859eSApple OSS Distributions static inline u_int32_t getblock32(const u_int32_t *, int);
54*0f4c859eSApple OSS Distributions static inline u_int64_t getblock64(const u_int64_t *, int);
55*0f4c859eSApple OSS Distributions static inline u_int32_t mh3_fmix32(u_int32_t);
56*0f4c859eSApple OSS Distributions static inline u_int64_t mh3_fmix64(u_int64_t);
57*0f4c859eSApple OSS Distributions
58*0f4c859eSApple OSS Distributions #define ALIGNED16(v) ((((uintptr_t)(v)) & 1) == 0)
59*0f4c859eSApple OSS Distributions #define ALIGNED32(v) ((((uintptr_t)(v)) & 3) == 0)
60*0f4c859eSApple OSS Distributions #define ALIGNED64(v) ((((uintptr_t)(v)) & 7) == 0)
61*0f4c859eSApple OSS Distributions
62*0f4c859eSApple OSS Distributions #define ROTL32(x, r) (((x) << (r)) | ((x) >> (32 - (r))))
63*0f4c859eSApple OSS Distributions #define ROTL64(x, r) (((x) << (r)) | ((x) >> (64 - (r))))
64*0f4c859eSApple OSS Distributions
65*0f4c859eSApple OSS Distributions /*
66*0f4c859eSApple OSS Distributions * The following hash algorithms are selected based on performance:
67*0f4c859eSApple OSS Distributions *
68*0f4c859eSApple OSS Distributions * 64-bit: MurmurHash3_x64_128
69*0f4c859eSApple OSS Distributions * 32-bit: JHash
70*0f4c859eSApple OSS Distributions */
71*0f4c859eSApple OSS Distributions #if defined(__LP64__)
72*0f4c859eSApple OSS Distributions net_flowhash_fn_t *net_flowhash = net_flowhash_mh3_x64_128;
73*0f4c859eSApple OSS Distributions #else /* !__LP64__ */
74*0f4c859eSApple OSS Distributions net_flowhash_fn_t *net_flowhash = net_flowhash_jhash;
75*0f4c859eSApple OSS Distributions #endif /* !__LP64__ */
76*0f4c859eSApple OSS Distributions
77*0f4c859eSApple OSS Distributions #if defined(__i386__) || defined(__x86_64__) || defined(__arm64__)
78*0f4c859eSApple OSS Distributions static inline u_int32_t
getblock32(const u_int32_t * p,int i)79*0f4c859eSApple OSS Distributions getblock32(const u_int32_t *p, int i)
80*0f4c859eSApple OSS Distributions {
81*0f4c859eSApple OSS Distributions return p[i];
82*0f4c859eSApple OSS Distributions }
83*0f4c859eSApple OSS Distributions
84*0f4c859eSApple OSS Distributions static inline u_int64_t
getblock64(const u_int64_t * p,int i)85*0f4c859eSApple OSS Distributions getblock64(const u_int64_t *p, int i)
86*0f4c859eSApple OSS Distributions {
87*0f4c859eSApple OSS Distributions return p[i];
88*0f4c859eSApple OSS Distributions }
89*0f4c859eSApple OSS Distributions #else /* !__i386__ && !__x86_64__ && !__arm64__*/
90*0f4c859eSApple OSS Distributions static inline u_int32_t
getblock32(const u_int32_t * p,int i)91*0f4c859eSApple OSS Distributions getblock32(const u_int32_t *p, int i)
92*0f4c859eSApple OSS Distributions {
93*0f4c859eSApple OSS Distributions const u_int8_t *bytes = (u_int8_t *)(void *)(uintptr_t)(p + i);
94*0f4c859eSApple OSS Distributions u_int32_t value;
95*0f4c859eSApple OSS Distributions
96*0f4c859eSApple OSS Distributions if (ALIGNED32(p)) {
97*0f4c859eSApple OSS Distributions value = p[i];
98*0f4c859eSApple OSS Distributions } else {
99*0f4c859eSApple OSS Distributions #if BYTE_ORDER == BIG_ENDIAN
100*0f4c859eSApple OSS Distributions value =
101*0f4c859eSApple OSS Distributions (((u_int32_t)bytes[0]) << 24) |
102*0f4c859eSApple OSS Distributions (((u_int32_t)bytes[1]) << 16) |
103*0f4c859eSApple OSS Distributions (((u_int32_t)bytes[2]) << 8) |
104*0f4c859eSApple OSS Distributions ((u_int32_t)bytes[3]);
105*0f4c859eSApple OSS Distributions #else /* LITTLE_ENDIAN */
106*0f4c859eSApple OSS Distributions value =
107*0f4c859eSApple OSS Distributions (((u_int32_t)bytes[3]) << 24) |
108*0f4c859eSApple OSS Distributions (((u_int32_t)bytes[2]) << 16) |
109*0f4c859eSApple OSS Distributions (((u_int32_t)bytes[1]) << 8) |
110*0f4c859eSApple OSS Distributions ((u_int32_t)bytes[0]);
111*0f4c859eSApple OSS Distributions #endif /* LITTLE_ENDIAN */
112*0f4c859eSApple OSS Distributions }
113*0f4c859eSApple OSS Distributions return value;
114*0f4c859eSApple OSS Distributions }
115*0f4c859eSApple OSS Distributions
116*0f4c859eSApple OSS Distributions static inline u_int64_t
getblock64(const u_int64_t * p,int i)117*0f4c859eSApple OSS Distributions getblock64(const u_int64_t *p, int i)
118*0f4c859eSApple OSS Distributions {
119*0f4c859eSApple OSS Distributions const u_int8_t *bytes = (const u_int8_t *)(void *)(uintptr_t)(p + i);
120*0f4c859eSApple OSS Distributions u_int64_t value;
121*0f4c859eSApple OSS Distributions
122*0f4c859eSApple OSS Distributions if (ALIGNED64(p)) {
123*0f4c859eSApple OSS Distributions value = p[i];
124*0f4c859eSApple OSS Distributions } else {
125*0f4c859eSApple OSS Distributions #if BYTE_ORDER == BIG_ENDIAN
126*0f4c859eSApple OSS Distributions value =
127*0f4c859eSApple OSS Distributions (((u_int64_t)bytes[0]) << 56) |
128*0f4c859eSApple OSS Distributions (((u_int64_t)bytes[1]) << 48) |
129*0f4c859eSApple OSS Distributions (((u_int64_t)bytes[2]) << 40) |
130*0f4c859eSApple OSS Distributions (((u_int64_t)bytes[3]) << 32) |
131*0f4c859eSApple OSS Distributions (((u_int64_t)bytes[4]) << 24) |
132*0f4c859eSApple OSS Distributions (((u_int64_t)bytes[5]) << 16) |
133*0f4c859eSApple OSS Distributions (((u_int64_t)bytes[6]) << 8) |
134*0f4c859eSApple OSS Distributions ((u_int64_t)bytes[7]);
135*0f4c859eSApple OSS Distributions #else /* LITTLE_ENDIAN */
136*0f4c859eSApple OSS Distributions value =
137*0f4c859eSApple OSS Distributions (((u_int64_t)bytes[7]) << 56) |
138*0f4c859eSApple OSS Distributions (((u_int64_t)bytes[6]) << 48) |
139*0f4c859eSApple OSS Distributions (((u_int64_t)bytes[5]) << 40) |
140*0f4c859eSApple OSS Distributions (((u_int64_t)bytes[4]) << 32) |
141*0f4c859eSApple OSS Distributions (((u_int64_t)bytes[3]) << 24) |
142*0f4c859eSApple OSS Distributions (((u_int64_t)bytes[2]) << 16) |
143*0f4c859eSApple OSS Distributions (((u_int64_t)bytes[1]) << 8) |
144*0f4c859eSApple OSS Distributions ((u_int64_t)bytes[0]);
145*0f4c859eSApple OSS Distributions #endif /* LITTLE_ENDIAN */
146*0f4c859eSApple OSS Distributions }
147*0f4c859eSApple OSS Distributions return value;
148*0f4c859eSApple OSS Distributions }
149*0f4c859eSApple OSS Distributions #endif /* !__i386__ && !__x86_64 && !__arm64__ */
150*0f4c859eSApple OSS Distributions
151*0f4c859eSApple OSS Distributions static inline u_int32_t
mh3_fmix32(u_int32_t h)152*0f4c859eSApple OSS Distributions mh3_fmix32(u_int32_t h)
153*0f4c859eSApple OSS Distributions {
154*0f4c859eSApple OSS Distributions h ^= h >> 16;
155*0f4c859eSApple OSS Distributions h *= 0x85ebca6b;
156*0f4c859eSApple OSS Distributions h ^= h >> 13;
157*0f4c859eSApple OSS Distributions h *= 0xc2b2ae35;
158*0f4c859eSApple OSS Distributions h ^= h >> 16;
159*0f4c859eSApple OSS Distributions
160*0f4c859eSApple OSS Distributions return h;
161*0f4c859eSApple OSS Distributions }
162*0f4c859eSApple OSS Distributions
163*0f4c859eSApple OSS Distributions static inline u_int64_t
mh3_fmix64(u_int64_t k)164*0f4c859eSApple OSS Distributions mh3_fmix64(u_int64_t k)
165*0f4c859eSApple OSS Distributions {
166*0f4c859eSApple OSS Distributions k ^= k >> 33;
167*0f4c859eSApple OSS Distributions k *= 0xff51afd7ed558ccdLLU;
168*0f4c859eSApple OSS Distributions k ^= k >> 33;
169*0f4c859eSApple OSS Distributions k *= 0xc4ceb9fe1a85ec53LLU;
170*0f4c859eSApple OSS Distributions k ^= k >> 33;
171*0f4c859eSApple OSS Distributions
172*0f4c859eSApple OSS Distributions return k;
173*0f4c859eSApple OSS Distributions }
174*0f4c859eSApple OSS Distributions
175*0f4c859eSApple OSS Distributions /*
176*0f4c859eSApple OSS Distributions * MurmurHash3_x86_32
177*0f4c859eSApple OSS Distributions */
178*0f4c859eSApple OSS Distributions #define MH3_X86_32_C1 0xcc9e2d51
179*0f4c859eSApple OSS Distributions #define MH3_X86_32_C2 0x1b873593
180*0f4c859eSApple OSS Distributions
181*0f4c859eSApple OSS Distributions u_int32_t
net_flowhash_mh3_x86_32(const void * key,u_int32_t len,const u_int32_t seed)182*0f4c859eSApple OSS Distributions net_flowhash_mh3_x86_32(const void *key, u_int32_t len, const u_int32_t seed)
183*0f4c859eSApple OSS Distributions {
184*0f4c859eSApple OSS Distributions const u_int8_t *data = (const u_int8_t *)key;
185*0f4c859eSApple OSS Distributions const u_int32_t nblocks = len / 4;
186*0f4c859eSApple OSS Distributions const u_int32_t *blocks;
187*0f4c859eSApple OSS Distributions const u_int8_t *tail;
188*0f4c859eSApple OSS Distributions u_int32_t h1 = seed, k1;
189*0f4c859eSApple OSS Distributions int i;
190*0f4c859eSApple OSS Distributions
191*0f4c859eSApple OSS Distributions /* body */
192*0f4c859eSApple OSS Distributions blocks = (const u_int32_t *)(const void *)(data + nblocks * 4);
193*0f4c859eSApple OSS Distributions
194*0f4c859eSApple OSS Distributions for (i = -nblocks; i; i++) {
195*0f4c859eSApple OSS Distributions k1 = getblock32(blocks, i);
196*0f4c859eSApple OSS Distributions
197*0f4c859eSApple OSS Distributions k1 *= MH3_X86_32_C1;
198*0f4c859eSApple OSS Distributions k1 = ROTL32(k1, 15);
199*0f4c859eSApple OSS Distributions k1 *= MH3_X86_32_C2;
200*0f4c859eSApple OSS Distributions
201*0f4c859eSApple OSS Distributions h1 ^= k1;
202*0f4c859eSApple OSS Distributions h1 = ROTL32(h1, 13);
203*0f4c859eSApple OSS Distributions h1 = h1 * 5 + 0xe6546b64;
204*0f4c859eSApple OSS Distributions }
205*0f4c859eSApple OSS Distributions
206*0f4c859eSApple OSS Distributions /* tail */
207*0f4c859eSApple OSS Distributions tail = (const u_int8_t *)(const void *)(data + nblocks * 4);
208*0f4c859eSApple OSS Distributions k1 = 0;
209*0f4c859eSApple OSS Distributions
210*0f4c859eSApple OSS Distributions switch (len & 3) {
211*0f4c859eSApple OSS Distributions case 3:
212*0f4c859eSApple OSS Distributions k1 ^= tail[2] << 16;
213*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
214*0f4c859eSApple OSS Distributions case 2:
215*0f4c859eSApple OSS Distributions k1 ^= tail[1] << 8;
216*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
217*0f4c859eSApple OSS Distributions case 1:
218*0f4c859eSApple OSS Distributions k1 ^= tail[0];
219*0f4c859eSApple OSS Distributions k1 *= MH3_X86_32_C1;
220*0f4c859eSApple OSS Distributions k1 = ROTL32(k1, 15);
221*0f4c859eSApple OSS Distributions k1 *= MH3_X86_32_C2;
222*0f4c859eSApple OSS Distributions h1 ^= k1;
223*0f4c859eSApple OSS Distributions }
224*0f4c859eSApple OSS Distributions ;
225*0f4c859eSApple OSS Distributions
226*0f4c859eSApple OSS Distributions /* finalization */
227*0f4c859eSApple OSS Distributions h1 ^= len;
228*0f4c859eSApple OSS Distributions
229*0f4c859eSApple OSS Distributions h1 = mh3_fmix32(h1);
230*0f4c859eSApple OSS Distributions
231*0f4c859eSApple OSS Distributions return h1;
232*0f4c859eSApple OSS Distributions }
233*0f4c859eSApple OSS Distributions
234*0f4c859eSApple OSS Distributions /*
235*0f4c859eSApple OSS Distributions * MurmurHash3_x64_128
236*0f4c859eSApple OSS Distributions */
237*0f4c859eSApple OSS Distributions #define MH3_X64_128_C1 0x87c37b91114253d5LLU
238*0f4c859eSApple OSS Distributions #define MH3_X64_128_C2 0x4cf5ad432745937fLLU
239*0f4c859eSApple OSS Distributions
240*0f4c859eSApple OSS Distributions u_int32_t
net_flowhash_mh3_x64_128(const void * key,u_int32_t len,const u_int32_t seed)241*0f4c859eSApple OSS Distributions net_flowhash_mh3_x64_128(const void *key, u_int32_t len, const u_int32_t seed)
242*0f4c859eSApple OSS Distributions {
243*0f4c859eSApple OSS Distributions const u_int8_t *data = (const u_int8_t *)key;
244*0f4c859eSApple OSS Distributions const u_int32_t nblocks = len / 16;
245*0f4c859eSApple OSS Distributions const u_int64_t *blocks;
246*0f4c859eSApple OSS Distributions const u_int8_t *tail;
247*0f4c859eSApple OSS Distributions u_int64_t h1 = seed, k1;
248*0f4c859eSApple OSS Distributions u_int64_t h2 = seed, k2;
249*0f4c859eSApple OSS Distributions u_int32_t i;
250*0f4c859eSApple OSS Distributions
251*0f4c859eSApple OSS Distributions /* body */
252*0f4c859eSApple OSS Distributions blocks = (const u_int64_t *)(const void *)data;
253*0f4c859eSApple OSS Distributions
254*0f4c859eSApple OSS Distributions for (i = 0; i < nblocks; i++) {
255*0f4c859eSApple OSS Distributions k1 = getblock64(blocks, i * 2 + 0);
256*0f4c859eSApple OSS Distributions k2 = getblock64(blocks, i * 2 + 1);
257*0f4c859eSApple OSS Distributions
258*0f4c859eSApple OSS Distributions k1 *= MH3_X64_128_C1;
259*0f4c859eSApple OSS Distributions #if defined(__x86_64__)
260*0f4c859eSApple OSS Distributions __asm__ ( "rol $31, %[k1]\n\t" :[k1] "+r" (k1) : :);
261*0f4c859eSApple OSS Distributions #elif defined(__arm64__)
262*0f4c859eSApple OSS Distributions __asm__ ( "ror %[k1], %[k1], #(64-31)\n\t" :[k1] "+r" (k1) : :);
263*0f4c859eSApple OSS Distributions #else /* !__x86_64__ && !__arm64__ */
264*0f4c859eSApple OSS Distributions k1 = ROTL64(k1, 31);
265*0f4c859eSApple OSS Distributions #endif /* !__x86_64__ && !__arm64__ */
266*0f4c859eSApple OSS Distributions k1 *= MH3_X64_128_C2;
267*0f4c859eSApple OSS Distributions h1 ^= k1;
268*0f4c859eSApple OSS Distributions
269*0f4c859eSApple OSS Distributions #if defined(__x86_64__)
270*0f4c859eSApple OSS Distributions __asm__ ( "rol $27, %[h1]\n\t" :[h1] "+r" (h1) : :);
271*0f4c859eSApple OSS Distributions #elif defined(__arm64__)
272*0f4c859eSApple OSS Distributions __asm__ ( "ror %[h1], %[h1], #(64-27)\n\t" :[h1] "+r" (h1) : :);
273*0f4c859eSApple OSS Distributions #else /* !__x86_64__ && !__arm64__ */
274*0f4c859eSApple OSS Distributions h1 = ROTL64(h1, 27);
275*0f4c859eSApple OSS Distributions #endif /* !__x86_64__ && !__arm64__ */
276*0f4c859eSApple OSS Distributions h1 += h2;
277*0f4c859eSApple OSS Distributions h1 = h1 * 5 + 0x52dce729;
278*0f4c859eSApple OSS Distributions
279*0f4c859eSApple OSS Distributions k2 *= MH3_X64_128_C2;
280*0f4c859eSApple OSS Distributions #if defined(__x86_64__)
281*0f4c859eSApple OSS Distributions __asm__ ( "rol $33, %[k2]\n\t" :[k2] "+r" (k2) : :);
282*0f4c859eSApple OSS Distributions #elif defined(__arm64__)
283*0f4c859eSApple OSS Distributions __asm__ ( "ror %[k2], %[k2], #(64-33)\n\t" :[k2] "+r" (k2) : :);
284*0f4c859eSApple OSS Distributions #else /* !__x86_64__ && !__arm64__ */
285*0f4c859eSApple OSS Distributions k2 = ROTL64(k2, 33);
286*0f4c859eSApple OSS Distributions #endif /* !__x86_64__ && !__arm64__ */
287*0f4c859eSApple OSS Distributions k2 *= MH3_X64_128_C1;
288*0f4c859eSApple OSS Distributions h2 ^= k2;
289*0f4c859eSApple OSS Distributions
290*0f4c859eSApple OSS Distributions #if defined(__x86_64__)
291*0f4c859eSApple OSS Distributions __asm__ ( "rol $31, %[h2]\n\t" :[h2] "+r" (h2) : :);
292*0f4c859eSApple OSS Distributions #elif defined(__arm64__)
293*0f4c859eSApple OSS Distributions __asm__ ( "ror %[h2], %[h2], #(64-31)\n\t" :[h2] "+r" (h2) : :);
294*0f4c859eSApple OSS Distributions #else /* !__x86_64__ && !__arm64__ */
295*0f4c859eSApple OSS Distributions h2 = ROTL64(h2, 31);
296*0f4c859eSApple OSS Distributions #endif /* !__x86_64__ && !__arm64__ */
297*0f4c859eSApple OSS Distributions h2 += h1;
298*0f4c859eSApple OSS Distributions h2 = h2 * 5 + 0x38495ab5;
299*0f4c859eSApple OSS Distributions }
300*0f4c859eSApple OSS Distributions
301*0f4c859eSApple OSS Distributions /* tail */
302*0f4c859eSApple OSS Distributions tail = (const u_int8_t *)(const void *)(data + nblocks * 16);
303*0f4c859eSApple OSS Distributions k1 = 0;
304*0f4c859eSApple OSS Distributions k2 = 0;
305*0f4c859eSApple OSS Distributions
306*0f4c859eSApple OSS Distributions switch (len & 15) {
307*0f4c859eSApple OSS Distributions case 15:
308*0f4c859eSApple OSS Distributions k2 ^= ((u_int64_t)tail[14]) << 48;
309*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
310*0f4c859eSApple OSS Distributions case 14:
311*0f4c859eSApple OSS Distributions k2 ^= ((u_int64_t)tail[13]) << 40;
312*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
313*0f4c859eSApple OSS Distributions case 13:
314*0f4c859eSApple OSS Distributions k2 ^= ((u_int64_t)tail[12]) << 32;
315*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
316*0f4c859eSApple OSS Distributions case 12:
317*0f4c859eSApple OSS Distributions k2 ^= ((u_int64_t)tail[11]) << 24;
318*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
319*0f4c859eSApple OSS Distributions case 11:
320*0f4c859eSApple OSS Distributions k2 ^= ((u_int64_t)tail[10]) << 16;
321*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
322*0f4c859eSApple OSS Distributions case 10:
323*0f4c859eSApple OSS Distributions k2 ^= ((u_int64_t)tail[9]) << 8;
324*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
325*0f4c859eSApple OSS Distributions case 9:
326*0f4c859eSApple OSS Distributions k2 ^= ((u_int64_t)tail[8]) << 0;
327*0f4c859eSApple OSS Distributions k2 *= MH3_X64_128_C2;
328*0f4c859eSApple OSS Distributions #if defined(__x86_64__)
329*0f4c859eSApple OSS Distributions __asm__ ( "rol $33, %[k2]\n\t" :[k2] "+r" (k2) : :);
330*0f4c859eSApple OSS Distributions #elif defined(__arm64__)
331*0f4c859eSApple OSS Distributions __asm__ ( "ror %[k2], %[k2], #(64-33)\n\t" :[k2] "+r" (k2) : :);
332*0f4c859eSApple OSS Distributions #else /* !__x86_64__ && !__arm64__ */
333*0f4c859eSApple OSS Distributions k2 = ROTL64(k2, 33);
334*0f4c859eSApple OSS Distributions #endif /* !__x86_64__ && !__arm64__ */
335*0f4c859eSApple OSS Distributions k2 *= MH3_X64_128_C1;
336*0f4c859eSApple OSS Distributions h2 ^= k2;
337*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
338*0f4c859eSApple OSS Distributions case 8:
339*0f4c859eSApple OSS Distributions k1 ^= ((u_int64_t)tail[7]) << 56;
340*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
341*0f4c859eSApple OSS Distributions case 7:
342*0f4c859eSApple OSS Distributions k1 ^= ((u_int64_t)tail[6]) << 48;
343*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
344*0f4c859eSApple OSS Distributions case 6:
345*0f4c859eSApple OSS Distributions k1 ^= ((u_int64_t)tail[5]) << 40;
346*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
347*0f4c859eSApple OSS Distributions case 5:
348*0f4c859eSApple OSS Distributions k1 ^= ((u_int64_t)tail[4]) << 32;
349*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
350*0f4c859eSApple OSS Distributions case 4:
351*0f4c859eSApple OSS Distributions k1 ^= ((u_int64_t)tail[3]) << 24;
352*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
353*0f4c859eSApple OSS Distributions case 3:
354*0f4c859eSApple OSS Distributions k1 ^= ((u_int64_t)tail[2]) << 16;
355*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
356*0f4c859eSApple OSS Distributions case 2:
357*0f4c859eSApple OSS Distributions k1 ^= ((u_int64_t)tail[1]) << 8;
358*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
359*0f4c859eSApple OSS Distributions case 1:
360*0f4c859eSApple OSS Distributions k1 ^= ((u_int64_t)tail[0]) << 0;
361*0f4c859eSApple OSS Distributions k1 *= MH3_X64_128_C1;
362*0f4c859eSApple OSS Distributions #if defined(__x86_64__)
363*0f4c859eSApple OSS Distributions __asm__ ( "rol $31, %[k1]\n\t" :[k1] "+r" (k1) : :);
364*0f4c859eSApple OSS Distributions #elif defined(__arm64__)
365*0f4c859eSApple OSS Distributions __asm__ ( "ror %[k1], %[k1], #(64-31)\n\t" :[k1] "+r" (k1) : :);
366*0f4c859eSApple OSS Distributions #else /* !__x86_64__ && !__arm64__ */
367*0f4c859eSApple OSS Distributions k1 = ROTL64(k1, 31);
368*0f4c859eSApple OSS Distributions #endif /* !__x86_64__ && !__arm64__ */
369*0f4c859eSApple OSS Distributions k1 *= MH3_X64_128_C2;
370*0f4c859eSApple OSS Distributions h1 ^= k1;
371*0f4c859eSApple OSS Distributions }
372*0f4c859eSApple OSS Distributions ;
373*0f4c859eSApple OSS Distributions
374*0f4c859eSApple OSS Distributions /* finalization */
375*0f4c859eSApple OSS Distributions h1 ^= len;
376*0f4c859eSApple OSS Distributions h2 ^= len;
377*0f4c859eSApple OSS Distributions
378*0f4c859eSApple OSS Distributions h1 += h2;
379*0f4c859eSApple OSS Distributions h2 += h1;
380*0f4c859eSApple OSS Distributions
381*0f4c859eSApple OSS Distributions h1 = mh3_fmix64(h1);
382*0f4c859eSApple OSS Distributions h2 = mh3_fmix64(h2);
383*0f4c859eSApple OSS Distributions
384*0f4c859eSApple OSS Distributions h1 += h2;
385*0f4c859eSApple OSS Distributions h2 += h1;
386*0f4c859eSApple OSS Distributions
387*0f4c859eSApple OSS Distributions /* throw all but lowest 32-bit */
388*0f4c859eSApple OSS Distributions return h1 & 0xffffffff;
389*0f4c859eSApple OSS Distributions }
390*0f4c859eSApple OSS Distributions
391*0f4c859eSApple OSS Distributions #define JHASH_INIT 0xdeadbeef
392*0f4c859eSApple OSS Distributions
393*0f4c859eSApple OSS Distributions #define JHASH_MIX(a, b, c) { \
394*0f4c859eSApple OSS Distributions a -= c; a ^= ROTL32(c, 4); c += b; \
395*0f4c859eSApple OSS Distributions b -= a; b ^= ROTL32(a, 6); a += c; \
396*0f4c859eSApple OSS Distributions c -= b; c ^= ROTL32(b, 8); b += a; \
397*0f4c859eSApple OSS Distributions a -= c; a ^= ROTL32(c, 16); c += b; \
398*0f4c859eSApple OSS Distributions b -= a; b ^= ROTL32(a, 19); a += c; \
399*0f4c859eSApple OSS Distributions c -= b; c ^= ROTL32(b, 4); b += a; \
400*0f4c859eSApple OSS Distributions }
401*0f4c859eSApple OSS Distributions
402*0f4c859eSApple OSS Distributions #define JHASH_FINAL(a, b, c) { \
403*0f4c859eSApple OSS Distributions c ^= b; c -= ROTL32(b, 14); \
404*0f4c859eSApple OSS Distributions a ^= c; a -= ROTL32(c, 11); \
405*0f4c859eSApple OSS Distributions b ^= a; b -= ROTL32(a, 25); \
406*0f4c859eSApple OSS Distributions c ^= b; c -= ROTL32(b, 16); \
407*0f4c859eSApple OSS Distributions a ^= c; a -= ROTL32(c, 4); \
408*0f4c859eSApple OSS Distributions b ^= a; b -= ROTL32(a, 14); \
409*0f4c859eSApple OSS Distributions c ^= b; c -= ROTL32(b, 24); \
410*0f4c859eSApple OSS Distributions }
411*0f4c859eSApple OSS Distributions
412*0f4c859eSApple OSS Distributions #if BYTE_ORDER == BIG_ENDIAN
413*0f4c859eSApple OSS Distributions /*
414*0f4c859eSApple OSS Distributions * hashbig()
415*0f4c859eSApple OSS Distributions */
416*0f4c859eSApple OSS Distributions u_int32_t
net_flowhash_jhash(const void * key,u_int32_t len,const u_int32_t seed)417*0f4c859eSApple OSS Distributions net_flowhash_jhash(const void *key, u_int32_t len, const u_int32_t seed)
418*0f4c859eSApple OSS Distributions {
419*0f4c859eSApple OSS Distributions u_int32_t a, b, c;
420*0f4c859eSApple OSS Distributions
421*0f4c859eSApple OSS Distributions /* Set up the internal state */
422*0f4c859eSApple OSS Distributions a = b = c = JHASH_INIT + len + seed;
423*0f4c859eSApple OSS Distributions
424*0f4c859eSApple OSS Distributions if (ALIGNED32(key)) {
425*0f4c859eSApple OSS Distributions /* read 32-bit chunks */
426*0f4c859eSApple OSS Distributions const u_int32_t *k = (const u_int32_t *)key;
427*0f4c859eSApple OSS Distributions
428*0f4c859eSApple OSS Distributions /*
429*0f4c859eSApple OSS Distributions * all but last block:
430*0f4c859eSApple OSS Distributions * aligned reads and affect 32 bits of (a,b,c)
431*0f4c859eSApple OSS Distributions */
432*0f4c859eSApple OSS Distributions while (len > 12) {
433*0f4c859eSApple OSS Distributions a += k[0];
434*0f4c859eSApple OSS Distributions b += k[1];
435*0f4c859eSApple OSS Distributions c += k[2];
436*0f4c859eSApple OSS Distributions JHASH_MIX(a, b, c);
437*0f4c859eSApple OSS Distributions len -= 12;
438*0f4c859eSApple OSS Distributions k += 3;
439*0f4c859eSApple OSS Distributions }
440*0f4c859eSApple OSS Distributions
441*0f4c859eSApple OSS Distributions /*
442*0f4c859eSApple OSS Distributions * handle the last (probably partial) block
443*0f4c859eSApple OSS Distributions *
444*0f4c859eSApple OSS Distributions * "k[2] << 8" actually reads beyond the end of the string,
445*0f4c859eSApple OSS Distributions * but then shifts out the part it's not allowed to read.
446*0f4c859eSApple OSS Distributions * Because the string is aligned, the illegal read is in
447*0f4c859eSApple OSS Distributions * the same word as the rest of the string. The masking
448*0f4c859eSApple OSS Distributions * trick does make the hash noticably faster for short
449*0f4c859eSApple OSS Distributions * strings (like English words).
450*0f4c859eSApple OSS Distributions */
451*0f4c859eSApple OSS Distributions switch (len) {
452*0f4c859eSApple OSS Distributions case 12:
453*0f4c859eSApple OSS Distributions c += k[2];
454*0f4c859eSApple OSS Distributions b += k[1];
455*0f4c859eSApple OSS Distributions a += k[0];
456*0f4c859eSApple OSS Distributions break;
457*0f4c859eSApple OSS Distributions
458*0f4c859eSApple OSS Distributions case 11:
459*0f4c859eSApple OSS Distributions c += k[2] & 0xffffff00;
460*0f4c859eSApple OSS Distributions b += k[1];
461*0f4c859eSApple OSS Distributions a += k[0];
462*0f4c859eSApple OSS Distributions break;
463*0f4c859eSApple OSS Distributions
464*0f4c859eSApple OSS Distributions case 10:
465*0f4c859eSApple OSS Distributions c += k[2] & 0xffff0000;
466*0f4c859eSApple OSS Distributions b += k[1];
467*0f4c859eSApple OSS Distributions a += k[0];
468*0f4c859eSApple OSS Distributions break;
469*0f4c859eSApple OSS Distributions
470*0f4c859eSApple OSS Distributions case 9:
471*0f4c859eSApple OSS Distributions c += k[2] & 0xff000000;
472*0f4c859eSApple OSS Distributions b += k[1];
473*0f4c859eSApple OSS Distributions a += k[0];
474*0f4c859eSApple OSS Distributions break;
475*0f4c859eSApple OSS Distributions
476*0f4c859eSApple OSS Distributions case 8:
477*0f4c859eSApple OSS Distributions b += k[1];
478*0f4c859eSApple OSS Distributions a += k[0];
479*0f4c859eSApple OSS Distributions break;
480*0f4c859eSApple OSS Distributions
481*0f4c859eSApple OSS Distributions case 7:
482*0f4c859eSApple OSS Distributions b += k[1] & 0xffffff00;
483*0f4c859eSApple OSS Distributions a += k[0];
484*0f4c859eSApple OSS Distributions break;
485*0f4c859eSApple OSS Distributions
486*0f4c859eSApple OSS Distributions case 6:
487*0f4c859eSApple OSS Distributions b += k[1] & 0xffff0000;
488*0f4c859eSApple OSS Distributions a += k[0];
489*0f4c859eSApple OSS Distributions break;
490*0f4c859eSApple OSS Distributions
491*0f4c859eSApple OSS Distributions case 5:
492*0f4c859eSApple OSS Distributions b += k[1] & 0xff000000;
493*0f4c859eSApple OSS Distributions a += k[0];
494*0f4c859eSApple OSS Distributions break;
495*0f4c859eSApple OSS Distributions
496*0f4c859eSApple OSS Distributions case 4:
497*0f4c859eSApple OSS Distributions a += k[0];
498*0f4c859eSApple OSS Distributions break;
499*0f4c859eSApple OSS Distributions
500*0f4c859eSApple OSS Distributions case 3:
501*0f4c859eSApple OSS Distributions a += k[0] & 0xffffff00;
502*0f4c859eSApple OSS Distributions break;
503*0f4c859eSApple OSS Distributions
504*0f4c859eSApple OSS Distributions case 2:
505*0f4c859eSApple OSS Distributions a += k[0] & 0xffff0000;
506*0f4c859eSApple OSS Distributions break;
507*0f4c859eSApple OSS Distributions
508*0f4c859eSApple OSS Distributions case 1:
509*0f4c859eSApple OSS Distributions a += k[0] & 0xff000000;
510*0f4c859eSApple OSS Distributions break;
511*0f4c859eSApple OSS Distributions
512*0f4c859eSApple OSS Distributions case 0:
513*0f4c859eSApple OSS Distributions /* zero length requires no mixing */
514*0f4c859eSApple OSS Distributions return c;
515*0f4c859eSApple OSS Distributions }
516*0f4c859eSApple OSS Distributions
517*0f4c859eSApple OSS Distributions JHASH_FINAL(a, b, c);
518*0f4c859eSApple OSS Distributions
519*0f4c859eSApple OSS Distributions return c;
520*0f4c859eSApple OSS Distributions }
521*0f4c859eSApple OSS Distributions
522*0f4c859eSApple OSS Distributions /* need to read the key one byte at a time */
523*0f4c859eSApple OSS Distributions const u_int8_t *k = (const u_int8_t *)key;
524*0f4c859eSApple OSS Distributions
525*0f4c859eSApple OSS Distributions /* all but the last block: affect some 32 bits of (a,b,c) */
526*0f4c859eSApple OSS Distributions while (len > 12) {
527*0f4c859eSApple OSS Distributions a += ((u_int32_t)k[0]) << 24;
528*0f4c859eSApple OSS Distributions a += ((u_int32_t)k[1]) << 16;
529*0f4c859eSApple OSS Distributions a += ((u_int32_t)k[2]) << 8;
530*0f4c859eSApple OSS Distributions a += ((u_int32_t)k[3]);
531*0f4c859eSApple OSS Distributions b += ((u_int32_t)k[4]) << 24;
532*0f4c859eSApple OSS Distributions b += ((u_int32_t)k[5]) << 16;
533*0f4c859eSApple OSS Distributions b += ((u_int32_t)k[6]) << 8;
534*0f4c859eSApple OSS Distributions b += ((u_int32_t)k[7]);
535*0f4c859eSApple OSS Distributions c += ((u_int32_t)k[8]) << 24;
536*0f4c859eSApple OSS Distributions c += ((u_int32_t)k[9]) << 16;
537*0f4c859eSApple OSS Distributions c += ((u_int32_t)k[10]) << 8;
538*0f4c859eSApple OSS Distributions c += ((u_int32_t)k[11]);
539*0f4c859eSApple OSS Distributions JHASH_MIX(a, b, c);
540*0f4c859eSApple OSS Distributions len -= 12;
541*0f4c859eSApple OSS Distributions k += 12;
542*0f4c859eSApple OSS Distributions }
543*0f4c859eSApple OSS Distributions
544*0f4c859eSApple OSS Distributions /* last block: affect all 32 bits of (c) */
545*0f4c859eSApple OSS Distributions switch (len) {
546*0f4c859eSApple OSS Distributions case 12:
547*0f4c859eSApple OSS Distributions c += k[11];
548*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
549*0f4c859eSApple OSS Distributions case 11:
550*0f4c859eSApple OSS Distributions c += ((u_int32_t)k[10]) << 8;
551*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
552*0f4c859eSApple OSS Distributions case 10:
553*0f4c859eSApple OSS Distributions c += ((u_int32_t)k[9]) << 16;
554*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
555*0f4c859eSApple OSS Distributions case 9:
556*0f4c859eSApple OSS Distributions c += ((u_int32_t)k[8]) << 24;
557*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
558*0f4c859eSApple OSS Distributions case 8:
559*0f4c859eSApple OSS Distributions b += k[7];
560*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
561*0f4c859eSApple OSS Distributions case 7:
562*0f4c859eSApple OSS Distributions b += ((u_int32_t)k[6]) << 8;
563*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
564*0f4c859eSApple OSS Distributions case 6:
565*0f4c859eSApple OSS Distributions b += ((u_int32_t)k[5]) << 16;
566*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
567*0f4c859eSApple OSS Distributions case 5:
568*0f4c859eSApple OSS Distributions b += ((u_int32_t)k[4]) << 24;
569*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
570*0f4c859eSApple OSS Distributions case 4:
571*0f4c859eSApple OSS Distributions a += k[3];
572*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
573*0f4c859eSApple OSS Distributions case 3:
574*0f4c859eSApple OSS Distributions a += ((u_int32_t)k[2]) << 8;
575*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
576*0f4c859eSApple OSS Distributions case 2:
577*0f4c859eSApple OSS Distributions a += ((u_int32_t)k[1]) << 16;
578*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
579*0f4c859eSApple OSS Distributions case 1:
580*0f4c859eSApple OSS Distributions a += ((u_int32_t)k[0]) << 24;
581*0f4c859eSApple OSS Distributions break;
582*0f4c859eSApple OSS Distributions
583*0f4c859eSApple OSS Distributions case 0:
584*0f4c859eSApple OSS Distributions /* zero length requires no mixing */
585*0f4c859eSApple OSS Distributions return c;
586*0f4c859eSApple OSS Distributions }
587*0f4c859eSApple OSS Distributions
588*0f4c859eSApple OSS Distributions JHASH_FINAL(a, b, c);
589*0f4c859eSApple OSS Distributions
590*0f4c859eSApple OSS Distributions return c;
591*0f4c859eSApple OSS Distributions }
592*0f4c859eSApple OSS Distributions #else /* LITTLE_ENDIAN */
593*0f4c859eSApple OSS Distributions /*
594*0f4c859eSApple OSS Distributions * hashlittle()
595*0f4c859eSApple OSS Distributions */
596*0f4c859eSApple OSS Distributions u_int32_t
net_flowhash_jhash(const void * key,u_int32_t len,const u_int32_t seed)597*0f4c859eSApple OSS Distributions net_flowhash_jhash(const void *key, u_int32_t len, const u_int32_t seed)
598*0f4c859eSApple OSS Distributions {
599*0f4c859eSApple OSS Distributions u_int32_t a, b, c;
600*0f4c859eSApple OSS Distributions
601*0f4c859eSApple OSS Distributions /* Set up the internal state */
602*0f4c859eSApple OSS Distributions a = b = c = JHASH_INIT + len + seed;
603*0f4c859eSApple OSS Distributions
604*0f4c859eSApple OSS Distributions #if defined(__i386__) || defined(__x86_64__)
605*0f4c859eSApple OSS Distributions /*
606*0f4c859eSApple OSS Distributions * On i386/x86_64, it is faster to read 32-bit chunks if the key
607*0f4c859eSApple OSS Distributions * is aligned 32-bit OR not 16-bit, and perform 16-bit reads if it
608*0f4c859eSApple OSS Distributions * is aligned 16-bit.
609*0f4c859eSApple OSS Distributions */
610*0f4c859eSApple OSS Distributions if (ALIGNED32(key) || !ALIGNED16(key)) {
611*0f4c859eSApple OSS Distributions #else /* !defined(__i386__) && !defined(__x86_64__) */
612*0f4c859eSApple OSS Distributions if (ALIGNED32(key)) {
613*0f4c859eSApple OSS Distributions #endif /* !defined(__i386__) && !defined(__x86_64__) */
614*0f4c859eSApple OSS Distributions /* read 32-bit chunks */
615*0f4c859eSApple OSS Distributions const u_int32_t *k = (const u_int32_t *)key;
616*0f4c859eSApple OSS Distributions const u_int16_t *k16 = (const u_int16_t *)key;
617*0f4c859eSApple OSS Distributions const u_int8_t *k8 = (const u_int8_t *)key;
618*0f4c859eSApple OSS Distributions
619*0f4c859eSApple OSS Distributions /*
620*0f4c859eSApple OSS Distributions * all but last block:
621*0f4c859eSApple OSS Distributions * aligned reads and affect 32 bits of (a,b,c)
622*0f4c859eSApple OSS Distributions */
623*0f4c859eSApple OSS Distributions while (len > 12) {
624*0f4c859eSApple OSS Distributions a += k[0];
625*0f4c859eSApple OSS Distributions b += k[1];
626*0f4c859eSApple OSS Distributions c += k[2];
627*0f4c859eSApple OSS Distributions JHASH_MIX(a, b, c);
628*0f4c859eSApple OSS Distributions len -= 12;
629*0f4c859eSApple OSS Distributions k += 3;
630*0f4c859eSApple OSS Distributions }
631*0f4c859eSApple OSS Distributions
632*0f4c859eSApple OSS Distributions /* handle the last (probably partial) block */
633*0f4c859eSApple OSS Distributions switch (len) {
634*0f4c859eSApple OSS Distributions case 12:
635*0f4c859eSApple OSS Distributions c += k[2];
636*0f4c859eSApple OSS Distributions b += k[1];
637*0f4c859eSApple OSS Distributions a += k[0];
638*0f4c859eSApple OSS Distributions break;
639*0f4c859eSApple OSS Distributions
640*0f4c859eSApple OSS Distributions case 11:
641*0f4c859eSApple OSS Distributions c += ((u_int32_t)k8[10]) << 16;
642*0f4c859eSApple OSS Distributions c += k16[4];
643*0f4c859eSApple OSS Distributions b += k[1];
644*0f4c859eSApple OSS Distributions a += k[0];
645*0f4c859eSApple OSS Distributions break;
646*0f4c859eSApple OSS Distributions
647*0f4c859eSApple OSS Distributions case 10:
648*0f4c859eSApple OSS Distributions c += k16[4];
649*0f4c859eSApple OSS Distributions b += k[1];
650*0f4c859eSApple OSS Distributions a += k[0];
651*0f4c859eSApple OSS Distributions break;
652*0f4c859eSApple OSS Distributions
653*0f4c859eSApple OSS Distributions case 9:
654*0f4c859eSApple OSS Distributions c += k8[8];
655*0f4c859eSApple OSS Distributions b += k[1];
656*0f4c859eSApple OSS Distributions a += k[0];
657*0f4c859eSApple OSS Distributions break;
658*0f4c859eSApple OSS Distributions
659*0f4c859eSApple OSS Distributions case 8:
660*0f4c859eSApple OSS Distributions b += k[1];
661*0f4c859eSApple OSS Distributions a += k[0];
662*0f4c859eSApple OSS Distributions break;
663*0f4c859eSApple OSS Distributions
664*0f4c859eSApple OSS Distributions case 7:
665*0f4c859eSApple OSS Distributions b += ((u_int32_t)k8[6]) << 16;
666*0f4c859eSApple OSS Distributions b += k16[2];
667*0f4c859eSApple OSS Distributions a += k[0];
668*0f4c859eSApple OSS Distributions break;
669*0f4c859eSApple OSS Distributions
670*0f4c859eSApple OSS Distributions case 6:
671*0f4c859eSApple OSS Distributions b += k16[2];
672*0f4c859eSApple OSS Distributions a += k[0];
673*0f4c859eSApple OSS Distributions break;
674*0f4c859eSApple OSS Distributions
675*0f4c859eSApple OSS Distributions case 5:
676*0f4c859eSApple OSS Distributions b += k8[4];
677*0f4c859eSApple OSS Distributions a += k[0];
678*0f4c859eSApple OSS Distributions break;
679*0f4c859eSApple OSS Distributions
680*0f4c859eSApple OSS Distributions case 4:
681*0f4c859eSApple OSS Distributions a += k[0];
682*0f4c859eSApple OSS Distributions break;
683*0f4c859eSApple OSS Distributions
684*0f4c859eSApple OSS Distributions case 3:
685*0f4c859eSApple OSS Distributions a += ((u_int32_t)k8[2]) << 16;
686*0f4c859eSApple OSS Distributions a += k16[0];
687*0f4c859eSApple OSS Distributions break;
688*0f4c859eSApple OSS Distributions
689*0f4c859eSApple OSS Distributions case 2:
690*0f4c859eSApple OSS Distributions a += k16[0];
691*0f4c859eSApple OSS Distributions break;
692*0f4c859eSApple OSS Distributions
693*0f4c859eSApple OSS Distributions case 1:
694*0f4c859eSApple OSS Distributions a += k8[0];
695*0f4c859eSApple OSS Distributions break;
696*0f4c859eSApple OSS Distributions
697*0f4c859eSApple OSS Distributions case 0:
698*0f4c859eSApple OSS Distributions /* zero length requires no mixing */
699*0f4c859eSApple OSS Distributions return c;
700*0f4c859eSApple OSS Distributions }
701*0f4c859eSApple OSS Distributions
702*0f4c859eSApple OSS Distributions JHASH_FINAL(a, b, c);
703*0f4c859eSApple OSS Distributions
704*0f4c859eSApple OSS Distributions return c;
705*0f4c859eSApple OSS Distributions }
706*0f4c859eSApple OSS Distributions #if !defined(__i386__) && !defined(__x86_64__)
707*0f4c859eSApple OSS Distributions else if (ALIGNED16(key)) {
708*0f4c859eSApple OSS Distributions #endif /* !defined(__i386__) && !defined(__x86_64__) */
709*0f4c859eSApple OSS Distributions /* read 16-bit chunks */
710*0f4c859eSApple OSS Distributions const u_int16_t *k = (const u_int16_t *)key;
711*0f4c859eSApple OSS Distributions const u_int8_t *k8;
712*0f4c859eSApple OSS Distributions
713*0f4c859eSApple OSS Distributions /* all but last block: aligned reads and different mixing */
714*0f4c859eSApple OSS Distributions while (len > 12) {
715*0f4c859eSApple OSS Distributions a += k[0] + (((u_int32_t)k[1]) << 16);
716*0f4c859eSApple OSS Distributions b += k[2] + (((u_int32_t)k[3]) << 16);
717*0f4c859eSApple OSS Distributions c += k[4] + (((u_int32_t)k[5]) << 16);
718*0f4c859eSApple OSS Distributions JHASH_MIX(a, b, c);
719*0f4c859eSApple OSS Distributions len -= 12;
720*0f4c859eSApple OSS Distributions k += 6;
721*0f4c859eSApple OSS Distributions }
722*0f4c859eSApple OSS Distributions
723*0f4c859eSApple OSS Distributions /* handle the last (probably partial) block */
724*0f4c859eSApple OSS Distributions k8 = (const u_int8_t *)k;
725*0f4c859eSApple OSS Distributions switch (len) {
726*0f4c859eSApple OSS Distributions case 12:
727*0f4c859eSApple OSS Distributions c += k[4] + (((u_int32_t)k[5]) << 16);
728*0f4c859eSApple OSS Distributions b += k[2] + (((u_int32_t)k[3]) << 16);
729*0f4c859eSApple OSS Distributions a += k[0] + (((u_int32_t)k[1]) << 16);
730*0f4c859eSApple OSS Distributions break;
731*0f4c859eSApple OSS Distributions
732*0f4c859eSApple OSS Distributions case 11:
733*0f4c859eSApple OSS Distributions c += ((u_int32_t)k8[10]) << 16;
734*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
735*0f4c859eSApple OSS Distributions case 10:
736*0f4c859eSApple OSS Distributions c += k[4];
737*0f4c859eSApple OSS Distributions b += k[2] + (((u_int32_t)k[3]) << 16);
738*0f4c859eSApple OSS Distributions a += k[0] + (((u_int32_t)k[1]) << 16);
739*0f4c859eSApple OSS Distributions break;
740*0f4c859eSApple OSS Distributions
741*0f4c859eSApple OSS Distributions case 9:
742*0f4c859eSApple OSS Distributions c += k8[8];
743*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
744*0f4c859eSApple OSS Distributions case 8:
745*0f4c859eSApple OSS Distributions b += k[2] + (((u_int32_t)k[3]) << 16);
746*0f4c859eSApple OSS Distributions a += k[0] + (((u_int32_t)k[1]) << 16);
747*0f4c859eSApple OSS Distributions break;
748*0f4c859eSApple OSS Distributions
749*0f4c859eSApple OSS Distributions case 7:
750*0f4c859eSApple OSS Distributions b += ((u_int32_t)k8[6]) << 16;
751*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
752*0f4c859eSApple OSS Distributions case 6:
753*0f4c859eSApple OSS Distributions b += k[2];
754*0f4c859eSApple OSS Distributions a += k[0] + (((u_int32_t)k[1]) << 16);
755*0f4c859eSApple OSS Distributions break;
756*0f4c859eSApple OSS Distributions
757*0f4c859eSApple OSS Distributions case 5:
758*0f4c859eSApple OSS Distributions b += k8[4];
759*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
760*0f4c859eSApple OSS Distributions case 4:
761*0f4c859eSApple OSS Distributions a += k[0] + (((u_int32_t)k[1]) << 16);
762*0f4c859eSApple OSS Distributions break;
763*0f4c859eSApple OSS Distributions
764*0f4c859eSApple OSS Distributions case 3:
765*0f4c859eSApple OSS Distributions a += ((u_int32_t)k8[2]) << 16;
766*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
767*0f4c859eSApple OSS Distributions case 2:
768*0f4c859eSApple OSS Distributions a += k[0];
769*0f4c859eSApple OSS Distributions break;
770*0f4c859eSApple OSS Distributions
771*0f4c859eSApple OSS Distributions case 1:
772*0f4c859eSApple OSS Distributions a += k8[0];
773*0f4c859eSApple OSS Distributions break;
774*0f4c859eSApple OSS Distributions
775*0f4c859eSApple OSS Distributions case 0:
776*0f4c859eSApple OSS Distributions /* zero length requires no mixing */
777*0f4c859eSApple OSS Distributions return c;
778*0f4c859eSApple OSS Distributions }
779*0f4c859eSApple OSS Distributions
780*0f4c859eSApple OSS Distributions JHASH_FINAL(a, b, c);
781*0f4c859eSApple OSS Distributions
782*0f4c859eSApple OSS Distributions return c;
783*0f4c859eSApple OSS Distributions #if !defined(__i386__) && !defined(__x86_64__)
784*0f4c859eSApple OSS Distributions }
785*0f4c859eSApple OSS Distributions
786*0f4c859eSApple OSS Distributions /* need to read the key one byte at a time */
787*0f4c859eSApple OSS Distributions const u_int8_t *k = (const u_int8_t *)key;
788*0f4c859eSApple OSS Distributions
789*0f4c859eSApple OSS Distributions /* all but the last block: affect some 32 bits of (a,b,c) */
790*0f4c859eSApple OSS Distributions while (len > 12) {
791*0f4c859eSApple OSS Distributions a += k[0];
792*0f4c859eSApple OSS Distributions a += ((u_int32_t)k[1]) << 8;
793*0f4c859eSApple OSS Distributions a += ((u_int32_t)k[2]) << 16;
794*0f4c859eSApple OSS Distributions a += ((u_int32_t)k[3]) << 24;
795*0f4c859eSApple OSS Distributions b += k[4];
796*0f4c859eSApple OSS Distributions b += ((u_int32_t)k[5]) << 8;
797*0f4c859eSApple OSS Distributions b += ((u_int32_t)k[6]) << 16;
798*0f4c859eSApple OSS Distributions b += ((u_int32_t)k[7]) << 24;
799*0f4c859eSApple OSS Distributions c += k[8];
800*0f4c859eSApple OSS Distributions c += ((u_int32_t)k[9]) << 8;
801*0f4c859eSApple OSS Distributions c += ((u_int32_t)k[10]) << 16;
802*0f4c859eSApple OSS Distributions c += ((u_int32_t)k[11]) << 24;
803*0f4c859eSApple OSS Distributions JHASH_MIX(a, b, c);
804*0f4c859eSApple OSS Distributions len -= 12;
805*0f4c859eSApple OSS Distributions k += 12;
806*0f4c859eSApple OSS Distributions }
807*0f4c859eSApple OSS Distributions
808*0f4c859eSApple OSS Distributions /* last block: affect all 32 bits of (c) */
809*0f4c859eSApple OSS Distributions switch (len) {
810*0f4c859eSApple OSS Distributions case 12:
811*0f4c859eSApple OSS Distributions c += ((u_int32_t)k[11]) << 24;
812*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
813*0f4c859eSApple OSS Distributions case 11:
814*0f4c859eSApple OSS Distributions c += ((u_int32_t)k[10]) << 16;
815*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
816*0f4c859eSApple OSS Distributions case 10:
817*0f4c859eSApple OSS Distributions c += ((u_int32_t)k[9]) << 8;
818*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
819*0f4c859eSApple OSS Distributions case 9:
820*0f4c859eSApple OSS Distributions c += k[8];
821*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
822*0f4c859eSApple OSS Distributions case 8:
823*0f4c859eSApple OSS Distributions b += ((u_int32_t)k[7]) << 24;
824*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
825*0f4c859eSApple OSS Distributions case 7:
826*0f4c859eSApple OSS Distributions b += ((u_int32_t)k[6]) << 16;
827*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
828*0f4c859eSApple OSS Distributions case 6:
829*0f4c859eSApple OSS Distributions b += ((u_int32_t)k[5]) << 8;
830*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
831*0f4c859eSApple OSS Distributions case 5:
832*0f4c859eSApple OSS Distributions b += k[4];
833*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
834*0f4c859eSApple OSS Distributions case 4:
835*0f4c859eSApple OSS Distributions a += ((u_int32_t)k[3]) << 24;
836*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
837*0f4c859eSApple OSS Distributions case 3:
838*0f4c859eSApple OSS Distributions a += ((u_int32_t)k[2]) << 16;
839*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
840*0f4c859eSApple OSS Distributions case 2:
841*0f4c859eSApple OSS Distributions a += ((u_int32_t)k[1]) << 8;
842*0f4c859eSApple OSS Distributions OS_FALLTHROUGH;
843*0f4c859eSApple OSS Distributions case 1:
844*0f4c859eSApple OSS Distributions a += k[0];
845*0f4c859eSApple OSS Distributions break;
846*0f4c859eSApple OSS Distributions
847*0f4c859eSApple OSS Distributions case 0:
848*0f4c859eSApple OSS Distributions /* zero length requires no mixing */
849*0f4c859eSApple OSS Distributions return c;
850*0f4c859eSApple OSS Distributions }
851*0f4c859eSApple OSS Distributions
852*0f4c859eSApple OSS Distributions JHASH_FINAL(a, b, c);
853*0f4c859eSApple OSS Distributions
854*0f4c859eSApple OSS Distributions return c;
855*0f4c859eSApple OSS Distributions #endif /* !defined(__i386__) && !defined(__x86_64__) */
856*0f4c859eSApple OSS Distributions }
857*0f4c859eSApple OSS Distributions #endif /* LITTLE_ENDIAN */
858