1 #include <string.h>
2
3 #include "dns.h"
4
5 /** Rotate (shuffle) a block of fixed-length addresses.
6
7 \param s The array of memory to shuffle.
8 \param n The number of elements of the array.
9 \param shift The size of each element, expressed as a power-of-two
10 */
dns_rotate(unsigned char * s,unsigned int n,unsigned int shift)11 void dns_rotate(unsigned char *s, unsigned int n, unsigned int shift)
12 {
13 unsigned int i;
14 unsigned int stride = 1 << shift;
15 unsigned char tmp[stride];
16
17 while (n > 1) {
18 i = dns_random(n);
19 --n;
20 memcpy(tmp, s + (i << shift), stride);
21 memcpy(s + (i << shift), s + (n << shift), stride);
22 memcpy(s + (n << shift), tmp, stride);
23 }
24 }
25
26 /** Rotate (shuffle) a block of IPv4 addresses. */
dns_rotateipv4(ipv4addr * addrs,unsigned int n)27 void dns_rotateipv4(ipv4addr* addrs, unsigned int n)
28 {
29 dns_rotate((unsigned char*)addrs, n, 2);
30 }
31
32 /** Rotate (shuffle) a block of IPv6 addresses. */
dns_rotateipv6(ipv6addr * addrs,unsigned int n)33 void dns_rotateipv6(ipv6addr* addrs, unsigned int n)
34 {
35 dns_rotate((unsigned char*)addrs, n, 4);
36 }
37