djbdnscurve6  38
djbdnscurve6
dns_sortip.c
Go to the documentation of this file.
1 #include "byte.h"
2 #include "ip.h"
3 #include "dns.h"
4 
5 /* XXX: sort servers by configurable notion of closeness? */
6 /* XXX: pay attention to competence of each server? */
7 /* XXX: pay attention to qualification (DNSSec, DNSCurve) of each server? */
8 /* YYY: we use a randomly sorted list of NS; not depending on answer */
9 
10 void dns_sortip4(char *s,unsigned int n)
11 {
12  unsigned int i;
13  char tmp[4];
14 
15  n >>= 2; /* 4 byte per IPv4 address */
16  while (n > 1) {
17  i = dns_random(n);
18  --n;
19  byte_copy(tmp,4,s + (i << 2));
20  byte_copy(s + (i << 2),4,s + (n << 2));
21  byte_copy(s + (n << 2),4,tmp);
22  }
23 }
24 
25 void dns_sortip6(char *s,unsigned int n)
26 {
27  unsigned int i;
28  char tmp[16];
29 
30  n >>= 4; /* 16 byte per IPv4 address */
31  while (n > 1) {
32  i = dns_random(n);
33  --n;
34  byte_copy(tmp,16,s + (i << 4));
35  byte_copy(s + (i << 4),16,s + (n << 4));
36  byte_copy(s + (n << 4),16,tmp);
37  }
38 }
39 
40 void dns_sortip(char *s,unsigned int n)
41 {
42  unsigned int i;
43  char tmp[16];
44 
45  for (i = 0; i < 16; ++i)
46  if (!ip6_isv4mapped(s + 16 * i))
47  byte_copy(s + 16 * i,16,V6localnet);
48 
49  n >>= 4; /* we use IPv4 mapped IPv6 addresses */
50  while (n > 1) {
51  i = dns_random(n);
52  --n;
53  byte_copy(tmp,16,s + (i << 4));
54  byte_copy(s + (i << 4),16,s + (n << 4));
55  byte_copy(s + (n << 4),16,tmp);
56  }
57 }
unsigned int dns_random(unsigned int)
Definition: dns_random.c:52
void dns_sortip4(char *s, unsigned int n)
Definition: dns_sortip.c:10
void dns_sortip(char *s, unsigned int n)
Definition: dns_sortip.c:40
void dns_sortip6(char *s, unsigned int n)
Definition: dns_sortip.c:25
struct line tmp
Definition: dnsfilter.c:32