Blame view

net/xfrm/xfrm_hash.h 4.44 KB
b24413180   Greg Kroah-Hartman   License cleanup: ...
1
  /* SPDX-License-Identifier: GPL-2.0 */
44e36b42a   David S. Miller   [XFRM]: Extract c...
2
3
4
5
6
  #ifndef _XFRM_HASH_H
  #define _XFRM_HASH_H
  
  #include <linux/xfrm.h>
  #include <linux/socket.h>
b58555f17   Christophe Gouault   xfrm: hash prefix...
7
  #include <linux/jhash.h>
44e36b42a   David S. Miller   [XFRM]: Extract c...
8

5f803b58c   David S. Miller   xfrm: Const'ify a...
9
  static inline unsigned int __xfrm4_addr_hash(const xfrm_address_t *addr)
44e36b42a   David S. Miller   [XFRM]: Extract c...
10
11
12
  {
  	return ntohl(addr->a4);
  }
5f803b58c   David S. Miller   xfrm: Const'ify a...
13
  static inline unsigned int __xfrm6_addr_hash(const xfrm_address_t *addr)
44e36b42a   David S. Miller   [XFRM]: Extract c...
14
  {
8d4b6bce2   Michal Kubecek   xfrm: use complet...
15
  	return jhash2((__force u32 *)addr->a6, 4, 0);
44e36b42a   David S. Miller   [XFRM]: Extract c...
16
  }
5f803b58c   David S. Miller   xfrm: Const'ify a...
17
18
  static inline unsigned int __xfrm4_daddr_saddr_hash(const xfrm_address_t *daddr,
  						    const xfrm_address_t *saddr)
44e36b42a   David S. Miller   [XFRM]: Extract c...
19
  {
0eae88f31   Eric Dumazet   net: Fix various ...
20
21
  	u32 sum = (__force u32)daddr->a4 + (__force u32)saddr->a4;
  	return ntohl((__force __be32)sum);
44e36b42a   David S. Miller   [XFRM]: Extract c...
22
  }
5f803b58c   David S. Miller   xfrm: Const'ify a...
23
24
  static inline unsigned int __xfrm6_daddr_saddr_hash(const xfrm_address_t *daddr,
  						    const xfrm_address_t *saddr)
44e36b42a   David S. Miller   [XFRM]: Extract c...
25
  {
8d4b6bce2   Michal Kubecek   xfrm: use complet...
26
  	return __xfrm6_addr_hash(daddr) ^ __xfrm6_addr_hash(saddr);
44e36b42a   David S. Miller   [XFRM]: Extract c...
27
  }
b58555f17   Christophe Gouault   xfrm: hash prefix...
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
  static inline u32 __bits2mask32(__u8 bits)
  {
  	u32 mask32 = 0xffffffff;
  
  	if (bits == 0)
  		mask32 = 0;
  	else if (bits < 32)
  		mask32 <<= (32 - bits);
  
  	return mask32;
  }
  
  static inline unsigned int __xfrm4_dpref_spref_hash(const xfrm_address_t *daddr,
  						    const xfrm_address_t *saddr,
  						    __u8 dbits,
  						    __u8 sbits)
  {
  	return jhash_2words(ntohl(daddr->a4) & __bits2mask32(dbits),
  			    ntohl(saddr->a4) & __bits2mask32(sbits),
  			    0);
  }
  
  static inline unsigned int __xfrm6_pref_hash(const xfrm_address_t *addr,
  					     __u8 prefixlen)
  {
d7f694663   Alexey Dobriyan   xfrm: use "unsign...
53
54
  	unsigned int pdw;
  	unsigned int pbi;
b58555f17   Christophe Gouault   xfrm: hash prefix...
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
  	u32 initval = 0;
  
  	pdw = prefixlen >> 5;     /* num of whole u32 in prefix */
  	pbi = prefixlen &  0x1f;  /* num of bits in incomplete u32 in prefix */
  
  	if (pbi) {
  		__be32 mask;
  
  		mask = htonl((0xffffffff) << (32 - pbi));
  
  		initval = (__force u32)(addr->a6[pdw] & mask);
  	}
  
  	return jhash2((__force u32 *)addr->a6, pdw, initval);
  }
  
  static inline unsigned int __xfrm6_dpref_spref_hash(const xfrm_address_t *daddr,
  						    const xfrm_address_t *saddr,
  						    __u8 dbits,
  						    __u8 sbits)
  {
  	return __xfrm6_pref_hash(daddr, dbits) ^
  	       __xfrm6_pref_hash(saddr, sbits);
  }
5f803b58c   David S. Miller   xfrm: Const'ify a...
79
80
  static inline unsigned int __xfrm_dst_hash(const xfrm_address_t *daddr,
  					   const xfrm_address_t *saddr,
44e36b42a   David S. Miller   [XFRM]: Extract c...
81
82
83
84
85
86
87
88
89
90
91
92
93
94
  					   u32 reqid, unsigned short family,
  					   unsigned int hmask)
  {
  	unsigned int h = family ^ reqid;
  	switch (family) {
  	case AF_INET:
  		h ^= __xfrm4_daddr_saddr_hash(daddr, saddr);
  		break;
  	case AF_INET6:
  		h ^= __xfrm6_daddr_saddr_hash(daddr, saddr);
  		break;
  	}
  	return (h ^ (h >> 16)) & hmask;
  }
95c961747   Eric Dumazet   net: cleanup unsi...
95
96
97
98
  static inline unsigned int __xfrm_src_hash(const xfrm_address_t *daddr,
  					   const xfrm_address_t *saddr,
  					   unsigned short family,
  					   unsigned int hmask)
