#include "byte.h" #include "dnsresolv.h" #include "ip.h" /** @file dns_sortip.c @authors djb, fefe, feh @source ucspi-tcp6 @brief random sort of DNS servers per IP */ /* XXX: sort servers by configurable notion of closeness? */ /* XXX: pay attention to competence of each server? */ /* XXX: pay attention to qualification (DNSSec, DNSCurve) of each server? */ /* YYY: we use a randomly sorted list of NS; not depending on answer */ void dns_sortip4(char *s, unsigned int n) { unsigned int i; char tmp[4]; n >>= 2; // 4 byte per IPv4 address while (n > 1) { i = dns_random(n); --n; byte_copy(tmp, 4, s + (i << 2)); byte_copy(s + (i << 2), 4, s + (n << 2)); byte_copy(s + (n << 2), 4, tmp); } } void dns_sortip6(char *s, unsigned int n) { unsigned int i; char tmp[16]; n >>= 4; // 16 byte per IPv4 address while (n > 1) { i = dns_random(n); --n; byte_copy(tmp, 16, s + (i << 4)); byte_copy(s + (i << 4), 16, s + (n << 4)); byte_copy(s + (n << 4), 16, tmp); } }