]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | /* |
2 | * This file is open source software, licensed to you under the terms | |
3 | * of the Apache License, Version 2.0 (the "License"). See the NOTICE file | |
4 | * distributed with this work for additional information regarding copyright | |
5 | * ownership. You may not use this file except in compliance with the License. | |
6 | * | |
7 | * You may obtain a copy of the License at | |
8 | * | |
9 | * http://www.apache.org/licenses/LICENSE-2.0 | |
10 | * | |
11 | * Unless required by applicable law or agreed to in writing, | |
12 | * software distributed under the License is distributed on an | |
13 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
14 | * KIND, either express or implied. See the License for the | |
15 | * specific language governing permissions and limitations | |
16 | * under the License. | |
17 | */ | |
18 | /*- | |
19 | * Copyright (c) 2010 David Malone <dwmalone@FreeBSD.org> | |
20 | * All rights reserved. | |
21 | * | |
22 | * Redistribution and use in source and binary forms, with or without | |
23 | * modification, are permitted provided that the following conditions | |
24 | * are met: | |
25 | * 1. Redistributions of source code must retain the above copyright | |
26 | * notice, this list of conditions and the following disclaimer. | |
27 | * 2. Redistributions in binary form must reproduce the above copyright | |
28 | * notice, this list of conditions and the following disclaimer in the | |
29 | * documentation and/or other materials provided with the distribution. | |
30 | * | |
31 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND | |
32 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
33 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
34 | * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | |
35 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
36 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
37 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
38 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
39 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
40 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
41 | * SUCH DAMAGE. | |
42 | */ | |
43 | ||
44 | #ifndef CEPH_MSG_TOEPLITZ_H_ | |
45 | #define CEPH_MSG_TOEPLITZ_H_ | |
46 | ||
47 | #include <vector> | |
48 | ||
49 | using rss_key_type = std::vector<uint8_t>; | |
50 | ||
51 | // Mellanox Linux's driver key | |
52 | static const rss_key_type default_rsskey_40bytes = { | |
53 | 0xd1, 0x81, 0xc6, 0x2c, 0xf7, 0xf4, 0xdb, 0x5b, | |
54 | 0x19, 0x83, 0xa2, 0xfc, 0x94, 0x3e, 0x1a, 0xdb, | |
55 | 0xd9, 0x38, 0x9e, 0x6b, 0xd1, 0x03, 0x9c, 0x2c, | |
56 | 0xa7, 0x44, 0x99, 0xad, 0x59, 0x3d, 0x56, 0xd9, | |
57 | 0xf3, 0x25, 0x3c, 0x06, 0x2a, 0xdc, 0x1f, 0xfc | |
58 | }; | |
59 | ||
60 | // Intel's i40e PMD default RSS key | |
61 | static const rss_key_type default_rsskey_52bytes = { | |
62 | 0x44, 0x39, 0x79, 0x6b, 0xb5, 0x4c, 0x50, 0x23, | |
63 | 0xb6, 0x75, 0xea, 0x5b, 0x12, 0x4f, 0x9f, 0x30, | |
64 | 0xb8, 0xa2, 0xc0, 0x3d, 0xdf, 0xdc, 0x4d, 0x02, | |
65 | 0xa0, 0x8c, 0x9b, 0x33, 0x4a, 0xf6, 0x4a, 0x4c, | |
66 | 0x05, 0xc6, 0xfa, 0x34, 0x39, 0x58, 0xd8, 0x55, | |
67 | 0x7d, 0x99, 0x58, 0x3a, 0xe1, 0x38, 0xc9, 0x2e, | |
68 | 0x81, 0x15, 0x03, 0x66 | |
69 | }; | |
70 | ||
71 | template<typename T> | |
72 | static inline uint32_t toeplitz_hash(const rss_key_type& key, const T& data) | |
73 | { | |
74 | uint32_t hash = 0, v; | |
75 | u_int i, b; | |
76 | ||
77 | /* XXXRW: Perhaps an assertion about key length vs. data length? */ | |
78 | ||
79 | v = (key[0]<<24) + (key[1]<<16) + (key[2] <<8) + key[3]; | |
80 | for (i = 0; i < data.size(); i++) { | |
81 | for (b = 0; b < 8; b++) { | |
82 | if (data[i] & (1<<(7-b))) | |
83 | hash ^= v; | |
84 | v <<= 1; | |
85 | if ((i + 4) < key.size() && | |
86 | (key[i+4] & (1<<(7-b)))) | |
87 | v |= 1; | |
88 | } | |
89 | } | |
90 | return (hash); | |
91 | } | |
92 | #endif |