aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/net/ipv6.h48
-rw-r--r--net/ipv6/ip6_fib.c54
2 files changed, 50 insertions, 52 deletions
diff --git a/include/net/ipv6.h b/include/net/ipv6.h
index 65ec86678a08..98661fa4fc78 100644
--- a/include/net/ipv6.h
+++ b/include/net/ipv6.h
@@ -341,6 +341,54 @@ static inline int ipv6_addr_any(const struct in6_addr *a)
341} 341}
342 342
343/* 343/*
344 * find the first different bit between two addresses
345 * length of address must be a multiple of 32bits
346 */
347static inline int __ipv6_addr_diff(const void *token1, const void *token2, int addrlen)
348{
349 const __u32 *a1 = token1, *a2 = token2;
350 int i;
351
352 addrlen >>= 2;
353
354 for (i = 0; i < addrlen; i++) {
355 __u32 xb = a1[i] ^ a2[i];
356 if (xb) {
357 int j = 31;
358
359 xb = ntohl(xb);
360 while ((xb & (1 << j)) == 0)
361 j--;
362
363 return (i * 32 + 31 - j);
364 }
365 }
366
367 /*
368 * we should *never* get to this point since that
369 * would mean the addrs are equal
370 *
371 * However, we do get to it 8) And exacly, when
372 * addresses are equal 8)
373 *
374 * ip route add 1111::/128 via ...
375 * ip route add 1111::/64 via ...
376 * and we are here.
377 *
378 * Ideally, this function should stop comparison
379 * at prefix length. It does not, but it is still OK,
380 * if returned value is greater than prefix length.
381 * --ANK (980803)
382 */
383 return (addrlen << 5);
384}
385
386static inline int ipv6_addr_diff(const struct in6_addr *a1, const struct in6_addr *a2)
387{
388 return __ipv6_addr_diff(a1, a2, sizeof(struct in6_addr));
389}
390
391/*
344 * Prototypes exported by ipv6 392 * Prototypes exported by ipv6
345 */ 393 */
346 394
diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c
index 4fcc5a7acf6e..1bf6d9a769e6 100644
--- a/net/ipv6/ip6_fib.c
+++ b/net/ipv6/ip6_fib.c
@@ -127,56 +127,6 @@ static __inline__ int addr_bit_set(void *token, int fn_bit)
127 return htonl(1 << ((~fn_bit)&0x1F)) & addr[fn_bit>>5]; 127 return htonl(1 << ((~fn_bit)&0x1F)) & addr[fn_bit>>5];
128} 128}
129 129
130/*
131 * find the first different bit between two addresses
132 * length of address must be a multiple of 32bits
133 */
134
135static __inline__ int addr_diff(void *token1, void *token2, int addrlen)
136{
137 __u32 *a1 = token1;
138 __u32 *a2 = token2;
139 int i;
140
141 addrlen >>= 2;
142
143 for (i = 0; i < addrlen; i++) {
144 __u32 xb;
145
146 xb = a1[i] ^ a2[i];
147
148 if (xb) {
149 int j = 31;
150
151 xb = ntohl(xb);
152
153 while ((xb & (1 << j)) == 0)
154 j--;
155
156 return (i * 32 + 31 - j);
157 }
158 }
159
160 /*
161 * we should *never* get to this point since that
162 * would mean the addrs are equal
163 *
164 * However, we do get to it 8) And exacly, when
165 * addresses are equal 8)
166 *
167 * ip route add 1111::/128 via ...
168 * ip route add 1111::/64 via ...
169 * and we are here.
170 *
171 * Ideally, this function should stop comparison
172 * at prefix length. It does not, but it is still OK,
173 * if returned value is greater than prefix length.
174 * --ANK (980803)
175 */
176
177 return addrlen<<5;
178}
179
180static __inline__ struct fib6_node * node_alloc(void) 130static __inline__ struct fib6_node * node_alloc(void)
181{ 131{
182 struct fib6_node *fn; 132 struct fib6_node *fn;
@@ -296,11 +246,11 @@ insert_above:
296 246
297 /* find 1st bit in difference between the 2 addrs. 247 /* find 1st bit in difference between the 2 addrs.
298 248
299 See comment in addr_diff: bit may be an invalid value, 249 See comment in __ipv6_addr_diff: bit may be an invalid value,
300 but if it is >= plen, the value is ignored in any case. 250 but if it is >= plen, the value is ignored in any case.
301 */ 251 */
302 252
303 bit = addr_diff(addr, &key->addr, addrlen); 253 bit = __ipv6_addr_diff(addr, &key->addr, addrlen);
304 254
305 /* 255 /*
306 * (intermediate)[in] 256 * (intermediate)[in]