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