44e36b42a   David S. Miller   [XFRM]: Extract c...
99
100
101
102
  {
  	unsigned int h = family;
  	switch (family) {
  	case AF_INET:
667bbcb6c   Masahide NAKAMURA   [XFRM] STATE: Use...
103
  		h ^= __xfrm4_daddr_saddr_hash(daddr, saddr);
44e36b42a   David S. Miller   [XFRM]: Extract c...
104
105
  		break;
  	case AF_INET6:
667bbcb6c   Masahide NAKAMURA   [XFRM] STATE: Use...
106
  		h ^= __xfrm6_daddr_saddr_hash(daddr, saddr);
44e36b42a   David S. Miller   [XFRM]: Extract c...
107
  		break;
ccbd6a5a4   Joe Perches   net: Remove unnec...
108
  	}
44e36b42a   David S. Miller   [XFRM]: Extract c...
109
110
111
112
  	return (h ^ (h >> 16)) & hmask;
  }
  
  static inline unsigned int
5f803b58c   David S. Miller   xfrm: Const'ify a...
113
114
  __xfrm_spi_hash(const xfrm_address_t *daddr, __be32 spi, u8 proto,
  		unsigned short family, unsigned int hmask)
44e36b42a   David S. Miller   [XFRM]: Extract c...
115
  {
8122adf06   Al Viro   [XFRM]: xfrm_spi_...
116
  	unsigned int h = (__force u32)spi ^ proto;
44e36b42a   David S. Miller   [XFRM]: Extract c...
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
  	switch (family) {
  	case AF_INET:
  		h ^= __xfrm4_addr_hash(daddr);
  		break;
  	case AF_INET6:
  		h ^= __xfrm6_addr_hash(daddr);
  		break;
  	}
  	return (h ^ (h >> 10) ^ (h >> 20)) & hmask;
  }
  
  static inline unsigned int __idx_hash(u32 index, unsigned int hmask)
  {
  	return (index ^ (index >> 8)) & hmask;
  }
5f803b58c   David S. Miller   xfrm: Const'ify a...
132
  static inline unsigned int __sel_hash(const struct xfrm_selector *sel,
b58555f17   Christophe Gouault   xfrm: hash prefix...
133
134
  				      unsigned short family, unsigned int hmask,
  				      u8 dbits, u8 sbits)
44e36b42a   David S. Miller   [XFRM]: Extract c...
135
  {
5f803b58c   David S. Miller   xfrm: Const'ify a...
136
137
  	const xfrm_address_t *daddr = &sel->daddr;
  	const xfrm_address_t *saddr = &sel->saddr;
44e36b42a   David S. Miller   [XFRM]: Extract c...
138
139
140
141
  	unsigned int h = 0;
  
  	switch (family) {
  	case AF_INET:
b58555f17   Christophe Gouault   xfrm: hash prefix...
142
143
  		if (sel->prefixlen_d < dbits ||
  		    sel->prefixlen_s < sbits)
44e36b42a   David S. Miller   [XFRM]: Extract c...
144
  			return hmask + 1;
b58555f17   Christophe Gouault   xfrm: hash prefix...
145
  		h = __xfrm4_dpref_spref_hash(daddr, saddr, dbits, sbits);
44e36b42a   David S. Miller   [XFRM]: Extract c...
146
147
148
  		break;
  
  	case AF_INET6:
b58555f17   Christophe Gouault   xfrm: hash prefix...
149
150
  		if (sel->prefixlen_d < dbits ||
  		    sel->prefixlen_s < sbits)
44e36b42a   David S. Miller   [XFRM]: Extract c...
151
  			return hmask + 1;
b58555f17   Christophe Gouault   xfrm: hash prefix...
152
  		h = __xfrm6_dpref_spref_hash(daddr, saddr, dbits, sbits);
44e36b42a   David S. Miller   [XFRM]: Extract c...
153
  		break;
ccbd6a5a4   Joe Perches   net: Remove unnec...
154
  	}
44e36b42a   David S. Miller   [XFRM]: Extract c...
155
156
157
  	h ^= (h >> 16);
  	return h & hmask;
  }
5f803b58c   David S. Miller   xfrm: Const'ify a...
158
159
  static inline unsigned int __addr_hash(const xfrm_address_t *daddr,
  				       const xfrm_address_t *saddr,
b58555f17   Christophe Gouault   xfrm: hash prefix...
160
161
162
  				       unsigned short family,
  				       unsigned int hmask,
  				       u8 dbits, u8 sbits)
44e36b42a   David S. Miller   [XFRM]: Extract c...
163
164
165
166
167
  {
  	unsigned int h = 0;
  
  	switch (family) {
  	case AF_INET:
b58555f17   Christophe Gouault   xfrm: hash prefix...
168
  		h = __xfrm4_dpref_spref_hash(daddr, saddr, dbits, sbits);
44e36b42a   David S. Miller   [XFRM]: Extract c...
169
170
171
  		break;
  
  	case AF_INET6:
b58555f17   Christophe Gouault   xfrm: hash prefix...
172
  		h = __xfrm6_dpref_spref_hash(daddr, saddr, dbits, sbits);
44e36b42a   David S. Miller   [XFRM]: Extract c...
173
  		break;
ccbd6a5a4   Joe Perches   net: Remove unnec...
174
  	}
44e36b42a   David S. Miller   [XFRM]: Extract c...
175
176
177
  	h ^= (h >> 16);
  	return h & hmask;
  }
c1b1203d6   Joe Perches   net: misc: Remove...
178
179
  struct hlist_head *xfrm_hash_alloc(unsigned int sz);
  void xfrm_hash_free(struct hlist_head *n, unsigned int sz);
44e36b42a   David S. Miller   [XFRM]: Extract c...
180
181
  
  #endif /* _XFRM_HASH_H */