+1 April 2009: Wouter
+ - suppress errors when trying to contact authority servers that gave
+ ipv6 AAAA records for their nameservers with ipv4 mapped contents.
+ Still tries to do so, could work when deployed in intranet.
+ Higher verbosity shows the error.
+
30 March 2009: Wouter
- Fixup LDFLAGS from libevent sourcedir compile configure restore.
- Fixup so no non-absolute rpaths are added.
(struct sockaddr_storage*)&b6, i, l6) == i);
}
}
+ /* test addr_is_ip4mapped */
+ if(1) {
+ struct sockaddr_storage a;
+ socklen_t l = (socklen_t)sizeof(a);
+ unit_assert(ipstrtoaddr("12.13.14.15", 53, &a, &l));
+ unit_assert(!addr_is_ip4mapped(&a, l));
+ unit_assert(ipstrtoaddr("fe80::217:31ff:fe91:df", 53, &a, &l));
+ unit_assert(!addr_is_ip4mapped(&a, l));
+ unit_assert(ipstrtoaddr("ffff::217:31ff:fe91:df", 53, &a, &l));
+ unit_assert(!addr_is_ip4mapped(&a, l));
+ unit_assert(ipstrtoaddr("::ffff:31ff:fe91:df", 53, &a, &l));
+ unit_assert(!addr_is_ip4mapped(&a, l));
+ unit_assert(ipstrtoaddr("::fffe:fe91:df", 53, &a, &l));
+ unit_assert(!addr_is_ip4mapped(&a, l));
+ unit_assert(ipstrtoaddr("::ffff:127.0.0.1", 53, &a, &l));
+ unit_assert(addr_is_ip4mapped(&a, l));
+ unit_assert(ipstrtoaddr("::ffff:127.0.0.2", 53, &a, &l));
+ unit_assert(addr_is_ip4mapped(&a, l));
+ unit_assert(ipstrtoaddr("::ffff:192.168.0.2", 53, &a, &l));
+ unit_assert(addr_is_ip4mapped(&a, l));
+ unit_assert(ipstrtoaddr("2::ffff:192.168.0.2", 53, &a, &l));
+ unit_assert(!addr_is_ip4mapped(&a, l));
+ }
}
#include "util/config_file.h"
snprintf(buf, len, "(inet_ntop_error)");
}
}
+
+int
+addr_is_ip4mapped(struct sockaddr_storage* addr, socklen_t addrlen)
+{
+ /* prefix for ipv4 into ipv6 mapping is ::ffff:x.x.x.x */
+ const uint8_t map_prefix[16] =
+ {0,0,0,0, 0,0,0,0, 0,0,0xff,0xff, 0,0,0,0};
+ uint8_t* s;
+ if(!addr_is_ip6(addr, addrlen))
+ return 0;
+ /* s is 16 octet ipv6 address string */
+ s = (uint8_t*)&((struct sockaddr_in6*)addr)->sin6_addr;
+ return (memcmp(s, map_prefix, 12) == 0);
+}
void addr_to_str(struct sockaddr_storage* addr, socklen_t addrlen,
char* buf, size_t len);
+/**
+ * See if sockaddr is an ipv6 mapped ipv4 address, ::ffff:0.0.0.0
+ * @param addr: address
+ * @param addrlen: length of address
+ * @return true if so
+ */
+int addr_is_ip4mapped(struct sockaddr_storage* addr, socklen_t addrlen);
+
#endif /* NET_HELP_H */
if(errno == ENETUNREACH && verbosity < VERB_ALGO)
return 0;
#endif
+ /* squelch errors where people deploy AAAA ::ffff:bla for
+ * authority servers, which we try for intranets. */
+ if(errno == EINVAL && addr_is_ip4mapped(
+ (struct sockaddr_storage*)addr, addrlen) &&
+ verbosity < VERB_DETAIL)
+ return 0;
#ifndef USE_WINSOCK
verbose(VERB_OPS, "sendto failed: %s", strerror(errno));
#else
/** Number of bytes to reseed after */
#define REKEY_BYTES (1 << 24)
-/** (re)setup system seed */
+/* (re)setup system seed */
void
ub_systemseed(unsigned int seed)
{