aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common/address.c91
-rw-r--r--src/common/address.h7
-rw-r--r--src/common/backtrace.c233
-rw-r--r--src/common/backtrace.h21
-rw-r--r--src/common/ciphers.inc169
-rw-r--r--src/common/compat.c543
-rw-r--r--src/common/compat.h41
-rw-r--r--src/common/compat_libevent.c70
-rw-r--r--src/common/compat_libevent.h7
-rw-r--r--src/common/container.c49
-rw-r--r--src/common/container.h23
-rw-r--r--src/common/crypto.c267
-rw-r--r--src/common/crypto.h21
-rw-r--r--src/common/crypto_curve25519.c2
-rw-r--r--src/common/crypto_curve25519.h10
-rw-r--r--src/common/crypto_format.c1
-rw-r--r--src/common/get_mozilla_ciphers.py192
-rw-r--r--src/common/include.am63
-rw-r--r--src/common/linux_syscalls.inc1153
-rw-r--r--src/common/log.c195
-rw-r--r--src/common/memarea.c50
-rw-r--r--src/common/sandbox.c1838
-rw-r--r--src/common/sandbox.h212
-rw-r--r--src/common/testsupport.h80
-rw-r--r--src/common/torgzip.c16
-rw-r--r--src/common/torgzip.h6
-rw-r--r--src/common/torlog.h25
-rw-r--r--src/common/tortls.c231
-rw-r--r--src/common/tortls.h3
-rw-r--r--src/common/util.c343
-rw-r--r--src/common/util.h72
-rw-r--r--src/config/README.geoip90
-rwxr-xr-xsrc/config/deanonymind.py194
-rw-r--r--src/config/geoip22394
-rw-r--r--src/config/geoip-manual116
-rw-r--r--src/config/geoip62115
-rw-r--r--src/config/mmdb-convert.py466
-rw-r--r--src/config/torrc.sample.in11
-rw-r--r--src/ext/README7
-rw-r--r--src/ext/csiphash.c166
-rw-r--r--src/ext/eventdns.c17
-rw-r--r--src/ext/ht.h9
-rw-r--r--src/ext/include.am3
-rw-r--r--src/ext/siphash.h13
-rw-r--r--src/ext/tinytest.c157
-rw-r--r--src/ext/tinytest.h19
-rw-r--r--src/ext/tinytest_demo.c49
-rw-r--r--src/ext/tinytest_macros.h27
-rw-r--r--src/or/addressmap.c4
-rw-r--r--src/or/addressmap.h6
-rw-r--r--src/or/buffers.c192
-rw-r--r--src/or/buffers.h49
-rw-r--r--src/or/channel.c96
-rw-r--r--src/or/channel.h98
-rw-r--r--src/or/channeltls.c76
-rw-r--r--src/or/circpathbias.c1538
-rw-r--r--src/or/circpathbias.h29
-rw-r--r--src/or/circuitbuild.c1660
-rw-r--r--src/or/circuitbuild.h14
-rw-r--r--src/or/circuitlist.c797
-rw-r--r--src/or/circuitlist.h30
-rw-r--r--src/or/circuitmux.c188
-rw-r--r--src/or/circuitmux.h22
-rw-r--r--src/or/circuitstats.c136
-rw-r--r--src/or/circuitstats.h63
-rw-r--r--src/or/circuituse.c228
-rw-r--r--src/or/circuituse.h1
-rw-r--r--src/or/command.c32
-rw-r--r--src/or/command.h2
-rw-r--r--src/or/config.c1391
-rw-r--r--src/or/config.h54
-rw-r--r--src/or/confparse.c89
-rw-r--r--src/or/confparse.h9
-rw-r--r--src/or/connection.c599
-rw-r--r--src/or/connection.h30
-rw-r--r--src/or/connection_edge.c153
-rw-r--r--src/or/connection_edge.h28
-rw-r--r--src/or/connection_or.c106
-rw-r--r--src/or/connection_or.h3
-rwxr-xr-x[-rw-r--r--]src/or/control.c718
-rw-r--r--src/or/control.h120
-rw-r--r--src/or/cpuworker.c11
-rw-r--r--src/or/directory.c651
-rw-r--r--src/or/directory.h9
-rw-r--r--src/or/dirserv.c807
-rw-r--r--src/or/dirserv.h35
-rw-r--r--src/or/dirvote.c36
-rw-r--r--src/or/dirvote.h20
-rw-r--r--src/or/dns.c24
-rw-r--r--src/or/dnsserv.c37
-rw-r--r--src/or/entrynodes.c184
-rw-r--r--src/or/entrynodes.h17
-rw-r--r--src/or/ext_orport.c648
-rw-r--r--src/or/ext_orport.h42
-rw-r--r--src/or/fp_pair.c13
-rw-r--r--src/or/geoip.c248
-rw-r--r--src/or/geoip.h12
-rw-r--r--src/or/hibernate.c27
-rw-r--r--src/or/hibernate.h9
-rw-r--r--src/or/include.am34
-rw-r--r--src/or/main.c557
-rw-r--r--src/or/main.h23
-rw-r--r--src/or/microdesc.c105
-rw-r--r--src/or/networkstatus.c667
-rw-r--r--src/or/networkstatus.h22
-rw-r--r--src/or/nodelist.c129
-rw-r--r--src/or/nodelist.h5
-rw-r--r--src/or/ntmain.c2
-rw-r--r--src/or/onion.c30
-rw-r--r--src/or/onion_fast.c3
-rw-r--r--src/or/onion_ntor.c9
-rw-r--r--src/or/onion_tap.c4
-rw-r--r--src/or/or.h474
-rw-r--r--src/or/policies.c81
-rw-r--r--src/or/policies.h2
-rw-r--r--src/or/reasons.c2
-rw-r--r--src/or/relay.c625
-rw-r--r--src/or/relay.h31
-rw-r--r--src/or/rendclient.c38
-rw-r--r--src/or/rendcommon.c260
-rw-r--r--src/or/rendcommon.h18
-rw-r--r--src/or/rendmid.c17
-rw-r--r--src/or/rendservice.c63
-rw-r--r--src/or/rendservice.h3
-rw-r--r--src/or/rephist.c218
-rw-r--r--src/or/rephist.h3
-rw-r--r--src/or/replaycache.c27
-rw-r--r--src/or/replaycache.h10
-rwxr-xr-x[-rw-r--r--]src/or/router.c256
-rw-r--r--src/or/router.h17
-rw-r--r--src/or/routerlist.c451
-rw-r--r--src/or/routerlist.h13
-rw-r--r--src/or/routerparse.c285
-rw-r--r--src/or/routerparse.h4
-rw-r--r--src/or/routerset.c33
-rw-r--r--src/or/routerset.h6
-rw-r--r--src/or/statefile.c87
-rw-r--r--src/or/statefile.h8
-rw-r--r--src/or/status.c45
-rw-r--r--src/or/status.h8
-rw-r--r--src/or/transports.c272
-rw-r--r--src/or/transports.h28
-rw-r--r--src/test/Makefile.nmake7
-rw-r--r--src/test/bench.c28
-rwxr-xr-xsrc/test/bt_test.py42
-rw-r--r--src/test/include.am69
-rwxr-xr-x[-rw-r--r--]src/test/ntor_ref.py72
-rw-r--r--src/test/slownacl_curve25519.py117
-rwxr-xr-xsrc/test/test-network.sh47
-rw-r--r--src/test/test.c1316
-rw-r--r--src/test/test.h127
-rw-r--r--src/test/test_addr.c194
-rw-r--r--src/test/test_bt_cl.c109
-rw-r--r--src/test/test_buffers.c732
-rw-r--r--src/test/test_cell_formats.c385
-rw-r--r--src/test/test_cell_queue.c158
-rw-r--r--src/test/test_circuitlist.c342
-rw-r--r--src/test/test_circuitmux.c88
-rwxr-xr-xsrc/test/test_cmdline_args.py292
-rw-r--r--src/test/test_config.c427
-rw-r--r--src/test/test_containers.c59
-rw-r--r--src/test/test_controller_events.c307
-rw-r--r--src/test/test_crypto.c244
-rw-r--r--src/test/test_data.c185
-rw-r--r--src/test/test_dir.c208
-rw-r--r--src/test/test_extorport.c607
-rw-r--r--src/test/test_hs.c129
-rw-r--r--src/test/test_logging.c135
-rw-r--r--src/test/test_microdesc.c108
-rw-r--r--src/test/test_nodelist.c71
-rw-r--r--src/test/test_oom.c372
-rw-r--r--src/test/test_options.c170
-rw-r--r--src/test/test_policy.c437
-rw-r--r--src/test/test_pt.c358
-rw-r--r--src/test/test_relaycell.c249
-rw-r--r--src/test/test_replay.c192
-rw-r--r--src/test/test_routerkeys.c85
-rw-r--r--src/test/test_socks.c393
-rw-r--r--src/test/test_status.c1114
-rw-r--r--src/test/test_util.c551
-rw-r--r--src/tools/tor-checkkey.c2
-rw-r--r--src/tools/tor-fw-helper/include.am2
-rw-r--r--src/tools/tor-fw-helper/tor-fw-helper.c2
-rw-r--r--src/tools/tor-gencert.c9
-rw-r--r--src/win32/orconfig.h2
185 files changed, 41679 insertions, 17117 deletions
diff --git a/src/common/address.c b/src/common/address.c
index 14a7b6bc9..29d4c0447 100644
--- a/src/common/address.c
+++ b/src/common/address.c
@@ -14,6 +14,7 @@
#include "address.h"
#include "torlog.h"
#include "container.h"
+#include "sandbox.h"
#ifdef _WIN32
#include <process.h>
@@ -181,7 +182,7 @@ tor_addr_make_unspec(tor_addr_t *a)
a->family = AF_UNSPEC;
}
-/** Set address <a>a</b> to the null address in address family <b>family</b>.
+/** Set address <b>a</b> to the null address in address family <b>family</b>.
* The null address for AF_INET is 0.0.0.0. The null address for AF_INET6 is
* [::]. AF_UNSPEC is all null. */
void
@@ -234,8 +235,10 @@ tor_addr_lookup(const char *name, uint16_t family, tor_addr_t *addr)
memset(&hints, 0, sizeof(hints));
hints.ai_family = family;
hints.ai_socktype = SOCK_STREAM;
- err = getaddrinfo(name, NULL, &hints, &res);
- if (!err) {
+ err = sandbox_getaddrinfo(name, NULL, &hints, &res);
+ /* The check for 'res' here shouldn't be necessary, but it makes static
+ * analysis tools happy. */
+ if (!err && res) {
best = NULL;
for (res_p = res; res_p; res_p = res_p->ai_next) {
if (family == AF_UNSPEC) {
@@ -261,7 +264,7 @@ tor_addr_lookup(const char *name, uint16_t family, tor_addr_t *addr)
&((struct sockaddr_in6*)best->ai_addr)->sin6_addr);
result = 0;
}
- freeaddrinfo(res);
+ sandbox_freeaddrinfo(res);
return result;
}
return (err == EAI_AGAIN) ? 1 : -1;
@@ -873,6 +876,32 @@ tor_addr_copy(tor_addr_t *dest, const tor_addr_t *src)
memcpy(dest, src, sizeof(tor_addr_t));
}
+/** Copy a tor_addr_t from <b>src</b> to <b>dest</b>, taking extra case to
+ * copy only the well-defined portions. Used for computing hashes of
+ * addresses.
+ */
+void
+tor_addr_copy_tight(tor_addr_t *dest, const tor_addr_t *src)
+{
+ tor_assert(src != dest);
+ tor_assert(src);
+ tor_assert(dest);
+ memset(dest, 0, sizeof(tor_addr_t));
+ dest->family = src->family;
+ switch (tor_addr_family(src))
+ {
+ case AF_INET:
+ dest->addr.in_addr.s_addr = src->addr.in_addr.s_addr;
+ break;
+ case AF_INET6:
+ memcpy(dest->addr.in6_addr.s6_addr, src->addr.in6_addr.s6_addr, 16);
+ case AF_UNSPEC:
+ break;
+ default:
+ tor_fragile_assert();
+ }
+}
+
/** Given two addresses <b>addr1</b> and <b>addr2</b>, return 0 if the two
* addresses are equivalent under the mask mbits, less than 0 if addr1
* precedes addr2, and greater than 0 otherwise.
@@ -994,19 +1023,17 @@ tor_addr_compare_masked(const tor_addr_t *addr1, const tor_addr_t *addr2,
}
}
-/** Return a hash code based on the address addr */
-unsigned int
+/** Return a hash code based on the address addr. DOCDOC extra */
+uint64_t
tor_addr_hash(const tor_addr_t *addr)
{
switch (tor_addr_family(addr)) {
case AF_INET:
- return tor_addr_to_ipv4h(addr);
+ return siphash24g(&addr->addr.in_addr.s_addr, 4);
case AF_UNSPEC:
return 0x4e4d5342;
- case AF_INET6: {
- const uint32_t *u = tor_addr_to_in6_addr32(addr);
- return u[0] + u[1] + u[2] + u[3];
- }
+ case AF_INET6:
+ return siphash24g(&addr->addr.in6_addr.s6_addr, 16);
default:
tor_fragile_assert();
return 0;
@@ -1420,31 +1447,22 @@ get_interface_address6(int severity, sa_family_t family, tor_addr_t *addr)
* XXXX024 IPv6 deprecate some of these.
*/
-/** Return true iff <b>ip</b> (in host order) is an IP reserved to localhost,
- * or reserved for local networks by RFC 1918.
- */
-int
-is_internal_IP(uint32_t ip, int for_listening)
-{
- tor_addr_t myaddr;
- myaddr.family = AF_INET;
- myaddr.addr.in_addr.s_addr = htonl(ip);
-
- return tor_addr_is_internal(&myaddr, for_listening);
-}
-
/** Given an address of the form "ip:port", try to divide it into its
* ip and port portions, setting *<b>address_out</b> to a newly
* allocated string holding the address portion and *<b>port_out</b>
* to the port.
*
- * Don't do DNS lookups and don't allow domain names in the <ip> field.
- * Don't accept <b>addrport</b> of the form "<ip>" or "<ip>:0".
+ * Don't do DNS lookups and don't allow domain names in the "ip" field.
+ *
+ * If <b>default_port</b> is less than 0, don't accept <b>addrport</b> of the
+ * form "ip" or "ip:0". Otherwise, accept those forms, and set
+ * *<b>port_out</b> to <b>default_port</b>.
*
* Return 0 on success, -1 on failure. */
int
tor_addr_port_parse(int severity, const char *addrport,
- tor_addr_t *address_out, uint16_t *port_out)
+ tor_addr_t *address_out, uint16_t *port_out,
+ int default_port)
{
int retval = -1;
int r;
@@ -1458,8 +1476,12 @@ tor_addr_port_parse(int severity, const char *addrport,
if (r < 0)
goto done;
- if (!*port_out)
- goto done;
+ if (!*port_out) {
+ if (default_port >= 0)
+ *port_out = default_port;
+ else
+ goto done;
+ }
/* make sure that address_out is an IP address */
if (tor_addr_parse(address_out, addr_tmp) < 0)
@@ -1480,9 +1502,18 @@ int
tor_addr_port_split(int severity, const char *addrport,
char **address_out, uint16_t *port_out)
{
+ tor_addr_t a_tmp;
tor_assert(addrport);
tor_assert(address_out);
tor_assert(port_out);
+ /* We need to check for IPv6 manually because addr_port_lookup() doesn't
+ * do a good job on IPv6 addresses that lack a port. */
+ if (tor_addr_parse(&a_tmp, addrport) == AF_INET6) {
+ *port_out = 0;
+ *address_out = tor_strdup(addrport);
+ return 0;
+ }
+
return addr_port_lookup(severity, addrport, address_out, NULL, port_out);
}
@@ -1560,7 +1591,7 @@ addr_mask_get_bits(uint32_t mask)
return 0;
if (mask == 0xFFFFFFFFu)
return 32;
- for (i=0; i<=32; ++i) {
+ for (i=1; i<=32; ++i) {
if (mask == (uint32_t) ~((1u<<(32-i))-1)) {
return i;
}
diff --git a/src/common/address.h b/src/common/address.h
index 77e585534..8dc63b71c 100644
--- a/src/common/address.h
+++ b/src/common/address.h
@@ -167,7 +167,7 @@ int tor_addr_compare_masked(const tor_addr_t *addr1, const tor_addr_t *addr2,
* "exactly". */
#define tor_addr_eq(a,b) (0==tor_addr_compare((a),(b),CMP_EXACT))
-unsigned int tor_addr_hash(const tor_addr_t *addr);
+uint64_t tor_addr_hash(const tor_addr_t *addr);
int tor_addr_is_v4(const tor_addr_t *addr);
int tor_addr_is_internal_(const tor_addr_t *ip, int for_listening,
const char *filename, int lineno);
@@ -192,6 +192,7 @@ const char * tor_addr_to_str(char *dest, const tor_addr_t *addr, size_t len,
int decorate);
int tor_addr_parse(tor_addr_t *addr, const char *src);
void tor_addr_copy(tor_addr_t *dest, const tor_addr_t *src);
+void tor_addr_copy_tight(tor_addr_t *dest, const tor_addr_t *src);
void tor_addr_from_ipv4n(tor_addr_t *dest, uint32_t v4addr);
/** Set <b>dest</b> to the IPv4 address encoded in <b>v4addr</b> in host
* order. */
@@ -209,12 +210,12 @@ int tor_addr_port_split(int severity, const char *addrport,
char **address_out, uint16_t *port_out);
int tor_addr_port_parse(int severity, const char *addrport,
- tor_addr_t *address_out, uint16_t *port_out);
+ tor_addr_t *address_out, uint16_t *port_out,
+ int default_port);
int tor_addr_hostname_is_local(const char *name);
/* IPv4 helpers */
-int is_internal_IP(uint32_t ip, int for_listening);
int addr_port_lookup(int severity, const char *addrport, char **address,
uint32_t *addr, uint16_t *port_out);
int parse_port_range(const char *port, uint16_t *port_min_out,
diff --git a/src/common/backtrace.c b/src/common/backtrace.c
new file mode 100644
index 000000000..3a073a8ff
--- /dev/null
+++ b/src/common/backtrace.c
@@ -0,0 +1,233 @@
+/* Copyright (c) 2013, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#define __USE_GNU
+#define _GNU_SOURCE 1
+
+#include "orconfig.h"
+#include "compat.h"
+#include "util.h"
+#include "torlog.h"
+
+#ifdef HAVE_EXECINFO_H
+#include <execinfo.h>
+#endif
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_SIGNAL_H
+#include <signal.h>
+#endif
+
+#ifdef HAVE_CYGWIN_SIGNAL_H
+#include <cygwin/signal.h>
+#elif defined(HAVE_SYS_UCONTEXT_H)
+#include <sys/ucontext.h>
+#elif defined(HAVE_UCONTEXT_H)
+#include <ucontext.h>
+#endif
+
+#define EXPOSE_CLEAN_BACKTRACE
+#include "backtrace.h"
+
+#if defined(HAVE_EXECINFO_H) && defined(HAVE_BACKTRACE) && \
+ defined(HAVE_BACKTRACE_SYMBOLS_FD) && defined(HAVE_SIGACTION)
+#define USE_BACKTRACE
+#endif
+
+#if !defined(USE_BACKTRACE)
+#define NO_BACKTRACE_IMPL
+#endif
+
+/** Version of Tor to report in backtrace messages. */
+static char *bt_version = NULL;
+
+#ifdef USE_BACKTRACE
+/** Largest stack depth to try to dump. */
+#define MAX_DEPTH 256
+/** Static allocation of stack to dump. This is static so we avoid stack
+ * pressure. */
+static void *cb_buf[MAX_DEPTH];
+/** Protects cb_buf from concurrent access */
+static tor_mutex_t cb_buf_mutex;
+
+/** Change a stacktrace in <b>stack</b> of depth <b>depth</b> so that it will
+ * log the correct function from which a signal was received with context
+ * <b>ctx</b>. (When we get a signal, the current function will not have
+ * called any other function, and will therefore have not pushed its address
+ * onto the stack. Fortunately, we usually have the program counter in the
+ * ucontext_t structure.
+ */
+void
+clean_backtrace(void **stack, int depth, const ucontext_t *ctx)
+{
+#ifdef PC_FROM_UCONTEXT
+#if defined(__linux__)
+ const int n = 1;
+#elif defined(__darwin__) || defined(__APPLE__) || defined(__OpenBSD__) \
+ || defined(__FreeBSD__)
+ const int n = 2;
+#else
+ const int n = 1;
+#endif
+ if (depth <= n)
+ return;
+
+ stack[n] = (void*) ctx->PC_FROM_UCONTEXT;
+#else
+ (void) depth;
+ (void) ctx;
+#endif
+}
+
+/** Log a message <b>msg</b> at <b>severity</b> in <b>domain</b>, and follow
+ * that with a backtrace log. */
+void
+log_backtrace(int severity, int domain, const char *msg)
+{
+ int depth;
+ char **symbols;
+ int i;
+
+ tor_mutex_acquire(&cb_buf_mutex);
+
+ depth = backtrace(cb_buf, MAX_DEPTH);
+ symbols = backtrace_symbols(cb_buf, depth);
+
+ tor_log(severity, domain, "%s. Stack trace:", msg);
+ if (!symbols) {
+ tor_log(severity, domain, " Unable to generate backtrace.");
+ goto done;
+ }
+ for (i=0; i < depth; ++i) {
+ tor_log(severity, domain, " %s", symbols[i]);
+ }
+ free(symbols);
+
+ done:
+ tor_mutex_release(&cb_buf_mutex);
+}
+
+static void crash_handler(int sig, siginfo_t *si, void *ctx_)
+ __attribute__((noreturn));
+
+/** Signal handler: write a crash message with a stack trace, and die. */
+static void
+crash_handler(int sig, siginfo_t *si, void *ctx_)
+{
+ char buf[40];
+ int depth;
+ ucontext_t *ctx = (ucontext_t *) ctx_;
+ int n_fds, i;
+ const int *fds = NULL;
+
+ (void) si;
+
+ depth = backtrace(cb_buf, MAX_DEPTH);
+ /* Clean up the top stack frame so we get the real function
+ * name for the most recently failing function. */
+ clean_backtrace(cb_buf, depth, ctx);
+
+ format_dec_number_sigsafe((unsigned)sig, buf, sizeof(buf));
+
+ tor_log_err_sigsafe(bt_version, " died: Caught signal ", buf, "\n",
+ NULL);
+
+ n_fds = tor_log_get_sigsafe_err_fds(&fds);
+ for (i=0; i < n_fds; ++i)
+ backtrace_symbols_fd(cb_buf, depth, fds[i]);
+
+ abort();
+}
+
+/** Install signal handlers as needed so that when we crash, we produce a
+ * useful stack trace. Return 0 on success, -1 on failure. */
+static int
+install_bt_handler(void)
+{
+ int trap_signals[] = { SIGSEGV, SIGILL, SIGFPE, SIGBUS, SIGSYS,
+ SIGIO, -1 };
+ int i, rv=0;
+
+ struct sigaction sa;
+
+ tor_mutex_init(&cb_buf_mutex);
+
+ memset(&sa, 0, sizeof(sa));
+ sa.sa_sigaction = crash_handler;
+ sa.sa_flags = SA_SIGINFO;
+ sigfillset(&sa.sa_mask);
+
+ for (i = 0; trap_signals[i] >= 0; ++i) {
+ if (sigaction(trap_signals[i], &sa, NULL) == -1) {
+ log_warn(LD_BUG, "Sigaction failed: %s", strerror(errno));
+ rv = -1;
+ }
+ }
+
+ {
+ /* Now, generate (but do not log) a backtrace. This ensures that
+ * libc has pre-loaded the symbols we need to dump things, so that later
+ * reads won't be denied by the sandbox code */
+ char **symbols;
+ int depth = backtrace(cb_buf, MAX_DEPTH);
+ symbols = backtrace_symbols(cb_buf, depth);
+ if (symbols)
+ free(symbols);
+ }
+
+ return rv;
+}
+
+/** Uninstall crash handlers. */
+static void
+remove_bt_handler(void)
+{
+ tor_mutex_uninit(&cb_buf_mutex);
+}
+#endif
+
+#ifdef NO_BACKTRACE_IMPL
+void
+log_backtrace(int severity, int domain, const char *msg)
+{
+ tor_log(severity, domain, "%s. (Stack trace not available)", msg);
+}
+
+static int
+install_bt_handler(void)
+{
+ return 0;
+}
+
+static void
+remove_bt_handler(void)
+{
+}
+#endif
+
+/** Set up code to handle generating error messages on crashes. */
+int
+configure_backtrace_handler(const char *tor_version)
+{
+ tor_free(bt_version);
+ if (!tor_version)
+ tor_version = "";
+ tor_asprintf(&bt_version, "Tor %s", tor_version);
+
+ return install_bt_handler();
+}
+
+/** Perform end-of-process cleanup for code that generates error messages on
+ * crashes. */
+void
+clean_up_backtrace_handler(void)
+{
+ remove_bt_handler();
+
+ tor_free(bt_version);
+}
+
diff --git a/src/common/backtrace.h b/src/common/backtrace.h
new file mode 100644
index 000000000..1f4d73339
--- /dev/null
+++ b/src/common/backtrace.h
@@ -0,0 +1,21 @@
+/* Copyright (c) 2013, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#ifndef TOR_BACKTRACE_H
+#define TOR_BACKTRACE_H
+
+#include "orconfig.h"
+
+void log_backtrace(int severity, int domain, const char *msg);
+int configure_backtrace_handler(const char *tor_version);
+void clean_up_backtrace_handler(void);
+
+#ifdef EXPOSE_CLEAN_BACKTRACE
+#if defined(HAVE_EXECINFO_H) && defined(HAVE_BACKTRACE) && \
+ defined(HAVE_BACKTRACE_SYMBOLS_FD) && defined(HAVE_SIGACTION)
+void clean_backtrace(void **stack, int depth, const ucontext_t *ctx);
+#endif
+#endif
+
+#endif
+
diff --git a/src/common/ciphers.inc b/src/common/ciphers.inc
index 137d78b11..ab4ac4072 100644
--- a/src/common/ciphers.inc
+++ b/src/common/ciphers.inc
@@ -4,86 +4,51 @@
*
* This file was automatically generated by get_mozilla_ciphers.py.
*/
-#ifdef TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
- CIPHER(0xc00a, TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA)
-#else
- XCIPHER(0xc00a, TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA)
-#endif
-#ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA
- CIPHER(0xc014, TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA)
-#else
- XCIPHER(0xc014, TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA)
-#endif
-#ifdef TLS1_TXT_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
- CIPHER(0x0088, TLS1_TXT_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA)
-#else
- XCIPHER(0x0088, TLS1_TXT_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA)
-#endif
-#ifdef TLS1_TXT_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA
- CIPHER(0x0087, TLS1_TXT_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA)
+#ifdef TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
+ CIPHER(0xc02b, TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256)
#else
- XCIPHER(0x0087, TLS1_TXT_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA)
+ XCIPHER(0xc02b, TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256)
#endif
-#ifdef TLS1_TXT_DHE_RSA_WITH_AES_256_SHA
- CIPHER(0x0039, TLS1_TXT_DHE_RSA_WITH_AES_256_SHA)
+#ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256
+ CIPHER(0xc02f, TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256)
#else
- XCIPHER(0x0039, TLS1_TXT_DHE_RSA_WITH_AES_256_SHA)
+ XCIPHER(0xc02f, TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256)
#endif
-#ifdef TLS1_TXT_DHE_DSS_WITH_AES_256_SHA
- CIPHER(0x0038, TLS1_TXT_DHE_DSS_WITH_AES_256_SHA)
+#ifdef TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
+ CIPHER(0xc00a, TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA)
#else
- XCIPHER(0x0038, TLS1_TXT_DHE_DSS_WITH_AES_256_SHA)
+ XCIPHER(0xc00a, TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA)
#endif
-#ifdef TLS1_TXT_ECDH_RSA_WITH_AES_256_CBC_SHA
- CIPHER(0xc00f, TLS1_TXT_ECDH_RSA_WITH_AES_256_CBC_SHA)
+#ifdef TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
+ CIPHER(0xc009, TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA)
#else
- XCIPHER(0xc00f, TLS1_TXT_ECDH_RSA_WITH_AES_256_CBC_SHA)
+ XCIPHER(0xc009, TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA)
#endif
-#ifdef TLS1_TXT_ECDH_ECDSA_WITH_AES_256_CBC_SHA
- CIPHER(0xc005, TLS1_TXT_ECDH_ECDSA_WITH_AES_256_CBC_SHA)
+#ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA
+ CIPHER(0xc013, TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA)
#else
- XCIPHER(0xc005, TLS1_TXT_ECDH_ECDSA_WITH_AES_256_CBC_SHA)
+ XCIPHER(0xc013, TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA)
#endif
-#ifdef TLS1_TXT_RSA_WITH_CAMELLIA_256_CBC_SHA
- CIPHER(0x0084, TLS1_TXT_RSA_WITH_CAMELLIA_256_CBC_SHA)
+#ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA
+ CIPHER(0xc014, TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA)
#else
- XCIPHER(0x0084, TLS1_TXT_RSA_WITH_CAMELLIA_256_CBC_SHA)
+ XCIPHER(0xc014, TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA)
#endif
-#ifdef TLS1_TXT_RSA_WITH_AES_256_SHA
- CIPHER(0x0035, TLS1_TXT_RSA_WITH_AES_256_SHA)
+#ifdef TLS1_TXT_ECDHE_RSA_WITH_DES_192_CBC3_SHA
+ CIPHER(0xc012, TLS1_TXT_ECDHE_RSA_WITH_DES_192_CBC3_SHA)
#else
- XCIPHER(0x0035, TLS1_TXT_RSA_WITH_AES_256_SHA)
+ XCIPHER(0xc012, TLS1_TXT_ECDHE_RSA_WITH_DES_192_CBC3_SHA)
#endif
#ifdef TLS1_TXT_ECDHE_ECDSA_WITH_RC4_128_SHA
CIPHER(0xc007, TLS1_TXT_ECDHE_ECDSA_WITH_RC4_128_SHA)
#else
XCIPHER(0xc007, TLS1_TXT_ECDHE_ECDSA_WITH_RC4_128_SHA)
#endif
-#ifdef TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
- CIPHER(0xc009, TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA)
-#else
- XCIPHER(0xc009, TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA)
-#endif
#ifdef TLS1_TXT_ECDHE_RSA_WITH_RC4_128_SHA
CIPHER(0xc011, TLS1_TXT_ECDHE_RSA_WITH_RC4_128_SHA)
#else
XCIPHER(0xc011, TLS1_TXT_ECDHE_RSA_WITH_RC4_128_SHA)
#endif
-#ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA
- CIPHER(0xc013, TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA)
-#else
- XCIPHER(0xc013, TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA)
-#endif
-#ifdef TLS1_TXT_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
- CIPHER(0x0045, TLS1_TXT_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA)
-#else
- XCIPHER(0x0045, TLS1_TXT_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA)
-#endif
-#ifdef TLS1_TXT_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA
- CIPHER(0x0044, TLS1_TXT_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA)
-#else
- XCIPHER(0x0044, TLS1_TXT_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA)
-#endif
#ifdef TLS1_TXT_DHE_RSA_WITH_AES_128_SHA
CIPHER(0x0033, TLS1_TXT_DHE_RSA_WITH_AES_128_SHA)
#else
@@ -94,89 +59,63 @@
#else
XCIPHER(0x0032, TLS1_TXT_DHE_DSS_WITH_AES_128_SHA)
#endif
-#ifdef TLS1_TXT_ECDH_RSA_WITH_RC4_128_SHA
- CIPHER(0xc00c, TLS1_TXT_ECDH_RSA_WITH_RC4_128_SHA)
-#else
- XCIPHER(0xc00c, TLS1_TXT_ECDH_RSA_WITH_RC4_128_SHA)
-#endif
-#ifdef TLS1_TXT_ECDH_RSA_WITH_AES_128_CBC_SHA
- CIPHER(0xc00e, TLS1_TXT_ECDH_RSA_WITH_AES_128_CBC_SHA)
-#else
- XCIPHER(0xc00e, TLS1_TXT_ECDH_RSA_WITH_AES_128_CBC_SHA)
-#endif
-#ifdef TLS1_TXT_ECDH_ECDSA_WITH_RC4_128_SHA
- CIPHER(0xc002, TLS1_TXT_ECDH_ECDSA_WITH_RC4_128_SHA)
-#else
- XCIPHER(0xc002, TLS1_TXT_ECDH_ECDSA_WITH_RC4_128_SHA)
-#endif
-#ifdef TLS1_TXT_ECDH_ECDSA_WITH_AES_128_CBC_SHA
- CIPHER(0xc004, TLS1_TXT_ECDH_ECDSA_WITH_AES_128_CBC_SHA)
+#ifdef TLS1_TXT_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
+ CIPHER(0x0045, TLS1_TXT_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA)
#else
- XCIPHER(0xc004, TLS1_TXT_ECDH_ECDSA_WITH_AES_128_CBC_SHA)
+ XCIPHER(0x0045, TLS1_TXT_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA)
#endif
-#ifdef TLS1_TXT_RSA_WITH_SEED_SHA
- CIPHER(0x0096, TLS1_TXT_RSA_WITH_SEED_SHA)
+#ifdef TLS1_TXT_DHE_RSA_WITH_AES_256_SHA
+ CIPHER(0x0039, TLS1_TXT_DHE_RSA_WITH_AES_256_SHA)
#else
- XCIPHER(0x0096, TLS1_TXT_RSA_WITH_SEED_SHA)
+ XCIPHER(0x0039, TLS1_TXT_DHE_RSA_WITH_AES_256_SHA)
#endif
-#ifdef TLS1_TXT_RSA_WITH_CAMELLIA_128_CBC_SHA
- CIPHER(0x0041, TLS1_TXT_RSA_WITH_CAMELLIA_128_CBC_SHA)
+#ifdef TLS1_TXT_DHE_DSS_WITH_AES_256_SHA
+ CIPHER(0x0038, TLS1_TXT_DHE_DSS_WITH_AES_256_SHA)
#else
- XCIPHER(0x0041, TLS1_TXT_RSA_WITH_CAMELLIA_128_CBC_SHA)
+ XCIPHER(0x0038, TLS1_TXT_DHE_DSS_WITH_AES_256_SHA)
#endif
-#ifdef SSL3_TXT_RSA_RC4_128_MD5
- CIPHER(0x0004, SSL3_TXT_RSA_RC4_128_MD5)
+#ifdef TLS1_TXT_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
+ CIPHER(0x0088, TLS1_TXT_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA)
#else
- XCIPHER(0x0004, SSL3_TXT_RSA_RC4_128_MD5)
+ XCIPHER(0x0088, TLS1_TXT_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA)
#endif
-#ifdef SSL3_TXT_RSA_RC4_128_SHA
- CIPHER(0x0005, SSL3_TXT_RSA_RC4_128_SHA)
+#ifdef SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA
+ CIPHER(0x0016, SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA)
#else
- XCIPHER(0x0005, SSL3_TXT_RSA_RC4_128_SHA)
+ XCIPHER(0x0016, SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA)
#endif
#ifdef TLS1_TXT_RSA_WITH_AES_128_SHA
CIPHER(0x002f, TLS1_TXT_RSA_WITH_AES_128_SHA)
#else
XCIPHER(0x002f, TLS1_TXT_RSA_WITH_AES_128_SHA)
#endif
-#ifdef TLS1_TXT_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA
- CIPHER(0xc008, TLS1_TXT_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA)
-#else
- XCIPHER(0xc008, TLS1_TXT_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA)
-#endif
-#ifdef TLS1_TXT_ECDHE_RSA_WITH_DES_192_CBC3_SHA
- CIPHER(0xc012, TLS1_TXT_ECDHE_RSA_WITH_DES_192_CBC3_SHA)
-#else
- XCIPHER(0xc012, TLS1_TXT_ECDHE_RSA_WITH_DES_192_CBC3_SHA)
-#endif
-#ifdef SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA
- CIPHER(0x0016, SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA)
+#ifdef TLS1_TXT_RSA_WITH_CAMELLIA_128_CBC_SHA
+ CIPHER(0x0041, TLS1_TXT_RSA_WITH_CAMELLIA_128_CBC_SHA)
#else
- XCIPHER(0x0016, SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA)
+ XCIPHER(0x0041, TLS1_TXT_RSA_WITH_CAMELLIA_128_CBC_SHA)
#endif
-#ifdef SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA
- CIPHER(0x0013, SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA)
+#ifdef TLS1_TXT_RSA_WITH_AES_256_SHA
+ CIPHER(0x0035, TLS1_TXT_RSA_WITH_AES_256_SHA)
#else
- XCIPHER(0x0013, SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA)
+ XCIPHER(0x0035, TLS1_TXT_RSA_WITH_AES_256_SHA)
#endif
-#ifdef TLS1_TXT_ECDH_RSA_WITH_DES_192_CBC3_SHA
- CIPHER(0xc00d, TLS1_TXT_ECDH_RSA_WITH_DES_192_CBC3_SHA)
+#ifdef TLS1_TXT_RSA_WITH_CAMELLIA_256_CBC_SHA
+ CIPHER(0x0084, TLS1_TXT_RSA_WITH_CAMELLIA_256_CBC_SHA)
#else
- XCIPHER(0xc00d, TLS1_TXT_ECDH_RSA_WITH_DES_192_CBC3_SHA)
+ XCIPHER(0x0084, TLS1_TXT_RSA_WITH_CAMELLIA_256_CBC_SHA)
#endif
-#ifdef TLS1_TXT_ECDH_ECDSA_WITH_DES_192_CBC3_SHA
- CIPHER(0xc003, TLS1_TXT_ECDH_ECDSA_WITH_DES_192_CBC3_SHA)
+#ifdef SSL3_TXT_RSA_DES_192_CBC3_SHA
+ CIPHER(0x000a, SSL3_TXT_RSA_DES_192_CBC3_SHA)
#else
- XCIPHER(0xc003, TLS1_TXT_ECDH_ECDSA_WITH_DES_192_CBC3_SHA)
+ XCIPHER(0x000a, SSL3_TXT_RSA_DES_192_CBC3_SHA)
#endif
-/* No openssl macro found for 0xfeff */
-#ifdef SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA
- CIPHER(0xfeff, SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA)
+#ifdef SSL3_TXT_RSA_RC4_128_SHA
+ CIPHER(0x0005, SSL3_TXT_RSA_RC4_128_SHA)
#else
- XCIPHER(0xfeff, SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA)
+ XCIPHER(0x0005, SSL3_TXT_RSA_RC4_128_SHA)
#endif
-#ifdef SSL3_TXT_RSA_DES_192_CBC3_SHA
- CIPHER(0x000a, SSL3_TXT_RSA_DES_192_CBC3_SHA)
+#ifdef SSL3_TXT_RSA_RC4_128_MD5
+ CIPHER(0x0004, SSL3_TXT_RSA_RC4_128_MD5)
#else
- XCIPHER(0x000a, SSL3_TXT_RSA_DES_192_CBC3_SHA)
+ XCIPHER(0x0004, SSL3_TXT_RSA_RC4_128_MD5)
#endif
diff --git a/src/common/compat.c b/src/common/compat.c
index d88c5f92d..111070cc1 100644
--- a/src/common/compat.c
+++ b/src/common/compat.c
@@ -23,6 +23,7 @@
* we can also take out the configure check. */
#define _GNU_SOURCE
+#define COMPAT_PRIVATE
#include "compat.h"
#ifdef _WIN32
@@ -34,6 +35,15 @@
#ifdef HAVE_UNAME
#include <sys/utsname.h>
#endif
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_SYSCTL_H
+#include <sys/sysctl.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
@@ -109,6 +119,7 @@
#include "util.h"
#include "container.h"
#include "address.h"
+#include "sandbox.h"
/* Inline the strl functions if the platform doesn't have them. */
#ifndef HAVE_STRLCPY
@@ -125,6 +136,7 @@ tor_open_cloexec(const char *path, int flags, unsigned mode)
{
int fd;
#ifdef O_CLOEXEC
+ path = sandbox_intern_string(path);
fd = open(path, flags|O_CLOEXEC, mode);
if (fd >= 0)
return fd;
@@ -135,6 +147,7 @@ tor_open_cloexec(const char *path, int flags, unsigned mode)
return -1;
#endif
+ log_debug(LD_FS, "Opening %s with flags %x", path, flags);
fd = open(path, flags, mode);
#ifdef FD_CLOEXEC
if (fd >= 0) {
@@ -166,6 +179,15 @@ tor_fopen_cloexec(const char *path, const char *mode)
return result;
}
+/** As rename(), but work correctly with the sandbox. */
+int
+tor_rename(const char *path_old, const char *path_new)
+{
+ log_debug(LD_FS, "Renaming %s to %s", path_old, path_new);
+ return rename(sandbox_intern_string(path_old),
+ sandbox_intern_string(path_new));
+}
+
#if defined(HAVE_SYS_MMAN_H) || defined(RUNNING_DOXYGEN)
/** Try to create a memory mapping for <b>filename</b> and return it. On
* failure, return NULL. Sets errno properly, using ERANGE to mean
@@ -175,9 +197,10 @@ tor_mmap_file(const char *filename)
{
int fd; /* router file */
char *string;
- int page_size;
+ int page_size, result;
tor_mmap_t *res;
size_t size, filesize;
+ struct stat st;
tor_assert(filename);
@@ -191,9 +214,22 @@ tor_mmap_file(const char *filename)
return NULL;
}
- /* XXXX why not just do fstat here? */
- size = filesize = (size_t) lseek(fd, 0, SEEK_END);
- lseek(fd, 0, SEEK_SET);
+ /* Get the size of the file */
+ result = fstat(fd, &st);
+ if (result != 0) {
+ int save_errno = errno;
+ log_warn(LD_FS,
+ "Couldn't fstat opened descriptor for \"%s\" during mmap: %s",
+ filename, strerror(errno));
+ close(fd);
+ errno = save_errno;
+ return NULL;
+ }
+ size = filesize = (size_t)(st.st_size);
+ /*
+ * Should we check for weird crap like mmapping a named pipe here,
+ * or just wait for if (!size) below to fail?
+ */
/* ensure page alignment */
page_size = getpagesize();
size += (size%page_size) ? page_size-(size%page_size) : 0;
@@ -224,12 +260,27 @@ tor_mmap_file(const char *filename)
return res;
}
-/** Release storage held for a memory mapping. */
-void
+/** Release storage held for a memory mapping; returns 0 on success,
+ * or -1 on failure (and logs a warning). */
+int
tor_munmap_file(tor_mmap_t *handle)
{
- munmap((char*)handle->data, handle->mapping_size);
- tor_free(handle);
+ int res;
+
+ if (handle == NULL)
+ return 0;
+
+ res = munmap((char*)handle->data, handle->mapping_size);
+ if (res == 0) {
+ /* munmap() succeeded */
+ tor_free(handle);
+ } else {
+ log_warn(LD_FS, "Failed to munmap() in tor_munmap_file(): %s",
+ strerror(errno));
+ res = -1;
+ }
+
+ return res;
}
#elif defined(_WIN32)
tor_mmap_t *
@@ -311,17 +362,29 @@ tor_mmap_file(const char *filename)
tor_munmap_file(res);
return NULL;
}
-void
+
+/* Unmap the file, and return 0 for success or -1 for failure */
+int
tor_munmap_file(tor_mmap_t *handle)
{
- if (handle->data)
+ if (handle == NULL)
+ return 0;
+
+ if (handle->data) {
/* This is an ugly cast, but without it, "data" in struct tor_mmap_t would
have to be redefined as non-const. */
- UnmapViewOfFile( (LPVOID) handle->data);
+ BOOL ok = UnmapViewOfFile( (LPVOID) handle->data);
+ if (!ok) {
+ log_warn(LD_FS, "Failed to UnmapViewOfFile() in tor_munmap_file(): %d",
+ (int)GetLastError());
+ }
+ }
if (handle->mmap_handle != NULL)
CloseHandle(handle->mmap_handle);
tor_free(handle);
+
+ return 0;
}
#else
tor_mmap_t *
@@ -337,13 +400,25 @@ tor_mmap_file(const char *filename)
handle->size = st.st_size;
return handle;
}
-void
+
+/** Unmap the file mapped with tor_mmap_file(), and return 0 for success
+ * or -1 for failure.
+ */
+
+int
tor_munmap_file(tor_mmap_t *handle)
{
- char *d = (char*)handle->data;
+ char *d = NULL;
+ if (handle == NULL)
+ return 0;
+
+ d = (char*)handle->data;
tor_free(d);
memwipe(handle, 0, sizeof(tor_mmap_t));
tor_free(handle);
+
+ /* Can't fail in this mmap()/munmap()-free case */
+ return 0;
}
#endif
@@ -498,21 +573,29 @@ tor_memmem(const void *_haystack, size_t hlen,
#else
/* This isn't as fast as the GLIBC implementation, but it doesn't need to
* be. */
- const char *p, *end;
+ const char *p, *last_possible_start;
const char *haystack = (const char*)_haystack;
const char *needle = (const char*)_needle;
char first;
tor_assert(nlen);
+ if (nlen > hlen)
+ return NULL;
+
p = haystack;
- end = haystack + hlen;
+ /* Last position at which the needle could start. */
+ last_possible_start = haystack + hlen - nlen;
first = *(const char*)needle;
- while ((p = memchr(p, first, end-p))) {
- if (p+nlen > end)
- return NULL;
+ while ((p = memchr(p, first, last_possible_start + 1 - p))) {
if (fast_memeq(p, needle, nlen))
return p;
- ++p;
+ if (++p > last_possible_start) {
+ /* This comparison shouldn't be necessary, since if p was previously
+ * equal to last_possible_start, the next memchr call would be
+ * "memchr(p, first, 0)", which will return NULL. But it clarifies the
+ * logic. */
+ return NULL;
+ }
}
return NULL;
#endif
@@ -729,7 +812,7 @@ int
replace_file(const char *from, const char *to)
{
#ifndef _WIN32
- return rename(from,to);
+ return tor_rename(from, to);
#else
switch (file_status(to))
{
@@ -744,7 +827,7 @@ replace_file(const char *from, const char *to)
errno = EISDIR;
return -1;
}
- return rename(from,to);
+ return tor_rename(from,to);
#endif
}
@@ -948,24 +1031,40 @@ socket_accounting_unlock(void)
}
/** As close(), but guaranteed to work for sockets across platforms (including
- * Windows, where close()ing a socket doesn't work. Returns 0 on success, -1
- * on failure. */
+ * Windows, where close()ing a socket doesn't work. Returns 0 on success and
+ * the socket error code on failure. */
int
-tor_close_socket(tor_socket_t s)
+tor_close_socket_simple(tor_socket_t s)
{
int r = 0;
/* On Windows, you have to call close() on fds returned by open(),
- * and closesocket() on fds returned by socket(). On Unix, everything
- * gets close()'d. We abstract this difference by always using
- * tor_close_socket to close sockets, and always using close() on
- * files.
- */
-#if defined(_WIN32)
- r = closesocket(s);
-#else
- r = close(s);
-#endif
+ * and closesocket() on fds returned by socket(). On Unix, everything
+ * gets close()'d. We abstract this difference by always using
+ * tor_close_socket to close sockets, and always using close() on
+ * files.
+ */
+ #if defined(_WIN32)
+ r = closesocket(s);
+ #else
+ r = close(s);
+ #endif
+
+ if (r != 0) {
+ int err = tor_socket_errno(-1);
+ log_info(LD_NET, "Close returned an error: %s", tor_socket_strerror(err));
+ return err;
+ }
+
+ return r;
+}
+
+/** As tor_close_socket_simple(), but keeps track of the number
+ * of open sockets. Returns 0 on success, -1 on failure. */
+int
+tor_close_socket(tor_socket_t s)
+{
+ int r = tor_close_socket_simple(s);
socket_accounting_lock();
#ifdef DEBUG_SOCKET_COUNTING
@@ -980,13 +1079,11 @@ tor_close_socket(tor_socket_t s)
if (r == 0) {
--n_sockets_open;
} else {
- int err = tor_socket_errno(-1);
- log_info(LD_NET, "Close returned an error: %s", tor_socket_strerror(err));
#ifdef _WIN32
- if (err != WSAENOTSOCK)
+ if (r != WSAENOTSOCK)
--n_sockets_open;
#else
- if (err != EBADF)
+ if (r != EBADF)
--n_sockets_open;
#endif
r = -1;
@@ -1032,33 +1129,61 @@ mark_socket_open(tor_socket_t s)
tor_socket_t
tor_open_socket(int domain, int type, int protocol)
{
+ return tor_open_socket_with_extensions(domain, type, protocol, 1, 0);
+}
+
+/** As socket(), but creates a nonblocking socket and
+ * counts the number of open sockets. */
+tor_socket_t
+tor_open_socket_nonblocking(int domain, int type, int protocol)
+{
+ return tor_open_socket_with_extensions(domain, type, protocol, 1, 1);
+}
+
+/** As socket(), but counts the number of open sockets and handles
+ * socket creation with either of SOCK_CLOEXEC and SOCK_NONBLOCK specified.
+ * <b>cloexec</b> and <b>nonblock</b> should be either 0 or 1 to indicate
+ * if the corresponding extension should be used.*/
+tor_socket_t
+tor_open_socket_with_extensions(int domain, int type, int protocol,
+ int cloexec, int nonblock)
+{
tor_socket_t s;
-#ifdef SOCK_CLOEXEC
- s = socket(domain, type|SOCK_CLOEXEC, protocol);
+#if defined(SOCK_CLOEXEC) && defined(SOCK_NONBLOCK)
+ int ext_flags = (cloexec ? SOCK_CLOEXEC : 0) |
+ (nonblock ? SOCK_NONBLOCK : 0);
+ s = socket(domain, type|ext_flags, protocol);
if (SOCKET_OK(s))
goto socket_ok;
/* If we got an error, see if it is EINVAL. EINVAL might indicate that,
- * even though we were built on a system with SOCK_CLOEXEC support, we
- * are running on one without. */
+ * even though we were built on a system with SOCK_CLOEXEC and SOCK_NONBLOCK
+ * support, we are running on one without. */
if (errno != EINVAL)
return s;
-#endif /* SOCK_CLOEXEC */
+#endif /* SOCK_CLOEXEC && SOCK_NONBLOCK */
s = socket(domain, type, protocol);
if (! SOCKET_OK(s))
return s;
#if defined(FD_CLOEXEC)
- if (fcntl(s, F_SETFD, FD_CLOEXEC) == -1) {
- log_warn(LD_FS,"Couldn't set FD_CLOEXEC: %s", strerror(errno));
-#if defined(_WIN32)
- closesocket(s);
+ if (cloexec) {
+ if (fcntl(s, F_SETFD, FD_CLOEXEC) == -1) {
+ log_warn(LD_FS,"Couldn't set FD_CLOEXEC: %s", strerror(errno));
+ tor_close_socket_simple(s);
+ return TOR_INVALID_SOCKET;
+ }
+ }
#else
- close(s);
+ (void)cloexec;
#endif
- return -1;
+
+ if (nonblock) {
+ if (set_socket_nonblocking(s) == -1) {
+ tor_close_socket_simple(s);
+ return TOR_INVALID_SOCKET;
+ }
}
-#endif
goto socket_ok; /* So that socket_ok will not be unused. */
@@ -1070,19 +1195,41 @@ tor_open_socket(int domain, int type, int protocol)
return s;
}
-/** As socket(), but counts the number of open sockets. */
+/** As accept(), but counts the number of open sockets. */
tor_socket_t
tor_accept_socket(tor_socket_t sockfd, struct sockaddr *addr, socklen_t *len)
{
+ return tor_accept_socket_with_extensions(sockfd, addr, len, 1, 0);
+}
+
+/** As accept(), but returns a nonblocking socket and
+ * counts the number of open sockets. */
+tor_socket_t
+tor_accept_socket_nonblocking(tor_socket_t sockfd, struct sockaddr *addr,
+ socklen_t *len)
+{
+ return tor_accept_socket_with_extensions(sockfd, addr, len, 1, 1);
+}
+
+/** As accept(), but counts the number of open sockets and handles
+ * socket creation with either of SOCK_CLOEXEC and SOCK_NONBLOCK specified.
+ * <b>cloexec</b> and <b>nonblock</b> should be either 0 or 1 to indicate
+ * if the corresponding extension should be used.*/
+tor_socket_t
+tor_accept_socket_with_extensions(tor_socket_t sockfd, struct sockaddr *addr,
+ socklen_t *len, int cloexec, int nonblock)
+{
tor_socket_t s;
-#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
- s = accept4(sockfd, addr, len, SOCK_CLOEXEC);
+#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC) && defined(SOCK_NONBLOCK)
+ int ext_flags = (cloexec ? SOCK_CLOEXEC : 0) |
+ (nonblock ? SOCK_NONBLOCK : 0);
+ s = accept4(sockfd, addr, len, ext_flags);
if (SOCKET_OK(s))
goto socket_ok;
/* If we got an error, see if it is ENOSYS. ENOSYS indicates that,
* even though we were built on a system with accept4 support, we
* are running on one without. Also, check for EINVAL, which indicates that
- * we are missing SOCK_CLOEXEC support. */
+ * we are missing SOCK_CLOEXEC/SOCK_NONBLOCK support. */
if (errno != EINVAL && errno != ENOSYS)
return s;
#endif
@@ -1092,13 +1239,24 @@ tor_accept_socket(tor_socket_t sockfd, struct sockaddr *addr, socklen_t *len)
return s;
#if defined(FD_CLOEXEC)
- if (fcntl(s, F_SETFD, FD_CLOEXEC) == -1) {
- log_warn(LD_NET, "Couldn't set FD_CLOEXEC: %s", strerror(errno));
- close(s);
- return TOR_INVALID_SOCKET;
+ if (cloexec) {
+ if (fcntl(s, F_SETFD, FD_CLOEXEC) == -1) {
+ log_warn(LD_NET, "Couldn't set FD_CLOEXEC: %s", strerror(errno));
+ tor_close_socket_simple(s);
+ return TOR_INVALID_SOCKET;
+ }
}
+#else
+ (void)cloexec;
#endif
+ if (nonblock) {
+ if (set_socket_nonblocking(s) == -1) {
+ tor_close_socket_simple(s);
+ return TOR_INVALID_SOCKET;
+ }
+ }
+
goto socket_ok; /* So that socket_ok will not be unused. */
socket_ok:
@@ -1220,6 +1378,18 @@ tor_socketpair(int family, int type, int protocol, tor_socket_t fd[2])
return 0;
#else
+ return tor_ersatz_socketpair(family, type, protocol, fd);
+#endif
+}
+
+#ifdef NEED_ERSATZ_SOCKETPAIR
+/**
+ * Helper used to implement socketpair on systems that lack it, by
+ * making a direct connection to localhost.
+ */
+STATIC int
+tor_ersatz_socketpair(int family, int type, int protocol, tor_socket_t fd[2])
+{
/* This socketpair does not work when localhost is down. So
* it's really not the same thing at all. But it's close enough
* for now, and really, when localhost is down sometimes, we
@@ -1230,7 +1400,7 @@ tor_socketpair(int family, int type, int protocol, tor_socket_t fd[2])
tor_socket_t acceptor = TOR_INVALID_SOCKET;
struct sockaddr_in listen_addr;
struct sockaddr_in connect_addr;
- int size;
+ socklen_t size;
int saved_errno = -1;
if (protocol
@@ -1313,8 +1483,8 @@ tor_socketpair(int family, int type, int protocol, tor_socket_t fd[2])
if (SOCKET_OK(acceptor))
tor_close_socket(acceptor);
return -saved_errno;
-#endif
}
+#endif
/** Number of extra file descriptors to keep in reserve beyond those that we
* tell Tor it's allowed to use. */
@@ -1532,6 +1702,106 @@ log_credential_status(void)
}
#endif
+#ifndef _WIN32
+/** Cached struct from the last getpwname() call we did successfully. */
+static struct passwd *passwd_cached = NULL;
+
+/** Helper: copy a struct passwd object.
+ *
+ * We only copy the fields pw_uid, pw_gid, pw_name, pw_dir. Tor doesn't use
+ * any others, and I don't want to run into incompatibilities.
+ */
+static struct passwd *
+tor_passwd_dup(const struct passwd *pw)
+{
+ struct passwd *new_pw = tor_malloc_zero(sizeof(struct passwd));
+ if (pw->pw_name)
+ new_pw->pw_name = tor_strdup(pw->pw_name);
+ if (pw->pw_dir)
+ new_pw->pw_dir = tor_strdup(pw->pw_dir);
+ new_pw->pw_uid = pw->pw_uid;
+ new_pw->pw_gid = pw->pw_gid;
+
+ return new_pw;
+}
+
+/** Helper: free one of our cached 'struct passwd' values. */
+static void
+tor_passwd_free(struct passwd *pw)
+{
+ if (!pw)
+ return;
+
+ tor_free(pw->pw_name);
+ tor_free(pw->pw_dir);
+ tor_free(pw);
+}
+
+/** Wrapper around getpwnam() that caches result. Used so that we don't need
+ * to give the sandbox access to /etc/passwd.
+ *
+ * The following fields alone will definitely be copied in the output: pw_uid,
+ * pw_gid, pw_name, pw_dir. Other fields are not present in cached values.
+ *
+ * When called with a NULL argument, this function clears storage associated
+ * with static variables it uses.
+ **/
+const struct passwd *
+tor_getpwnam(const char *username)
+{
+ struct passwd *pw;
+
+ if (username == NULL) {
+ tor_passwd_free(passwd_cached);
+ passwd_cached = NULL;
+ return NULL;
+ }
+
+ if ((pw = getpwnam(username))) {
+ tor_passwd_free(passwd_cached);
+ passwd_cached = tor_passwd_dup(pw);
+ log_notice(LD_GENERAL, "Caching new entry %s for %s",
+ passwd_cached->pw_name, username);
+ return pw;
+ }
+
+ /* Lookup failed */
+ if (! passwd_cached || ! passwd_cached->pw_name)
+ return NULL;
+
+ if (! strcmp(username, passwd_cached->pw_name))
+ return passwd_cached;
+
+ return NULL;
+}
+
+/** Wrapper around getpwnam() that can use cached result from
+ * tor_getpwnam(). Used so that we don't need to give the sandbox access to
+ * /etc/passwd.
+ *
+ * The following fields alone will definitely be copied in the output: pw_uid,
+ * pw_gid, pw_name, pw_dir. Other fields are not present in cached values.
+ */
+const struct passwd *
+tor_getpwuid(uid_t uid)
+{
+ struct passwd *pw;
+
+ if ((pw = getpwuid(uid))) {
+ return pw;
+ }
+
+ /* Lookup failed */
+ if (! passwd_cached)
+ return NULL;
+
+ if (uid == passwd_cached->pw_uid)
+ return passwd_cached;
+
+ return NULL;
+}
+#endif
+
/** Call setuid and setgid to run as <b>user</b> and switch to their
* primary group. Return 0 on success. On failure, log and return -1.
*/
@@ -1539,7 +1809,7 @@ int
switch_id(const char *user)
{
#ifndef _WIN32
- struct passwd *pw = NULL;
+ const struct passwd *pw = NULL;
uid_t old_uid;
gid_t old_gid;
static int have_already_switched_id = 0;
@@ -1560,7 +1830,7 @@ switch_id(const char *user)
old_gid = getgid();
/* Lookup the user and group information, if we have a problem, bail out. */
- pw = getpwnam(user);
+ pw = tor_getpwnam(user);
if (pw == NULL) {
log_warn(LD_CONFIG, "Error setting configured user: %s not found", user);
return -1;
@@ -1731,10 +2001,10 @@ tor_disable_debugger_attach(void)
char *
get_user_homedir(const char *username)
{
- struct passwd *pw;
+ const struct passwd *pw;
tor_assert(username);
- if (!(pw = getpwnam(username))) {
+ if (!(pw = tor_getpwnam(username))) {
log_err(LD_CONFIG,"User \"%s\" not found.", username);
return NULL;
}
@@ -1746,6 +2016,15 @@ get_user_homedir(const char *username)
* actually examine the filesystem; does a purely syntactic modification.
*
* The parent of the root director is considered to be iteself.
+ *
+ * Path separators are the forward slash (/) everywhere and additionally
+ * the backslash (\) on Win32.
+ *
+ * Cuts off any number of trailing path separators but otherwise ignores
+ * them for purposes of finding the parent directory.
+ *
+ * Returns 0 if a parent directory was successfully found, -1 otherwise (fname
+ * did not have any path separators or only had them at the end).
* */
int
get_parent_directory(char *fname)
@@ -2019,8 +2298,10 @@ tor_inet_pton(int af, const char *src, void *dst)
else {
unsigned byte1,byte2,byte3,byte4;
char more;
- for (eow = dot-1; eow >= src && TOR_ISDIGIT(*eow); --eow)
+ for (eow = dot-1; eow > src && TOR_ISDIGIT(*eow); --eow)
;
+ if (*eow != ':')
+ return 0;
++eow;
/* We use "scanf" because some platform inet_aton()s are too lax
@@ -2248,6 +2529,12 @@ tor_pthread_helper_fn(void *_data)
func(arg);
return NULL;
}
+/**
+ * A pthread attribute to make threads start detached.
+ */
+static pthread_attr_t attr_detached;
+/** True iff we've called tor_threads_init() */
+static int threads_initialized = 0;
#endif
/** Minimalist interface to run a void function in the background. On
@@ -2271,12 +2558,12 @@ spawn_func(void (*func)(void *), void *data)
#elif defined(USE_PTHREADS)
pthread_t thread;
tor_pthread_data_t *d;
+ if (PREDICT_UNLIKELY(!threads_initialized))
+ tor_threads_init();
d = tor_malloc(sizeof(tor_pthread_data_t));
d->data = data;
d->func = func;
- if (pthread_create(&thread,NULL,tor_pthread_helper_fn,d))
- return -1;
- if (pthread_detach(thread))
+ if (pthread_create(&thread,&attr_detached,tor_pthread_helper_fn,d))
return -1;
return 0;
#else
@@ -2633,8 +2920,6 @@ tor_get_thread_id(void)
* "reentrant" mutexes (i.e., once we can re-lock if we're already holding
* them.) */
static pthread_mutexattr_t attr_reentrant;
-/** True iff we've called tor_threads_init() */
-static int threads_initialized = 0;
/** Initialize <b>mutex</b> so it can be locked. Every mutex must be set
* up with tor_mutex_init() or tor_mutex_new(); not both. */
void
@@ -2778,6 +3063,8 @@ tor_threads_init(void)
if (!threads_initialized) {
pthread_mutexattr_init(&attr_reentrant);
pthread_mutexattr_settype(&attr_reentrant, PTHREAD_MUTEX_RECURSIVE);
+ tor_assert(0==pthread_attr_init(&attr_detached));
+ tor_assert(0==pthread_attr_setdetachstate(&attr_detached, 1));
threads_initialized = 1;
set_main_thread();
}
@@ -3153,3 +3440,119 @@ format_win32_error(DWORD err)
}
#endif
+#if defined(HW_PHYSMEM64)
+/* This appears to be an OpenBSD thing */
+#define INT64_HW_MEM HW_PHYSMEM64
+#elif defined(HW_MEMSIZE)
+/* OSX defines this one */
+#define INT64_HW_MEM HW_MEMSIZE
+#endif
+
+/**
+ * Helper: try to detect the total system memory, and return it. On failure,
+ * return 0.
+ */
+static uint64_t
+get_total_system_memory_impl(void)
+{
+#if defined(__linux__)
+ /* On linux, sysctl is deprecated. Because proc is so awesome that you
+ * shouldn't _want_ to write portable code, I guess? */
+ unsigned long long result=0;
+ int fd = -1;
+ char *s = NULL;
+ const char *cp;
+ size_t file_size=0;
+ if (-1 == (fd = tor_open_cloexec("/proc/meminfo",O_RDONLY,0)))
+ return 0;
+ s = read_file_to_str_until_eof(fd, 65536, &file_size);
+ if (!s)
+ goto err;
+ cp = strstr(s, "MemTotal:");
+ if (!cp)
+ goto err;
+ /* Use the system sscanf so that space will match a wider number of space */
+ if (sscanf(cp, "MemTotal: %llu kB\n", &result) != 1)
+ goto err;
+
+ close(fd);
+ tor_free(s);
+ return result * 1024;
+
+ err:
+ tor_free(s);
+ close(fd);
+ return 0;
+#elif defined (_WIN32)
+ /* Windows has MEMORYSTATUSEX; pretty straightforward. */
+ MEMORYSTATUSEX ms;
+ memset(&ms, 0, sizeof(ms));
+ ms.dwLength = sizeof(ms);
+ if (! GlobalMemoryStatusEx(&ms))
+ return 0;
+
+ return ms.ullTotalPhys;
+
+#elif defined(HAVE_SYSCTL) && defined(INT64_HW_MEM)
+ /* On many systems, HW_PYHSMEM is clipped to 32 bits; let's use a better
+ * variant if we know about it. */
+ uint64_t memsize = 0;
+ size_t len = sizeof(memsize);
+ int mib[2] = {CTL_HW, INT64_HW_MEM};
+ if (sysctl(mib,2,&memsize,&len,NULL,0))
+ return 0;
+
+ return memsize;
+
+#elif defined(HAVE_SYSCTL) && defined(HW_PHYSMEM)
+ /* On some systems (like FreeBSD I hope) you can use a size_t with
+ * HW_PHYSMEM. */
+ size_t memsize=0;
+ size_t len = sizeof(memsize);
+ int mib[2] = {CTL_HW, HW_USERMEM};
+ if (sysctl(mib,2,&memsize,&len,NULL,0))
+ return -1;
+
+ return memsize;
+
+#else
+ /* I have no clue. */
+ return 0;
+#endif
+}
+
+/**
+ * Try to find out how much physical memory the system has. On success,
+ * return 0 and set *<b>mem_out</b> to that value. On failure, return -1.
+ */
+int
+get_total_system_memory(size_t *mem_out)
+{
+ static size_t mem_cached=0;
+ uint64_t m = get_total_system_memory_impl();
+ if (0 == m) {
+ /* We couldn't find our memory total */
+ if (0 == mem_cached) {
+ /* We have no cached value either */
+ *mem_out = 0;
+ return -1;
+ }
+
+ *mem_out = mem_cached;
+ return 0;
+ }
+
+#if SIZE_T_MAX != UINT64_MAX
+ if (m > SIZE_T_MAX) {
+ /* I think this could happen if we're a 32-bit Tor running on a 64-bit
+ * system: we could have more system memory than would fit in a
+ * size_t. */
+ m = SIZE_T_MAX;
+ }
+#endif
+
+ *mem_out = mem_cached = (size_t) m;
+
+ return 0;
+}
+
diff --git a/src/common/compat.h b/src/common/compat.h
index 51fb8c527..683c4d089 100644
--- a/src/common/compat.h
+++ b/src/common/compat.h
@@ -8,6 +8,7 @@
#include "orconfig.h"
#include "torint.h"
+#include "testsupport.h"
#ifdef _WIN32
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0501
@@ -84,13 +85,19 @@
/* ===== Compiler compatibility */
-/* GCC can check printf types on arbitrary functions. */
+/* GCC can check printf and scanf types on arbitrary functions. */
#ifdef __GNUC__
#define CHECK_PRINTF(formatIdx, firstArg) \
__attribute__ ((format(printf, formatIdx, firstArg)))
#else
#define CHECK_PRINTF(formatIdx, firstArg)
#endif
+#ifdef __GNUC__
+#define CHECK_SCANF(formatIdx, firstArg) \
+ __attribute__ ((format(scanf, formatIdx, firstArg)))
+#else
+#define CHECK_SCANF(formatIdx, firstArg)
+#endif
/* inline is __inline on windows. */
#ifdef _WIN32
@@ -285,7 +292,7 @@ typedef struct tor_mmap_t {
} tor_mmap_t;
tor_mmap_t *tor_mmap_file(const char *filename) ATTR_NONNULL((1));
-void tor_munmap_file(tor_mmap_t *handle) ATTR_NONNULL((1));
+int tor_munmap_file(tor_mmap_t *handle) ATTR_NONNULL((1));
int tor_snprintf(char *str, size_t size, const char *format, ...)
CHECK_PRINTF(3,4) ATTR_NONNULL((1,3));
@@ -314,7 +321,7 @@ tor_memstr(const void *haystack, size_t hlen, const char *needle)
extern const uint32_t TOR_##name##_TABLE[]; \
static INLINE int TOR_##name(char c) { \
uint8_t u = c; \
- return !!(TOR_##name##_TABLE[(u >> 5) & 7] & (1 << (u & 31))); \
+ return !!(TOR_##name##_TABLE[(u >> 5) & 7] & (1u << (u & 31))); \
}
DECLARE_CTYPE_FN(ISALPHA)
DECLARE_CTYPE_FN(ISALNUM)
@@ -403,6 +410,7 @@ struct tm *tor_gmtime_r(const time_t *timep, struct tm *result);
/* ===== File compatibility */
int tor_open_cloexec(const char *path, int flags, unsigned mode);
FILE *tor_fopen_cloexec(const char *path, const char *mode);
+int tor_rename(const char *path_old, const char *path_new);
int replace_file(const char *from, const char *to);
int touch_file(const char *fname);
@@ -446,10 +454,22 @@ typedef int socklen_t;
#define TOR_INVALID_SOCKET (-1)
#endif
+int tor_close_socket_simple(tor_socket_t s);
int tor_close_socket(tor_socket_t s);
+tor_socket_t tor_open_socket_with_extensions(
+ int domain, int type, int protocol,
+ int cloexec, int nonblock);
tor_socket_t tor_open_socket(int domain, int type, int protocol);
+tor_socket_t tor_open_socket_nonblocking(int domain, int type, int protocol);
tor_socket_t tor_accept_socket(tor_socket_t sockfd, struct sockaddr *addr,
socklen_t *len);
+tor_socket_t tor_accept_socket_nonblocking(tor_socket_t sockfd,
+ struct sockaddr *addr,
+ socklen_t *len);
+tor_socket_t tor_accept_socket_with_extensions(tor_socket_t sockfd,
+ struct sockaddr *addr,
+ socklen_t *len,
+ int cloexec, int nonblock);
int get_n_open_sockets(void);
#define tor_socket_send(s, buf, len, flags) send(s, buf, len, flags)
@@ -613,11 +633,18 @@ int switch_id(const char *user);
char *get_user_homedir(const char *username);
#endif
+#ifndef _WIN32
+const struct passwd *tor_getpwnam(const char *username);
+const struct passwd *tor_getpwuid(uid_t uid);
+#endif
+
int get_parent_directory(char *fname);
char *make_path_absolute(char *fname);
char **get_environment(void);
+int get_total_system_memory(size_t *mem_out);
+
int spawn_func(void (*func)(void *), void *data);
void spawn_exit(void) ATTR_NORETURN;
@@ -722,5 +749,13 @@ char *format_win32_error(DWORD err);
#endif
+#ifdef COMPAT_PRIVATE
+#if !defined(HAVE_SOCKETPAIR) || defined(_WIN32) || defined(TOR_UNIT_TESTS)
+#define NEED_ERSATZ_SOCKETPAIR
+STATIC int tor_ersatz_socketpair(int family, int type, int protocol,
+ tor_socket_t fd[2]);
+#endif
+#endif
+
#endif
diff --git a/src/common/compat_libevent.c b/src/common/compat_libevent.c
index 200a7c65f..74b54bb85 100644
--- a/src/common/compat_libevent.c
+++ b/src/common/compat_libevent.c
@@ -13,6 +13,8 @@
#include "compat.h"
#include "compat_libevent.h"
+#include "crypto.h"
+
#include "util.h"
#include "torlog.h"
@@ -415,6 +417,14 @@ tor_check_libevent_version(const char *m, int server,
#define HEADER_VERSION _EVENT_VERSION
#endif
+/** Return a string representation of the version of Libevent that was used
+* at compilation time. */
+const char *
+tor_libevent_get_header_version_str(void)
+{
+ return HEADER_VERSION;
+}
+
/** See whether the headers we were built against differ from the library we
* linked against so much that we're likely to crash. If so, warn the
* user. */
@@ -618,7 +628,25 @@ tor_add_bufferevent_to_rate_limit_group(struct bufferevent *bev,
}
#endif
-#if defined(LIBEVENT_VERSION_NUMBER) && LIBEVENT_VERSION_NUMBER >= V(2,1,1)
+int
+tor_init_libevent_rng(void)
+{
+ int rv = 0;
+#ifdef HAVE_EVUTIL_SECURE_RNG_INIT
+ char buf[256];
+ if (evutil_secure_rng_init() < 0) {
+ rv = -1;
+ }
+ /* Older libevent -- manually initialize the RNG */
+ crypto_rand(buf, 32);
+ evutil_secure_rng_add_bytes(buf, 32);
+ evutil_secure_rng_get_bytes(buf, sizeof(buf));
+#endif
+ return rv;
+}
+
+#if defined(LIBEVENT_VERSION_NUMBER) && LIBEVENT_VERSION_NUMBER >= V(2,1,1) \
+ && !defined(TOR_UNIT_TESTS)
void
tor_gettimeofday_cached(struct timeval *tv)
{
@@ -651,5 +679,45 @@ tor_gettimeofday_cache_clear(void)
{
cached_time_hires.tv_sec = 0;
}
+
+#ifdef TOR_UNIT_TESTS
+/** For testing: force-update the cached time to a given value. */
+void
+tor_gettimeofday_cache_set(const struct timeval *tv)
+{
+ tor_assert(tv);
+ memcpy(&cached_time_hires, tv, sizeof(*tv));
+}
+#endif
#endif
+/**
+ * As tor_gettimeofday_cached, but can never move backwards in time.
+ *
+ * The returned value may diverge from wall-clock time, since wall-clock time
+ * can trivially be adjusted backwards, and this can't. Don't mix wall-clock
+ * time with these values in the same calculation.
+ *
+ * Depending on implementation, this function may or may not "smooth out" huge
+ * jumps forward in wall-clock time. It may or may not keep its results
+ * advancing forward (as opposed to stalling) if the wall-clock time goes
+ * backwards. The current implementation does neither of of these.
+ *
+ * This function is not thread-safe; do not call it outside the main thread.
+ *
+ * In future versions of Tor, this may return a time does not have its
+ * origin at the Unix epoch.
+ */
+void
+tor_gettimeofday_cached_monotonic(struct timeval *tv)
+{
+ struct timeval last_tv = { 0, 0 };
+
+ tor_gettimeofday_cached(tv);
+ if (timercmp(tv, &last_tv, <)) {
+ memcpy(tv, &last_tv, sizeof(struct timeval));
+ } else {
+ memcpy(&last_tv, tv, sizeof(struct timeval));
+ }
+}
+
diff --git a/src/common/compat_libevent.h b/src/common/compat_libevent.h
index 2472e2c49..9ee7b49cf 100644
--- a/src/common/compat_libevent.h
+++ b/src/common/compat_libevent.h
@@ -78,6 +78,7 @@ void tor_check_libevent_version(const char *m, int server,
const char **badness_out);
void tor_check_libevent_header_compatibility(void);
const char *tor_libevent_get_version_str(void);
+const char *tor_libevent_get_header_version_str(void);
#ifdef USE_BUFFEREVENTS
const struct timeval *tor_libevent_get_one_tick_timeout(void);
@@ -88,8 +89,14 @@ int tor_add_bufferevent_to_rate_limit_group(struct bufferevent *bev,
struct bufferevent_rate_limit_group *g);
#endif
+int tor_init_libevent_rng(void);
+
void tor_gettimeofday_cached(struct timeval *tv);
void tor_gettimeofday_cache_clear(void);
+#ifdef TOR_UNIT_TESTS
+void tor_gettimeofday_cache_set(const struct timeval *tv);
+#endif
+void tor_gettimeofday_cached_monotonic(struct timeval *tv);
#endif
diff --git a/src/common/container.c b/src/common/container.c
index eec497a3e..b937d544f 100644
--- a/src/common/container.c
+++ b/src/common/container.c
@@ -243,6 +243,25 @@ smartlist_strings_eq(const smartlist_t *sl1, const smartlist_t *sl2)
return 1;
}
+/** Return true iff the two lists contain the same int pointer values in
+ * the same order, or if they are both NULL. */
+int
+smartlist_ints_eq(const smartlist_t *sl1, const smartlist_t *sl2)
+{
+ if (sl1 == NULL)
+ return sl2 == NULL;
+ if (sl2 == NULL)
+ return 0;
+ if (smartlist_len(sl1) != smartlist_len(sl2))
+ return 0;
+ SMARTLIST_FOREACH(sl1, int *, cp1, {
+ int *cp2 = smartlist_get(sl2, cp1_sl_idx);
+ if (*cp1 != *cp2)
+ return 0;
+ });
+ return 1;
+}
+
/** Return true iff <b>sl</b> has some element E such that
* tor_memeq(E,<b>element</b>,DIGEST_LEN)
*/
@@ -708,6 +727,26 @@ smartlist_uniq_strings(smartlist_t *sl)
smartlist_uniq(sl, compare_string_ptrs_, tor_free_);
}
+/** Helper: compare two pointers. */
+static int
+compare_ptrs_(const void **_a, const void **_b)
+{
+ const void *a = *_a, *b = *_b;
+ if (a<b)
+ return -1;
+ else if (a==b)
+ return 0;
+ else
+ return 1;
+}
+
+/** Sort <b>sl</b> in ascending order of the pointers it contains. */
+void
+smartlist_sort_pointers(smartlist_t *sl)
+{
+ smartlist_sort(sl, compare_ptrs_);
+}
+
/* Heap-based priority queue implementation for O(lg N) insert and remove.
* Recall that the heap property is that, for every index I, h[I] <
* H[LEFT_CHILD[I]] and h[I] < H[RIGHT_CHILD[I]].
@@ -985,7 +1024,7 @@ strmap_entries_eq(const strmap_entry_t *a, const strmap_entry_t *b)
static INLINE unsigned int
strmap_entry_hash(const strmap_entry_t *a)
{
- return ht_string_hash(a->key);
+ return (unsigned) siphash24g(a->key, strlen(a->key));
}
/** Helper: compare digestmap_entry_t objects by key value. */
@@ -999,13 +1038,7 @@ digestmap_entries_eq(const digestmap_entry_t *a, const digestmap_entry_t *b)
static INLINE unsigned int
digestmap_entry_hash(const digestmap_entry_t *a)
{
-#if SIZEOF_INT != 8
- const uint32_t *p = (const uint32_t*)a->key;
- return p[0] ^ p[1] ^ p[2] ^ p[3] ^ p[4];
-#else
- const uint64_t *p = (const uint64_t*)a->key;
- return p[0] ^ p[1];
-#endif
+ return (unsigned) siphash24g(a->key, DIGEST_LEN);
}
HT_PROTOTYPE(strmap_impl, strmap_entry_t, node, strmap_entry_hash,
diff --git a/src/common/container.h b/src/common/container.h
index fb9374794..0d31f2093 100644
--- a/src/common/container.h
+++ b/src/common/container.h
@@ -7,6 +7,7 @@
#define TOR_CONTAINER_H
#include "util.h"
+#include "siphash.h"
/** A resizeable list of pointers, with associated helpful functionality.
*
@@ -42,6 +43,7 @@ int smartlist_contains_string_case(const smartlist_t *sl, const char *element);
int smartlist_contains_int_as_string(const smartlist_t *sl, int num);
int smartlist_strings_eq(const smartlist_t *sl1, const smartlist_t *sl2);
int smartlist_contains_digest(const smartlist_t *sl, const char *element);
+int smartlist_ints_eq(const smartlist_t *sl1, const smartlist_t *sl2);
int smartlist_overlap(const smartlist_t *sl1, const smartlist_t *sl2);
void smartlist_intersect(smartlist_t *sl1, const smartlist_t *sl2);
void smartlist_subtract(smartlist_t *sl1, const smartlist_t *sl2);
@@ -101,6 +103,7 @@ void smartlist_uniq(smartlist_t *sl,
void smartlist_sort_strings(smartlist_t *sl);
void smartlist_sort_digests(smartlist_t *sl);
void smartlist_sort_digests256(smartlist_t *sl);
+void smartlist_sort_pointers(smartlist_t *sl);
char *smartlist_get_most_frequent_string(smartlist_t *sl);
char *smartlist_get_most_frequent_digest256(smartlist_t *sl);
@@ -619,11 +622,11 @@ typedef struct {
static INLINE void
digestset_add(digestset_t *set, const char *digest)
{
- const uint32_t *p = (const uint32_t *)digest;
- const uint32_t d1 = p[0] + (p[1]>>16);
- const uint32_t d2 = p[1] + (p[2]>>16);
- const uint32_t d3 = p[2] + (p[3]>>16);
- const uint32_t d4 = p[3] + (p[0]>>16);
+ const uint64_t x = siphash24g(digest, 20);
+ const uint32_t d1 = (uint32_t) x;
+ const uint32_t d2 = (uint32_t)( (x>>16) + x);
+ const uint32_t d3 = (uint32_t)( (x>>32) + x);
+ const uint32_t d4 = (uint32_t)( (x>>48) + x);
bitarray_set(set->ba, BIT(d1));
bitarray_set(set->ba, BIT(d2));
bitarray_set(set->ba, BIT(d3));
@@ -635,11 +638,11 @@ digestset_add(digestset_t *set, const char *digest)
static INLINE int
digestset_contains(const digestset_t *set, const char *digest)
{
- const uint32_t *p = (const uint32_t *)digest;
- const uint32_t d1 = p[0] + (p[1]>>16);
- const uint32_t d2 = p[1] + (p[2]>>16);
- const uint32_t d3 = p[2] + (p[3]>>16);
- const uint32_t d4 = p[3] + (p[0]>>16);
+ const uint64_t x = siphash24g(digest, 20);
+ const uint32_t d1 = (uint32_t) x;
+ const uint32_t d2 = (uint32_t)( (x>>16) + x);
+ const uint32_t d3 = (uint32_t)( (x>>32) + x);
+ const uint32_t d4 = (uint32_t)( (x>>48) + x);
return bitarray_is_set(set->ba, BIT(d1)) &&
bitarray_is_set(set->ba, BIT(d2)) &&
bitarray_is_set(set->ba, BIT(d3)) &&
diff --git a/src/common/crypto.c b/src/common/crypto.c
index 925beb352..a247a87d4 100644
--- a/src/common/crypto.c
+++ b/src/common/crypto.c
@@ -56,6 +56,7 @@
#include "../common/util.h"
#include "container.h"
#include "compat.h"
+#include "sandbox.h"
#if OPENSSL_VERSION_NUMBER < OPENSSL_V_SERIES(0,9,8)
#error "We require OpenSSL >= 0.9.8"
@@ -114,7 +115,6 @@ crypto_get_rsa_padding_overhead(int padding)
switch (padding)
{
case RSA_PKCS1_OAEP_PADDING: return PKCS1_OAEP_PADDING_OVERHEAD;
- case RSA_PKCS1_PADDING: return PKCS1_PADDING_OVERHEAD;
default: tor_assert(0); return -1;
}
}
@@ -126,13 +126,15 @@ crypto_get_rsa_padding(int padding)
{
switch (padding)
{
- case PK_PKCS1_PADDING: return RSA_PKCS1_PADDING;
case PK_PKCS1_OAEP_PADDING: return RSA_PKCS1_OAEP_PADDING;
default: tor_assert(0); return -1;
}
}
/** Boolean: has OpenSSL's crypto been initialized? */
+static int crypto_early_initialized_ = 0;
+
+/** Boolean: has OpenSSL's crypto been initialized? */
static int crypto_global_initialized_ = 0;
/** Log all pending crypto errors at level <b>severity</b>. Use
@@ -197,6 +199,27 @@ try_load_engine(const char *path, const char *engine)
}
#endif
+/* Returns a trimmed and human-readable version of an openssl version string
+* <b>raw_version</b>. They are usually in the form of 'OpenSSL 1.0.0b 10
+* May 2012' and this will parse them into a form similar to '1.0.0b' */
+static char *
+parse_openssl_version_str(const char *raw_version)
+{
+ const char *end_of_version = NULL;
+ /* The output should be something like "OpenSSL 1.0.0b 10 May 2012. Let's
+ trim that down. */
+ if (!strcmpstart(raw_version, "OpenSSL ")) {
+ raw_version += strlen("OpenSSL ");
+ end_of_version = strchr(raw_version, ' ');
+ }
+
+ if (end_of_version)
+ return tor_strndup(raw_version,
+ end_of_version-raw_version);
+ else
+ return tor_strdup(raw_version);
+}
+
static char *crypto_openssl_version_str = NULL;
/* Return a human-readable version of the run-time openssl version number. */
const char *
@@ -204,32 +227,67 @@ crypto_openssl_get_version_str(void)
{
if (crypto_openssl_version_str == NULL) {
const char *raw_version = SSLeay_version(SSLEAY_VERSION);
- const char *end_of_version = NULL;
- /* The output should be something like "OpenSSL 1.0.0b 10 May 2012. Let's
- trim that down. */
- if (!strcmpstart(raw_version, "OpenSSL ")) {
- raw_version += strlen("OpenSSL ");
- end_of_version = strchr(raw_version, ' ');
- }
-
- if (end_of_version)
- crypto_openssl_version_str = tor_strndup(raw_version,
- end_of_version-raw_version);
- else
- crypto_openssl_version_str = tor_strdup(raw_version);
+ crypto_openssl_version_str = parse_openssl_version_str(raw_version);
}
return crypto_openssl_version_str;
}
+static char *crypto_openssl_header_version_str = NULL;
+/* Return a human-readable version of the compile-time openssl version
+* number. */
+const char *
+crypto_openssl_get_header_version_str(void)
+{
+ if (crypto_openssl_header_version_str == NULL) {
+ crypto_openssl_header_version_str =
+ parse_openssl_version_str(OPENSSL_VERSION_TEXT);
+ }
+ return crypto_openssl_header_version_str;
+}
+
+/** Make sure that openssl is using its default PRNG. Return 1 if we had to
+ * adjust it; 0 otherwise. */
+static int
+crypto_force_rand_ssleay(void)
+{
+ if (RAND_get_rand_method() != RAND_SSLeay()) {
+ log_notice(LD_CRYPTO, "It appears that one of our engines has provided "
+ "a replacement the OpenSSL RNG. Resetting it to the default "
+ "implementation.");
+ RAND_set_rand_method(RAND_SSLeay());
+ return 1;
+ }
+ return 0;
+}
+
+/** Set up the siphash key if we haven't already done so. */
+int
+crypto_init_siphash_key(void)
+{
+ static int have_seeded_siphash = 0;
+ struct sipkey key;
+ if (have_seeded_siphash)
+ return 0;
+
+ if (crypto_rand((char*) &key, sizeof(key)) < 0)
+ return -1;
+ siphash_set_global_key(&key);
+ have_seeded_siphash = 1;
+ return 0;
+}
+
/** Initialize the crypto library. Return 0 on success, -1 on failure.
*/
int
-crypto_global_init(int useAccel, const char *accelName, const char *accelDir)
+crypto_early_init(void)
{
- if (!crypto_global_initialized_) {
+ if (!crypto_early_initialized_) {
+
+ crypto_early_initialized_ = 1;
+
ERR_load_crypto_strings();
OpenSSL_add_all_algorithms();
- crypto_global_initialized_ = 1;
+
setup_openssl_threading();
if (SSLeay() == OPENSSL_VERSION_NUMBER &&
@@ -251,6 +309,26 @@ crypto_global_init(int useAccel, const char *accelName, const char *accelDir)
crypto_openssl_get_version_str());
}
+ crypto_force_rand_ssleay();
+
+ if (crypto_seed_rng(1) < 0)
+ return -1;
+ if (crypto_init_siphash_key() < 0)
+ return -1;
+ }
+ return 0;
+}
+
+/** Initialize the crypto library. Return 0 on success, -1 on failure.
+ */
+int
+crypto_global_init(int useAccel, const char *accelName, const char *accelDir)
+{
+ if (!crypto_global_initialized_) {
+ crypto_early_init();
+
+ crypto_global_initialized_ = 1;
+
if (useAccel > 0) {
#ifdef DISABLE_ENGINES
(void)accelName;
@@ -286,28 +364,41 @@ crypto_global_init(int useAccel, const char *accelName, const char *accelDir)
" setting default ciphers.");
ENGINE_set_default(e, ENGINE_METHOD_ALL);
}
+ /* Log, if available, the intersection of the set of algorithms
+ used by Tor and the set of algorithms available in the engine */
log_engine("RSA", ENGINE_get_default_RSA());
log_engine("DH", ENGINE_get_default_DH());
+ log_engine("ECDH", ENGINE_get_default_ECDH());
+ log_engine("ECDSA", ENGINE_get_default_ECDSA());
+ log_engine("RAND", ENGINE_get_default_RAND());
log_engine("RAND (which we will not use)", ENGINE_get_default_RAND());
log_engine("SHA1", ENGINE_get_digest_engine(NID_sha1));
- log_engine("3DES", ENGINE_get_cipher_engine(NID_des_ede3_ecb));
- log_engine("AES", ENGINE_get_cipher_engine(NID_aes_128_ecb));
+ log_engine("3DES-CBC", ENGINE_get_cipher_engine(NID_des_ede3_cbc));
+ log_engine("AES-128-ECB", ENGINE_get_cipher_engine(NID_aes_128_ecb));
+ log_engine("AES-128-CBC", ENGINE_get_cipher_engine(NID_aes_128_cbc));
+#ifdef NID_aes_128_ctr
+ log_engine("AES-128-CTR", ENGINE_get_cipher_engine(NID_aes_128_ctr));
+#endif
+#ifdef NID_aes_128_gcm
+ log_engine("AES-128-GCM", ENGINE_get_cipher_engine(NID_aes_128_gcm));
+#endif
+ log_engine("AES-256-CBC", ENGINE_get_cipher_engine(NID_aes_256_cbc));
+#ifdef NID_aes_256_gcm
+ log_engine("AES-256-GCM", ENGINE_get_cipher_engine(NID_aes_256_gcm));
+#endif
+
#endif
} else {
log_info(LD_CRYPTO, "NOT using OpenSSL engine support.");
}
- if (RAND_get_rand_method() != RAND_SSLeay()) {
- log_notice(LD_CRYPTO, "It appears that one of our engines has provided "
- "a replacement the OpenSSL RNG. Resetting it to the default "
- "implementation.");
- RAND_set_rand_method(RAND_SSLeay());
+ if (crypto_force_rand_ssleay()) {
+ if (crypto_seed_rng(1) < 0)
+ return -1;
}
evaluate_evp_for_aes(-1);
evaluate_ctr_for_aes();
-
- return crypto_seed_rng(1);
}
return 0;
}
@@ -1161,22 +1252,21 @@ int
crypto_pk_asn1_encode(crypto_pk_t *pk, char *dest, size_t dest_len)
{
int len;
- unsigned char *buf, *cp;
- len = i2d_RSAPublicKey(pk->key, NULL);
- if (len < 0 || (size_t)len > dest_len || dest_len > SIZE_T_CEILING)
+ unsigned char *buf = NULL;
+
+ len = i2d_RSAPublicKey(pk->key, &buf);
+ if (len < 0 || buf == NULL)
return -1;
- cp = buf = tor_malloc(len+1);
- len = i2d_RSAPublicKey(pk->key, &cp);
- if (len < 0) {
- crypto_log_errors(LOG_WARN,"encoding public key");
- tor_free(buf);
+
+ if ((size_t)len > dest_len || dest_len > SIZE_T_CEILING) {
+ OPENSSL_free(buf);
return -1;
}
/* We don't encode directly into 'dest', because that would be illegal
* type-punning. (C99 is smarter than me, C99 is smarter than me...)
*/
memcpy(dest,buf,len);
- tor_free(buf);
+ OPENSSL_free(buf);
return len;
}
@@ -1207,24 +1297,17 @@ crypto_pk_asn1_decode(const char *str, size_t len)
int
crypto_pk_get_digest(crypto_pk_t *pk, char *digest_out)
{
- unsigned char *buf, *bufp;
+ unsigned char *buf = NULL;
int len;
- len = i2d_RSAPublicKey(pk->key, NULL);
- if (len < 0)
- return -1;
- buf = bufp = tor_malloc(len+1);
- len = i2d_RSAPublicKey(pk->key, &bufp);
- if (len < 0) {
- crypto_log_errors(LOG_WARN,"encoding public key");
- tor_free(buf);
+ len = i2d_RSAPublicKey(pk->key, &buf);
+ if (len < 0 || buf == NULL)
return -1;
- }
if (crypto_digest(digest_out, (char*)buf, len) < 0) {
- tor_free(buf);
+ OPENSSL_free(buf);
return -1;
}
- tor_free(buf);
+ OPENSSL_free(buf);
return 0;
}
@@ -1233,31 +1316,24 @@ crypto_pk_get_digest(crypto_pk_t *pk, char *digest_out)
int
crypto_pk_get_all_digests(crypto_pk_t *pk, digests_t *digests_out)
{
- unsigned char *buf, *bufp;
+ unsigned char *buf = NULL;
int len;
- len = i2d_RSAPublicKey(pk->key, NULL);
- if (len < 0)
+ len = i2d_RSAPublicKey(pk->key, &buf);
+ if (len < 0 || buf == NULL)
return -1;
- buf = bufp = tor_malloc(len+1);
- len = i2d_RSAPublicKey(pk->key, &bufp);
- if (len < 0) {
- crypto_log_errors(LOG_WARN,"encoding public key");
- tor_free(buf);
- return -1;
- }
if (crypto_digest_all(digests_out, (char*)buf, len) < 0) {
- tor_free(buf);
+ OPENSSL_free(buf);
return -1;
}
- tor_free(buf);
+ OPENSSL_free(buf);
return 0;
}
/** Copy <b>in</b> to the <b>outlen</b>-byte buffer <b>out</b>, adding spaces
* every four spaces. */
-/* static */ void
-add_spaces_to_fp(char *out, size_t outlen, const char *in)
+void
+crypto_add_spaces_to_fp(char *out, size_t outlen, const char *in)
{
int n = 0;
char *end = out+outlen;
@@ -1294,13 +1370,35 @@ crypto_pk_get_fingerprint(crypto_pk_t *pk, char *fp_out, int add_space)
}
base16_encode(hexdigest,sizeof(hexdigest),digest,DIGEST_LEN);
if (add_space) {
- add_spaces_to_fp(fp_out, FINGERPRINT_LEN+1, hexdigest);
+ crypto_add_spaces_to_fp(fp_out, FINGERPRINT_LEN+1, hexdigest);
} else {
strncpy(fp_out, hexdigest, HEX_DIGEST_LEN+1);
}
return 0;
}
+/** Given a private or public key <b>pk</b>, put a hashed fingerprint of
+ * the public key into <b>fp_out</b> (must have at least FINGERPRINT_LEN+1
+ * bytes of space). Return 0 on success, -1 on failure.
+ *
+ * Hashed fingerprints are computed as the SHA1 digest of the SHA1 digest
+ * of the ASN.1 encoding of the public key, converted to hexadecimal, in
+ * upper case.
+ */
+int
+crypto_pk_get_hashed_fingerprint(crypto_pk_t *pk, char *fp_out)
+{
+ char digest[DIGEST_LEN], hashed_digest[DIGEST_LEN];
+ if (crypto_pk_get_digest(pk, digest)) {
+ return -1;
+ }
+ if (crypto_digest(hashed_digest, digest, DIGEST_LEN)) {
+ return -1;
+ }
+ base16_encode(fp_out, FINGERPRINT_LEN + 1, hashed_digest, DIGEST_LEN);
+ return 0;
+}
+
/* symmetric crypto */
/** Return a pointer to the key set for the cipher in <b>env</b>.
@@ -1496,7 +1594,7 @@ struct crypto_digest_t {
SHA256_CTX sha2; /**< state for SHA256 */
} d; /**< State for the digest we're using. Only one member of the
* union is usable, depending on the value of <b>algorithm</b>. */
- ENUM_BF(digest_algorithm_t) algorithm : 8; /**< Which algorithm is in use? */
+ digest_algorithm_bitfield_t algorithm : 8; /**< Which algorithm is in use? */
};
/** Allocate and return a new digest object to compute SHA1 digests.
@@ -1644,21 +1742,6 @@ crypto_digest_smartlist(char *digest_out, size_t len_out,
crypto_digest_free(d);
}
-/** Compute the HMAC-SHA-1 of the <b>msg_len</b> bytes in <b>msg</b>, using
- * the <b>key</b> of length <b>key_len</b>. Store the DIGEST_LEN-byte result
- * in <b>hmac_out</b>.
- */
-void
-crypto_hmac_sha1(char *hmac_out,
- const char *key, size_t key_len,
- const char *msg, size_t msg_len)
-{
- tor_assert(key_len < INT_MAX);
- tor_assert(msg_len < INT_MAX);
- HMAC(EVP_sha1(), key, (int)key_len, (unsigned char*)msg, (int)msg_len,
- (unsigned char*)hmac_out, NULL);
-}
-
/** Compute the HMAC-SHA-256 of the <b>msg_len</b> bytes in <b>msg</b>, using
* the <b>key</b> of length <b>key_len</b>. Store the DIGEST256_LEN-byte
* result in <b>hmac_out</b>.
@@ -1727,7 +1810,7 @@ crypto_store_dynamic_dh_modulus(const char *fname)
{
int len, new_len;
DH *dh = NULL;
- unsigned char *dh_string_repr = NULL, *cp = NULL;
+ unsigned char *dh_string_repr = NULL;
char *base64_encoded_dh = NULL;
char *file_string = NULL;
int retval = -1;
@@ -1751,15 +1834,8 @@ crypto_store_dynamic_dh_modulus(const char *fname)
if (!BN_set_word(dh->g, DH_GENERATOR))
goto done;
- len = i2d_DHparams(dh, NULL);
- if (len < 0) {
- log_warn(LD_CRYPTO, "Error occured while DER encoding DH modulus (1).");
- goto done;
- }
-
- cp = dh_string_repr = tor_malloc_zero(len+1);
- len = i2d_DHparams(dh, &cp);
- if ((len < 0) || ((cp - dh_string_repr) != len)) {
+ len = i2d_DHparams(dh, &dh_string_repr);
+ if ((len < 0) || (dh_string_repr == NULL)) {
log_warn(LD_CRYPTO, "Error occured while DER encoding DH modulus (2).");
goto done;
}
@@ -1786,7 +1862,8 @@ crypto_store_dynamic_dh_modulus(const char *fname)
done:
if (dh)
DH_free(dh);
- tor_free(dh_string_repr);
+ if (dh_string_repr)
+ OPENSSL_free(dh_string_repr);
tor_free(base64_encoded_dh);
tor_free(file_string);
@@ -2394,7 +2471,8 @@ crypto_strongest_rand(uint8_t *out, size_t out_len)
return 0;
#else
for (i = 0; filenames[i]; ++i) {
- fd = open(filenames[i], O_RDONLY, 0);
+ log_debug(LD_FS, "Opening %s for entropy", filenames[i]);
+ fd = open(sandbox_intern_string(filenames[i]), O_RDONLY, 0);
if (fd<0) continue;
log_info(LD_CRYPTO, "Reading entropy from \"%s\"", filenames[i]);
n = read_all(fd, (char*)out, out_len, 0);
@@ -2449,8 +2527,8 @@ crypto_seed_rng(int startup)
/** Write <b>n</b> bytes of strong random data to <b>to</b>. Return 0 on
* success, -1 on failure.
*/
-int
-crypto_rand(char *to, size_t n)
+MOCK_IMPL(int,
+crypto_rand, (char *to, size_t n))
{
int r;
tor_assert(n < INT_MAX);
@@ -3026,7 +3104,7 @@ openssl_locking_cb_(int mode, int n, const char *file, int line)
(void)file;
(void)line;
if (!openssl_mutexes_)
- /* This is not a really good fix for the
+ /* This is not a really good fix for the
* "release-freed-lock-from-separate-thread-on-shutdown" problem, but
* it can't hurt. */
return;
@@ -3144,6 +3222,7 @@ crypto_global_cleanup(void)
}
#endif
tor_free(crypto_openssl_version_str);
+ tor_free(crypto_openssl_header_version_str);
return 0;
}
diff --git a/src/common/crypto.h b/src/common/crypto.h
index 2fbca4c26..aa4271aa3 100644
--- a/src/common/crypto.h
+++ b/src/common/crypto.h
@@ -15,6 +15,7 @@
#include <stdio.h>
#include "torint.h"
+#include "testsupport.h"
/*
Macro to create an arbitrary OpenSSL version number as used by
@@ -69,13 +70,9 @@
* signs removed. */
#define BASE64_DIGEST256_LEN 43
-/** Constant used to indicate PKCS1 padding for public-key encryption */
-#define PK_PKCS1_PADDING 60001
/** Constant used to indicate OAEP padding for public-key encryption */
#define PK_PKCS1_OAEP_PADDING 60002
-/** Number of bytes added for PKCS1 padding. */
-#define PKCS1_PADDING_OVERHEAD 11
/** Number of bytes added for PKCS1-OAEP padding. */
#define PKCS1_OAEP_PADDING_OVERHEAD 42
@@ -92,6 +89,7 @@ typedef enum {
DIGEST_SHA256 = 1,
} digest_algorithm_t;
#define N_DIGEST_ALGORITHMS (DIGEST_SHA256+1)
+#define digest_algorithm_bitfield_t ENUM_BF(digest_algorithm_t)
/** A set of all the digests we know how to compute, taken on a single
* string. Any digests that are shorter than 256 bits are right-padded
@@ -112,6 +110,8 @@ typedef struct crypto_dh_t crypto_dh_t;
/* global state */
const char * crypto_openssl_get_version_str(void);
+const char * crypto_openssl_get_header_version_str(void);
+int crypto_early_init(void);
int crypto_global_init(int hardwareAccel,
const char *accelName,
const char *accelPath);
@@ -183,6 +183,7 @@ crypto_pk_t *crypto_pk_asn1_decode(const char *str, size_t len);
int crypto_pk_get_digest(crypto_pk_t *pk, char *digest_out);
int crypto_pk_get_all_digests(crypto_pk_t *pk, digests_t *digests_out);
int crypto_pk_get_fingerprint(crypto_pk_t *pk, char *fp_out,int add_space);
+int crypto_pk_get_hashed_fingerprint(crypto_pk_t *pk, char *fp_out);
/* symmetric crypto */
const char *crypto_cipher_get_key(crypto_cipher_t *env);
@@ -221,9 +222,6 @@ void crypto_digest_get_digest(crypto_digest_t *digest,
crypto_digest_t *crypto_digest_dup(const crypto_digest_t *digest);
void crypto_digest_assign(crypto_digest_t *into,
const crypto_digest_t *from);
-void crypto_hmac_sha1(char *hmac_out,
- const char *key, size_t key_len,
- const char *msg, size_t msg_len);
void crypto_hmac_sha256(char *hmac_out,
const char *key, size_t key_len,
const char *msg, size_t msg_len);
@@ -254,13 +252,14 @@ int crypto_expand_key_material_rfc5869_sha256(
/* random numbers */
int crypto_seed_rng(int startup);
-int crypto_rand(char *to, size_t n);
+MOCK_DECL(int,crypto_rand,(char *to, size_t n));
int crypto_strongest_rand(uint8_t *out, size_t out_len);
int crypto_rand_int(unsigned int max);
uint64_t crypto_rand_uint64(uint64_t max);
double crypto_rand_double(void);
struct tor_weak_rng_t;
void crypto_seed_weak_rng(struct tor_weak_rng_t *rng);
+int crypto_init_siphash_key(void);
char *crypto_random_hostname(int min_rand_len, int max_rand_len,
const char *prefix, const char *suffix);
@@ -290,7 +289,6 @@ void secret_to_key(char *key_out, size_t key_out_len, const char *secret,
/** OpenSSL-based utility functions. */
void memwipe(void *mem, uint8_t byte, size_t sz);
-#ifdef CRYPTO_PRIVATE
/* Prototypes for private functions only used by tortls.c, crypto.c, and the
* unit tests. */
struct rsa_st;
@@ -301,9 +299,8 @@ crypto_pk_t *crypto_new_pk_from_rsa_(struct rsa_st *rsa);
struct evp_pkey_st *crypto_pk_get_evp_pkey_(crypto_pk_t *env,
int private);
struct dh_st *crypto_dh_get_dh_(crypto_dh_t *dh);
-/* Prototypes for private functions only used by crypto.c and test.c*/
-void add_spaces_to_fp(char *out, size_t outlen, const char *in);
-#endif
+
+void crypto_add_spaces_to_fp(char *out, size_t outlen, const char *in);
#endif
diff --git a/src/common/crypto_curve25519.c b/src/common/crypto_curve25519.c
index 88c723f37..9e83440e1 100644
--- a/src/common/crypto_curve25519.c
+++ b/src/common/crypto_curve25519.c
@@ -29,7 +29,7 @@ int curve25519_donna(uint8_t *mypublic,
#endif
#endif
-int
+STATIC int
curve25519_impl(uint8_t *output, const uint8_t *secret,
const uint8_t *basepoint)
{
diff --git a/src/common/crypto_curve25519.h b/src/common/crypto_curve25519.h
index 652f1883c..57018ac2f 100644
--- a/src/common/crypto_curve25519.h
+++ b/src/common/crypto_curve25519.h
@@ -4,6 +4,7 @@
#ifndef TOR_CRYPTO_CURVE25519_H
#define TOR_CRYPTO_CURVE25519_H
+#include "testsupport.h"
#include "torint.h"
/** Length of a curve25519 public key when encoded. */
@@ -30,6 +31,11 @@ typedef struct curve25519_keypair_t {
} curve25519_keypair_t;
#ifdef CURVE25519_ENABLED
+/* These functions require that we actually know how to use curve25519 keys.
+ * The other data structures and functions in this header let us parse them,
+ * store them, and move them around.
+ */
+
int curve25519_public_key_is_ok(const curve25519_public_key_t *);
int curve25519_secret_key_generate(curve25519_secret_key_t *key_out,
@@ -52,8 +58,8 @@ int curve25519_keypair_read_from_file(curve25519_keypair_t *keypair_out,
const char *fname);
#ifdef CRYPTO_CURVE25519_PRIVATE
-int curve25519_impl(uint8_t *output, const uint8_t *secret,
- const uint8_t *basepoint);
+STATIC int curve25519_impl(uint8_t *output, const uint8_t *secret,
+ const uint8_t *basepoint);
#endif
#endif
diff --git a/src/common/crypto_format.c b/src/common/crypto_format.c
index 93932f839..be669c8d2 100644
--- a/src/common/crypto_format.c
+++ b/src/common/crypto_format.c
@@ -3,7 +3,6 @@
/* Formatting and parsing code for crypto-related data structures. */
-#define CRYPTO_CURVE25519_PRIVATE
#include "orconfig.h"
#ifdef HAVE_SYS_STAT_H
#include <sys/stat.h>
diff --git a/src/common/get_mozilla_ciphers.py b/src/common/get_mozilla_ciphers.py
deleted file mode 100644
index c7e9a84a0..000000000
--- a/src/common/get_mozilla_ciphers.py
+++ /dev/null
@@ -1,192 +0,0 @@
-#!/usr/bin/python
-# coding=utf-8
-# Copyright 2011, The Tor Project, Inc
-# original version by Arturo Filastò
-# See LICENSE for licensing information
-
-# This script parses Firefox and OpenSSL sources, and uses this information
-# to generate a ciphers.inc file.
-#
-# It takes two arguments: the location of a firefox source directory, and the
-# location of an openssl source directory.
-
-import os
-import re
-import sys
-
-if len(sys.argv) != 3:
- print >>sys.stderr, "Syntax: get_mozilla_ciphers.py <firefox-source-dir> <openssl-source-dir>"
- sys.exit(1)
-
-ff_root = sys.argv[1]
-ossl_root = sys.argv[2]
-
-def ff(s):
- return os.path.join(ff_root, s)
-def ossl(s):
- return os.path.join(ossl_root, s)
-
-#####
-# Read the cpp file to understand what Ciphers map to what name :
-# Make "ciphers" a map from name used in the javascript to a cipher macro name
-fileA = open(ff('security/manager/ssl/src/nsNSSComponent.cpp'),'r')
-
-# The input format is a file containing exactly one section of the form:
-# static CipherPref CipherPrefs[] = {
-# {"name", MACRO_NAME}, // comment
-# ...
-# {NULL, 0}
-# }
-
-inCipherSection = False
-cipherLines = []
-for line in fileA:
- if line.startswith('static CipherPref CipherPrefs'):
- # Get the starting boundary of the Cipher Preferences
- inCipherSection = True
- elif inCipherSection:
- line = line.strip()
- if line.startswith('{NULL, 0}'):
- # At the ending boundary of the Cipher Prefs
- break
- else:
- cipherLines.append(line)
-fileA.close()
-
-# Parse the lines and put them into a dict
-ciphers = {}
-cipher_pref = {}
-for line in cipherLines:
- m = re.search(r'^{\s*\"([^\"]+)\",\s*(\S*)\s*}', line)
- if m:
- key,value = m.groups()
- ciphers[key] = value
- cipher_pref[value] = key
-
-####
-# Now find the correct order for the ciphers
-fileC = open(ff('security/nss/lib/ssl/ssl3con.c'), 'r')
-firefox_ciphers = []
-inEnum=False
-for line in fileC:
- if not inEnum:
- if "ssl3CipherSuiteCfg cipherSuites[" in line:
- inEnum = True
- continue
-
- if line.startswith("};"):
- break
-
- m = re.match(r'^\s*\{\s*([A-Z_0-9]+),', line)
- if m:
- firefox_ciphers.append(m.group(1))
-
-fileC.close()
-
-#####
-# Read the JS file to understand what ciphers are enabled. The format is
-# pref("name", true/false);
-# Build a map enabled_ciphers from javascript name to "true" or "false",
-# and an (unordered!) list of the macro names for those ciphers that are
-# enabled.
-fileB = open(ff('netwerk/base/public/security-prefs.js'), 'r')
-
-enabled_ciphers = {}
-for line in fileB:
- m = re.match(r'pref\(\"([^\"]+)\"\s*,\s*(\S*)\s*\)', line)
- if not m:
- continue
- key, val = m.groups()
- if key.startswith("security.ssl3"):
- enabled_ciphers[key] = val
-fileB.close()
-
-used_ciphers = []
-for k, v in enabled_ciphers.items():
- if v == "true":
- used_ciphers.append(ciphers[k])
-
-#oSSLinclude = ('/usr/include/openssl/ssl3.h', '/usr/include/openssl/ssl.h',
-# '/usr/include/openssl/ssl2.h', '/usr/include/openssl/ssl23.h',
-# '/usr/include/openssl/tls1.h')
-oSSLinclude = ('ssl/ssl3.h', 'ssl/ssl.h',
- 'ssl/ssl2.h', 'ssl/ssl23.h',
- 'ssl/tls1.h')
-
-#####
-# This reads the hex code for the ciphers that are used by firefox.
-# sslProtoD is set to a map from macro name to macro value in sslproto.h;
-# cipher_codes is set to an (unordered!) list of these hex values.
-sslProto = open(ff('security/nss/lib/ssl/sslproto.h'), 'r')
-sslProtoD = {}
-
-for line in sslProto:
- m = re.match('#define\s+(\S+)\s+(\S+)', line)
- if m:
- key, value = m.groups()
- sslProtoD[key] = value
-sslProto.close()
-
-cipher_codes = []
-for x in used_ciphers:
- cipher_codes.append(sslProtoD[x].lower())
-
-####
-# Now read through all the openssl include files, and try to find the openssl
-# macro names for those files.
-openssl_macro_by_hex = {}
-all_openssl_macros = {}
-for fl in oSSLinclude:
- fp = open(ossl(fl), 'r')
- for line in fp.readlines():
- m = re.match('#define\s+(\S+)\s+(\S+)', line)
- if m:
- value,key = m.groups()
- if key.startswith('0x') and "_CK_" in value:
- key = key.replace('0x0300','0x').lower()
- #print "%s %s" % (key, value)
- openssl_macro_by_hex[key] = value
- all_openssl_macros[value]=key
- fp.close()
-
-# Now generate the output.
-print """\
-/* This is an include file used to define the list of ciphers clients should
- * advertise. Before including it, you should define the CIPHER and XCIPHER
- * macros.
- *
- * This file was automatically generated by get_mozilla_ciphers.py.
- */"""
-# Go in order by the order in CipherPrefs
-for firefox_macro in firefox_ciphers:
-
- try:
- js_cipher_name = cipher_pref[firefox_macro]
- except KeyError:
- # This one has no javascript preference.
- continue
-
- # The cipher needs to be enabled in security-prefs.js
- if enabled_ciphers.get(js_cipher_name, 'false') != 'true':
- continue
-
- hexval = sslProtoD[firefox_macro].lower()
-
- try:
- openssl_macro = openssl_macro_by_hex[hexval.lower()]
- openssl_macro = openssl_macro.replace("_CK_", "_TXT_")
- if openssl_macro not in all_openssl_macros:
- raise KeyError()
- format = {'hex':hexval, 'macro':openssl_macro, 'note':""}
- except KeyError:
- # openssl doesn't have a macro for this.
- format = {'hex':hexval, 'macro':firefox_macro,
- 'note':"/* No openssl macro found for "+hexval+" */\n"}
-
- res = """\
-%(note)s#ifdef %(macro)s
- CIPHER(%(hex)s, %(macro)s)
-#else
- XCIPHER(%(hex)s, %(macro)s)
-#endif""" % format
- print res
diff --git a/src/common/include.am b/src/common/include.am
index b796ebfae..61a90cd35 100644
--- a/src/common/include.am
+++ b/src/common/include.am
@@ -1,5 +1,15 @@
-noinst_LIBRARIES+= src/common/libor.a src/common/libor-crypto.a src/common/libor-event.a
+noinst_LIBRARIES += \
+ src/common/libor.a \
+ src/common/libor-crypto.a \
+ src/common/libor-event.a
+
+if UNITTESTS_ENABLED
+noinst_LIBRARIES += \
+ src/common/libor-testing.a \
+ src/common/libor-crypto-testing.a \
+ src/common/libor-event-testing.a
+endif
EXTRA_DIST+= \
src/common/common_sha1.i \
@@ -14,9 +24,21 @@ else
libor_extra_source=
endif
+if USE_MEMPOOLS
+libor_mempool_source=src/common/mempool.c
+libor_mempool_header=src/common/mempool.h
+else
+libor_mempool_source=
+libor_mempool_header=
+endif
+
+src_common_libcurve25519_donna_a_CFLAGS=
+
if BUILD_CURVE25519_DONNA
src_common_libcurve25519_donna_a_SOURCES=\
src/ext/curve25519_donna/curve25519-donna.c
+src_common_libcurve25519_donna_a_CFLAGS+=\
+ @F_OMIT_FRAME_POINTER@
noinst_LIBRARIES+=src/common/libcurve25519_donna.a
LIBDONNA=src/common/libcurve25519_donna.a
else
@@ -30,26 +52,27 @@ LIBDONNA=
endif
endif
-src_common_libcurve25519_donna_a_CFLAGS =
-
if CURVE25519_ENABLED
libcrypto_extra_source=src/common/crypto_curve25519.c
endif
-src_common_libor_a_SOURCES = \
+LIBOR_A_SOURCES = \
src/common/address.c \
+ src/common/backtrace.c \
src/common/compat.c \
src/common/container.c \
src/common/di_ops.c \
src/common/log.c \
src/common/memarea.c \
- src/common/mempool.c \
src/common/procmon.c \
src/common/util.c \
src/common/util_codedigest.c \
- $(libor_extra_source)
+ src/common/sandbox.c \
+ src/ext/csiphash.c \
+ $(libor_extra_source) \
+ $(libor_mempool_source)
-src_common_libor_crypto_a_SOURCES = \
+LIBOR_CRYPTO_A_SOURCES = \
src/common/aes.c \
src/common/crypto.c \
src/common/crypto_format.c \
@@ -57,10 +80,27 @@ src_common_libor_crypto_a_SOURCES = \
src/common/tortls.c \
$(libcrypto_extra_source)
-src_common_libor_event_a_SOURCES = src/common/compat_libevent.c
+LIBOR_EVENT_A_SOURCES = src/common/compat_libevent.c
+
+src_common_libor_a_SOURCES = $(LIBOR_A_SOURCES)
+src_common_libor_crypto_a_SOURCES = $(LIBOR_CRYPTO_A_SOURCES)
+src_common_libor_event_a_SOURCES = $(LIBOR_EVENT_A_SOURCES)
+
+src_common_libor_testing_a_SOURCES = $(LIBOR_A_SOURCES)
+src_common_libor_crypto_testing_a_SOURCES = $(LIBOR_CRYPTO_A_SOURCES)
+src_common_libor_event_testing_a_SOURCES = $(LIBOR_EVENT_A_SOURCES)
+
+src_common_libor_testing_a_CPPFLAGS = -DTOR_UNIT_TESTS $(AM_CPPFLAGS)
+src_common_libor_crypto_testing_a_CPPFLAGS = -DTOR_UNIT_TESTS $(AM_CPPFLAGS)
+src_common_libor_event_testing_a_CPPFLAGS = -DTOR_UNIT_TESTS $(AM_CPPFLAGS)
+src_common_libor_testing_a_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS)
+src_common_libor_crypto_testing_a_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS)
+src_common_libor_event_testing_a_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS)
+
COMMONHEADERS = \
src/common/address.h \
+ src/common/backtrace.h \
src/common/aes.h \
src/common/ciphers.inc \
src/common/compat.h \
@@ -70,13 +110,16 @@ COMMONHEADERS = \
src/common/crypto_curve25519.h \
src/common/di_ops.h \
src/common/memarea.h \
- src/common/mempool.h \
+ src/common/linux_syscalls.inc \
src/common/procmon.h \
+ src/common/sandbox.h \
+ src/common/testsupport.h \
src/common/torgzip.h \
src/common/torint.h \
src/common/torlog.h \
src/common/tortls.h \
- src/common/util.h
+ src/common/util.h \
+ $(libor_mempool_header)
noinst_HEADERS+= $(COMMONHEADERS)
diff --git a/src/common/linux_syscalls.inc b/src/common/linux_syscalls.inc
new file mode 100644
index 000000000..cf47c7380
--- /dev/null
+++ b/src/common/linux_syscalls.inc
@@ -0,0 +1,1153 @@
+/* Automatically generated with
+ gen_linux_syscalls.pl /usr/include/asm/unistd*.h
+ Do not edit.
+ */
+static const struct {
+ int syscall_num; const char *syscall_name;
+} SYSCALLS_BY_NUMBER[] = {
+#ifdef __NR__llseek
+ { __NR__llseek, "_llseek" },
+#endif
+#ifdef __NR__newselect
+ { __NR__newselect, "_newselect" },
+#endif
+#ifdef __NR__sysctl
+ { __NR__sysctl, "_sysctl" },
+#endif
+#ifdef __NR_accept
+ { __NR_accept, "accept" },
+#endif
+#ifdef __NR_accept4
+ { __NR_accept4, "accept4" },
+#endif
+#ifdef __NR_access
+ { __NR_access, "access" },
+#endif
+#ifdef __NR_acct
+ { __NR_acct, "acct" },
+#endif
+#ifdef __NR_add_key
+ { __NR_add_key, "add_key" },
+#endif
+#ifdef __NR_adjtimex
+ { __NR_adjtimex, "adjtimex" },
+#endif
+#ifdef __NR_afs_syscall
+ { __NR_afs_syscall, "afs_syscall" },
+#endif
+#ifdef __NR_alarm
+ { __NR_alarm, "alarm" },
+#endif
+#ifdef __NR_arch_prctl
+ { __NR_arch_prctl, "arch_prctl" },
+#endif
+#ifdef __NR_bdflush
+ { __NR_bdflush, "bdflush" },
+#endif
+#ifdef __NR_bind
+ { __NR_bind, "bind" },
+#endif
+#ifdef __NR_break
+ { __NR_break, "break" },
+#endif
+#ifdef __NR_brk
+ { __NR_brk, "brk" },
+#endif
+#ifdef __NR_capget
+ { __NR_capget, "capget" },
+#endif
+#ifdef __NR_capset
+ { __NR_capset, "capset" },
+#endif
+#ifdef __NR_chdir
+ { __NR_chdir, "chdir" },
+#endif
+#ifdef __NR_chmod
+ { __NR_chmod, "chmod" },
+#endif
+#ifdef __NR_chown
+ { __NR_chown, "chown" },
+#endif
+#ifdef __NR_chown32
+ { __NR_chown32, "chown32" },
+#endif
+#ifdef __NR_chroot
+ { __NR_chroot, "chroot" },
+#endif
+#ifdef __NR_clock_adjtime
+ { __NR_clock_adjtime, "clock_adjtime" },
+#endif
+#ifdef __NR_clock_getres
+ { __NR_clock_getres, "clock_getres" },
+#endif
+#ifdef __NR_clock_gettime
+ { __NR_clock_gettime, "clock_gettime" },
+#endif
+#ifdef __NR_clock_nanosleep
+ { __NR_clock_nanosleep, "clock_nanosleep" },
+#endif
+#ifdef __NR_clock_settime
+ { __NR_clock_settime, "clock_settime" },
+#endif
+#ifdef __NR_clone
+ { __NR_clone, "clone" },
+#endif
+#ifdef __NR_close
+ { __NR_close, "close" },
+#endif
+#ifdef __NR_connect
+ { __NR_connect, "connect" },
+#endif
+#ifdef __NR_creat
+ { __NR_creat, "creat" },
+#endif
+#ifdef __NR_create_module
+ { __NR_create_module, "create_module" },
+#endif
+#ifdef __NR_delete_module
+ { __NR_delete_module, "delete_module" },
+#endif
+#ifdef __NR_dup
+ { __NR_dup, "dup" },
+#endif
+#ifdef __NR_dup2
+ { __NR_dup2, "dup2" },
+#endif
+#ifdef __NR_dup3
+ { __NR_dup3, "dup3" },
+#endif
+#ifdef __NR_epoll_create
+ { __NR_epoll_create, "epoll_create" },
+#endif
+#ifdef __NR_epoll_create1
+ { __NR_epoll_create1, "epoll_create1" },
+#endif
+#ifdef __NR_epoll_ctl
+ { __NR_epoll_ctl, "epoll_ctl" },
+#endif
+#ifdef __NR_epoll_ctl_old
+ { __NR_epoll_ctl_old, "epoll_ctl_old" },
+#endif
+#ifdef __NR_epoll_pwait
+ { __NR_epoll_pwait, "epoll_pwait" },
+#endif
+#ifdef __NR_epoll_wait
+ { __NR_epoll_wait, "epoll_wait" },
+#endif
+#ifdef __NR_epoll_wait_old
+ { __NR_epoll_wait_old, "epoll_wait_old" },
+#endif
+#ifdef __NR_eventfd
+ { __NR_eventfd, "eventfd" },
+#endif
+#ifdef __NR_eventfd2
+ { __NR_eventfd2, "eventfd2" },
+#endif
+#ifdef __NR_execve
+ { __NR_execve, "execve" },
+#endif
+#ifdef __NR_exit
+ { __NR_exit, "exit" },
+#endif
+#ifdef __NR_exit_group
+ { __NR_exit_group, "exit_group" },
+#endif
+#ifdef __NR_faccessat
+ { __NR_faccessat, "faccessat" },
+#endif
+#ifdef __NR_fadvise64
+ { __NR_fadvise64, "fadvise64" },
+#endif
+#ifdef __NR_fadvise64_64
+ { __NR_fadvise64_64, "fadvise64_64" },
+#endif
+#ifdef __NR_fallocate
+ { __NR_fallocate, "fallocate" },
+#endif
+#ifdef __NR_fanotify_init
+ { __NR_fanotify_init, "fanotify_init" },
+#endif
+#ifdef __NR_fanotify_mark
+ { __NR_fanotify_mark, "fanotify_mark" },
+#endif
+#ifdef __NR_fchdir
+ { __NR_fchdir, "fchdir" },
+#endif
+#ifdef __NR_fchmod
+ { __NR_fchmod, "fchmod" },
+#endif
+#ifdef __NR_fchmodat
+ { __NR_fchmodat, "fchmodat" },
+#endif
+#ifdef __NR_fchown
+ { __NR_fchown, "fchown" },
+#endif
+#ifdef __NR_fchown32
+ { __NR_fchown32, "fchown32" },
+#endif
+#ifdef __NR_fchownat
+ { __NR_fchownat, "fchownat" },
+#endif
+#ifdef __NR_fcntl
+ { __NR_fcntl, "fcntl" },
+#endif
+#ifdef __NR_fcntl64
+ { __NR_fcntl64, "fcntl64" },
+#endif
+#ifdef __NR_fdatasync
+ { __NR_fdatasync, "fdatasync" },
+#endif
+#ifdef __NR_fgetxattr
+ { __NR_fgetxattr, "fgetxattr" },
+#endif
+#ifdef __NR_finit_module
+ { __NR_finit_module, "finit_module" },
+#endif
+#ifdef __NR_flistxattr
+ { __NR_flistxattr, "flistxattr" },
+#endif
+#ifdef __NR_flock
+ { __NR_flock, "flock" },
+#endif
+#ifdef __NR_fork
+ { __NR_fork, "fork" },
+#endif
+#ifdef __NR_fremovexattr
+ { __NR_fremovexattr, "fremovexattr" },
+#endif
+#ifdef __NR_fsetxattr
+ { __NR_fsetxattr, "fsetxattr" },
+#endif
+#ifdef __NR_fstat
+ { __NR_fstat, "fstat" },
+#endif
+#ifdef __NR_fstat64
+ { __NR_fstat64, "fstat64" },
+#endif
+#ifdef __NR_fstatat64
+ { __NR_fstatat64, "fstatat64" },
+#endif
+#ifdef __NR_fstatfs
+ { __NR_fstatfs, "fstatfs" },
+#endif
+#ifdef __NR_fstatfs64
+ { __NR_fstatfs64, "fstatfs64" },
+#endif
+#ifdef __NR_fsync
+ { __NR_fsync, "fsync" },
+#endif
+#ifdef __NR_ftime
+ { __NR_ftime, "ftime" },
+#endif
+#ifdef __NR_ftruncate
+ { __NR_ftruncate, "ftruncate" },
+#endif
+#ifdef __NR_ftruncate64
+ { __NR_ftruncate64, "ftruncate64" },
+#endif
+#ifdef __NR_futex
+ { __NR_futex, "futex" },
+#endif
+#ifdef __NR_futimesat
+ { __NR_futimesat, "futimesat" },
+#endif
+#ifdef __NR_get_kernel_syms
+ { __NR_get_kernel_syms, "get_kernel_syms" },
+#endif
+#ifdef __NR_get_mempolicy
+ { __NR_get_mempolicy, "get_mempolicy" },
+#endif
+#ifdef __NR_get_robust_list
+ { __NR_get_robust_list, "get_robust_list" },
+#endif
+#ifdef __NR_get_thread_area
+ { __NR_get_thread_area, "get_thread_area" },
+#endif
+#ifdef __NR_getcpu
+ { __NR_getcpu, "getcpu" },
+#endif
+#ifdef __NR_getcwd
+ { __NR_getcwd, "getcwd" },
+#endif
+#ifdef __NR_getdents
+ { __NR_getdents, "getdents" },
+#endif
+#ifdef __NR_getdents64
+ { __NR_getdents64, "getdents64" },
+#endif
+#ifdef __NR_getegid
+ { __NR_getegid, "getegid" },
+#endif
+#ifdef __NR_getegid32
+ { __NR_getegid32, "getegid32" },
+#endif
+#ifdef __NR_geteuid
+ { __NR_geteuid, "geteuid" },
+#endif
+#ifdef __NR_geteuid32
+ { __NR_geteuid32, "geteuid32" },
+#endif
+#ifdef __NR_getgid
+ { __NR_getgid, "getgid" },
+#endif
+#ifdef __NR_getgid32
+ { __NR_getgid32, "getgid32" },
+#endif
+#ifdef __NR_getgroups
+ { __NR_getgroups, "getgroups" },
+#endif
+#ifdef __NR_getgroups32
+ { __NR_getgroups32, "getgroups32" },
+#endif
+#ifdef __NR_getitimer
+ { __NR_getitimer, "getitimer" },
+#endif
+#ifdef __NR_getpeername
+ { __NR_getpeername, "getpeername" },
+#endif
+#ifdef __NR_getpgid
+ { __NR_getpgid, "getpgid" },
+#endif
+#ifdef __NR_getpgrp
+ { __NR_getpgrp, "getpgrp" },
+#endif
+#ifdef __NR_getpid
+ { __NR_getpid, "getpid" },
+#endif
+#ifdef __NR_getpmsg
+ { __NR_getpmsg, "getpmsg" },
+#endif
+#ifdef __NR_getppid
+ { __NR_getppid, "getppid" },
+#endif
+#ifdef __NR_getpriority
+ { __NR_getpriority, "getpriority" },
+#endif
+#ifdef __NR_getresgid
+ { __NR_getresgid, "getresgid" },
+#endif
+#ifdef __NR_getresgid32
+ { __NR_getresgid32, "getresgid32" },
+#endif
+#ifdef __NR_getresuid
+ { __NR_getresuid, "getresuid" },
+#endif
+#ifdef __NR_getresuid32
+ { __NR_getresuid32, "getresuid32" },
+#endif
+#ifdef __NR_getrlimit
+ { __NR_getrlimit, "getrlimit" },
+#endif
+#ifdef __NR_getrusage
+ { __NR_getrusage, "getrusage" },
+#endif
+#ifdef __NR_getsid
+ { __NR_getsid, "getsid" },
+#endif
+#ifdef __NR_getsockname
+ { __NR_getsockname, "getsockname" },
+#endif
+#ifdef __NR_getsockopt
+ { __NR_getsockopt, "getsockopt" },
+#endif
+#ifdef __NR_gettid
+ { __NR_gettid, "gettid" },
+#endif
+#ifdef __NR_gettimeofday
+ { __NR_gettimeofday, "gettimeofday" },
+#endif
+#ifdef __NR_getuid
+ { __NR_getuid, "getuid" },
+#endif
+#ifdef __NR_getuid32
+ { __NR_getuid32, "getuid32" },
+#endif
+#ifdef __NR_getxattr
+ { __NR_getxattr, "getxattr" },
+#endif
+#ifdef __NR_gtty
+ { __NR_gtty, "gtty" },
+#endif
+#ifdef __NR_idle
+ { __NR_idle, "idle" },
+#endif
+#ifdef __NR_init_module
+ { __NR_init_module, "init_module" },
+#endif
+#ifdef __NR_inotify_add_watch
+ { __NR_inotify_add_watch, "inotify_add_watch" },
+#endif
+#ifdef __NR_inotify_init
+ { __NR_inotify_init, "inotify_init" },
+#endif
+#ifdef __NR_inotify_init1
+ { __NR_inotify_init1, "inotify_init1" },
+#endif
+#ifdef __NR_inotify_rm_watch
+ { __NR_inotify_rm_watch, "inotify_rm_watch" },
+#endif
+#ifdef __NR_io_cancel
+ { __NR_io_cancel, "io_cancel" },
+#endif
+#ifdef __NR_io_destroy
+ { __NR_io_destroy, "io_destroy" },
+#endif
+#ifdef __NR_io_getevents
+ { __NR_io_getevents, "io_getevents" },
+#endif
+#ifdef __NR_io_setup
+ { __NR_io_setup, "io_setup" },
+#endif
+#ifdef __NR_io_submit
+ { __NR_io_submit, "io_submit" },
+#endif
+#ifdef __NR_ioctl
+ { __NR_ioctl, "ioctl" },
+#endif
+#ifdef __NR_ioperm
+ { __NR_ioperm, "ioperm" },
+#endif
+#ifdef __NR_iopl
+ { __NR_iopl, "iopl" },
+#endif
+#ifdef __NR_ioprio_get
+ { __NR_ioprio_get, "ioprio_get" },
+#endif
+#ifdef __NR_ioprio_set
+ { __NR_ioprio_set, "ioprio_set" },
+#endif
+#ifdef __NR_ipc
+ { __NR_ipc, "ipc" },
+#endif
+#ifdef __NR_kcmp
+ { __NR_kcmp, "kcmp" },
+#endif
+#ifdef __NR_kexec_load
+ { __NR_kexec_load, "kexec_load" },
+#endif
+#ifdef __NR_keyctl
+ { __NR_keyctl, "keyctl" },
+#endif
+#ifdef __NR_kill
+ { __NR_kill, "kill" },
+#endif
+#ifdef __NR_lchown
+ { __NR_lchown, "lchown" },
+#endif
+#ifdef __NR_lchown32
+ { __NR_lchown32, "lchown32" },
+#endif
+#ifdef __NR_lgetxattr
+ { __NR_lgetxattr, "lgetxattr" },
+#endif
+#ifdef __NR_link
+ { __NR_link, "link" },
+#endif
+#ifdef __NR_linkat
+ { __NR_linkat, "linkat" },
+#endif
+#ifdef __NR_listen
+ { __NR_listen, "listen" },
+#endif
+#ifdef __NR_listxattr
+ { __NR_listxattr, "listxattr" },
+#endif
+#ifdef __NR_llistxattr
+ { __NR_llistxattr, "llistxattr" },
+#endif
+#ifdef __NR_lock
+ { __NR_lock, "lock" },
+#endif
+#ifdef __NR_lookup_dcookie
+ { __NR_lookup_dcookie, "lookup_dcookie" },
+#endif
+#ifdef __NR_lremovexattr
+ { __NR_lremovexattr, "lremovexattr" },
+#endif
+#ifdef __NR_lseek
+ { __NR_lseek, "lseek" },
+#endif
+#ifdef __NR_lsetxattr
+ { __NR_lsetxattr, "lsetxattr" },
+#endif
+#ifdef __NR_lstat
+ { __NR_lstat, "lstat" },
+#endif
+#ifdef __NR_lstat64
+ { __NR_lstat64, "lstat64" },
+#endif
+#ifdef __NR_madvise
+ { __NR_madvise, "madvise" },
+#endif
+#ifdef __NR_mbind
+ { __NR_mbind, "mbind" },
+#endif
+#ifdef __NR_migrate_pages
+ { __NR_migrate_pages, "migrate_pages" },
+#endif
+#ifdef __NR_mincore
+ { __NR_mincore, "mincore" },
+#endif
+#ifdef __NR_mkdir
+ { __NR_mkdir, "mkdir" },
+#endif
+#ifdef __NR_mkdirat
+ { __NR_mkdirat, "mkdirat" },
+#endif
+#ifdef __NR_mknod
+ { __NR_mknod, "mknod" },
+#endif
+#ifdef __NR_mknodat
+ { __NR_mknodat, "mknodat" },
+#endif
+#ifdef __NR_mlock
+ { __NR_mlock, "mlock" },
+#endif
+#ifdef __NR_mlockall
+ { __NR_mlockall, "mlockall" },
+#endif
+#ifdef __NR_mmap
+ { __NR_mmap, "mmap" },
+#endif
+#ifdef __NR_mmap2
+ { __NR_mmap2, "mmap2" },
+#endif
+#ifdef __NR_modify_ldt
+ { __NR_modify_ldt, "modify_ldt" },
+#endif
+#ifdef __NR_mount
+ { __NR_mount, "mount" },
+#endif
+#ifdef __NR_move_pages
+ { __NR_move_pages, "move_pages" },
+#endif
+#ifdef __NR_mprotect
+ { __NR_mprotect, "mprotect" },
+#endif
+#ifdef __NR_mpx
+ { __NR_mpx, "mpx" },
+#endif
+#ifdef __NR_mq_getsetattr
+ { __NR_mq_getsetattr, "mq_getsetattr" },
+#endif
+#ifdef __NR_mq_notify
+ { __NR_mq_notify, "mq_notify" },
+#endif
+#ifdef __NR_mq_open
+ { __NR_mq_open, "mq_open" },
+#endif
+#ifdef __NR_mq_timedreceive
+ { __NR_mq_timedreceive, "mq_timedreceive" },
+#endif
+#ifdef __NR_mq_timedsend
+ { __NR_mq_timedsend, "mq_timedsend" },
+#endif
+#ifdef __NR_mq_unlink
+ { __NR_mq_unlink, "mq_unlink" },
+#endif
+#ifdef __NR_mremap
+ { __NR_mremap, "mremap" },
+#endif
+#ifdef __NR_msgctl
+ { __NR_msgctl, "msgctl" },
+#endif
+#ifdef __NR_msgget
+ { __NR_msgget, "msgget" },
+#endif
+#ifdef __NR_msgrcv
+ { __NR_msgrcv, "msgrcv" },
+#endif
+#ifdef __NR_msgsnd
+ { __NR_msgsnd, "msgsnd" },
+#endif
+#ifdef __NR_msync
+ { __NR_msync, "msync" },
+#endif
+#ifdef __NR_munlock
+ { __NR_munlock, "munlock" },
+#endif
+#ifdef __NR_munlockall
+ { __NR_munlockall, "munlockall" },
+#endif
+#ifdef __NR_munmap
+ { __NR_munmap, "munmap" },
+#endif
+#ifdef __NR_name_to_handle_at
+ { __NR_name_to_handle_at, "name_to_handle_at" },
+#endif
+#ifdef __NR_nanosleep
+ { __NR_nanosleep, "nanosleep" },
+#endif
+#ifdef __NR_newfstatat
+ { __NR_newfstatat, "newfstatat" },
+#endif
+#ifdef __NR_nfsservctl
+ { __NR_nfsservctl, "nfsservctl" },
+#endif
+#ifdef __NR_nice
+ { __NR_nice, "nice" },
+#endif
+#ifdef __NR_oldfstat
+ { __NR_oldfstat, "oldfstat" },
+#endif
+#ifdef __NR_oldlstat
+ { __NR_oldlstat, "oldlstat" },
+#endif
+#ifdef __NR_oldolduname
+ { __NR_oldolduname, "oldolduname" },
+#endif
+#ifdef __NR_oldstat
+ { __NR_oldstat, "oldstat" },
+#endif
+#ifdef __NR_olduname
+ { __NR_olduname, "olduname" },
+#endif
+#ifdef __NR_open
+ { __NR_open, "open" },
+#endif
+#ifdef __NR_open_by_handle_at
+ { __NR_open_by_handle_at, "open_by_handle_at" },
+#endif
+#ifdef __NR_openat
+ { __NR_openat, "openat" },
+#endif
+#ifdef __NR_pause
+ { __NR_pause, "pause" },
+#endif
+#ifdef __NR_perf_event_open
+ { __NR_perf_event_open, "perf_event_open" },
+#endif
+#ifdef __NR_personality
+ { __NR_personality, "personality" },
+#endif
+#ifdef __NR_pipe
+ { __NR_pipe, "pipe" },
+#endif
+#ifdef __NR_pipe2
+ { __NR_pipe2, "pipe2" },
+#endif
+#ifdef __NR_pivot_root
+ { __NR_pivot_root, "pivot_root" },
+#endif
+#ifdef __NR_poll
+ { __NR_poll, "poll" },
+#endif
+#ifdef __NR_ppoll
+ { __NR_ppoll, "ppoll" },
+#endif
+#ifdef __NR_prctl
+ { __NR_prctl, "prctl" },
+#endif
+#ifdef __NR_pread64
+ { __NR_pread64, "pread64" },
+#endif
+#ifdef __NR_preadv
+ { __NR_preadv, "preadv" },
+#endif
+#ifdef __NR_prlimit64
+ { __NR_prlimit64, "prlimit64" },
+#endif
+#ifdef __NR_process_vm_readv
+ { __NR_process_vm_readv, "process_vm_readv" },
+#endif
+#ifdef __NR_process_vm_writev
+ { __NR_process_vm_writev, "process_vm_writev" },
+#endif
+#ifdef __NR_prof
+ { __NR_prof, "prof" },
+#endif
+#ifdef __NR_profil
+ { __NR_profil, "profil" },
+#endif
+#ifdef __NR_pselect6
+ { __NR_pselect6, "pselect6" },
+#endif
+#ifdef __NR_ptrace
+ { __NR_ptrace, "ptrace" },
+#endif
+#ifdef __NR_putpmsg
+ { __NR_putpmsg, "putpmsg" },
+#endif
+#ifdef __NR_pwrite64
+ { __NR_pwrite64, "pwrite64" },
+#endif
+#ifdef __NR_pwritev
+ { __NR_pwritev, "pwritev" },
+#endif
+#ifdef __NR_query_module
+ { __NR_query_module, "query_module" },
+#endif
+#ifdef __NR_quotactl
+ { __NR_quotactl, "quotactl" },
+#endif
+#ifdef __NR_read
+ { __NR_read, "read" },
+#endif
+#ifdef __NR_readahead
+ { __NR_readahead, "readahead" },
+#endif
+#ifdef __NR_readdir
+ { __NR_readdir, "readdir" },
+#endif
+#ifdef __NR_readlink
+ { __NR_readlink, "readlink" },
+#endif
+#ifdef __NR_readlinkat
+ { __NR_readlinkat, "readlinkat" },
+#endif
+#ifdef __NR_readv
+ { __NR_readv, "readv" },
+#endif
+#ifdef __NR_reboot
+ { __NR_reboot, "reboot" },
+#endif
+#ifdef __NR_recvfrom
+ { __NR_recvfrom, "recvfrom" },
+#endif
+#ifdef __NR_recvmmsg
+ { __NR_recvmmsg, "recvmmsg" },
+#endif
+#ifdef __NR_recvmsg
+ { __NR_recvmsg, "recvmsg" },
+#endif
+#ifdef __NR_remap_file_pages
+ { __NR_remap_file_pages, "remap_file_pages" },
+#endif
+#ifdef __NR_removexattr
+ { __NR_removexattr, "removexattr" },
+#endif
+#ifdef __NR_rename
+ { __NR_rename, "rename" },
+#endif
+#ifdef __NR_renameat
+ { __NR_renameat, "renameat" },
+#endif
+#ifdef __NR_request_key
+ { __NR_request_key, "request_key" },
+#endif
+#ifdef __NR_restart_syscall
+ { __NR_restart_syscall, "restart_syscall" },
+#endif
+#ifdef __NR_rmdir
+ { __NR_rmdir, "rmdir" },
+#endif
+#ifdef __NR_rt_sigaction
+ { __NR_rt_sigaction, "rt_sigaction" },
+#endif
+#ifdef __NR_rt_sigpending
+ { __NR_rt_sigpending, "rt_sigpending" },
+#endif
+#ifdef __NR_rt_sigprocmask
+ { __NR_rt_sigprocmask, "rt_sigprocmask" },
+#endif
+#ifdef __NR_rt_sigqueueinfo
+ { __NR_rt_sigqueueinfo, "rt_sigqueueinfo" },
+#endif
+#ifdef __NR_rt_sigreturn
+ { __NR_rt_sigreturn, "rt_sigreturn" },
+#endif
+#ifdef __NR_rt_sigsuspend
+ { __NR_rt_sigsuspend, "rt_sigsuspend" },
+#endif
+#ifdef __NR_rt_sigtimedwait
+ { __NR_rt_sigtimedwait, "rt_sigtimedwait" },
+#endif
+#ifdef __NR_rt_tgsigqueueinfo
+ { __NR_rt_tgsigqueueinfo, "rt_tgsigqueueinfo" },
+#endif
+#ifdef __NR_sched_get_priority_max
+ { __NR_sched_get_priority_max, "sched_get_priority_max" },
+#endif
+#ifdef __NR_sched_get_priority_min
+ { __NR_sched_get_priority_min, "sched_get_priority_min" },
+#endif
+#ifdef __NR_sched_getaffinity
+ { __NR_sched_getaffinity, "sched_getaffinity" },
+#endif
+#ifdef __NR_sched_getparam
+ { __NR_sched_getparam, "sched_getparam" },
+#endif
+#ifdef __NR_sched_getscheduler
+ { __NR_sched_getscheduler, "sched_getscheduler" },
+#endif
+#ifdef __NR_sched_rr_get_interval
+ { __NR_sched_rr_get_interval, "sched_rr_get_interval" },
+#endif
+#ifdef __NR_sched_setaffinity
+ { __NR_sched_setaffinity, "sched_setaffinity" },
+#endif
+#ifdef __NR_sched_setparam
+ { __NR_sched_setparam, "sched_setparam" },
+#endif
+#ifdef __NR_sched_setscheduler
+ { __NR_sched_setscheduler, "sched_setscheduler" },
+#endif
+#ifdef __NR_sched_yield
+ { __NR_sched_yield, "sched_yield" },
+#endif
+#ifdef __NR_security
+ { __NR_security, "security" },
+#endif
+#ifdef __NR_select
+ { __NR_select, "select" },
+#endif
+#ifdef __NR_semctl
+ { __NR_semctl, "semctl" },
+#endif
+#ifdef __NR_semget
+ { __NR_semget, "semget" },
+#endif
+#ifdef __NR_semop
+ { __NR_semop, "semop" },
+#endif
+#ifdef __NR_semtimedop
+ { __NR_semtimedop, "semtimedop" },
+#endif
+#ifdef __NR_sendfile
+ { __NR_sendfile, "sendfile" },
+#endif
+#ifdef __NR_sendfile64
+ { __NR_sendfile64, "sendfile64" },
+#endif
+#ifdef __NR_sendmmsg
+ { __NR_sendmmsg, "sendmmsg" },
+#endif
+#ifdef __NR_sendmsg
+ { __NR_sendmsg, "sendmsg" },
+#endif
+#ifdef __NR_sendto
+ { __NR_sendto, "sendto" },
+#endif
+#ifdef __NR_set_mempolicy
+ { __NR_set_mempolicy, "set_mempolicy" },
+#endif
+#ifdef __NR_set_robust_list
+ { __NR_set_robust_list, "set_robust_list" },
+#endif
+#ifdef __NR_set_thread_area
+ { __NR_set_thread_area, "set_thread_area" },
+#endif
+#ifdef __NR_set_tid_address
+ { __NR_set_tid_address, "set_tid_address" },
+#endif
+#ifdef __NR_setdomainname
+ { __NR_setdomainname, "setdomainname" },
+#endif
+#ifdef __NR_setfsgid
+ { __NR_setfsgid, "setfsgid" },
+#endif
+#ifdef __NR_setfsgid32
+ { __NR_setfsgid32, "setfsgid32" },
+#endif
+#ifdef __NR_setfsuid
+ { __NR_setfsuid, "setfsuid" },
+#endif
+#ifdef __NR_setfsuid32
+ { __NR_setfsuid32, "setfsuid32" },
+#endif
+#ifdef __NR_setgid
+ { __NR_setgid, "setgid" },
+#endif
+#ifdef __NR_setgid32
+ { __NR_setgid32, "setgid32" },
+#endif
+#ifdef __NR_setgroups
+ { __NR_setgroups, "setgroups" },
+#endif
+#ifdef __NR_setgroups32
+ { __NR_setgroups32, "setgroups32" },
+#endif
+#ifdef __NR_sethostname
+ { __NR_sethostname, "sethostname" },
+#endif
+#ifdef __NR_setitimer
+ { __NR_setitimer, "setitimer" },
+#endif
+#ifdef __NR_setns
+ { __NR_setns, "setns" },
+#endif
+#ifdef __NR_setpgid
+ { __NR_setpgid, "setpgid" },
+#endif
+#ifdef __NR_setpriority
+ { __NR_setpriority, "setpriority" },
+#endif
+#ifdef __NR_setregid
+ { __NR_setregid, "setregid" },
+#endif
+#ifdef __NR_setregid32
+ { __NR_setregid32, "setregid32" },
+#endif
+#ifdef __NR_setresgid
+ { __NR_setresgid, "setresgid" },
+#endif
+#ifdef __NR_setresgid32
+ { __NR_setresgid32, "setresgid32" },
+#endif
+#ifdef __NR_setresuid
+ { __NR_setresuid, "setresuid" },
+#endif
+#ifdef __NR_setresuid32
+ { __NR_setresuid32, "setresuid32" },
+#endif
+#ifdef __NR_setreuid
+ { __NR_setreuid, "setreuid" },
+#endif
+#ifdef __NR_setreuid32
+ { __NR_setreuid32, "setreuid32" },
+#endif
+#ifdef __NR_setrlimit
+ { __NR_setrlimit, "setrlimit" },
+#endif
+#ifdef __NR_setsid
+ { __NR_setsid, "setsid" },
+#endif
+#ifdef __NR_setsockopt
+ { __NR_setsockopt, "setsockopt" },
+#endif
+#ifdef __NR_settimeofday
+ { __NR_settimeofday, "settimeofday" },
+#endif
+#ifdef __NR_setuid
+ { __NR_setuid, "setuid" },
+#endif
+#ifdef __NR_setuid32
+ { __NR_setuid32, "setuid32" },
+#endif
+#ifdef __NR_setxattr
+ { __NR_setxattr, "setxattr" },
+#endif
+#ifdef __NR_sgetmask
+ { __NR_sgetmask, "sgetmask" },
+#endif
+#ifdef __NR_shmat
+ { __NR_shmat, "shmat" },
+#endif
+#ifdef __NR_shmctl
+ { __NR_shmctl, "shmctl" },
+#endif
+#ifdef __NR_shmdt
+ { __NR_shmdt, "shmdt" },
+#endif
+#ifdef __NR_shmget
+ { __NR_shmget, "shmget" },
+#endif
+#ifdef __NR_shutdown
+ { __NR_shutdown, "shutdown" },
+#endif
+#ifdef __NR_sigaction
+ { __NR_sigaction, "sigaction" },
+#endif
+#ifdef __NR_sigaltstack
+ { __NR_sigaltstack, "sigaltstack" },
+#endif
+#ifdef __NR_signal
+ { __NR_signal, "signal" },
+#endif
+#ifdef __NR_signalfd
+ { __NR_signalfd, "signalfd" },
+#endif
+#ifdef __NR_signalfd4
+ { __NR_signalfd4, "signalfd4" },
+#endif
+#ifdef __NR_sigpending
+ { __NR_sigpending, "sigpending" },
+#endif
+#ifdef __NR_sigprocmask
+ { __NR_sigprocmask, "sigprocmask" },
+#endif
+#ifdef __NR_sigreturn
+ { __NR_sigreturn, "sigreturn" },
+#endif
+#ifdef __NR_sigsuspend
+ { __NR_sigsuspend, "sigsuspend" },
+#endif
+#ifdef __NR_socket
+ { __NR_socket, "socket" },
+#endif
+#ifdef __NR_socketcall
+ { __NR_socketcall, "socketcall" },
+#endif
+#ifdef __NR_socketpair
+ { __NR_socketpair, "socketpair" },
+#endif
+#ifdef __NR_splice
+ { __NR_splice, "splice" },
+#endif
+#ifdef __NR_ssetmask
+ { __NR_ssetmask, "ssetmask" },
+#endif
+#ifdef __NR_stat
+ { __NR_stat, "stat" },
+#endif
+#ifdef __NR_stat64
+ { __NR_stat64, "stat64" },
+#endif
+#ifdef __NR_statfs
+ { __NR_statfs, "statfs" },
+#endif
+#ifdef __NR_statfs64
+ { __NR_statfs64, "statfs64" },
+#endif
+#ifdef __NR_stime
+ { __NR_stime, "stime" },
+#endif
+#ifdef __NR_stty
+ { __NR_stty, "stty" },
+#endif
+#ifdef __NR_swapoff
+ { __NR_swapoff, "swapoff" },
+#endif
+#ifdef __NR_swapon
+ { __NR_swapon, "swapon" },
+#endif
+#ifdef __NR_symlink
+ { __NR_symlink, "symlink" },
+#endif
+#ifdef __NR_symlinkat
+ { __NR_symlinkat, "symlinkat" },
+#endif
+#ifdef __NR_sync
+ { __NR_sync, "sync" },
+#endif
+#ifdef __NR_sync_file_range
+ { __NR_sync_file_range, "sync_file_range" },
+#endif
+#ifdef __NR_syncfs
+ { __NR_syncfs, "syncfs" },
+#endif
+#ifdef __NR_sysfs
+ { __NR_sysfs, "sysfs" },
+#endif
+#ifdef __NR_sysinfo
+ { __NR_sysinfo, "sysinfo" },
+#endif
+#ifdef __NR_syslog
+ { __NR_syslog, "syslog" },
+#endif
+#ifdef __NR_tee
+ { __NR_tee, "tee" },
+#endif
+#ifdef __NR_tgkill
+ { __NR_tgkill, "tgkill" },
+#endif
+#ifdef __NR_time
+ { __NR_time, "time" },
+#endif
+#ifdef __NR_timer_create
+ { __NR_timer_create, "timer_create" },
+#endif
+#ifdef __NR_timer_delete
+ { __NR_timer_delete, "timer_delete" },
+#endif
+#ifdef __NR_timer_getoverrun
+ { __NR_timer_getoverrun, "timer_getoverrun" },
+#endif
+#ifdef __NR_timer_gettime
+ { __NR_timer_gettime, "timer_gettime" },
+#endif
+#ifdef __NR_timer_settime
+ { __NR_timer_settime, "timer_settime" },
+#endif
+#ifdef __NR_timerfd_create
+ { __NR_timerfd_create, "timerfd_create" },
+#endif
+#ifdef __NR_timerfd_gettime
+ { __NR_timerfd_gettime, "timerfd_gettime" },
+#endif
+#ifdef __NR_timerfd_settime
+ { __NR_timerfd_settime, "timerfd_settime" },
+#endif
+#ifdef __NR_times
+ { __NR_times, "times" },
+#endif
+#ifdef __NR_tkill
+ { __NR_tkill, "tkill" },
+#endif
+#ifdef __NR_truncate
+ { __NR_truncate, "truncate" },
+#endif
+#ifdef __NR_truncate64
+ { __NR_truncate64, "truncate64" },
+#endif
+#ifdef __NR_tuxcall
+ { __NR_tuxcall, "tuxcall" },
+#endif
+#ifdef __NR_ugetrlimit
+ { __NR_ugetrlimit, "ugetrlimit" },
+#endif
+#ifdef __NR_ulimit
+ { __NR_ulimit, "ulimit" },
+#endif
+#ifdef __NR_umask
+ { __NR_umask, "umask" },
+#endif
+#ifdef __NR_umount
+ { __NR_umount, "umount" },
+#endif
+#ifdef __NR_umount2
+ { __NR_umount2, "umount2" },
+#endif
+#ifdef __NR_uname
+ { __NR_uname, "uname" },
+#endif
+#ifdef __NR_unlink
+ { __NR_unlink, "unlink" },
+#endif
+#ifdef __NR_unlinkat
+ { __NR_unlinkat, "unlinkat" },
+#endif
+#ifdef __NR_unshare
+ { __NR_unshare, "unshare" },
+#endif
+#ifdef __NR_uselib
+ { __NR_uselib, "uselib" },
+#endif
+#ifdef __NR_ustat
+ { __NR_ustat, "ustat" },
+#endif
+#ifdef __NR_utime
+ { __NR_utime, "utime" },
+#endif
+#ifdef __NR_utimensat
+ { __NR_utimensat, "utimensat" },
+#endif
+#ifdef __NR_utimes
+ { __NR_utimes, "utimes" },
+#endif
+#ifdef __NR_vfork
+ { __NR_vfork, "vfork" },
+#endif
+#ifdef __NR_vhangup
+ { __NR_vhangup, "vhangup" },
+#endif
+#ifdef __NR_vm86
+ { __NR_vm86, "vm86" },
+#endif
+#ifdef __NR_vm86old
+ { __NR_vm86old, "vm86old" },
+#endif
+#ifdef __NR_vmsplice
+ { __NR_vmsplice, "vmsplice" },
+#endif
+#ifdef __NR_vserver
+ { __NR_vserver, "vserver" },
+#endif
+#ifdef __NR_wait4
+ { __NR_wait4, "wait4" },
+#endif
+#ifdef __NR_waitid
+ { __NR_waitid, "waitid" },
+#endif
+#ifdef __NR_waitpid
+ { __NR_waitpid, "waitpid" },
+#endif
+#ifdef __NR_write
+ { __NR_write, "write" },
+#endif
+#ifdef __NR_writev
+ { __NR_writev, "writev" },
+#endif
+ {0, NULL}
+};
+
diff --git a/src/common/log.c b/src/common/log.c
index e196a1128..517fa4faa 100644
--- a/src/common/log.c
+++ b/src/common/log.c
@@ -36,6 +36,10 @@
#include "torlog.h"
#include "container.h"
+/** Given a severity, yields an index into log_severity_list_t.masks to use
+ * for that severity. */
+#define SEVERITY_MASK_IDX(sev) ((sev) - LOG_ERR)
+
/** @{ */
/** The string we stick at the end of a log message when it is too long,
* and its length. */
@@ -83,12 +87,12 @@ should_log_function_name(log_domain_mask_t domain, int severity)
case LOG_DEBUG:
case LOG_INFO:
/* All debugging messages occur in interesting places. */
- return 1;
+ return (domain & LD_NOFUNCNAME) == 0;
case LOG_NOTICE:
case LOG_WARN:
case LOG_ERR:
/* We care about places where bugs occur. */
- return (domain == LD_BUG);
+ return (domain & (LD_BUG|LD_NOFUNCNAME)) == LD_BUG;
default:
/* Call assert, not tor_assert, since tor_assert calls log on failure. */
assert(0); return 0;
@@ -143,9 +147,6 @@ static INLINE char *format_msg(char *buf, size_t buf_len,
const char *suffix,
const char *format, va_list ap, size_t *msg_len_out)
CHECK_PRINTF(7,0);
-static void logv(int severity, log_domain_mask_t domain, const char *funcname,
- const char *suffix, const char *format, va_list ap)
- CHECK_PRINTF(5,0);
/** Name of the application: used to generate the message we write at the
* start of each new log. */
@@ -332,9 +333,9 @@ format_msg(char *buf, size_t buf_len,
* <b>severity</b>. If provided, <b>funcname</b> is prepended to the
* message. The actual message is derived as from tor_snprintf(format,ap).
*/
-static void
-logv(int severity, log_domain_mask_t domain, const char *funcname,
- const char *suffix, const char *format, va_list ap)
+MOCK_IMPL(STATIC void,
+logv,(int severity, log_domain_mask_t domain, const char *funcname,
+ const char *suffix, const char *format, va_list ap))
{
char buf[10024];
size_t msg_len = 0;
@@ -439,6 +440,149 @@ tor_log(int severity, log_domain_mask_t domain, const char *format, ...)
va_end(ap);
}
+/** Maximum number of fds that will get notifications if we crash */
+#define MAX_SIGSAFE_FDS 8
+/** Array of fds to log crash-style warnings to. */
+static int sigsafe_log_fds[MAX_SIGSAFE_FDS] = { STDERR_FILENO };
+/** The number of elements used in sigsafe_log_fds */
+static int n_sigsafe_log_fds = 1;
+
+/** Write <b>s</b> to each element of sigsafe_log_fds. Return 0 on success, -1
+ * on failure. */
+static int
+tor_log_err_sigsafe_write(const char *s)
+{
+ int i;
+ ssize_t r;
+ size_t len = strlen(s);
+ int err = 0;
+ for (i=0; i < n_sigsafe_log_fds; ++i) {
+ r = write(sigsafe_log_fds[i], s, len);
+ err += (r != (ssize_t)len);
+ }
+ return err ? -1 : 0;
+}
+
+/** Given a list of string arguments ending with a NULL, writes them
+ * to our logs and to stderr (if possible). This function is safe to call
+ * from within a signal handler. */
+void
+tor_log_err_sigsafe(const char *m, ...)
+{
+ va_list ap;
+ const char *x;
+ char timebuf[33];
+ time_t now = time(NULL);
+
+ if (!m)
+ return;
+ if (log_time_granularity >= 2000) {
+ int g = log_time_granularity / 1000;
+ now -= now % g;
+ }
+ timebuf[0] = now < 0 ? '-' : ' ';
+ if (now < 0) now = -now;
+ timebuf[1] = '\0';
+ format_dec_number_sigsafe(now, timebuf+1, sizeof(timebuf)-1);
+ tor_log_err_sigsafe_write("\n=========================================="
+ "================== T=");
+ tor_log_err_sigsafe_write(timebuf);
+ tor_log_err_sigsafe_write("\n");
+ tor_log_err_sigsafe_write(m);
+ va_start(ap, m);
+ while ((x = va_arg(ap, const char*))) {
+ tor_log_err_sigsafe_write(x);
+ }
+ va_end(ap);
+}
+
+/** Set *<b>out</b> to a pointer to an array of the fds to log errors to from
+ * inside a signal handler. Return the number of elements in the array. */
+int
+tor_log_get_sigsafe_err_fds(const int **out)
+{
+ *out = sigsafe_log_fds;
+ return n_sigsafe_log_fds;
+}
+
+/** Helper function; return true iff the <b>n</b>-element array <b>array</b>
+ * contains <b>item</b>. */
+static int
+int_array_contains(const int *array, int n, int item)
+{
+ int j;
+ for (j = 0; j < n; ++j) {
+ if (array[j] == item)
+ return 1;
+ }
+ return 0;
+}
+
+/** Function to call whenever the list of logs changes to get ready to log
+ * from signal handlers. */
+void
+tor_log_update_sigsafe_err_fds(void)
+{
+ const logfile_t *lf;
+ int found_real_stderr = 0;
+
+ LOCK_LOGS();
+ /* Reserve the first one for stderr. This is safe because when we daemonize,
+ * we dup2 /dev/null to stderr, */
+ sigsafe_log_fds[0] = STDERR_FILENO;
+ n_sigsafe_log_fds = 1;
+
+ for (lf = logfiles; lf; lf = lf->next) {
+ /* Don't try callback to the control port, or syslogs: We can't
+ * do them from a signal handler. Don't try stdout: we always do stderr.
+ */
+ if (lf->is_temporary || lf->is_syslog ||
+ lf->callback || lf->seems_dead || lf->fd < 0)
+ continue;
+ if (lf->severities->masks[SEVERITY_MASK_IDX(LOG_ERR)] &
+ (LD_BUG|LD_GENERAL)) {
+ if (lf->fd == STDERR_FILENO)
+ found_real_stderr = 1;
+ /* Avoid duplicates */
+ if (int_array_contains(sigsafe_log_fds, n_sigsafe_log_fds, lf->fd))
+ continue;
+ sigsafe_log_fds[n_sigsafe_log_fds++] = lf->fd;
+ if (n_sigsafe_log_fds == MAX_SIGSAFE_FDS)
+ break;
+ }
+ }
+
+ if (!found_real_stderr &&
+ int_array_contains(sigsafe_log_fds, n_sigsafe_log_fds, STDOUT_FILENO)) {
+ /* Don't use a virtual stderr when we're also logging to stdout. */
+ assert(n_sigsafe_log_fds >= 2); /* Don't use assert inside log functions*/
+ sigsafe_log_fds[0] = sigsafe_log_fds[--n_sigsafe_log_fds];
+ }
+
+ UNLOCK_LOGS();
+}
+
+/** Add to <b>out</b> a copy of every currently configured log file name. Used
+ * to enable access to these filenames with the sandbox code. */
+void
+tor_log_get_logfile_names(smartlist_t *out)
+{
+ logfile_t *lf;
+ tor_assert(out);
+
+ LOCK_LOGS();
+
+ for (lf = logfiles; lf; lf = lf->next) {
+ if (lf->is_temporary || lf->is_syslog || lf->callback)
+ continue;
+ if (lf->filename == NULL)
+ continue;
+ smartlist_add(out, tor_strdup(lf->filename));
+ }
+
+ UNLOCK_LOGS();
+}
+
/** Output a message to the log, prefixed with a function name <b>fn</b>. */
#ifdef __GNUC__
/** GCC-based implementation of the log_fn backend, used when we have
@@ -1153,38 +1297,3 @@ switch_logs_debug(void)
UNLOCK_LOGS();
}
-#if 0
-static void
-dump_log_info(logfile_t *lf)
-{
- const char *tp;
-
- if (lf->filename) {
- printf("=== log into \"%s\" (%s-%s) (%stemporary)\n", lf->filename,
- sev_to_string(lf->min_loglevel),
- sev_to_string(lf->max_loglevel),
- lf->is_temporary?"":"not ");
- } else if (lf->is_syslog) {
- printf("=== syslog (%s-%s) (%stemporary)\n",
- sev_to_string(lf->min_loglevel),
- sev_to_string(lf->max_loglevel),
- lf->is_temporary?"":"not ");
- } else {
- printf("=== log (%s-%s) (%stemporary)\n",
- sev_to_string(lf->min_loglevel),
- sev_to_string(lf->max_loglevel),
- lf->is_temporary?"":"not ");
- }
-}
-
-void
-describe_logs(void)
-{
- logfile_t *lf;
- printf("==== BEGIN LOGS ====\n");
- for (lf = logfiles; lf; lf = lf->next)
- dump_log_info(lf);
- printf("==== END LOGS ====\n");
-}
-#endif
-
diff --git a/src/common/memarea.c b/src/common/memarea.c
index 0ae0ccca1..bcaea0949 100644
--- a/src/common/memarea.c
+++ b/src/common/memarea.c
@@ -29,6 +29,13 @@
#error "void* is neither 4 nor 8 bytes long. I don't know how to align stuff."
#endif
+#if defined(__GNUC__) && defined(FLEXIBLE_ARRAY_MEMBER)
+#define USE_ALIGNED_ATTRIBUTE
+#define U_MEM mem
+#else
+#define U_MEM u.mem
+#endif
+
#ifdef USE_SENTINELS
/** Magic value that we stick at the end of a memarea so we can make sure
* there are no run-off-the-end bugs. */
@@ -39,12 +46,12 @@
* end, set those bytes. */
#define SET_SENTINEL(chunk) \
STMT_BEGIN \
- set_uint32( &(chunk)->u.mem[chunk->mem_size], SENTINEL_VAL ); \
+ set_uint32( &(chunk)->U_MEM[chunk->mem_size], SENTINEL_VAL ); \
STMT_END
/** Assert that the sentinel on a memarea is set correctly. */
#define CHECK_SENTINEL(chunk) \
STMT_BEGIN \
- uint32_t sent_val = get_uint32(&(chunk)->u.mem[chunk->mem_size]); \
+ uint32_t sent_val = get_uint32(&(chunk)->U_MEM[chunk->mem_size]); \
tor_assert(sent_val == SENTINEL_VAL); \
STMT_END
#else
@@ -71,19 +78,23 @@ realign_pointer(void *ptr)
typedef struct memarea_chunk_t {
/** Next chunk in this area. Only kept around so we can free it. */
struct memarea_chunk_t *next_chunk;
- size_t mem_size; /**< How much RAM is available in u.mem, total? */
- char *next_mem; /**< Next position in u.mem to allocate data at. If it's
+ size_t mem_size; /**< How much RAM is available in mem, total? */
+ char *next_mem; /**< Next position in mem to allocate data at. If it's
* greater than or equal to mem+mem_size, this chunk is
* full. */
+#ifdef USE_ALIGNED_ATTRIBUTE
+ char mem[FLEXIBLE_ARRAY_MEMBER] __attribute__((aligned(MEMAREA_ALIGN)));
+#else
union {
char mem[1]; /**< Memory space in this chunk. */
void *void_for_alignment_; /**< Dummy; used to make sure mem is aligned. */
} u;
+#endif
} memarea_chunk_t;
/** How many bytes are needed for overhead before we get to the memory part
* of a chunk? */
-#define CHUNK_HEADER_SIZE STRUCT_OFFSET(memarea_chunk_t, u)
+#define CHUNK_HEADER_SIZE STRUCT_OFFSET(memarea_chunk_t, U_MEM)
/** What's the smallest that we'll allocate a chunk? */
#define CHUNK_SIZE 4096
@@ -121,7 +132,7 @@ alloc_chunk(size_t sz, int freelist_ok)
res = tor_malloc(chunk_size);
res->next_chunk = NULL;
res->mem_size = chunk_size - CHUNK_HEADER_SIZE - SENTINEL_LEN;
- res->next_mem = res->u.mem;
+ res->next_mem = res->U_MEM;
tor_assert(res->next_mem+res->mem_size+SENTINEL_LEN ==
((char*)res)+chunk_size);
tor_assert(realign_pointer(res->next_mem) == res->next_mem);
@@ -140,7 +151,7 @@ chunk_free_unchecked(memarea_chunk_t *chunk)
++freelist_len;
chunk->next_chunk = freelist;
freelist = chunk;
- chunk->next_mem = chunk->u.mem;
+ chunk->next_mem = chunk->U_MEM;
} else {
tor_free(chunk);
}
@@ -183,7 +194,7 @@ memarea_clear(memarea_t *area)
}
area->first->next_chunk = NULL;
}
- area->first->next_mem = area->first->u.mem;
+ area->first->next_mem = area->first->U_MEM;
}
/** Remove all unused memarea chunks from the internal freelist. */
@@ -207,7 +218,7 @@ memarea_owns_ptr(const memarea_t *area, const void *p)
memarea_chunk_t *chunk;
const char *ptr = p;
for (chunk = area->first; chunk; chunk = chunk->next_chunk) {
- if (ptr >= chunk->u.mem && ptr < chunk->next_mem)
+ if (ptr >= chunk->U_MEM && ptr < chunk->next_mem)
return 1;
}
return 0;
@@ -226,7 +237,7 @@ memarea_alloc(memarea_t *area, size_t sz)
tor_assert(sz < SIZE_T_CEILING);
if (sz == 0)
sz = 1;
- if (chunk->next_mem+sz > chunk->u.mem+chunk->mem_size) {
+ if (chunk->next_mem+sz > chunk->U_MEM+chunk->mem_size) {
if (sz+CHUNK_HEADER_SIZE >= CHUNK_SIZE) {
/* This allocation is too big. Stick it in a special chunk, and put
* that chunk second in the list. */
@@ -244,8 +255,8 @@ memarea_alloc(memarea_t *area, size_t sz)
result = chunk->next_mem;
chunk->next_mem = chunk->next_mem + sz;
/* Reinstate these if bug 930 ever comes back
- tor_assert(chunk->next_mem >= chunk->u.mem);
- tor_assert(chunk->next_mem <= chunk->u.mem+chunk->mem_size);
+ tor_assert(chunk->next_mem >= chunk->U_MEM);
+ tor_assert(chunk->next_mem <= chunk->U_MEM+chunk->mem_size);
*/
chunk->next_mem = realign_pointer(chunk->next_mem);
return result;
@@ -280,14 +291,11 @@ memarea_strdup(memarea_t *area, const char *s)
char *
memarea_strndup(memarea_t *area, const char *s, size_t n)
{
- size_t ln;
+ size_t ln = 0;
char *result;
- const char *cp, *end = s+n;
tor_assert(n < SIZE_T_CEILING);
- for (cp = s; cp < end && *cp; ++cp)
+ for (ln = 0; ln < n && s[ln]; ++ln)
;
- /* cp now points to s+n, or to the 0 in the string. */
- ln = cp-s;
result = memarea_alloc(area, ln+1);
memcpy(result, s, ln);
result[ln]='\0';
@@ -304,8 +312,8 @@ memarea_get_stats(memarea_t *area, size_t *allocated_out, size_t *used_out)
for (chunk = area->first; chunk; chunk = chunk->next_chunk) {
CHECK_SENTINEL(chunk);
a += CHUNK_HEADER_SIZE + chunk->mem_size;
- tor_assert(chunk->next_mem >= chunk->u.mem);
- u += CHUNK_HEADER_SIZE + (chunk->next_mem - chunk->u.mem);
+ tor_assert(chunk->next_mem >= chunk->U_MEM);
+ u += CHUNK_HEADER_SIZE + (chunk->next_mem - chunk->U_MEM);
}
*allocated_out = a;
*used_out = u;
@@ -320,9 +328,9 @@ memarea_assert_ok(memarea_t *area)
for (chunk = area->first; chunk; chunk = chunk->next_chunk) {
CHECK_SENTINEL(chunk);
- tor_assert(chunk->next_mem >= chunk->u.mem);
+ tor_assert(chunk->next_mem >= chunk->U_MEM);
tor_assert(chunk->next_mem <=
- (char*) realign_pointer(chunk->u.mem+chunk->mem_size));
+ (char*) realign_pointer(chunk->U_MEM+chunk->mem_size));
}
}
diff --git a/src/common/sandbox.c b/src/common/sandbox.c
new file mode 100644
index 000000000..05b91be7b
--- /dev/null
+++ b/src/common/sandbox.c
@@ -0,0 +1,1838 @@
+/* Copyright (c) 2001 Matej Pfajfar.
+ * Copyright (c) 2001-2004, Roger Dingledine.
+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
+ * Copyright (c) 2007-2013, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file sandbox.c
+ * \brief Code to enable sandboxing.
+ **/
+
+#include "orconfig.h"
+
+#ifndef _LARGEFILE64_SOURCE
+/**
+ * Temporarily required for O_LARGEFILE flag. Needs to be removed
+ * with the libevent fix.
+ */
+#define _LARGEFILE64_SOURCE
+#endif
+
+/** Malloc mprotect limit in bytes. */
+#define MALLOC_MP_LIM 1048576
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "sandbox.h"
+#include "container.h"
+#include "torlog.h"
+#include "torint.h"
+#include "util.h"
+#include "tor_queue.h"
+
+#include "ht.h"
+
+#define DEBUGGING_CLOSE
+
+#if defined(USE_LIBSECCOMP)
+
+#define _GNU_SOURCE
+
+#include <sys/mman.h>
+#include <sys/syscall.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/epoll.h>
+#include <sys/prctl.h>
+#include <linux/futex.h>
+#include <bits/signum.h>
+
+#include <stdarg.h>
+#include <seccomp.h>
+#include <signal.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <time.h>
+#include <poll.h>
+
+#if defined(HAVE_EXECINFO_H) && defined(HAVE_BACKTRACE) && \
+ defined(HAVE_BACKTRACE_SYMBOLS_FD) && defined(HAVE_SIGACTION)
+#define USE_BACKTRACE
+#define EXPOSE_CLEAN_BACKTRACE
+#include "backtrace.h"
+#endif
+
+#ifdef USE_BACKTRACE
+#include <execinfo.h>
+#endif
+
+/**
+ * Linux 32 bit definitions
+ */
+#if defined(__i386__)
+
+#define REG_SYSCALL REG_EAX
+#define M_SYSCALL gregs[REG_SYSCALL]
+
+/**
+ * Linux 64 bit definitions
+ */
+#elif defined(__x86_64__)
+
+#define REG_SYSCALL REG_RAX
+#define M_SYSCALL gregs[REG_SYSCALL]
+
+#elif defined(__arm__)
+
+#define M_SYSCALL arm_r7
+
+#endif
+
+/**Determines if at least one sandbox is active.*/
+static int sandbox_active = 0;
+/** Holds the parameter list configuration for the sandbox.*/
+static sandbox_cfg_t *filter_dynamic = NULL;
+
+#undef SCMP_CMP
+#define SCMP_CMP(a,b,c) ((struct scmp_arg_cmp){(a),(b),(c),0})
+#define SCMP_CMP4(a,b,c,d) ((struct scmp_arg_cmp){(a),(b),(c),(d)})
+/* We use a wrapper here because these masked comparisons seem to be pretty
+ * verbose. Also, it's important to cast to scmp_datum_t before negating the
+ * mask, since otherwise the negation might get applied to a 32 bit value, and
+ * the high bits of the value might get masked out improperly. */
+#define SCMP_CMP_MASKED(a,b,c) \
+ SCMP_CMP4((a), SCMP_CMP_MASKED_EQ, ~(scmp_datum_t)(b), (c))
+
+/** Variable used for storing all syscall numbers that will be allowed with the
+ * stage 1 general Tor sandbox.
+ */
+static int filter_nopar_gen[] = {
+ SCMP_SYS(access),
+ SCMP_SYS(brk),
+ SCMP_SYS(clock_gettime),
+ SCMP_SYS(close),
+ SCMP_SYS(clone),
+ SCMP_SYS(epoll_create),
+ SCMP_SYS(epoll_wait),
+ SCMP_SYS(fcntl),
+ SCMP_SYS(fstat),
+#ifdef __NR_fstat64
+ SCMP_SYS(fstat64),
+#endif
+ SCMP_SYS(getdents64),
+ SCMP_SYS(getegid),
+#ifdef __NR_getegid32
+ SCMP_SYS(getegid32),
+#endif
+ SCMP_SYS(geteuid),
+#ifdef __NR_geteuid32
+ SCMP_SYS(geteuid32),
+#endif
+ SCMP_SYS(getgid),
+#ifdef __NR_getgid32
+ SCMP_SYS(getgid32),
+#endif
+#ifdef __NR_getrlimit
+ SCMP_SYS(getrlimit),
+#endif
+ SCMP_SYS(gettimeofday),
+ SCMP_SYS(gettid),
+ SCMP_SYS(getuid),
+#ifdef __NR_getuid32
+ SCMP_SYS(getuid32),
+#endif
+ SCMP_SYS(lseek),
+#ifdef __NR__llseek
+ SCMP_SYS(_llseek),
+#endif
+ SCMP_SYS(mkdir),
+ SCMP_SYS(mlockall),
+#ifdef __NR_mmap
+ /* XXXX restrict this in the same ways as mmap2 */
+ SCMP_SYS(mmap),
+#endif
+ SCMP_SYS(munmap),
+ SCMP_SYS(read),
+ SCMP_SYS(rt_sigreturn),
+ SCMP_SYS(sched_getaffinity),
+ SCMP_SYS(set_robust_list),
+#ifdef __NR_sigreturn
+ SCMP_SYS(sigreturn),
+#endif
+ SCMP_SYS(stat),
+ SCMP_SYS(uname),
+ SCMP_SYS(write),
+ SCMP_SYS(writev),
+ SCMP_SYS(exit_group),
+ SCMP_SYS(exit),
+
+ SCMP_SYS(madvise),
+#ifdef __NR_stat64
+ // getaddrinfo uses this..
+ SCMP_SYS(stat64),
+#endif
+
+ /*
+ * These socket syscalls are not required on x86_64 and not supported with
+ * some libseccomp versions (eg: 1.0.1)
+ */
+#if defined(__i386)
+ SCMP_SYS(recv),
+ SCMP_SYS(send),
+#endif
+
+ // socket syscalls
+ SCMP_SYS(bind),
+ SCMP_SYS(listen),
+ SCMP_SYS(connect),
+ SCMP_SYS(getsockname),
+ SCMP_SYS(recvmsg),
+ SCMP_SYS(recvfrom),
+ SCMP_SYS(sendto),
+ SCMP_SYS(unlink)
+};
+
+/* These macros help avoid the error where the number of filters we add on a
+ * single rule don't match the arg_cnt param. */
+#define seccomp_rule_add_0(ctx,act,call) \
+ seccomp_rule_add((ctx),(act),(call),0)
+#define seccomp_rule_add_1(ctx,act,call,f1) \
+ seccomp_rule_add((ctx),(act),(call),1,(f1))
+#define seccomp_rule_add_2(ctx,act,call,f1,f2) \
+ seccomp_rule_add((ctx),(act),(call),2,(f1),(f2))
+#define seccomp_rule_add_3(ctx,act,call,f1,f2,f3) \
+ seccomp_rule_add((ctx),(act),(call),3,(f1),(f2),(f3))
+#define seccomp_rule_add_4(ctx,act,call,f1,f2,f3,f4) \
+ seccomp_rule_add((ctx),(act),(call),4,(f1),(f2),(f3),(f4))
+
+/**
+ * Function responsible for setting up the rt_sigaction syscall for
+ * the seccomp filter sandbox.
+ */
+static int
+sb_rt_sigaction(scmp_filter_ctx ctx, sandbox_cfg_t *filter)
+{
+ unsigned i;
+ int rc;
+ int param[] = { SIGINT, SIGTERM, SIGPIPE, SIGUSR1, SIGUSR2, SIGHUP, SIGCHLD,
+#ifdef SIGXFSZ
+ SIGXFSZ
+#endif
+ };
+ (void) filter;
+
+ for (i = 0; i < ARRAY_LENGTH(param); i++) {
+ rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(rt_sigaction),
+ SCMP_CMP(0, SCMP_CMP_EQ, param[i]));
+ if (rc)
+ break;
+ }
+
+ return rc;
+}
+
+#if 0
+/**
+ * Function responsible for setting up the execve syscall for
+ * the seccomp filter sandbox.
+ */
+static int
+sb_execve(scmp_filter_ctx ctx, sandbox_cfg_t *filter)
+{
+ int rc;
+ sandbox_cfg_t *elem = NULL;
+
+ // for each dynamic parameter filters
+ for (elem = filter; elem != NULL; elem = elem->next) {
+ smp_param_t *param = elem->param;
+
+ if (param != NULL && param->prot == 1 && param->syscall
+ == SCMP_SYS(execve)) {
+ rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(execve),
+ SCMP_CMP(0, SCMP_CMP_EQ, param->value));
+ if (rc != 0) {
+ log_err(LD_BUG,"(Sandbox) failed to add execve syscall, received "
+ "libseccomp error %d", rc);
+ return rc;
+ }
+ }
+ }
+
+ return 0;
+}
+#endif
+
+/**
+ * Function responsible for setting up the time syscall for
+ * the seccomp filter sandbox.
+ */
+static int
+sb_time(scmp_filter_ctx ctx, sandbox_cfg_t *filter)
+{
+ (void) filter;
+#ifdef __NR_time
+ return seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(time),
+ SCMP_CMP(0, SCMP_CMP_EQ, 0));
+#else
+ return 0;
+#endif
+}
+
+/**
+ * Function responsible for setting up the accept4 syscall for
+ * the seccomp filter sandbox.
+ */
+static int
+sb_accept4(scmp_filter_ctx ctx, sandbox_cfg_t *filter)
+{
+ int rc = 0;
+ (void)filter;
+
+#ifdef __i386__
+ rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(socketcall),
+ SCMP_CMP(0, SCMP_CMP_EQ, 18));
+ if (rc) {
+ return rc;
+ }
+#endif
+
+ rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(accept4),
+ SCMP_CMP_MASKED(3, SOCK_CLOEXEC|SOCK_NONBLOCK, 0));
+ if (rc) {
+ return rc;
+ }
+
+ return 0;
+}
+
+#ifdef __NR_mmap2
+/**
+ * Function responsible for setting up the mmap2 syscall for
+ * the seccomp filter sandbox.
+ */
+static int
+sb_mmap2(scmp_filter_ctx ctx, sandbox_cfg_t *filter)
+{
+ int rc = 0;
+ (void)filter;
+
+ rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mmap2),
+ SCMP_CMP(2, SCMP_CMP_EQ, PROT_READ),
+ SCMP_CMP(3, SCMP_CMP_EQ, MAP_PRIVATE));
+ if (rc) {
+ return rc;
+ }
+
+ rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mmap2),
+ SCMP_CMP(2, SCMP_CMP_EQ, PROT_NONE),
+ SCMP_CMP(3, SCMP_CMP_EQ, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE));
+ if (rc) {
+ return rc;
+ }
+
+ rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mmap2),
+ SCMP_CMP(2, SCMP_CMP_EQ, PROT_READ|PROT_WRITE),
+ SCMP_CMP(3, SCMP_CMP_EQ, MAP_PRIVATE|MAP_ANONYMOUS));
+ if (rc) {
+ return rc;
+ }
+
+ rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mmap2),
+ SCMP_CMP(2, SCMP_CMP_EQ, PROT_READ|PROT_WRITE),
+ SCMP_CMP(3, SCMP_CMP_EQ,MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK));
+ if (rc) {
+ return rc;
+ }
+
+ rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mmap2),
+ SCMP_CMP(2, SCMP_CMP_EQ, PROT_READ|PROT_WRITE),
+ SCMP_CMP(3, SCMP_CMP_EQ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE));
+ if (rc) {
+ return rc;
+ }
+
+ rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mmap2),
+ SCMP_CMP(2, SCMP_CMP_EQ, PROT_READ|PROT_WRITE),
+ SCMP_CMP(3, SCMP_CMP_EQ, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS));
+ if (rc) {
+ return rc;
+ }
+
+ rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mmap2),
+ SCMP_CMP(2, SCMP_CMP_EQ, PROT_READ|PROT_EXEC),
+ SCMP_CMP(3, SCMP_CMP_EQ, MAP_PRIVATE|MAP_DENYWRITE));
+ if (rc) {
+ return rc;
+ }
+
+ return 0;
+}
+#endif
+
+/**
+ * Function responsible for setting up the open syscall for
+ * the seccomp filter sandbox.
+ */
+static int
+sb_open(scmp_filter_ctx ctx, sandbox_cfg_t *filter)
+{
+ int rc;
+ sandbox_cfg_t *elem = NULL;
+
+ // for each dynamic parameter filters
+ for (elem = filter; elem != NULL; elem = elem->next) {
+ smp_param_t *param = elem->param;
+
+ if (param != NULL && param->prot == 1 && param->syscall
+ == SCMP_SYS(open)) {
+ rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(open),
+ SCMP_CMP(0, SCMP_CMP_EQ, param->value));
+ if (rc != 0) {
+ log_err(LD_BUG,"(Sandbox) failed to add open syscall, received "
+ "libseccomp error %d", rc);
+ return rc;
+ }
+ }
+ }
+
+ rc = seccomp_rule_add_1(ctx, SCMP_ACT_ERRNO(EACCES), SCMP_SYS(open),
+ SCMP_CMP_MASKED(1, O_CLOEXEC|O_NONBLOCK|O_NOCTTY, O_RDONLY));
+ if (rc != 0) {
+ log_err(LD_BUG,"(Sandbox) failed to add open syscall, received libseccomp "
+ "error %d", rc);
+ return rc;
+ }
+
+ return 0;
+}
+
+static int
+sb__sysctl(scmp_filter_ctx ctx, sandbox_cfg_t *filter)
+{
+ int rc;
+ (void) filter;
+ (void) ctx;
+
+ rc = seccomp_rule_add_0(ctx, SCMP_ACT_ERRNO(EPERM), SCMP_SYS(_sysctl));
+ if (rc != 0) {
+ log_err(LD_BUG,"(Sandbox) failed to add _sysctl syscall, "
+ "received libseccomp error %d", rc);
+ return rc;
+ }
+
+ return 0;
+}
+
+/**
+ * Function responsible for setting up the rename syscall for
+ * the seccomp filter sandbox.
+ */
+static int
+sb_rename(scmp_filter_ctx ctx, sandbox_cfg_t *filter)
+{
+ int rc;
+ sandbox_cfg_t *elem = NULL;
+
+ // for each dynamic parameter filters
+ for (elem = filter; elem != NULL; elem = elem->next) {
+ smp_param_t *param = elem->param;
+
+ if (param != NULL && param->prot == 1 &&
+ param->syscall == SCMP_SYS(rename)) {
+
+ rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(rename),
+ SCMP_CMP(0, SCMP_CMP_EQ, param->value),
+ SCMP_CMP(1, SCMP_CMP_EQ, param->value2));
+ if (rc != 0) {
+ log_err(LD_BUG,"(Sandbox) failed to add rename syscall, received "
+ "libseccomp error %d", rc);
+ return rc;
+ }
+ }
+ }
+
+ return 0;
+}
+
+/**
+ * Function responsible for setting up the openat syscall for
+ * the seccomp filter sandbox.
+ */
+static int
+sb_openat(scmp_filter_ctx ctx, sandbox_cfg_t *filter)
+{
+ int rc;
+ sandbox_cfg_t *elem = NULL;
+
+ // for each dynamic parameter filters
+ for (elem = filter; elem != NULL; elem = elem->next) {
+ smp_param_t *param = elem->param;
+
+ if (param != NULL && param->prot == 1 && param->syscall
+ == SCMP_SYS(openat)) {
+ rc = seccomp_rule_add_3(ctx, SCMP_ACT_ALLOW, SCMP_SYS(openat),
+ SCMP_CMP(0, SCMP_CMP_EQ, AT_FDCWD),
+ SCMP_CMP(1, SCMP_CMP_EQ, param->value),
+ SCMP_CMP(2, SCMP_CMP_EQ, O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|
+ O_CLOEXEC));
+ if (rc != 0) {
+ log_err(LD_BUG,"(Sandbox) failed to add openat syscall, received "
+ "libseccomp error %d", rc);
+ return rc;
+ }
+ }
+ }
+
+ return 0;
+}
+
+/**
+ * Function responsible for setting up the socket syscall for
+ * the seccomp filter sandbox.
+ */
+static int
+sb_socket(scmp_filter_ctx ctx, sandbox_cfg_t *filter)
+{
+ int rc = 0;
+ int i;
+ (void) filter;
+
+#ifdef __i386__
+ rc = seccomp_rule_add_0(ctx, SCMP_ACT_ALLOW, SCMP_SYS(socket));
+ if (rc)
+ return rc;
+#endif
+
+ rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(socket),
+ SCMP_CMP(0, SCMP_CMP_EQ, PF_FILE),
+ SCMP_CMP_MASKED(1, SOCK_CLOEXEC|SOCK_NONBLOCK, SOCK_STREAM));
+ if (rc)
+ return rc;
+
+ for (i = 0; i < 2; ++i) {
+ const int pf = i ? PF_INET : PF_INET6;
+
+ rc = seccomp_rule_add_3(ctx, SCMP_ACT_ALLOW, SCMP_SYS(socket),
+ SCMP_CMP(0, SCMP_CMP_EQ, pf),
+ SCMP_CMP_MASKED(1, SOCK_CLOEXEC|SOCK_NONBLOCK, SOCK_STREAM),
+ SCMP_CMP(2, SCMP_CMP_EQ, IPPROTO_TCP));
+ if (rc)
+ return rc;
+
+ rc = seccomp_rule_add_3(ctx, SCMP_ACT_ALLOW, SCMP_SYS(socket),
+ SCMP_CMP(0, SCMP_CMP_EQ, pf),
+ SCMP_CMP_MASKED(1, SOCK_CLOEXEC|SOCK_NONBLOCK, SOCK_DGRAM),
+ SCMP_CMP(2, SCMP_CMP_EQ, IPPROTO_IP));
+ if (rc)
+ return rc;
+ }
+
+ rc = seccomp_rule_add_3(ctx, SCMP_ACT_ALLOW, SCMP_SYS(socket),
+ SCMP_CMP(0, SCMP_CMP_EQ, PF_NETLINK),
+ SCMP_CMP(1, SCMP_CMP_EQ, SOCK_RAW),
+ SCMP_CMP(2, SCMP_CMP_EQ, 0));
+ if (rc)
+ return rc;
+
+ return 0;
+}
+
+/**
+ * Function responsible for setting up the socketpair syscall for
+ * the seccomp filter sandbox.
+ */
+static int
+sb_socketpair(scmp_filter_ctx ctx, sandbox_cfg_t *filter)
+{
+ int rc = 0;
+ (void) filter;
+
+#ifdef __i386__
+ rc = seccomp_rule_add_0(ctx, SCMP_ACT_ALLOW, SCMP_SYS(socketpair));
+ if (rc)
+ return rc;
+#endif
+
+ rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(socketpair),
+ SCMP_CMP(0, SCMP_CMP_EQ, PF_FILE),
+ SCMP_CMP(1, SCMP_CMP_EQ, SOCK_STREAM|SOCK_CLOEXEC));
+ if (rc)
+ return rc;
+
+ return 0;
+}
+
+/**
+ * Function responsible for setting up the setsockopt syscall for
+ * the seccomp filter sandbox.
+ */
+static int
+sb_setsockopt(scmp_filter_ctx ctx, sandbox_cfg_t *filter)
+{
+ int rc = 0;
+ (void) filter;
+
+#ifdef __i386__
+ rc = seccomp_rule_add_0(ctx, SCMP_ACT_ALLOW, SCMP_SYS(setsockopt));
+ if (rc)
+ return rc;
+#endif
+
+ rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(setsockopt),
+ SCMP_CMP(1, SCMP_CMP_EQ, SOL_SOCKET),
+ SCMP_CMP(2, SCMP_CMP_EQ, SO_REUSEADDR));
+ if (rc)
+ return rc;
+
+ rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(setsockopt),
+ SCMP_CMP(1, SCMP_CMP_EQ, SOL_SOCKET),
+ SCMP_CMP(2, SCMP_CMP_EQ, SO_SNDBUF));
+ if (rc)
+ return rc;
+
+ rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(setsockopt),
+ SCMP_CMP(1, SCMP_CMP_EQ, SOL_SOCKET),
+ SCMP_CMP(2, SCMP_CMP_EQ, SO_RCVBUF));
+ if (rc)
+ return rc;
+
+#ifdef IP_TRANSPARENT
+ rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(setsockopt),
+ SCMP_CMP(1, SCMP_CMP_EQ, SOL_IP),
+ SCMP_CMP(2, SCMP_CMP_EQ, IP_TRANSPARENT));
+ if (rc)
+ return rc;
+#endif
+
+ return 0;
+}
+
+/**
+ * Function responsible for setting up the getsockopt syscall for
+ * the seccomp filter sandbox.
+ */
+static int
+sb_getsockopt(scmp_filter_ctx ctx, sandbox_cfg_t *filter)
+{
+ int rc = 0;
+ (void) filter;
+
+#ifdef __i386__
+ rc = seccomp_rule_add_0(ctx, SCMP_ACT_ALLOW, SCMP_SYS(getsockopt));
+ if (rc)
+ return rc;
+#endif
+
+ rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(getsockopt),
+ SCMP_CMP(1, SCMP_CMP_EQ, SOL_SOCKET),
+ SCMP_CMP(2, SCMP_CMP_EQ, SO_ERROR));
+ if (rc)
+ return rc;
+
+ return 0;
+}
+
+#ifdef __NR_fcntl64
+/**
+ * Function responsible for setting up the fcntl64 syscall for
+ * the seccomp filter sandbox.
+ */
+static int
+sb_fcntl64(scmp_filter_ctx ctx, sandbox_cfg_t *filter)
+{
+ int rc = 0;
+ (void) filter;
+
+ rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(fcntl64),
+ SCMP_CMP(1, SCMP_CMP_EQ, F_GETFL));
+ if (rc)
+ return rc;
+
+ rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(fcntl64),
+ SCMP_CMP(1, SCMP_CMP_EQ, F_SETFL),
+ SCMP_CMP(2, SCMP_CMP_EQ, O_RDWR|O_NONBLOCK));
+ if (rc)
+ return rc;
+
+ rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(fcntl64),
+ SCMP_CMP(1, SCMP_CMP_EQ, F_GETFD));
+ if (rc)
+ return rc;
+
+ rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(fcntl64),
+ SCMP_CMP(1, SCMP_CMP_EQ, F_SETFD),
+ SCMP_CMP(2, SCMP_CMP_EQ, FD_CLOEXEC));
+ if (rc)
+ return rc;
+
+ return 0;
+}
+#endif
+
+/**
+ * Function responsible for setting up the epoll_ctl syscall for
+ * the seccomp filter sandbox.
+ *
+ * Note: basically allows everything but will keep for now..
+ */
+static int
+sb_epoll_ctl(scmp_filter_ctx ctx, sandbox_cfg_t *filter)
+{
+ int rc = 0;
+ (void) filter;
+
+ rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(epoll_ctl),
+ SCMP_CMP(1, SCMP_CMP_EQ, EPOLL_CTL_ADD));
+ if (rc)
+ return rc;
+
+ rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(epoll_ctl),
+ SCMP_CMP(1, SCMP_CMP_EQ, EPOLL_CTL_MOD));
+ if (rc)
+ return rc;
+
+ rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(epoll_ctl),
+ SCMP_CMP(1, SCMP_CMP_EQ, EPOLL_CTL_DEL));
+ if (rc)
+ return rc;
+
+ return 0;
+}
+
+/**
+ * Function responsible for setting up the fcntl64 syscall for
+ * the seccomp filter sandbox.
+ *
+ * NOTE: if multiple filters need to be added, the PR_SECCOMP parameter needs
+ * to be whitelisted in this function.
+ */
+static int
+sb_prctl(scmp_filter_ctx ctx, sandbox_cfg_t *filter)
+{
+ int rc = 0;
+ (void) filter;
+
+ rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(prctl),
+ SCMP_CMP(0, SCMP_CMP_EQ, PR_SET_DUMPABLE));
+ if (rc)
+ return rc;
+
+ return 0;
+}
+
+/**
+ * Function responsible for setting up the fcntl64 syscall for
+ * the seccomp filter sandbox.
+ *
+ * NOTE: does not NEED to be here.. currently only occurs before filter; will
+ * keep just in case for the future.
+ */
+static int
+sb_mprotect(scmp_filter_ctx ctx, sandbox_cfg_t *filter)
+{
+ int rc = 0;
+ (void) filter;
+
+ rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mprotect),
+ SCMP_CMP(2, SCMP_CMP_EQ, PROT_READ));
+ if (rc)
+ return rc;
+
+ rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mprotect),
+ SCMP_CMP(2, SCMP_CMP_EQ, PROT_NONE));
+ if (rc)
+ return rc;
+
+ return 0;
+}
+
+/**
+ * Function responsible for setting up the rt_sigprocmask syscall for
+ * the seccomp filter sandbox.
+ */
+static int
+sb_rt_sigprocmask(scmp_filter_ctx ctx, sandbox_cfg_t *filter)
+{
+ int rc = 0;
+ (void) filter;
+
+ rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(rt_sigprocmask),
+ SCMP_CMP(0, SCMP_CMP_EQ, SIG_UNBLOCK));
+ if (rc)
+ return rc;
+
+ rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(rt_sigprocmask),
+ SCMP_CMP(0, SCMP_CMP_EQ, SIG_SETMASK));
+ if (rc)
+ return rc;
+
+ return 0;
+}
+
+/**
+ * Function responsible for setting up the flock syscall for
+ * the seccomp filter sandbox.
+ *
+ * NOTE: does not need to be here, occurs before filter is applied.
+ */
+static int
+sb_flock(scmp_filter_ctx ctx, sandbox_cfg_t *filter)
+{
+ int rc = 0;
+ (void) filter;
+
+ rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(flock),
+ SCMP_CMP(1, SCMP_CMP_EQ, LOCK_EX|LOCK_NB));
+ if (rc)
+ return rc;
+
+ rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(flock),
+ SCMP_CMP(1, SCMP_CMP_EQ, LOCK_UN));
+ if (rc)
+ return rc;
+
+ return 0;
+}
+
+/**
+ * Function responsible for setting up the futex syscall for
+ * the seccomp filter sandbox.
+ */
+static int
+sb_futex(scmp_filter_ctx ctx, sandbox_cfg_t *filter)
+{
+ int rc = 0;
+ (void) filter;
+
+ // can remove
+ rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(futex),
+ SCMP_CMP(1, SCMP_CMP_EQ,
+ FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME));
+ if (rc)
+ return rc;
+
+ rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(futex),
+ SCMP_CMP(1, SCMP_CMP_EQ, FUTEX_WAKE_PRIVATE));
+ if (rc)
+ return rc;
+
+ rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(futex),
+ SCMP_CMP(1, SCMP_CMP_EQ, FUTEX_WAIT_PRIVATE));
+ if (rc)
+ return rc;
+
+ return 0;
+}
+
+/**
+ * Function responsible for setting up the mremap syscall for
+ * the seccomp filter sandbox.
+ *
+ * NOTE: so far only occurs before filter is applied.
+ */
+static int
+sb_mremap(scmp_filter_ctx ctx, sandbox_cfg_t *filter)
+{
+ int rc = 0;
+ (void) filter;
+
+ rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mremap),
+ SCMP_CMP(3, SCMP_CMP_EQ, MREMAP_MAYMOVE));
+ if (rc)
+ return rc;
+
+ return 0;
+}
+
+/**
+ * Function responsible for setting up the poll syscall for
+ * the seccomp filter sandbox.
+ */
+static int
+sb_poll(scmp_filter_ctx ctx, sandbox_cfg_t *filter)
+{
+ int rc = 0;
+ (void) filter;
+
+ rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(poll),
+ SCMP_CMP(1, SCMP_CMP_EQ, 1),
+ SCMP_CMP(2, SCMP_CMP_EQ, 10));
+ if (rc)
+ return rc;
+
+ return 0;
+}
+
+#ifdef __NR_stat64
+/**
+ * Function responsible for setting up the stat64 syscall for
+ * the seccomp filter sandbox.
+ */
+static int
+sb_stat64(scmp_filter_ctx ctx, sandbox_cfg_t *filter)
+{
+ int rc = 0;
+ sandbox_cfg_t *elem = NULL;
+
+ // for each dynamic parameter filters
+ for (elem = filter; elem != NULL; elem = elem->next) {
+ smp_param_t *param = elem->param;
+
+ if (param != NULL && param->prot == 1 && (param->syscall == SCMP_SYS(open)
+ || param->syscall == SCMP_SYS(stat64))) {
+ rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(stat64),
+ SCMP_CMP(0, SCMP_CMP_EQ, param->value));
+ if (rc != 0) {
+ log_err(LD_BUG,"(Sandbox) failed to add open syscall, received "
+ "libseccomp error %d", rc);
+ return rc;
+ }
+ }
+ }
+
+ return 0;
+}
+#endif
+
+/**
+ * Array of function pointers responsible for filtering different syscalls at
+ * a parameter level.
+ */
+static sandbox_filter_func_t filter_func[] = {
+ sb_rt_sigaction,
+ sb_rt_sigprocmask,
+#if 0
+ sb_execve,
+#endif
+ sb_time,
+ sb_accept4,
+#ifdef __NR_mmap2
+ sb_mmap2,
+#endif
+ sb_open,
+ sb_openat,
+ sb__sysctl,
+ sb_rename,
+#ifdef __NR_fcntl64
+ sb_fcntl64,
+#endif
+ sb_epoll_ctl,
+ sb_prctl,
+ sb_mprotect,
+ sb_flock,
+ sb_futex,
+ sb_mremap,
+ sb_poll,
+#ifdef __NR_stat64
+ sb_stat64,
+#endif
+
+ sb_socket,
+ sb_setsockopt,
+ sb_getsockopt,
+ sb_socketpair
+};
+
+const char *
+sandbox_intern_string(const char *str)
+{
+ sandbox_cfg_t *elem;
+
+ if (str == NULL)
+ return NULL;
+
+ for (elem = filter_dynamic; elem != NULL; elem = elem->next) {
+ smp_param_t *param = elem->param;
+
+ if (param->prot) {
+ if (!strcmp(str, (char*)(param->value))) {
+ return (char*)param->value;
+ }
+ if (param->value2 && !strcmp(str, (char*)param->value2)) {
+ return (char*)param->value2;
+ }
+ }
+ }
+
+ if (sandbox_active)
+ log_warn(LD_BUG, "No interned sandbox parameter found for %s", str);
+ return str;
+}
+
+/** DOCDOC */
+static int
+prot_strings_helper(strmap_t *locations,
+ char **pr_mem_next_p,
+ size_t *pr_mem_left_p,
+ intptr_t *value_p)
+{
+ char *param_val;
+ size_t param_size;
+ void *location;
+
+ if (*value_p == 0)
+ return 0;
+
+ param_val = (char*) *value_p;
+ param_size = strlen(param_val) + 1;
+ location = strmap_get(locations, param_val);
+
+ if (location) {
+ // We already interned this string.
+ tor_free(param_val);
+ *value_p = (intptr_t) location;
+ return 0;
+ } else if (*pr_mem_left_p >= param_size) {
+ // copy to protected
+ location = *pr_mem_next_p;
+ memcpy(location, param_val, param_size);
+
+ // re-point el parameter to protected
+ tor_free(param_val);
+ *value_p = (intptr_t) location;
+
+ strmap_set(locations, location, location); /* good real estate advice */
+
+ // move next available protected memory
+ *pr_mem_next_p += param_size;
+ *pr_mem_left_p -= param_size;
+ return 0;
+ } else {
+ log_err(LD_BUG,"(Sandbox) insufficient protected memory!");
+ return -1;
+ }
+}
+
+/**
+ * Protects all the strings in the sandbox's parameter list configuration. It
+ * works by calculating the total amount of memory required by the parameter
+ * list, allocating the memory using mmap, and protecting it from writes with
+ * mprotect().
+ */
+static int
+prot_strings(scmp_filter_ctx ctx, sandbox_cfg_t* cfg)
+{
+ int ret = 0;
+ size_t pr_mem_size = 0, pr_mem_left = 0;
+ char *pr_mem_next = NULL, *pr_mem_base;
+ sandbox_cfg_t *el = NULL;
+ strmap_t *locations = NULL;
+
+ // get total number of bytes required to mmap. (Overestimate.)
+ for (el = cfg; el != NULL; el = el->next) {
+ pr_mem_size += strlen((char*) el->param->value) + 1;
+ if (el->param->value2)
+ pr_mem_size += strlen((char*) el->param->value2) + 1;
+ }
+
+ // allocate protected memory with MALLOC_MP_LIM canary
+ pr_mem_base = (char*) mmap(NULL, MALLOC_MP_LIM + pr_mem_size,
+ PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
+ if (pr_mem_base == MAP_FAILED) {
+ log_err(LD_BUG,"(Sandbox) failed allocate protected memory! mmap: %s",
+ strerror(errno));
+ ret = -1;
+ goto out;
+ }
+
+ pr_mem_next = pr_mem_base + MALLOC_MP_LIM;
+ pr_mem_left = pr_mem_size;
+
+ locations = strmap_new();
+
+ // change el value pointer to protected
+ for (el = cfg; el != NULL; el = el->next) {
+ if (prot_strings_helper(locations, &pr_mem_next, &pr_mem_left,
+ &el->param->value) < 0) {
+ ret = -2;
+ goto out;
+ }
+ if (prot_strings_helper(locations, &pr_mem_next, &pr_mem_left,
+ &el->param->value2) < 0) {
+ ret = -2;
+ goto out;
+ }
+ el->param->prot = 1;
+ }
+
+ // protecting from writes
+ if (mprotect(pr_mem_base, MALLOC_MP_LIM + pr_mem_size, PROT_READ)) {
+ log_err(LD_BUG,"(Sandbox) failed to protect memory! mprotect: %s",
+ strerror(errno));
+ ret = -3;
+ goto out;
+ }
+
+ /*
+ * Setting sandbox restrictions so the string memory cannot be tampered with
+ */
+ // no mremap of the protected base address
+ ret = seccomp_rule_add_1(ctx, SCMP_ACT_KILL, SCMP_SYS(mremap),
+ SCMP_CMP(0, SCMP_CMP_EQ, (intptr_t) pr_mem_base));
+ if (ret) {
+ log_err(LD_BUG,"(Sandbox) mremap protected memory filter fail!");
+ return ret;
+ }
+
+ // no munmap of the protected base address
+ ret = seccomp_rule_add_1(ctx, SCMP_ACT_KILL, SCMP_SYS(munmap),
+ SCMP_CMP(0, SCMP_CMP_EQ, (intptr_t) pr_mem_base));
+ if (ret) {
+ log_err(LD_BUG,"(Sandbox) munmap protected memory filter fail!");
+ return ret;
+ }
+
+ /*
+ * Allow mprotect with PROT_READ|PROT_WRITE because openssl uses it, but
+ * never over the memory region used by the protected strings.
+ *
+ * PROT_READ|PROT_WRITE was originally fully allowed in sb_mprotect(), but
+ * had to be removed due to limitation of libseccomp regarding intervals.
+ *
+ * There is a restriction on how much you can mprotect with R|W up to the
+ * size of the canary.
+ */
+ ret = seccomp_rule_add_3(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mprotect),
+ SCMP_CMP(0, SCMP_CMP_LT, (intptr_t) pr_mem_base),
+ SCMP_CMP(1, SCMP_CMP_LE, MALLOC_MP_LIM),
+ SCMP_CMP(2, SCMP_CMP_EQ, PROT_READ|PROT_WRITE));
+ if (ret) {
+ log_err(LD_BUG,"(Sandbox) mprotect protected memory filter fail (LT)!");
+ return ret;
+ }
+
+ ret = seccomp_rule_add_3(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mprotect),
+ SCMP_CMP(0, SCMP_CMP_GT, (intptr_t) pr_mem_base + pr_mem_size +
+ MALLOC_MP_LIM),
+ SCMP_CMP(1, SCMP_CMP_LE, MALLOC_MP_LIM),
+ SCMP_CMP(2, SCMP_CMP_EQ, PROT_READ|PROT_WRITE));
+ if (ret) {
+ log_err(LD_BUG,"(Sandbox) mprotect protected memory filter fail (GT)!");
+ return ret;
+ }
+
+ out:
+ strmap_free(locations, NULL);
+ return ret;
+}
+
+/**
+ * Auxiliary function used in order to allocate a sandbox_cfg_t element and set
+ * it's values according the the parameter list. All elements are initialised
+ * with the 'prot' field set to false, as the pointer is not protected at this
+ * point.
+ */
+static sandbox_cfg_t*
+new_element2(int syscall, intptr_t value, intptr_t value2)
+{
+ smp_param_t *param = NULL;
+
+ sandbox_cfg_t *elem = tor_malloc_zero(sizeof(sandbox_cfg_t));
+ param = elem->param = tor_malloc_zero(sizeof(smp_param_t));
+
+ param->syscall = syscall;
+ param->value = value;
+ param->value2 = value2;
+ param->prot = 0;
+
+ return elem;
+}
+
+static sandbox_cfg_t*
+new_element(int syscall, intptr_t value)
+{
+ return new_element2(syscall, value, 0);
+}
+
+#ifdef __NR_stat64
+#define SCMP_stat SCMP_SYS(stat64)
+#else
+#define SCMP_stat SCMP_SYS(stat)
+#endif
+
+int
+sandbox_cfg_allow_stat_filename(sandbox_cfg_t **cfg, char *file)
+{
+ sandbox_cfg_t *elem = NULL;
+
+ elem = new_element(SCMP_stat, (intptr_t)(void*) file);
+ if (!elem) {
+ log_err(LD_BUG,"(Sandbox) failed to register parameter!");
+ return -1;
+ }
+
+ elem->next = *cfg;
+ *cfg = elem;
+
+ return 0;
+}
+
+int
+sandbox_cfg_allow_stat_filename_array(sandbox_cfg_t **cfg, ...)
+{
+ int rc = 0;
+ char *fn = NULL;
+
+ va_list ap;
+ va_start(ap, cfg);
+
+ while ((fn = va_arg(ap, char*)) != NULL) {
+ rc = sandbox_cfg_allow_stat_filename(cfg, fn);
+ if (rc) {
+ log_err(LD_BUG,"(Sandbox) sandbox_cfg_allow_stat_filename_array fail");
+ goto end;
+ }
+ }
+
+ end:
+ va_end(ap);
+ return 0;
+}
+
+int
+sandbox_cfg_allow_open_filename(sandbox_cfg_t **cfg, char *file)
+{
+ sandbox_cfg_t *elem = NULL;
+
+ elem = new_element(SCMP_SYS(open), (intptr_t)(void *) file);
+ if (!elem) {
+ log_err(LD_BUG,"(Sandbox) failed to register parameter!");
+ return -1;
+ }
+
+ elem->next = *cfg;
+ *cfg = elem;
+
+ return 0;
+}
+
+int
+sandbox_cfg_allow_rename(sandbox_cfg_t **cfg, char *file1, char *file2)
+{
+ sandbox_cfg_t *elem = NULL;
+
+ elem = new_element2(SCMP_SYS(rename),
+ (intptr_t)(void *) file1,
+ (intptr_t)(void *) file2);
+
+ if (!elem) {
+ log_err(LD_BUG,"(Sandbox) failed to register parameter!");
+ return -1;
+ }
+
+ elem->next = *cfg;
+ *cfg = elem;
+
+ return 0;
+}
+
+int
+sandbox_cfg_allow_open_filename_array(sandbox_cfg_t **cfg, ...)
+{
+ int rc = 0;
+ char *fn = NULL;
+
+ va_list ap;
+ va_start(ap, cfg);
+
+ while ((fn = va_arg(ap, char*)) != NULL) {
+ rc = sandbox_cfg_allow_open_filename(cfg, fn);
+ if (rc) {
+ log_err(LD_BUG,"(Sandbox) sandbox_cfg_allow_open_filename_array fail");
+ goto end;
+ }
+ }
+
+ end:
+ va_end(ap);
+ return 0;
+}
+
+int
+sandbox_cfg_allow_openat_filename(sandbox_cfg_t **cfg, char *file)
+{
+ sandbox_cfg_t *elem = NULL;
+
+ elem = new_element(SCMP_SYS(openat), (intptr_t)(void *) file);
+ if (!elem) {
+ log_err(LD_BUG,"(Sandbox) failed to register parameter!");
+ return -1;
+ }
+
+ elem->next = *cfg;
+ *cfg = elem;
+
+ return 0;
+}
+
+int
+sandbox_cfg_allow_openat_filename_array(sandbox_cfg_t **cfg, ...)
+{
+ int rc = 0;
+ char *fn = NULL;
+
+ va_list ap;
+ va_start(ap, cfg);
+
+ while ((fn = va_arg(ap, char*)) != NULL) {
+ rc = sandbox_cfg_allow_openat_filename(cfg, fn);
+ if (rc) {
+ log_err(LD_BUG,"(Sandbox) sandbox_cfg_allow_openat_filename_array fail");
+ goto end;
+ }
+ }
+
+ end:
+ va_end(ap);
+ return 0;
+}
+
+#if 0
+int
+sandbox_cfg_allow_execve(sandbox_cfg_t **cfg, const char *com)
+{
+ sandbox_cfg_t *elem = NULL;
+
+ elem = new_element(SCMP_SYS(execve), (intptr_t)(void *) com);
+ if (!elem) {
+ log_err(LD_BUG,"(Sandbox) failed to register parameter!");
+ return -1;
+ }
+
+ elem->next = *cfg;
+ *cfg = elem;
+
+ return 0;
+}
+
+int
+sandbox_cfg_allow_execve_array(sandbox_cfg_t **cfg, ...)
+{
+ int rc = 0;
+ char *fn = NULL;
+
+ va_list ap;
+ va_start(ap, cfg);
+
+ while ((fn = va_arg(ap, char*)) != NULL) {
+
+ rc = sandbox_cfg_allow_execve(cfg, fn);
+ if (rc) {
+ log_err(LD_BUG,"(Sandbox) sandbox_cfg_allow_execve_array failed");
+ goto end;
+ }
+ }
+
+ end:
+ va_end(ap);
+ return 0;
+}
+#endif
+
+/** Cache entry for getaddrinfo results; used when sandboxing is implemented
+ * so that we can consult the cache when the sandbox prevents us from doing
+ * getaddrinfo.
+ *
+ * We support only a limited range of getaddrinfo calls, where servname is null
+ * and hints contains only socktype=SOCK_STREAM, family in INET,INET6,UNSPEC.
+ */
+typedef struct cached_getaddrinfo_item_t {
+ HT_ENTRY(cached_getaddrinfo_item_t) node;
+ char *name;
+ int family;
+ /** set if no error; otherwise NULL */
+ struct addrinfo *res;
+ /** 0 for no error; otherwise an EAI_* value */
+ int err;
+} cached_getaddrinfo_item_t;
+
+static unsigned
+cached_getaddrinfo_item_hash(const cached_getaddrinfo_item_t *item)
+{
+ return (unsigned)siphash24g(item->name, strlen(item->name)) + item->family;
+}
+
+static unsigned
+cached_getaddrinfo_items_eq(const cached_getaddrinfo_item_t *a,
+ const cached_getaddrinfo_item_t *b)
+{
+ return (a->family == b->family) && 0 == strcmp(a->name, b->name);
+}
+
+static void
+cached_getaddrinfo_item_free(cached_getaddrinfo_item_t *item)
+{
+ if (item == NULL)
+ return;
+
+ tor_free(item->name);
+ if (item->res)
+ freeaddrinfo(item->res);
+ tor_free(item);
+}
+
+static HT_HEAD(getaddrinfo_cache, cached_getaddrinfo_item_t)
+ getaddrinfo_cache = HT_INITIALIZER();
+
+HT_PROTOTYPE(getaddrinfo_cache, cached_getaddrinfo_item_t, node,
+ cached_getaddrinfo_item_hash,
+ cached_getaddrinfo_items_eq);
+HT_GENERATE(getaddrinfo_cache, cached_getaddrinfo_item_t, node,
+ cached_getaddrinfo_item_hash,
+ cached_getaddrinfo_items_eq,
+ 0.6, tor_malloc_, tor_realloc_, tor_free_);
+
+int
+sandbox_getaddrinfo(const char *name, const char *servname,
+ const struct addrinfo *hints,
+ struct addrinfo **res)
+{
+ int err;
+ struct cached_getaddrinfo_item_t search, *item;
+
+ if (servname != NULL) {
+ log_warn(LD_BUG, "called with non-NULL servname");
+ return EAI_NONAME;
+ }
+ if (name == NULL) {
+ log_warn(LD_BUG, "called with NULL name");
+ return EAI_NONAME;
+ }
+
+ *res = NULL;
+
+ memset(&search, 0, sizeof(search));
+ search.name = (char *) name;
+ search.family = hints ? hints->ai_family : AF_UNSPEC;
+ item = HT_FIND(getaddrinfo_cache, &getaddrinfo_cache, &search);
+
+ if (! sandbox_is_active()) {
+ /* If the sandbox is not turned on yet, then getaddrinfo and store the
+ result. */
+
+ err = getaddrinfo(name, NULL, hints, res);
+ log_info(LD_NET,"(Sandbox) getaddrinfo %s.", err ? "failed" : "succeeded");
+
+ if (! item) {
+ item = tor_malloc_zero(sizeof(*item));
+ item->name = tor_strdup(name);
+ item->family = hints ? hints->ai_family : AF_UNSPEC;
+ HT_INSERT(getaddrinfo_cache, &getaddrinfo_cache, item);
+ }
+
+ if (item->res) {
+ freeaddrinfo(item->res);
+ item->res = NULL;
+ }
+ item->res = *res;
+ item->err = err;
+ return err;
+ }
+
+ /* Otherwise, the sanbox is on. If we have an item, yield its cached
+ result. */
+ if (item) {
+ *res = item->res;
+ return item->err;
+ }
+
+ /* getting here means something went wrong */
+ log_err(LD_BUG,"(Sandbox) failed to get address %s!", name);
+ return EAI_NONAME;
+}
+
+int
+sandbox_add_addrinfo(const char *name)
+{
+ struct addrinfo *res;
+ struct addrinfo hints;
+ int i;
+ static const int families[] = { AF_INET, AF_INET6, AF_UNSPEC };
+
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_socktype = SOCK_STREAM;
+ for (i = 0; i < 3; ++i) {
+ hints.ai_family = families[i];
+
+ res = NULL;
+ (void) sandbox_getaddrinfo(name, NULL, &hints, &res);
+ if (res)
+ sandbox_freeaddrinfo(res);
+ }
+
+ return 0;
+}
+
+void
+sandbox_free_getaddrinfo_cache(void)
+{
+ cached_getaddrinfo_item_t **next, **item;
+
+ for (item = HT_START(getaddrinfo_cache, &getaddrinfo_cache);
+ item;
+ item = next) {
+ next = HT_NEXT_RMV(getaddrinfo_cache, &getaddrinfo_cache, item);
+ cached_getaddrinfo_item_free(*item);
+ }
+
+ HT_CLEAR(getaddrinfo_cache, &getaddrinfo_cache);
+}
+
+/**
+ * Function responsible for going through the parameter syscall filters and
+ * call each function pointer in the list.
+ */
+static int
+add_param_filter(scmp_filter_ctx ctx, sandbox_cfg_t* cfg)
+{
+ unsigned i;
+ int rc = 0;
+
+ // function pointer
+ for (i = 0; i < ARRAY_LENGTH(filter_func); i++) {
+ if ((filter_func[i])(ctx, cfg)) {
+ log_err(LD_BUG,"(Sandbox) failed to add syscall %d, received libseccomp "
+ "error %d", i, rc);
+ return rc;
+ }
+ }
+
+ return 0;
+}
+
+/**
+ * Function responsible of loading the libseccomp syscall filters which do not
+ * have parameter filtering.
+ */
+static int
+add_noparam_filter(scmp_filter_ctx ctx)
+{
+ unsigned i;
+ int rc = 0;
+
+ // add general filters
+ for (i = 0; i < ARRAY_LENGTH(filter_nopar_gen); i++) {
+ rc = seccomp_rule_add_0(ctx, SCMP_ACT_ALLOW, filter_nopar_gen[i]);
+ if (rc != 0) {
+ log_err(LD_BUG,"(Sandbox) failed to add syscall index %d (NR=%d), "
+ "received libseccomp error %d", i, filter_nopar_gen[i], rc);
+ return rc;
+ }
+ }
+
+ return 0;
+}
+
+/**
+ * Function responsible for setting up and enabling a global syscall filter.
+ * The function is a prototype developed for stage 1 of sandboxing Tor.
+ * Returns 0 on success.
+ */
+static int
+install_syscall_filter(sandbox_cfg_t* cfg)
+{
+ int rc = 0;
+ scmp_filter_ctx ctx;
+
+ ctx = seccomp_init(SCMP_ACT_TRAP);
+ if (ctx == NULL) {
+ log_err(LD_BUG,"(Sandbox) failed to initialise libseccomp context");
+ rc = -1;
+ goto end;
+ }
+
+ // protectign sandbox parameter strings
+ if ((rc = prot_strings(ctx, cfg))) {
+ goto end;
+ }
+
+ // add parameter filters
+ if ((rc = add_param_filter(ctx, cfg))) {
+ log_err(LD_BUG, "(Sandbox) failed to add param filters!");
+ goto end;
+ }
+
+ // adding filters with no parameters
+ if ((rc = add_noparam_filter(ctx))) {
+ log_err(LD_BUG, "(Sandbox) failed to add param filters!");
+ goto end;
+ }
+
+ // loading the seccomp2 filter
+ if ((rc = seccomp_load(ctx))) {
+ log_err(LD_BUG, "(Sandbox) failed to load: %d (%s)!", rc,
+ strerror(-rc));
+ goto end;
+ }
+
+ // marking the sandbox as active
+ sandbox_active = 1;
+
+ end:
+ seccomp_release(ctx);
+ return (rc < 0 ? -rc : rc);
+}
+
+#include "linux_syscalls.inc"
+static const char *
+get_syscall_name(int syscall_num)
+{
+ int i;
+ for (i = 0; SYSCALLS_BY_NUMBER[i].syscall_name; ++i) {
+ if (SYSCALLS_BY_NUMBER[i].syscall_num == syscall_num)
+ return SYSCALLS_BY_NUMBER[i].syscall_name;
+ }
+
+ {
+ static char syscall_name_buf[64];
+ format_dec_number_sigsafe(syscall_num,
+ syscall_name_buf, sizeof(syscall_name_buf));
+ return syscall_name_buf;
+ }
+}
+
+#ifdef USE_BACKTRACE
+#define MAX_DEPTH 256
+static void *syscall_cb_buf[MAX_DEPTH];
+#endif
+
+/**
+ * Function called when a SIGSYS is caught by the application. It notifies the
+ * user that an error has occurred and either terminates or allows the
+ * application to continue execution, based on the DEBUGGING_CLOSE symbol.
+ */
+static void
+sigsys_debugging(int nr, siginfo_t *info, void *void_context)
+{
+ ucontext_t *ctx = (ucontext_t *) (void_context);
+ const char *syscall_name;
+ int syscall;
+#ifdef USE_BACKTRACE
+ int depth;
+ int n_fds, i;
+ const int *fds = NULL;
+#endif
+
+ (void) nr;
+
+ if (info->si_code != SYS_SECCOMP)
+ return;
+
+ if (!ctx)
+ return;
+
+ syscall = (int) ctx->uc_mcontext.M_SYSCALL;
+
+#ifdef USE_BACKTRACE
+ depth = backtrace(syscall_cb_buf, MAX_DEPTH);
+ /* Clean up the top stack frame so we get the real function
+ * name for the most recently failing function. */
+ clean_backtrace(syscall_cb_buf, depth, ctx);
+#endif
+
+ syscall_name = get_syscall_name(syscall);
+
+ tor_log_err_sigsafe("(Sandbox) Caught a bad syscall attempt (syscall ",
+ syscall_name,
+ ")\n",
+ NULL);
+
+#ifdef USE_BACKTRACE
+ n_fds = tor_log_get_sigsafe_err_fds(&fds);
+ for (i=0; i < n_fds; ++i)
+ backtrace_symbols_fd(syscall_cb_buf, depth, fds[i]);
+#endif
+
+#if defined(DEBUGGING_CLOSE)
+ _exit(1);
+#endif // DEBUGGING_CLOSE
+}
+
+/**
+ * Function that adds a handler for SIGSYS, which is the signal thrown
+ * when the application is issuing a syscall which is not allowed. The
+ * main purpose of this function is to help with debugging by identifying
+ * filtered syscalls.
+ */
+static int
+install_sigsys_debugging(void)
+{
+ struct sigaction act;
+ sigset_t mask;
+
+ memset(&act, 0, sizeof(act));
+ sigemptyset(&mask);
+ sigaddset(&mask, SIGSYS);
+
+ act.sa_sigaction = &sigsys_debugging;
+ act.sa_flags = SA_SIGINFO;
+ if (sigaction(SIGSYS, &act, NULL) < 0) {
+ log_err(LD_BUG,"(Sandbox) Failed to register SIGSYS signal handler");
+ return -1;
+ }
+
+ if (sigprocmask(SIG_UNBLOCK, &mask, NULL)) {
+ log_err(LD_BUG,"(Sandbox) Failed call to sigprocmask()");
+ return -2;
+ }
+
+ return 0;
+}
+
+/**
+ * Function responsible of registering the sandbox_cfg_t list of parameter
+ * syscall filters to the existing parameter list. This is used for incipient
+ * multiple-sandbox support.
+ */
+static int
+register_cfg(sandbox_cfg_t* cfg)
+{
+ sandbox_cfg_t *elem = NULL;
+
+ if (filter_dynamic == NULL) {
+ filter_dynamic = cfg;
+ return 0;
+ }
+
+ for (elem = filter_dynamic; elem->next != NULL; elem = elem->next)
+ ;
+
+ elem->next = cfg;
+
+ return 0;
+}
+
+#endif // USE_LIBSECCOMP
+
+#ifdef USE_LIBSECCOMP
+/**
+ * Initialises the syscall sandbox filter for any linux architecture, taking
+ * into account various available features for different linux flavours.
+ */
+static int
+initialise_libseccomp_sandbox(sandbox_cfg_t* cfg)
+{
+ if (install_sigsys_debugging())
+ return -1;
+
+ if (install_syscall_filter(cfg))
+ return -2;
+
+ if (register_cfg(cfg))
+ return -3;
+
+ return 0;
+}
+
+int
+sandbox_is_active(void)
+{
+ return sandbox_active != 0;
+}
+#endif // USE_LIBSECCOMP
+
+sandbox_cfg_t*
+sandbox_cfg_new(void)
+{
+ return NULL;
+}
+
+int
+sandbox_init(sandbox_cfg_t *cfg)
+{
+#if defined(USE_LIBSECCOMP)
+ return initialise_libseccomp_sandbox(cfg);
+
+#elif defined(__linux__)
+ (void)cfg;
+ log_warn(LD_GENERAL,
+ "This version of Tor was built without support for sandboxing. To "
+ "build with support for sandboxing on Linux, you must have "
+ "libseccomp and its necessary header files (e.g. seccomp.h).");
+ return 0;
+
+#else
+ (void)cfg;
+ log_warn(LD_GENERAL,
+ "Currently, sandboxing is only implemented on Linux. The feature "
+ "is disabled on your platform.");
+ return 0;
+#endif
+}
+
+#ifndef USE_LIBSECCOMP
+int
+sandbox_cfg_allow_open_filename(sandbox_cfg_t **cfg, char *file)
+{
+ (void)cfg; (void)file;
+ return 0;
+}
+
+int
+sandbox_cfg_allow_open_filename_array(sandbox_cfg_t **cfg, ...)
+{
+ (void)cfg;
+ return 0;
+}
+
+int
+sandbox_cfg_allow_openat_filename(sandbox_cfg_t **cfg, char *file)
+{
+ (void)cfg; (void)file;
+ return 0;
+}
+
+int
+sandbox_cfg_allow_openat_filename_array(sandbox_cfg_t **cfg, ...)
+{
+ (void)cfg;
+ return 0;
+}
+
+#if 0
+int
+sandbox_cfg_allow_execve(sandbox_cfg_t **cfg, const char *com)
+{
+ (void)cfg; (void)com;
+ return 0;
+}
+
+int
+sandbox_cfg_allow_execve_array(sandbox_cfg_t **cfg, ...)
+{
+ (void)cfg;
+ return 0;
+}
+#endif
+
+int
+sandbox_cfg_allow_stat_filename(sandbox_cfg_t **cfg, char *file)
+{
+ (void)cfg; (void)file;
+ return 0;
+}
+
+int
+sandbox_cfg_allow_stat_filename_array(sandbox_cfg_t **cfg, ...)
+{
+ (void)cfg;
+ return 0;
+}
+
+int
+sandbox_cfg_allow_rename(sandbox_cfg_t **cfg, char *file1, char *file2)
+{
+ (void)cfg; (void)file1; (void)file2;
+ return 0;
+}
+
+int
+sandbox_is_active(void)
+{
+ return 0;
+}
+#endif
+
diff --git a/src/common/sandbox.h b/src/common/sandbox.h
new file mode 100644
index 000000000..20d5d5080
--- /dev/null
+++ b/src/common/sandbox.h
@@ -0,0 +1,212 @@
+/* Copyright (c) 2001 Matej Pfajfar.
+ * Copyright (c) 2001-2004, Roger Dingledine.
+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
+ * Copyright (c) 2007-2013, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file sandbox.h
+ * \brief Header file for sandbox.c.
+ **/
+
+#ifndef SANDBOX_H_
+#define SANDBOX_H_
+
+#include "orconfig.h"
+#include "torint.h"
+
+#ifndef SYS_SECCOMP
+
+/**
+ * Used by SIGSYS signal handler to check if the signal was issued due to a
+ * seccomp2 filter violation.
+ */
+#define SYS_SECCOMP 1
+
+#endif
+
+#if defined(HAVE_SECCOMP_H) && defined(__linux__)
+#define USE_LIBSECCOMP
+#endif
+
+struct sandbox_cfg_elem;
+
+/** Typedef to structure used to manage a sandbox configuration. */
+typedef struct sandbox_cfg_elem sandbox_cfg_t;
+
+/**
+ * Linux definitions
+ */
+#ifdef USE_LIBSECCOMP
+
+#ifndef __USE_GNU
+#define __USE_GNU
+#endif
+#include <sys/ucontext.h>
+#include <seccomp.h>
+#include <netdb.h>
+
+#define PARAM_PTR 0
+#define PARAM_NUM 1
+
+/**
+ * Enum used to manage the type of the implementation for general purpose.
+ */
+typedef enum {
+ /** Libseccomp implementation based on seccomp2*/
+ LIBSECCOMP2 = 0
+} SB_IMPL;
+
+/**
+ * Configuration parameter structure associated with the LIBSECCOMP2
+ * implementation.
+ */
+typedef struct smp_param {
+ /** syscall associated with parameter. */
+ int syscall;
+
+ /** parameter value. */
+ intptr_t value;
+ /** parameter value, second argument. */
+ intptr_t value2;
+
+ /** parameter flag (0 = not protected, 1 = protected). */
+ int prot;
+} smp_param_t;
+
+/**
+ * Structure used to manage a sandbox configuration.
+ *
+ * It is implemented as a linked list of parameters. Currently only controls
+ * parameters for open, openat, execve, stat64.
+ */
+struct sandbox_cfg_elem {
+ /** Sandbox implementation which dictates the parameter type. */
+ SB_IMPL implem;
+
+ /** Configuration parameter. */
+ smp_param_t *param;
+
+ /** Next element of the configuration*/
+ struct sandbox_cfg_elem *next;
+};
+
+/** Function pointer defining the prototype of a filter function.*/
+typedef int (*sandbox_filter_func_t)(scmp_filter_ctx ctx,
+ sandbox_cfg_t *filter);
+
+/** Type that will be used in step 3 in order to manage multiple sandboxes.*/
+typedef struct {
+ /** function pointers associated with the filter */
+ sandbox_filter_func_t *filter_func;
+
+ /** filter function pointer parameters */
+ sandbox_cfg_t *filter_dynamic;
+} sandbox_t;
+
+#endif // USE_LIBSECCOMP
+
+#ifdef USE_LIBSECCOMP
+/** Pre-calls getaddrinfo in order to pre-record result. */
+int sandbox_add_addrinfo(const char *addr);
+
+struct addrinfo;
+/** Replacement for getaddrinfo(), using pre-recorded results. */
+int sandbox_getaddrinfo(const char *name, const char *servname,
+ const struct addrinfo *hints,
+ struct addrinfo **res);
+#define sandbox_freeaddrinfo(addrinfo) ((void)0)
+void sandbox_free_getaddrinfo_cache(void);
+#else
+#define sandbox_getaddrinfo(name, servname, hints, res) \
+ getaddrinfo((name),(servname), (hints),(res))
+#define sandbox_add_addrinfo(name) \
+ ((void)(name))
+#define sandbox_freeaddrinfo(addrinfo) \
+ freeaddrinfo((addrinfo))
+#define sandbox_free_getaddrinfo_cache()
+#endif
+
+#ifdef USE_LIBSECCOMP
+/** Returns a registered protected string used with the sandbox, given that
+ * it matches the parameter.
+ */
+const char* sandbox_intern_string(const char *param);
+#else
+#define sandbox_intern_string(s) (s)
+#endif
+
+/** Creates an empty sandbox configuration file.*/
+sandbox_cfg_t * sandbox_cfg_new(void);
+
+/**
+ * Function used to add a open allowed filename to a supplied configuration.
+ * The (char*) specifies the path to the allowed file; we take ownership
+ * of the pointer.
+ */
+int sandbox_cfg_allow_open_filename(sandbox_cfg_t **cfg, char *file);
+
+/**DOCDOC*/
+int sandbox_cfg_allow_rename(sandbox_cfg_t **cfg, char *file1, char *file2);
+
+/** Function used to add a series of open allowed filenames to a supplied
+ * configuration.
+ * @param cfg sandbox configuration.
+ * @param ... a list of stealable pointers to permitted files. The last
+ * one must be NULL.
+*/
+int sandbox_cfg_allow_open_filename_array(sandbox_cfg_t **cfg, ...);
+
+/**
+ * Function used to add a openat allowed filename to a supplied configuration.
+ * The (char*) specifies the path to the allowed file; we steal the pointer to
+ * that file.
+ */
+int sandbox_cfg_allow_openat_filename(sandbox_cfg_t **cfg, char *file);
+
+/** Function used to add a series of openat allowed filenames to a supplied
+ * configuration.
+ * @param cfg sandbox configuration.
+ * @param ... a list of stealable pointers to permitted files. The last
+ * one must be NULL.
+ */
+int sandbox_cfg_allow_openat_filename_array(sandbox_cfg_t **cfg, ...);
+
+#if 0
+/**
+ * Function used to add a execve allowed filename to a supplied configuration.
+ * The (char*) specifies the path to the allowed file; that pointer is stolen.
+ */
+int sandbox_cfg_allow_execve(sandbox_cfg_t **cfg, const char *com);
+
+/** Function used to add a series of execve allowed filenames to a supplied
+ * configuration.
+ * @param cfg sandbox configuration.
+ * @param ... an array of stealable pointers to permitted files. The last
+ * one must be NULL.
+ */
+int sandbox_cfg_allow_execve_array(sandbox_cfg_t **cfg, ...);
+#endif
+
+/**
+ * Function used to add a stat/stat64 allowed filename to a configuration.
+ * The (char*) specifies the path to the allowed file; that pointer is stolen.
+ */
+int sandbox_cfg_allow_stat_filename(sandbox_cfg_t **cfg, char *file);
+
+/** Function used to add a series of stat64 allowed filenames to a supplied
+ * configuration.
+ * @param cfg sandbox configuration.
+ * @param ... an array of stealable pointers to permitted files. The last
+ * one must be NULL.
+ */
+int sandbox_cfg_allow_stat_filename_array(sandbox_cfg_t **cfg, ...);
+
+/** Function used to initialise a sandbox configuration.*/
+int sandbox_init(sandbox_cfg_t* cfg);
+
+/** Return true iff the sandbox is turned on. */
+int sandbox_is_active(void);
+
+#endif /* SANDBOX_H_ */
+
diff --git a/src/common/testsupport.h b/src/common/testsupport.h
new file mode 100644
index 000000000..4a4f50b69
--- /dev/null
+++ b/src/common/testsupport.h
@@ -0,0 +1,80 @@
+/* Copyright (c) 2013, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#ifndef TOR_TESTSUPPORT_H
+#define TOR_TESTSUPPORT_H
+
+#ifdef TOR_UNIT_TESTS
+#define STATIC
+#else
+#define STATIC static
+#endif
+
+/** Quick and dirty macros to implement test mocking.
+ *
+ * To use them, suppose that you have a function you'd like to mock
+ * with the signature "void writebuf(size_t n, char *buf)". You can then
+ * declare the function as:
+ *
+ * MOCK_DECL(void, writebuf, (size_t n, char *buf));
+ *
+ * and implement it as:
+ *
+ * MOCK_IMPL(void
+ * writebuf,(size_t n, char *buf)
+ * {
+ * ...
+ * }
+ *
+ * For the non-testing build, this will expand simply into:
+ *
+ * void writebuf(size_t n, char *buf);
+ * void
+ * writebuf(size_t n, char *buf)
+ * {
+ * ...
+ * }
+ *
+ * But for the testing case, it will expand into:
+ *
+ * void writebuf__real(size_t n, char *buf);
+ * extern void (*writebuf)(size_t n, char *buf);
+ *
+ * void (*writebuf)(size_t n, char *buf) = writebuf__real;
+ * void
+ * writebuf__real(size_t n, char *buf)
+ * {
+ * ...
+ * }
+ *
+ * This is not a great mocking system! It is deliberately "the simplest
+ * thing that could work", and pays for its simplicity in its lack of
+ * features, and in its uglification of the Tor code. Replacing it with
+ * something clever would be a fine thing.
+ *
+ * @{ */
+#ifdef TOR_UNIT_TESTS
+#define MOCK_DECL(rv, funcname, arglist) \
+ rv funcname ##__real arglist; \
+ extern rv(*funcname) arglist
+#define MOCK_IMPL(rv, funcname, arglist) \
+ rv(*funcname) arglist = funcname ##__real; \
+ rv funcname ##__real arglist
+#define MOCK(func, replacement) \
+ do { \
+ (func) = (replacement); \
+ } while (0)
+#define UNMOCK(func) \
+ do { \
+ func = func ##__real; \
+ } while (0)
+#else
+#define MOCK_DECL(rv, funcname, arglist) \
+ rv funcname arglist
+#define MOCK_IMPL(rv, funcname, arglist) \
+ rv funcname arglist
+#endif
+/** @} */
+
+#endif
+
diff --git a/src/common/torgzip.c b/src/common/torgzip.c
index 4328c63c8..15451ee30 100644
--- a/src/common/torgzip.c
+++ b/src/common/torgzip.c
@@ -68,6 +68,22 @@ is_gzip_supported(void)
return gzip_is_supported;
}
+/** Return a string representation of the version of the currently running
+ * version of zlib. */
+const char *
+tor_zlib_get_version_str(void)
+{
+ return zlibVersion();
+}
+
+/** Return a string representation of the version of the version of zlib
+* used at compilation. */
+const char *
+tor_zlib_get_header_version_str(void)
+{
+ return ZLIB_VERSION;
+}
+
/** Return the 'bits' value to tell zlib to use <b>method</b>.*/
static INLINE int
method_bits(compress_method_t method)
diff --git a/src/common/torgzip.h b/src/common/torgzip.h
index be1016445..5db03fe6e 100644
--- a/src/common/torgzip.h
+++ b/src/common/torgzip.h
@@ -32,6 +32,12 @@ tor_gzip_uncompress(char **out, size_t *out_len,
int is_gzip_supported(void);
+const char *
+tor_zlib_get_version_str(void);
+
+const char *
+tor_zlib_get_header_version_str(void);
+
compress_method_t detect_compression_method(const char *in, size_t in_len);
/** Return values from tor_zlib_process; see that function's documentation for
diff --git a/src/common/torlog.h b/src/common/torlog.h
index 8675d7b6e..34f70f3c0 100644
--- a/src/common/torlog.h
+++ b/src/common/torlog.h
@@ -13,6 +13,7 @@
#ifndef TOR_TORLOG_H
#include "compat.h"
+#include "testsupport.h"
#ifdef HAVE_SYSLOG_H
#include <syslog.h>
@@ -102,6 +103,9 @@
/** This log message is not safe to send to a callback-based logger
* immediately. Used as a flag, not a log domain. */
#define LD_NOCB (1u<<31)
+/** This log message should not include a function name, even if it otherwise
+ * would. Used as a flag, not a log domain. */
+#define LD_NOFUNCNAME (1u<<30)
/** Mask of zero or more log domains, OR'd together. */
typedef uint32_t log_domain_mask_t;
@@ -114,12 +118,6 @@ typedef struct log_severity_list_t {
log_domain_mask_t masks[LOG_DEBUG-LOG_ERR+1];
} log_severity_list_t;
-#ifdef LOG_PRIVATE
-/** Given a severity, yields an index into log_severity_list_t.masks to use
- * for that severity. */
-#define SEVERITY_MASK_IDX(sev) ((sev) - LOG_ERR)
-#endif
-
/** Callback type used for add_callback_log. */
typedef void (*log_callback)(int severity, uint32_t domain, const char *msg);
@@ -154,9 +152,16 @@ void set_log_time_granularity(int granularity_msec);
void tor_log(int severity, log_domain_mask_t domain, const char *format, ...)
CHECK_PRINTF(3,4);
-#if defined(__GNUC__) || defined(RUNNING_DOXYGEN)
+void tor_log_err_sigsafe(const char *m, ...);
+int tor_log_get_sigsafe_err_fds(const int **out);
+void tor_log_update_sigsafe_err_fds(void);
+
+struct smartlist_t;
+void tor_log_get_logfile_names(struct smartlist_t *out);
+
extern int log_global_min_severity_;
+#if defined(__GNUC__) || defined(RUNNING_DOXYGEN)
void log_fn_(int severity, log_domain_mask_t domain,
const char *funcname, const char *format, ...)
CHECK_PRINTF(4,5);
@@ -227,6 +232,12 @@ extern const char *log_fn_function_name_;
#endif /* !GNUC */
+#ifdef LOG_PRIVATE
+MOCK_DECL(STATIC void, logv, (int severity, log_domain_mask_t domain,
+ const char *funcname, const char *suffix, const char *format,
+ va_list ap) CHECK_PRINTF(5,0));
+#endif
+
# define TOR_TORLOG_H
#endif
diff --git a/src/common/tortls.c b/src/common/tortls.c
index 886ee0dda..ea0f21cb2 100644
--- a/src/common/tortls.c
+++ b/src/common/tortls.c
@@ -48,9 +48,6 @@
#include "compat_libevent.h"
#endif
-#define CRYPTO_PRIVATE /* to import prototypes from crypto.h */
-#define TORTLS_PRIVATE
-
#include "crypto.h"
#include "tortls.h"
#include "util.h"
@@ -152,6 +149,7 @@ typedef enum {
TOR_TLS_ST_SENTCLOSE, TOR_TLS_ST_CLOSED, TOR_TLS_ST_RENEGOTIATE,
TOR_TLS_ST_BUFFEREVENT
} tor_tls_state_t;
+#define tor_tls_state_bitfield_t ENUM_BF(tor_tls_state_t)
/** Holds a SSL object and its associated data. Members are only
* accessed from within tortls.c.
@@ -162,7 +160,7 @@ struct tor_tls_t {
SSL *ssl; /**< An OpenSSL SSL object. */
int socket; /**< The underlying file descriptor for this TLS connection. */
char *address; /**< An address to log when describing this connection. */
- ENUM_BF(tor_tls_state_t) state : 3; /**< The current SSL state,
+ tor_tls_state_bitfield_t state : 3; /**< The current SSL state,
* depending on which operations
* have completed successfully. */
unsigned int isServer:1; /**< True iff this is a server-side connection */
@@ -714,31 +712,47 @@ tor_tls_create_certificate(crypto_pk_t *rsa,
/** List of ciphers that servers should select from when we actually have
* our choice of what cipher to use. */
const char UNRESTRICTED_SERVER_CIPHER_LIST[] =
-#ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_256_CHC_SHA
- TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA ":"
-#endif
+ /* This list is autogenerated with the gen_server_ciphers.py script;
+ * don't hand-edit it. */
#ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS1_TXT_ECDHE_RSA_WITH_AES_256_GCM_SHA384 ":"
#endif
+#ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256
+ TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256 ":"
+#endif
+#ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_256_SHA384
+ TLS1_TXT_ECDHE_RSA_WITH_AES_256_SHA384 ":"
+#endif
#ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_128_SHA256
TLS1_TXT_ECDHE_RSA_WITH_AES_128_SHA256 ":"
#endif
+#ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA
+ TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA ":"
+#endif
#ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA
TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA ":"
#endif
-#ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256
+#ifdef TLS1_TXT_DHE_RSA_WITH_AES_256_GCM_SHA384
+ TLS1_TXT_DHE_RSA_WITH_AES_256_GCM_SHA384 ":"
#endif
-//#if TLS1_TXT_ECDHE_RSA_WITH_RC4_128_SHA
-// TLS1_TXT_ECDHE_RSA_WITH_RC4_128_SHA ":"
-//#endif
- /* These next two are mandatory. */
- TLS1_TXT_DHE_RSA_WITH_AES_256_SHA ":"
- TLS1_TXT_DHE_RSA_WITH_AES_128_SHA ":"
+#ifdef TLS1_TXT_DHE_RSA_WITH_AES_128_GCM_SHA256
+ TLS1_TXT_DHE_RSA_WITH_AES_128_GCM_SHA256 ":"
+#endif
+#ifdef TLS1_TXT_DHE_RSA_WITH_AES_256_SHA256
+ TLS1_TXT_DHE_RSA_WITH_AES_256_SHA256 ":"
+#endif
+#ifdef TLS1_TXT_DHE_RSA_WITH_AES_128_SHA256
+ TLS1_TXT_DHE_RSA_WITH_AES_128_SHA256 ":"
+#endif
+ /* Required */
+ TLS1_TXT_DHE_RSA_WITH_AES_256_SHA ":"
+ /* Required */
+ TLS1_TXT_DHE_RSA_WITH_AES_128_SHA ":"
#ifdef TLS1_TXT_ECDHE_RSA_WITH_DES_192_CBC3_SHA
TLS1_TXT_ECDHE_RSA_WITH_DES_192_CBC3_SHA ":"
#endif
- SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA;
+ /* Required */
+ SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA;
/* Note: to set up your own private testing network with link crypto
* disabled, set your Tors' cipher list to
@@ -806,24 +820,24 @@ tor_cert_new(X509 *x509_cert)
tor_cert_t *cert;
EVP_PKEY *pkey;
RSA *rsa;
- int length, length2;
- unsigned char *cp;
+ int length;
+ unsigned char *buf = NULL;
if (!x509_cert)
return NULL;
- length = i2d_X509(x509_cert, NULL);
+ length = i2d_X509(x509_cert, &buf);
cert = tor_malloc_zero(sizeof(tor_cert_t));
- if (length <= 0) {
+ if (length <= 0 || buf == NULL) {
tor_free(cert);
log_err(LD_CRYPTO, "Couldn't get length of encoded x509 certificate");
X509_free(x509_cert);
return NULL;
}
cert->encoded_len = (size_t) length;
- cp = cert->encoded = tor_malloc(length);
- length2 = i2d_X509(x509_cert, &cp);
- tor_assert(length2 == length);
+ cert->encoded = tor_malloc(length);
+ memcpy(cert->encoded, buf, length);
+ OPENSSL_free(buf);
cert->cert = x509_cert;
@@ -979,31 +993,6 @@ tor_tls_cert_get_key(tor_cert_t *cert)
return result;
}
-/** Return true iff <b>a</b> and <b>b</b> represent the same public key. */
-static int
-pkey_eq(EVP_PKEY *a, EVP_PKEY *b)
-{
- /* We'd like to do this, but openssl 0.9.7 doesn't have it:
- return EVP_PKEY_cmp(a,b) == 1;
- */
- unsigned char *a_enc=NULL, *b_enc=NULL, *a_ptr, *b_ptr;
- int a_len1, b_len1, a_len2, b_len2, result;
- a_len1 = i2d_PublicKey(a, NULL);
- b_len1 = i2d_PublicKey(b, NULL);
- if (a_len1 != b_len1)
- return 0;
- a_ptr = a_enc = tor_malloc(a_len1);
- b_ptr = b_enc = tor_malloc(b_len1);
- a_len2 = i2d_PublicKey(a, &a_ptr);
- b_len2 = i2d_PublicKey(b, &b_ptr);
- tor_assert(a_len2 == a_len1);
- tor_assert(b_len2 == b_len1);
- result = tor_memeq(a_enc, b_enc, a_len1);
- tor_free(a_enc);
- tor_free(b_enc);
- return result;
-}
-
/** Return true iff the other side of <b>tls</b> has authenticated to us, and
* the key certified in <b>cert</b> is the same as the key they used to do it.
*/
@@ -1019,7 +1008,7 @@ tor_tls_cert_matches_key(const tor_tls_t *tls, const tor_cert_t *cert)
link_key = X509_get_pubkey(peercert);
cert_key = X509_get_pubkey(cert->cert);
- result = link_key && cert_key && pkey_eq(cert_key, link_key);
+ result = link_key && cert_key && EVP_PKEY_cmp(cert_key, link_key) == 1;
X509_free(peercert);
if (link_key)
@@ -1261,6 +1250,10 @@ tor_tls_context_new(crypto_pk_t *identity, unsigned int key_lifetime,
goto error;
SSL_CTX_set_options(result->ctx, SSL_OP_NO_SSLv2);
+ /* Prefer the server's ordering of ciphers: the client's ordering has
+ * historically been chosen for fingerprinting resistance. */
+ SSL_CTX_set_options(result->ctx, SSL_OP_CIPHER_SERVER_PREFERENCE);
+
/* Disable TLS1.1 and TLS1.2 if they exist. We need to do this to
* workaround a bug present in all OpenSSL 1.0.1 versions (as of 1
* June 2012), wherein renegotiating while using one of these TLS
@@ -1418,6 +1411,21 @@ tor_tls_context_new(crypto_pk_t *identity, unsigned int key_lifetime,
return NULL;
}
+/** Invoked when a TLS state changes: log the change at severity 'debug' */
+static void
+tor_tls_debug_state_callback(const SSL *ssl, int type, int val)
+{
+ log_debug(LD_HANDSHAKE, "SSL %p is now in state %s [type=%d,val=%d].",
+ ssl, SSL_state_string_long(ssl), type, val);
+}
+
+/* Return the name of the negotiated ciphersuite in use on <b>tls</b> */
+const char *
+tor_tls_get_ciphersuite_name(tor_tls_t *tls)
+{
+ return SSL_get_cipher(tls->ssl);
+}
+
#ifdef V2_HANDSHAKE_SERVER
/* Here's the old V2 cipher list we sent from 0.2.1.1-alpha up to
@@ -1469,10 +1477,13 @@ prune_v2_cipher_list(void)
inp = outp = v2_cipher_list;
while (*inp) {
- unsigned char cipherid[2];
+ unsigned char cipherid[3];
const SSL_CIPHER *cipher;
/* Is there no better way to do this? */
set_uint16(cipherid, htons(*inp));
+ cipherid[2] = 0; /* If ssl23_get_cipher_by_char finds no cipher starting
+ * with a two-byte 'cipherid', it may look for a v2
+ * cipher with the appropriate 3 bytes. */
cipher = m->get_cipher_by_char(cipherid);
if (cipher) {
tor_assert((cipher->id & 0xffff) == *inp);
@@ -1486,13 +1497,6 @@ prune_v2_cipher_list(void)
v2_cipher_list_pruned = 1;
}
-/* Return the name of the negotiated ciphersuite in use on <b>tls</b> */
-const char *
-tor_tls_get_ciphersuite_name(tor_tls_t *tls)
-{
- return SSL_get_cipher(tls->ssl);
-}
-
/** Examine the client cipher list in <b>ssl</b>, and determine what kind of
* client it is. Return one of CIPHERS_ERR, CIPHERS_V1, CIPHERS_V2,
* CIPHERS_UNRESTRICTED.
@@ -1591,56 +1595,6 @@ tor_tls_client_is_using_v2_ciphers(const SSL *ssl)
return tor_tls_classify_client_ciphers(ssl, session->ciphers) >= CIPHERS_V2;
}
-#if OPENSSL_VERSION_NUMBER >= OPENSSL_V_SERIES(1,0,0)
-/** Callback to get invoked on a server after we've read the list of ciphers
- * the client supports, but before we pick our own ciphersuite.
- *
- * We can't abuse an info_cb for this, since by the time one of the
- * client_hello info_cbs is called, we've already picked which ciphersuite to
- * use.
- *
- * Technically, this function is an abuse of this callback, since the point of
- * a session_secret_cb is to try to set up and/or verify a shared-secret for
- * authentication on the fly. But as long as we return 0, we won't actually be
- * setting up a shared secret, and all will be fine.
- */
-static int
-tor_tls_session_secret_cb(SSL *ssl, void *secret, int *secret_len,
- STACK_OF(SSL_CIPHER) *peer_ciphers,
- SSL_CIPHER **cipher, void *arg)
-{
- (void) secret;
- (void) secret_len;
- (void) peer_ciphers;
- (void) cipher;
- (void) arg;
-
- if (tor_tls_classify_client_ciphers(ssl, peer_ciphers) ==
- CIPHERS_UNRESTRICTED) {
- SSL_set_cipher_list(ssl, UNRESTRICTED_SERVER_CIPHER_LIST);
- }
-
- SSL_set_session_secret_cb(ssl, NULL, NULL);
-
- return 0;
-}
-static void
-tor_tls_setup_session_secret_cb(tor_tls_t *tls)
-{
- SSL_set_session_secret_cb(tls->ssl, tor_tls_session_secret_cb, NULL);
-}
-#else
-#define tor_tls_setup_session_secret_cb(tls) STMT_NIL
-#endif
-
-/** Invoked when a TLS state changes: log the change at severity 'debug' */
-static void
-tor_tls_debug_state_callback(const SSL *ssl, int type, int val)
-{
- log_debug(LD_HANDSHAKE, "SSL %p is now in state %s [type=%d,val=%d].",
- ssl, SSL_state_string_long(ssl), type, val);
-}
-
/** Invoked when we're accepting a connection on <b>ssl</b>, and the connection
* changes state. We use this:
* <ul><li>To alter the state of the handshake partway through, so we
@@ -1700,6 +1654,48 @@ tor_tls_server_info_callback(const SSL *ssl, int type, int val)
}
#endif
+#if OPENSSL_VERSION_NUMBER >= OPENSSL_V_SERIES(1,0,0)
+/** Callback to get invoked on a server after we've read the list of ciphers
+ * the client supports, but before we pick our own ciphersuite.
+ *
+ * We can't abuse an info_cb for this, since by the time one of the
+ * client_hello info_cbs is called, we've already picked which ciphersuite to
+ * use.
+ *
+ * Technically, this function is an abuse of this callback, since the point of
+ * a session_secret_cb is to try to set up and/or verify a shared-secret for
+ * authentication on the fly. But as long as we return 0, we won't actually be
+ * setting up a shared secret, and all will be fine.
+ */
+static int
+tor_tls_session_secret_cb(SSL *ssl, void *secret, int *secret_len,
+ STACK_OF(SSL_CIPHER) *peer_ciphers,
+ SSL_CIPHER **cipher, void *arg)
+{
+ (void) secret;
+ (void) secret_len;
+ (void) peer_ciphers;
+ (void) cipher;
+ (void) arg;
+
+ if (tor_tls_classify_client_ciphers(ssl, peer_ciphers) ==
+ CIPHERS_UNRESTRICTED) {
+ SSL_set_cipher_list(ssl, UNRESTRICTED_SERVER_CIPHER_LIST);
+ }
+
+ SSL_set_session_secret_cb(ssl, NULL, NULL);
+
+ return 0;
+}
+static void
+tor_tls_setup_session_secret_cb(tor_tls_t *tls)
+{
+ SSL_set_session_secret_cb(tls->ssl, tor_tls_session_secret_cb, NULL);
+}
+#else
+#define tor_tls_setup_session_secret_cb(tls) STMT_NIL
+#endif
+
/** Explain which ciphers we're missing. */
static void
log_unsupported_ciphers(smartlist_t *unsupported)
@@ -2339,6 +2335,7 @@ log_cert_lifetime(int severity, const X509 *cert, const char *problem)
char mytime[33];
time_t now = time(NULL);
struct tm tm;
+ size_t n;
if (problem)
tor_log(severity, LD_GENERAL,
@@ -2364,11 +2361,17 @@ log_cert_lifetime(int severity, const X509 *cert, const char *problem)
BIO_get_mem_ptr(bio, &buf);
s2 = tor_strndup(buf->data, buf->length);
- strftime(mytime, 32, "%b %d %H:%M:%S %Y UTC", tor_gmtime_r(&now, &tm));
-
- tor_log(severity, LD_GENERAL,
- "(certificate lifetime runs from %s through %s. Your time is %s.)",
- s1,s2,mytime);
+ n = strftime(mytime, 32, "%b %d %H:%M:%S %Y UTC", tor_gmtime_r(&now, &tm));
+ if (n > 0) {
+ tor_log(severity, LD_GENERAL,
+ "(certificate lifetime runs from %s through %s. Your time is %s.)",
+ s1,s2,mytime);
+ } else {
+ tor_log(severity, LD_GENERAL,
+ "(certificate lifetime runs from %s through %s. "
+ "Couldn't get your time.)",
+ s1, s2);
+ }
end:
/* Not expected to get invoked */
@@ -2583,8 +2586,8 @@ tor_tls_get_n_raw_bytes(tor_tls_t *tls, size_t *n_read, size_t *n_written)
/** Return a ratio of the bytes that TLS has sent to the bytes that we've told
* it to send. Used to track whether our TLS records are getting too tiny. */
-double
-tls_get_write_overhead_ratio(void)
+MOCK_IMPL(double,
+tls_get_write_overhead_ratio,(void))
{
if (total_bytes_written_over_tls == 0)
return 1.0;
diff --git a/src/common/tortls.h b/src/common/tortls.h
index 49c488b36..a76ba3bc7 100644
--- a/src/common/tortls.h
+++ b/src/common/tortls.h
@@ -13,6 +13,7 @@
#include "crypto.h"
#include "compat.h"
+#include "testsupport.h"
/* Opaque structure to hold a TLS connection. */
typedef struct tor_tls_t tor_tls_t;
@@ -95,7 +96,7 @@ void tor_tls_get_buffer_sizes(tor_tls_t *tls,
size_t *rbuf_capacity, size_t *rbuf_bytes,
size_t *wbuf_capacity, size_t *wbuf_bytes);
-double tls_get_write_overhead_ratio(void);
+MOCK_DECL(double, tls_get_write_overhead_ratio, (void));
int tor_tls_used_v1_handshake(tor_tls_t *tls);
int tor_tls_received_v3_certificate(tor_tls_t *tls);
diff --git a/src/common/util.c b/src/common/util.c
index 5eb0f9a69..e27036a84 100644
--- a/src/common/util.c
+++ b/src/common/util.c
@@ -24,6 +24,8 @@
#include "torint.h"
#include "container.h"
#include "address.h"
+#include "sandbox.h"
+#include "backtrace.h"
#ifdef _WIN32
#include <io.h>
@@ -94,6 +96,23 @@
#endif
/* =====
+ * Assertion helper.
+ * ===== */
+/** Helper for tor_assert: report the assertion failure. */
+void
+tor_assertion_failed_(const char *fname, unsigned int line,
+ const char *func, const char *expr)
+{
+ char buf[256];
+ log_err(LD_BUG, "%s:%u: %s: Assertion %s failed; aborting.",
+ fname, line, func, expr);
+ tor_snprintf(buf, sizeof(buf),
+ "Assertion %s failed in %s at %s:%u",
+ expr, func, fname, line);
+ log_backtrace(LOG_ERR, LD_BUG, buf);
+}
+
+/* =====
* Memory management
* ===== */
#ifdef USE_DMALLOC
@@ -284,7 +303,7 @@ tor_memdup_(const void *mem, size_t len DMALLOC_PARAMS)
/** As tor_memdup(), but add an extra 0 byte at the end of the resulting
* memory. */
void *
-tor_memdup_nulterm(const void *mem, size_t len DMALLOC_PARAMS)
+tor_memdup_nulterm_(const void *mem, size_t len DMALLOC_PARAMS)
{
char *dup;
tor_assert(len < SIZE_T_CEILING+1);
@@ -879,6 +898,39 @@ tor_digest_is_zero(const char *digest)
return tor_memeq(digest, ZERO_DIGEST, DIGEST_LEN);
}
+/** Return true if <b>string</b> is a valid 'key=[value]' string.
+ * "value" is optional, to indicate the empty string. Log at logging
+ * <b>severity</b> if something ugly happens. */
+int
+string_is_key_value(int severity, const char *string)
+{
+ /* position of equal sign in string */
+ const char *equal_sign_pos = NULL;
+
+ tor_assert(string);
+
+ if (strlen(string) < 2) { /* "x=" is shortest args string */
+ tor_log(severity, LD_GENERAL, "'%s' is too short to be a k=v value.",
+ escaped(string));
+ return 0;
+ }
+
+ equal_sign_pos = strchr(string, '=');
+ if (!equal_sign_pos) {
+ tor_log(severity, LD_GENERAL, "'%s' is not a k=v value.", escaped(string));
+ return 0;
+ }
+
+ /* validate that the '=' is not in the beginning of the string. */
+ if (equal_sign_pos == string) {
+ tor_log(severity, LD_GENERAL, "'%s' is not a valid k=v value.",
+ escaped(string));
+ return 0;
+ }
+
+ return 1;
+}
+
/** Return true iff the DIGEST256_LEN bytes in digest are all zero. */
int
tor_digest256_is_zero(const char *digest)
@@ -1190,6 +1242,43 @@ escaped(const char *s)
return escaped_val_;
}
+/** Return a newly allocated string equal to <b>string</b>, except that every
+ * character in <b>chars_to_escape</b> is preceded by a backslash. */
+char *
+tor_escape_str_for_pt_args(const char *string, const char *chars_to_escape)
+{
+ char *new_string = NULL;
+ char *new_cp = NULL;
+ size_t length, new_length;
+
+ tor_assert(string);
+
+ length = strlen(string);
+
+ if (!length) /* If we were given the empty string, return the same. */
+ return tor_strdup("");
+ /* (new_length > SIZE_MAX) => ((length * 2) + 1 > SIZE_MAX) =>
+ (length*2 > SIZE_MAX - 1) => (length > (SIZE_MAX - 1)/2) */
+ if (length > (SIZE_MAX - 1)/2) /* check for overflow */
+ return NULL;
+
+ /* this should be enough even if all characters must be escaped */
+ new_length = (length * 2) + 1;
+
+ new_string = new_cp = tor_malloc(new_length);
+
+ while (*string) {
+ if (strchr(chars_to_escape, *string))
+ *new_cp++ = '\\';
+
+ *new_cp++ = *string++;
+ }
+
+ *new_cp = '\0'; /* NUL-terminate the new string */
+
+ return new_string;
+}
+
/* =====
* Time
* ===== */
@@ -1427,7 +1516,7 @@ void
format_iso_time_nospace_usec(char *buf, const struct timeval *tv)
{
tor_assert(tv);
- format_iso_time_nospace(buf, tv->tv_sec);
+ format_iso_time_nospace(buf, (time_t)tv->tv_sec);
tor_snprintf(buf+ISO_TIME_LEN, 8, ".%06d", (int)tv->tv_usec);
}
@@ -1741,7 +1830,8 @@ file_status(const char *fname)
int r;
f = tor_strdup(fname);
clean_name_for_stat(f);
- r = stat(f, &st);
+ log_debug(LD_FS, "stat()ing %s", f);
+ r = stat(sandbox_intern_string(f), &st);
tor_free(f);
if (r) {
if (errno == ENOENT) {
@@ -1781,7 +1871,7 @@ check_private_dir(const char *dirname, cpd_check_t check,
char *f;
#ifndef _WIN32
int mask;
- struct passwd *pw = NULL;
+ const struct passwd *pw = NULL;
uid_t running_uid;
gid_t running_gid;
#else
@@ -1791,7 +1881,8 @@ check_private_dir(const char *dirname, cpd_check_t check,
tor_assert(dirname);
f = tor_strdup(dirname);
clean_name_for_stat(f);
- r = stat(f, &st);
+ log_debug(LD_FS, "stat()ing %s", f);
+ r = stat(sandbox_intern_string(f), &st);
tor_free(f);
if (r) {
if (errno != ENOENT) {
@@ -1827,7 +1918,7 @@ check_private_dir(const char *dirname, cpd_check_t check,
if (effective_user) {
/* Look up the user and group information.
* If we have a problem, bail out. */
- pw = getpwnam(effective_user);
+ pw = tor_getpwnam(effective_user);
if (pw == NULL) {
log_warn(LD_CONFIG, "Error setting configured user: %s not found",
effective_user);
@@ -1841,13 +1932,13 @@ check_private_dir(const char *dirname, cpd_check_t check,
}
if (st.st_uid != running_uid) {
- struct passwd *pw = NULL;
+ const struct passwd *pw = NULL;
char *process_ownername = NULL;
- pw = getpwuid(running_uid);
+ pw = tor_getpwuid(running_uid);
process_ownername = pw ? tor_strdup(pw->pw_name) : tor_strdup("<unknown>");
- pw = getpwuid(st.st_uid);
+ pw = tor_getpwuid(st.st_uid);
log_warn(LD_FS, "%s is not owned by this user (%s, %d) but by "
"%s (%d). Perhaps you are running Tor as the wrong user?",
@@ -1913,7 +2004,8 @@ write_str_to_file(const char *fname, const char *str, int bin)
#ifdef _WIN32
if (!bin && strchr(str, '\r')) {
log_warn(LD_BUG,
- "We're writing a text string that already contains a CR.");
+ "We're writing a text string that already contains a CR to %s",
+ escaped(fname));
}
#endif
return write_bytes_to_file(fname, str, strlen(str), bin);
@@ -1977,8 +2069,10 @@ start_writing_to_file(const char *fname, int open_flags, int mode,
open_flags &= ~O_EXCL;
new_file->rename_on_close = 1;
}
+#if O_BINARY != 0
if (open_flags & O_BINARY)
new_file->binary = 1;
+#endif
new_file->fd = tor_open_cloexec(open_name, open_flags, mode);
if (new_file->fd < 0) {
@@ -2050,6 +2144,7 @@ static int
finish_writing_to_file_impl(open_file_t *file_data, int abort_write)
{
int r = 0;
+
tor_assert(file_data && file_data->filename);
if (file_data->stdio_file) {
if (fclose(file_data->stdio_file)) {
@@ -2066,7 +2161,13 @@ finish_writing_to_file_impl(open_file_t *file_data, int abort_write)
if (file_data->rename_on_close) {
tor_assert(file_data->tempname && file_data->filename);
if (abort_write) {
- unlink(file_data->tempname);
+ int res = unlink(file_data->tempname);
+ if (res != 0) {
+ /* We couldn't unlink and we'll leave a mess behind */
+ log_warn(LD_FS, "Failed to unlink %s: %s",
+ file_data->tempname, strerror(errno));
+ r = -1;
+ }
} else {
tor_assert(strcmp(file_data->filename, file_data->tempname));
if (replace_file(file_data->tempname, file_data->filename)) {
@@ -2132,12 +2233,20 @@ write_chunks_to_file_impl(const char *fname, const smartlist_t *chunks,
return -1;
}
-/** Given a smartlist of sized_chunk_t, write them atomically to a file
- * <b>fname</b>, overwriting or creating the file as necessary. */
+/** Given a smartlist of sized_chunk_t, write them to a file
+ * <b>fname</b>, overwriting or creating the file as necessary.
+ * If <b>no_tempfile</b> is 0 then the file will be written
+ * atomically. */
int
-write_chunks_to_file(const char *fname, const smartlist_t *chunks, int bin)
+write_chunks_to_file(const char *fname, const smartlist_t *chunks, int bin,
+ int no_tempfile)
{
int flags = OPEN_FLAGS_REPLACE|(bin?O_BINARY:O_TEXT);
+
+ if (no_tempfile) {
+ /* O_APPEND stops write_chunks_to_file from using tempfiles */
+ flags |= O_APPEND;
+ }
return write_chunks_to_file_impl(fname, chunks, flags);
}
@@ -2158,9 +2267,9 @@ write_bytes_to_file_impl(const char *fname, const char *str, size_t len,
/** As write_str_to_file, but does not assume a NUL-terminated
* string. Instead, we write <b>len</b> bytes, starting at <b>str</b>. */
-int
-write_bytes_to_file(const char *fname, const char *str, size_t len,
- int bin)
+MOCK_IMPL(int,
+write_bytes_to_file,(const char *fname, const char *str, size_t len,
+ int bin))
{
return write_bytes_to_file_impl(fname, str, len,
OPEN_FLAGS_REPLACE|(bin?O_BINARY:O_TEXT));
@@ -2927,7 +3036,7 @@ tor_vsscanf(const char *buf, const char *pattern, va_list ap)
/** Minimal sscanf replacement: parse <b>buf</b> according to <b>pattern</b>
* and store the results in the corresponding argument fields. Differs from
* sscanf in that:
- * <ul><li>It only handles %u, %lu, %x, %lx, %<NUM>s, %d, %ld, %lf, and %c.
+ * <ul><li>It only handles %u, %lu, %x, %lx, %[NUM]s, %d, %ld, %lf, and %c.
* <li>It only handles decimal inputs for %lf. (12.3, not 1.23e1)
* <li>It does not handle arbitrarily long widths.
* <li>Numbers do not consume any space characters.
@@ -3022,9 +3131,10 @@ tor_listdir(const char *dirname)
FindClose(handle);
tor_free(pattern);
#else
+ const char *prot_dname = sandbox_intern_string(dirname);
DIR *d;
struct dirent *de;
- if (!(d = opendir(dirname)))
+ if (!(d = opendir(prot_dname)))
return NULL;
result = smartlist_new();
@@ -3320,14 +3430,59 @@ tor_join_win_cmdline(const char *argv[])
return joined_argv;
}
+/* As format_{hex,dex}_number_sigsafe, but takes a <b>radix</b> argument
+ * in range 2..16 inclusive. */
+static int
+format_number_sigsafe(unsigned long x, char *buf, int buf_len,
+ unsigned int radix)
+{
+ unsigned long tmp;
+ int len;
+ char *cp;
+
+ /* NOT tor_assert. This needs to be safe to run from within a signal handler,
+ * and from within the 'tor_assert() has failed' code. */
+ if (radix < 2 || radix > 16)
+ return 0;
+
+ /* Count how many digits we need. */
+ tmp = x;
+ len = 1;
+ while (tmp >= radix) {
+ tmp /= radix;
+ ++len;
+ }
+
+ /* Not long enough */
+ if (!buf || len >= buf_len)
+ return 0;
+
+ cp = buf + len;
+ *cp = '\0';
+ do {
+ unsigned digit = (unsigned) (x % radix);
+ tor_assert(cp > buf);
+ --cp;
+ *cp = "0123456789ABCDEF"[digit];
+ x /= radix;
+ } while (x);
+
+ /* NOT tor_assert; see above. */
+ if (cp != buf) {
+ abort();
+ }
+
+ return len;
+}
+
/**
- * Helper function to output hex numbers, called by
- * format_helper_exit_status(). This writes the hexadecimal digits of x into
- * buf, up to max_len digits, and returns the actual number of digits written.
- * If there is insufficient space, it will write nothing and return 0.
+ * Helper function to output hex numbers from within a signal handler.
+ *
+ * Writes the nul-terminated hexadecimal digits of <b>x</b> into a buffer
+ * <b>buf</b> of size <b>buf_len</b>, and return the actual number of digits
+ * written, not counting the terminal NUL.
*
- * This function DOES NOT add a terminating NUL character to its output: be
- * careful!
+ * If there is insufficient space, write nothing and return 0.
*
* This accepts an unsigned int because format_helper_exit_status() needs to
* call it with a signed int and an unsigned char, and since the C standard
@@ -3342,46 +3497,19 @@ tor_join_win_cmdline(const char *argv[])
* arbitrary C functions.
*/
int
-format_hex_number_for_helper_exit_status(unsigned int x, char *buf,
- int max_len)
+format_hex_number_sigsafe(unsigned long x, char *buf, int buf_len)
{
- int len;
- unsigned int tmp;
- char *cur;
-
- /* Sanity check */
- if (!buf || max_len <= 0)
- return 0;
-
- /* How many chars do we need for x? */
- if (x > 0) {
- len = 0;
- tmp = x;
- while (tmp > 0) {
- tmp >>= 4;
- ++len;
- }
- } else {
- len = 1;
- }
-
- /* Bail if we would go past the end of the buffer */
- if (len > max_len)
- return 0;
-
- /* Point to last one */
- cur = buf + len - 1;
-
- /* Convert x to hex */
- do {
- *cur-- = "0123456789ABCDEF"[x & 0xf];
- x >>= 4;
- } while (x != 0 && cur >= buf);
+ return format_number_sigsafe(x, buf, buf_len, 16);
+}
- /* Return len */
- return len;
+/** As format_hex_number_sigsafe, but format the number in base 10. */
+int
+format_dec_number_sigsafe(unsigned long x, char *buf, int buf_len)
+{
+ return format_number_sigsafe(x, buf, buf_len, 10);
}
+#ifndef _WIN32
/** Format <b>child_state</b> and <b>saved_errno</b> as a hex string placed in
* <b>hex_errno</b>. Called between fork and _exit, so must be signal-handler
* safe.
@@ -3397,7 +3525,7 @@ format_hex_number_for_helper_exit_status(unsigned int x, char *buf,
* On success return the number of characters added to hex_errno, not counting
* the terminating NUL; return -1 on error.
*/
-int
+STATIC int
format_helper_exit_status(unsigned char child_state, int saved_errno,
char *hex_errno)
{
@@ -3428,8 +3556,8 @@ format_helper_exit_status(unsigned char child_state, int saved_errno,
cur = hex_errno;
/* Emit child_state */
- written = format_hex_number_for_helper_exit_status(child_state,
- cur, left);
+ written = format_hex_number_sigsafe(child_state, cur, left);
+
if (written <= 0)
goto err;
@@ -3458,8 +3586,7 @@ format_helper_exit_status(unsigned char child_state, int saved_errno,
}
/* Emit unsigned_errno */
- written = format_hex_number_for_helper_exit_status(unsigned_errno,
- cur, left);
+ written = format_hex_number_sigsafe(unsigned_errno, cur, left);
if (written <= 0)
goto err;
@@ -3490,6 +3617,7 @@ format_helper_exit_status(unsigned char child_state, int saved_errno,
done:
return res;
}
+#endif
/* Maximum number of file descriptors, if we cannot get it via sysconf() */
#define DEFAULT_MAX_FD 256
@@ -3685,7 +3813,7 @@ tor_spawn_background(const char *const filename, const char **argv,
TRUE, // handles are inherited
/*(TODO: set CREATE_NEW CONSOLE/PROCESS_GROUP to make GetExitCodeProcess()
* work?) */
- 0, // creation flags
+ CREATE_NO_WINDOW, // creation flags
(env==NULL) ? NULL : env->windows_environment_block,
NULL, // use parent's current directory
&siStartInfo, // STARTUPINFO pointer
@@ -3906,9 +4034,9 @@ tor_spawn_background(const char *const filename, const char **argv,
* <b>process_handle</b>.
* If <b>also_terminate_process</b> is true, also terminate the
* process of the process handle. */
-void
-tor_process_handle_destroy(process_handle_t *process_handle,
- int also_terminate_process)
+MOCK_IMPL(void,
+tor_process_handle_destroy,(process_handle_t *process_handle,
+ int also_terminate_process))
{
if (!process_handle)
return;
@@ -4412,14 +4540,38 @@ stream_status_to_string(enum stream_status stream_status)
}
}
+/* DOCDOC */
+static void
+log_portfw_spawn_error_message(const char *buf,
+ const char *executable, int *child_status)
+{
+ /* Parse error message */
+ int retval, child_state, saved_errno;
+ retval = tor_sscanf(buf, SPAWN_ERROR_MESSAGE "%x/%x",
+ &child_state, &saved_errno);
+ if (retval == 2) {
+ log_warn(LD_GENERAL,
+ "Failed to start child process \"%s\" in state %d: %s",
+ executable, child_state, strerror(saved_errno));
+ if (child_status)
+ *child_status = 1;
+ } else {
+ /* Failed to parse message from child process, log it as a
+ warning */
+ log_warn(LD_GENERAL,
+ "Unexpected message from port forwarding helper \"%s\": %s",
+ executable, buf);
+ }
+}
+
#ifdef _WIN32
/** Return a smartlist containing lines outputted from
* <b>handle</b>. Return NULL on error, and set
* <b>stream_status_out</b> appropriately. */
-smartlist_t *
-tor_get_lines_from_handle(HANDLE *handle,
- enum stream_status *stream_status_out)
+MOCK_IMPL(smartlist_t *,
+tor_get_lines_from_handle, (HANDLE *handle,
+ enum stream_status *stream_status_out))
{
int pos;
char stdout_buf[600] = {0};
@@ -4507,8 +4659,9 @@ log_from_handle(HANDLE *pipe, int severity)
/** Return a smartlist containing lines outputted from
* <b>handle</b>. Return NULL on error, and set
* <b>stream_status_out</b> appropriately. */
-smartlist_t *
-tor_get_lines_from_handle(FILE *handle, enum stream_status *stream_status_out)
+MOCK_IMPL(smartlist_t *,
+tor_get_lines_from_handle, (FILE *handle,
+ enum stream_status *stream_status_out))
{
enum stream_status stream_status;
char stdout_buf[400];
@@ -4558,23 +4711,7 @@ log_from_pipe(FILE *stream, int severity, const char *executable,
/* Check if buf starts with SPAWN_ERROR_MESSAGE */
if (strcmpstart(buf, SPAWN_ERROR_MESSAGE) == 0) {
- /* Parse error message */
- int retval, child_state, saved_errno;
- retval = tor_sscanf(buf, SPAWN_ERROR_MESSAGE "%x/%x",
- &child_state, &saved_errno);
- if (retval == 2) {
- log_warn(LD_GENERAL,
- "Failed to start child process \"%s\" in state %d: %s",
- executable, child_state, strerror(saved_errno));
- if (child_status)
- *child_status = 1;
- } else {
- /* Failed to parse message from child process, log it as a
- warning */
- log_warn(LD_GENERAL,
- "Unexpected message from port forwarding helper \"%s\": %s",
- executable, buf);
- }
+ log_portfw_spawn_error_message(buf, executable, child_status);
} else {
log_fn(severity, LD_GENERAL, "Port forwarding helper says: %s", buf);
}
@@ -4652,7 +4789,7 @@ get_string_from_pipe(FILE *stream, char *buf_out, size_t count)
/** Parse a <b>line</b> from tor-fw-helper and issue an appropriate
* log message to our user. */
static void
-handle_fw_helper_line(const char *line)
+handle_fw_helper_line(const char *executable, const char *line)
{
smartlist_t *tokens = smartlist_new();
char *message = NULL;
@@ -4663,6 +4800,19 @@ handle_fw_helper_line(const char *line)
int port = 0;
int success = 0;
+ if (strcmpstart(line, SPAWN_ERROR_MESSAGE) == 0) {
+ /* We need to check for SPAWN_ERROR_MESSAGE again here, since it's
+ * possible that it got sent after we tried to read it in log_from_pipe.
+ *
+ * XXX Ideally, we should be using one of stdout/stderr for the real
+ * output, and one for the output of the startup code. We used to do that
+ * before cd05f35d2c.
+ */
+ int child_status;
+ log_portfw_spawn_error_message(line, executable, &child_status);
+ goto done;
+ }
+
smartlist_split_string(tokens, line, NULL,
SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, -1);
@@ -4742,7 +4892,8 @@ handle_fw_helper_line(const char *line)
/** Read what tor-fw-helper has to say in its stdout and handle it
* appropriately */
static int
-handle_fw_helper_output(process_handle_t *process_handle)
+handle_fw_helper_output(const char *executable,
+ process_handle_t *process_handle)
{
smartlist_t *fw_helper_output = NULL;
enum stream_status stream_status = 0;
@@ -4757,7 +4908,7 @@ handle_fw_helper_output(process_handle_t *process_handle)
/* Handle the lines we got: */
SMARTLIST_FOREACH_BEGIN(fw_helper_output, char *, line) {
- handle_fw_helper_line(line);
+ handle_fw_helper_line(executable, line);
tor_free(line);
} SMARTLIST_FOREACH_END(line);
@@ -4872,7 +5023,7 @@ tor_check_port_forwarding(const char *filename,
stderr_status = log_from_pipe(child_handle->stderr_handle,
LOG_INFO, filename, &retval);
#endif
- if (handle_fw_helper_output(child_handle) < 0) {
+ if (handle_fw_helper_output(filename, child_handle) < 0) {
log_warn(LD_GENERAL, "Failed to handle fw helper output.");
stdout_status = -1;
retval = -1;
diff --git a/src/common/util.h b/src/common/util.h
index 73daa6e2a..18dc20639 100644
--- a/src/common/util.h
+++ b/src/common/util.h
@@ -15,6 +15,7 @@
#include "torint.h"
#include "compat.h"
#include "di_ops.h"
+#include "testsupport.h"
#include <stdio.h>
#include <stdlib.h>
#ifdef _WIN32
@@ -47,13 +48,13 @@
/** Like assert(3), but send assertion failures to the log as well as to
* stderr. */
#define tor_assert(expr) STMT_BEGIN \
- if (PREDICT_UNLIKELY(!(expr))) { \
- log_err(LD_BUG, "%s:%d: %s: Assertion %s failed; aborting.", \
- SHORT_FILE__, __LINE__, __func__, #expr); \
- fprintf(stderr,"%s:%d %s: Assertion %s failed; aborting.\n", \
- SHORT_FILE__, __LINE__, __func__, #expr); \
- abort(); \
- } STMT_END
+ if (PREDICT_UNLIKELY(!(expr))) { \
+ tor_assertion_failed_(SHORT_FILE__, __LINE__, __func__, #expr); \
+ abort(); \
+ } STMT_END
+
+void tor_assertion_failed_(const char *fname, unsigned int line,
+ const char *func, const char *expr);
/* If we're building with dmalloc, we want all of our memory allocation
* functions to take an extra file/line pair of arguments. If not, not.
@@ -222,23 +223,22 @@ const char *find_whitespace_eos(const char *s, const char *eos);
const char *find_str_at_start_of_line(const char *haystack,
const char *needle);
int string_is_C_identifier(const char *string);
+int string_is_key_value(int severity, const char *string);
int tor_mem_is_zero(const char *mem, size_t len);
int tor_digest_is_zero(const char *digest);
int tor_digest256_is_zero(const char *digest);
char *esc_for_log(const char *string) ATTR_MALLOC;
const char *escaped(const char *string);
+
+char *tor_escape_str_for_pt_args(const char *string,
+ const char *chars_to_escape);
+
struct smartlist_t;
-int tor_vsscanf(const char *buf, const char *pattern, va_list ap)
-#ifdef __GNUC__
- __attribute__((format(scanf, 2, 0)))
-#endif
- ;
+int tor_vsscanf(const char *buf, const char *pattern, va_list ap) \
+ CHECK_SCANF(2, 0);
int tor_sscanf(const char *buf, const char *pattern, ...)
-#ifdef __GNUC__
- __attribute__((format(scanf, 2, 3)))
-#endif
- ;
+ CHECK_SCANF(2, 3);
void smartlist_add_asprintf(struct smartlist_t *sl, const char *pattern, ...)
CHECK_PRINTF(2, 3);
@@ -356,8 +356,9 @@ FILE *fdopen_file(open_file_t *file_data);
int finish_writing_to_file(open_file_t *file_data);
int abort_writing_to_file(open_file_t *file_data);
int write_str_to_file(const char *fname, const char *str, int bin);
-int write_bytes_to_file(const char *fname, const char *str, size_t len,
- int bin);
+MOCK_DECL(int,
+write_bytes_to_file,(const char *fname, const char *str, size_t len,
+ int bin));
/** An ad-hoc type to hold a string of characters and a count; used by
* write_chunks_to_file. */
typedef struct sized_chunk_t {
@@ -365,7 +366,7 @@ typedef struct sized_chunk_t {
size_t len;
} sized_chunk_t;
int write_chunks_to_file(const char *fname, const struct smartlist_t *chunks,
- int bin);
+ int bin, int no_tempfile);
int append_bytes_to_file(const char *fname, const char *str, size_t len,
int bin);
int write_bytes_to_new_file(const char *fname, const char *str, size_t len,
@@ -493,18 +494,21 @@ FILE *tor_process_get_stdout_pipe(process_handle_t *process_handle);
#endif
#ifdef _WIN32
-struct smartlist_t *
-tor_get_lines_from_handle(HANDLE *handle,
- enum stream_status *stream_status);
+MOCK_DECL(struct smartlist_t *,
+tor_get_lines_from_handle,(HANDLE *handle,
+ enum stream_status *stream_status));
#else
-struct smartlist_t *
-tor_get_lines_from_handle(FILE *handle,
- enum stream_status *stream_status);
+MOCK_DECL(struct smartlist_t *,
+tor_get_lines_from_handle,(FILE *handle,
+ enum stream_status *stream_status));
#endif
-int tor_terminate_process(process_handle_t *process_handle);
-void tor_process_handle_destroy(process_handle_t *process_handle,
- int also_terminate_process);
+int
+tor_terminate_process(process_handle_t *process_handle);
+
+MOCK_DECL(void,
+tor_process_handle_destroy,(process_handle_t *process_handle,
+ int also_terminate_process));
/* ===== Insecure rng */
typedef struct tor_weak_rng_t {
@@ -520,12 +524,14 @@ int32_t tor_weak_random_range(tor_weak_rng_t *rng, int32_t top);
* <b>n</b> */
#define tor_weak_random_one_in_n(rng, n) (0==tor_weak_random_range((rng),(n)))
+int format_hex_number_sigsafe(unsigned long x, char *buf, int max_len);
+int format_dec_number_sigsafe(unsigned long x, char *buf, int max_len);
+
#ifdef UTIL_PRIVATE
/* Prototypes for private functions only used by util.c (and unit tests) */
-int format_hex_number_for_helper_exit_status(unsigned int x, char *buf,
- int max_len);
-int format_helper_exit_status(unsigned char child_state,
+#ifndef _WIN32
+STATIC int format_helper_exit_status(unsigned char child_state,
int saved_errno, char *hex_errno);
/* Space for hex values of child state, a slash, saved_errno (with
@@ -534,7 +540,11 @@ int format_helper_exit_status(unsigned char child_state,
1 + sizeof(int) * 2 + 1)
#endif
+#endif
+
const char *libor_get_digests(void);
+#define ARRAY_LENGTH(x) (sizeof(x)) / sizeof(x[0])
+
#endif
diff --git a/src/config/README.geoip b/src/config/README.geoip
deleted file mode 100644
index 852050140..000000000
--- a/src/config/README.geoip
+++ /dev/null
@@ -1,90 +0,0 @@
-README.geoip -- information on the IP-to-country-code file shipped with tor
-===========================================================================
-
-The IP-to-country-code file in src/config/geoip is based on MaxMind's
-GeoLite Country database with the following modifications:
-
- - Those "A1" ("Anonymous Proxy") entries lying inbetween two entries with
- the same country code are automatically changed to that country code.
- These changes can be overriden by specifying a different country code
- in src/config/geoip-manual.
-
- - Other "A1" entries are replaced with country codes specified in
- src/config/geoip-manual, or are left as is if there is no corresponding
- entry in that file. Even non-"A1" entries can be modified by adding a
- replacement entry to src/config/geoip-manual. Handle with care.
-
-
-1. Updating the geoip file from a MaxMind database file
--------------------------------------------------------
-
-Download the most recent MaxMind GeoLite Country database:
-http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
-
-Run `python deanonymind.py` in the local directory. Review the output to
-learn about applied automatic/manual changes and watch out for any
-warnings.
-
-Possibly edit geoip-manual to make more/fewer/different manual changes and
-re-run `python deanonymind.py`.
-
-When done, prepend the new geoip file with a comment like this:
-
- # Last updated based on $DATE Maxmind GeoLite Country
- # See README.geoip for details on the conversion.
-
-
-2. Verifying automatic and manual changes using diff
-----------------------------------------------------
-
-To unzip the original MaxMind file and look at the automatic changes, run:
-
- unzip GeoIPCountryCSV.zip
- diff -U1 GeoIPCountryWhois.csv AutomaticGeoIPCountryWhois.csv
-
-To look at subsequent manual changes, run:
-
- diff -U1 AutomaticGeoIPCountryWhois.csv ManualGeoIPCountryWhois.csv
-
-To manually generate the geoip file and compare it to the automatically
-created one, run:
-
- cut -d, -f3-5 < ManualGeoIPCountryWhois.csv | sed 's/"//g' > mygeoip
- diff -U1 geoip mygeoip
-
-
-3. Verifying automatic and manual changes using blockfinder
------------------------------------------------------------
-
-Blockfinder is a powerful tool to handle multiple IP-to-country data
-sources. Blockfinder has a function to specify a country code and compare
-conflicting country code assignments in different data sources.
-
-We can use blockfinder to compare A1 entries in the original MaxMind file
-with the same or overlapping blocks in the file generated above and in the
-RIR delegation files:
-
- git clone https://github.com/ioerror/blockfinder
- cd blockfinder/
- python blockfinder -i
- python blockfinder -r ../GeoIPCountryWhois.csv
- python blockfinder -r ../ManualGeoIPCountryWhois.csv
- python blockfinder -p A1 > A1-comparison.txt
-
-The output marks conflicts between assignments using either '*' in case of
-two different opinions or '#' for three or more different opinions about
-the country code for a given block.
-
-The '*' conflicts are most likely harmless, because there will always be
-at least two opinions with the original MaxMind file saying A1 and the
-other two sources saying something more meaningful.
-
-However, watch out for '#' conflicts. In these cases, the original
-MaxMind file ("A1"), the updated MaxMind file (hopefully the correct
-country code), and the RIR delegation files (some other country code) all
-disagree.
-
-There are perfectly valid cases where the updated MaxMind file and the RIR
-delegation files don't agree. But each of those cases must be verified
-manually.
-
diff --git a/src/config/deanonymind.py b/src/config/deanonymind.py
deleted file mode 100755
index c86dadca9..000000000
--- a/src/config/deanonymind.py
+++ /dev/null
@@ -1,194 +0,0 @@
-#!/usr/bin/env python
-import optparse
-import os
-import sys
-import zipfile
-
-"""
-Take a MaxMind GeoLite Country database as input and replace A1 entries
-with the country code and name of the preceding entry iff the preceding
-(subsequent) entry ends (starts) directly before (after) the A1 entry and
-both preceding and subsequent entries contain the same country code.
-
-Then apply manual changes, either replacing A1 entries that could not be
-replaced automatically or overriding previously made automatic changes.
-"""
-
-def main():
- options = parse_options()
- assignments = read_file(options.in_maxmind)
- assignments = apply_automatic_changes(assignments)
- write_file(options.out_automatic, assignments)
- manual_assignments = read_file(options.in_manual, must_exist=False)
- assignments = apply_manual_changes(assignments, manual_assignments)
- write_file(options.out_manual, assignments)
- write_file(options.out_geoip, assignments, long_format=False)
-
-def parse_options():
- parser = optparse.OptionParser()
- parser.add_option('-i', action='store', dest='in_maxmind',
- default='GeoIPCountryCSV.zip', metavar='FILE',
- help='use the specified MaxMind GeoLite Country .zip or .csv '
- 'file as input [default: %default]')
- parser.add_option('-g', action='store', dest='in_manual',
- default='geoip-manual', metavar='FILE',
- help='use the specified .csv file for manual changes or to '
- 'override automatic changes [default: %default]')
- parser.add_option('-a', action='store', dest='out_automatic',
- default="AutomaticGeoIPCountryWhois.csv", metavar='FILE',
- help='write full input file plus automatic changes to the '
- 'specified .csv file [default: %default]')
- parser.add_option('-m', action='store', dest='out_manual',
- default='ManualGeoIPCountryWhois.csv', metavar='FILE',
- help='write full input file plus automatic and manual '
- 'changes to the specified .csv file [default: %default]')
- parser.add_option('-o', action='store', dest='out_geoip',
- default='geoip', metavar='FILE',
- help='write full input file plus automatic and manual '
- 'changes to the specified .csv file that can be shipped '
- 'with tor [default: %default]')
- (options, args) = parser.parse_args()
- return options
-
-def read_file(path, must_exist=True):
- if not os.path.exists(path):
- if must_exist:
- print 'File %s does not exist. Exiting.' % (path, )
- sys.exit(1)
- else:
- return
- if path.endswith('.zip'):
- zip_file = zipfile.ZipFile(path)
- csv_content = zip_file.read('GeoIPCountryWhois.csv')
- zip_file.close()
- else:
- csv_file = open(path)
- csv_content = csv_file.read()
- csv_file.close()
- assignments = []
- for line in csv_content.split('\n'):
- stripped_line = line.strip()
- if len(stripped_line) > 0 and not stripped_line.startswith('#'):
- assignments.append(stripped_line)
- return assignments
-
-def apply_automatic_changes(assignments):
- print '\nApplying automatic changes...'
- result_lines = []
- prev_line = None
- a1_lines = []
- for line in assignments:
- if '"A1"' in line:
- a1_lines.append(line)
- else:
- if len(a1_lines) > 0:
- new_a1_lines = process_a1_lines(prev_line, a1_lines, line)
- for new_a1_line in new_a1_lines:
- result_lines.append(new_a1_line)
- a1_lines = []
- result_lines.append(line)
- prev_line = line
- if len(a1_lines) > 0:
- new_a1_lines = process_a1_lines(prev_line, a1_lines, None)
- for new_a1_line in new_a1_lines:
- result_lines.append(new_a1_line)
- return result_lines
-
-def process_a1_lines(prev_line, a1_lines, next_line):
- if not prev_line or not next_line:
- return a1_lines # Can't merge first or last line in file.
- if len(a1_lines) > 1:
- return a1_lines # Can't merge more than 1 line at once.
- a1_line = a1_lines[0].strip()
- prev_entry = parse_line(prev_line)
- a1_entry = parse_line(a1_line)
- next_entry = parse_line(next_line)
- touches_prev_entry = int(prev_entry['end_num']) + 1 == \
- int(a1_entry['start_num'])
- touches_next_entry = int(a1_entry['end_num']) + 1 == \
- int(next_entry['start_num'])
- same_country_code = prev_entry['country_code'] == \
- next_entry['country_code']
- if touches_prev_entry and touches_next_entry and same_country_code:
- new_line = format_line_with_other_country(a1_entry, prev_entry)
- print '-%s\n+%s' % (a1_line, new_line, )
- return [new_line]
- else:
- return a1_lines
-
-def parse_line(line):
- if not line:
- return None
- keys = ['start_str', 'end_str', 'start_num', 'end_num',
- 'country_code', 'country_name']
- stripped_line = line.replace('"', '').strip()
- parts = stripped_line.split(',')
- entry = dict((k, v) for k, v in zip(keys, parts))
- return entry
-
-def format_line_with_other_country(original_entry, other_entry):
- return '"%s","%s","%s","%s","%s","%s"' % (original_entry['start_str'],
- original_entry['end_str'], original_entry['start_num'],
- original_entry['end_num'], other_entry['country_code'],
- other_entry['country_name'], )
-
-def apply_manual_changes(assignments, manual_assignments):
- if not manual_assignments:
- return assignments
- print '\nApplying manual changes...'
- manual_dict = {}
- for line in manual_assignments:
- start_num = parse_line(line)['start_num']
- if start_num in manual_dict:
- print ('Warning: duplicate start number in manual '
- 'assignments:\n %s\n %s\nDiscarding first entry.' %
- (manual_dict[start_num], line, ))
- manual_dict[start_num] = line
- result = []
- for line in assignments:
- entry = parse_line(line)
- start_num = entry['start_num']
- if start_num in manual_dict:
- manual_line = manual_dict[start_num]
- manual_entry = parse_line(manual_line)
- if entry['start_str'] == manual_entry['start_str'] and \
- entry['end_str'] == manual_entry['end_str'] and \
- entry['end_num'] == manual_entry['end_num']:
- if len(manual_entry['country_code']) != 2:
- print '-%s' % (line, ) # only remove, don't replace
- else:
- new_line = format_line_with_other_country(entry,
- manual_entry)
- print '-%s\n+%s' % (line, new_line, )
- result.append(new_line)
- del manual_dict[start_num]
- else:
- print ('Warning: only partial match between '
- 'original/automatically replaced assignment and '
- 'manual assignment:\n %s\n %s\nNot applying '
- 'manual change.' % (line, manual_line, ))
- result.append(line)
- else:
- result.append(line)
- if len(manual_dict) > 0:
- print ('Warning: could not apply all manual assignments: %s' %
- ('\n '.join(manual_dict.values())), )
- return result
-
-def write_file(path, assignments, long_format=True):
- if long_format:
- output_lines = assignments
- else:
- output_lines = []
- for long_line in assignments:
- entry = parse_line(long_line)
- short_line = "%s,%s,%s" % (entry['start_num'],
- entry['end_num'], entry['country_code'], )
- output_lines.append(short_line)
- out_file = open(path, 'w')
- out_file.write('\n'.join(output_lines))
- out_file.close()
-
-if __name__ == '__main__':
- main()
-
diff --git a/src/config/geoip b/src/config/geoip
index 67e74680c..653aff570 100644
--- a/src/config/geoip
+++ b/src/config/geoip
@@ -1,5 +1,5 @@
-# Last updated based on February 7 2014 Maxmind GeoLite2 Country
-# wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz
+# Last updated based on June 4 2014 Maxmind GeoLite2 Country
+# wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz
# gunzip GeoLite2-Country.mmdb.gz
# python mmdb-convert.py GeoLite2-Country.mmdb
16777216,16777471,AU
@@ -70,8 +70,10 @@
29949952,30015487,KR
30015488,30408703,CN
30408704,33554431,KR
-33554432,34603007,FR
+33554432,33554432,DE
+33554433,34603007,FR
34604544,34605055,DE
+34612224,34612735,IL
34620416,34620927,SE
34620928,34621439,IT
34636800,34637311,DE
@@ -82,6 +84,7 @@
34673664,34674687,DE
34733056,34734079,DE
34754560,34758655,GR
+34796032,34796543,NL
34803712,34807807,IT
34861056,34865151,DE
34866176,34867199,IT
@@ -111,7 +114,7 @@
35008512,35009023,FR
35010304,35010559,BE
35010560,35011583,FR
-35011584,35011839,CH
+35011584,35011839,SE
35020800,35037183,GB
35037184,35054335,FR
35054336,35054591,GB
@@ -125,13 +128,10 @@
35651584,36700159,IT
36700160,36962303,AE
36962304,37224447,IL
-37224448,37486591,UA
37486592,37748735,RU
-37748736,38032383,SE
-38032384,38032639,DK
-38032640,38074879,SE
-38074880,38075135,DK
-38075136,38273023,SE
+37748736,38258687,SE
+38258688,38258943,DK
+38258944,38273023,SE
38273024,38797311,KZ
38797312,39059455,PT
39059456,39321599,GR
@@ -139,7 +139,11 @@
39583744,39845887,RU
39845888,40370175,GB
40370176,40894463,DK
-40894464,41418751,IT
+40894464,41094879,IT
+41094880,41094887,SI
+41094888,41094895,IT
+41094896,41094903,SI
+41094904,41418751,IT
41418752,41943039,GB
41943040,42205183,DK
42205184,42467327,KZ
@@ -158,7 +162,9 @@
49807360,50331647,SE
50331648,57083940,US
57083941,57083941,BE
-57083942,69094399,US
+57083942,68305407,US
+68305408,68305919,MX
+68305920,69094399,US
69094400,69094655,AU
69094656,71020543,US
71020544,71020799,CA
@@ -208,9 +214,7 @@
84021248,84023295,GB
84023296,84025343,ES
84025344,84033535,RU
-84033536,84035071,NL
-84035072,84035327,NG
-84035328,84037631,NL
+84033536,84037631,NL
84037632,84039679,TR
84039680,84041727,ES
84041728,84049919,GB
@@ -218,8 +222,8 @@
84082688,84148223,RU
84148224,84410367,DE
84410368,84428799,RU
-84428800,84429823,DE
-84429824,84434943,RU
+84428800,84430847,GB
+84430848,84434943,RU
84434944,84443135,IT
84443136,84451327,LB
84451328,84457471,RU
@@ -258,11 +262,11 @@
84563704,84563711,US
84563712,84564411,NL
84564412,84564415,US
-84564416,84564663,NL
-84564664,84564671,GB
-84564672,84564871,NL
-84564872,84564879,MY
-84564880,84565247,NL
+84564416,84564498,NL
+84564499,84564499,GB
+84564500,84564863,NL
+84564864,84564871,TR
+84564872,84565247,NL
84565248,84565311,US
84565312,84565655,NL
84565656,84565663,US
@@ -307,6 +311,8 @@
85391360,85393407,NL
85395968,85396223,BE
85396480,85397503,ES
+85398528,85398783,SA
+85399552,85400063,FR
85401600,85403647,IT
85403648,85405695,FR
85405696,85407743,RU
@@ -362,15 +368,58 @@
86245376,86376447,OM
86376448,86409215,AE
86409216,86441983,HU
-86441984,86442700,FR
+86441984,86442495,FR
+86442496,86442499,ES
+86442500,86442507,FR
+86442508,86442511,ES
+86442512,86442687,FR
+86442688,86442691,ES
+86442692,86442699,FR
+86442700,86442700,ES
86442701,86442702,CH
-86442703,86442723,FR
+86442703,86442703,ES
+86442704,86442723,FR
86442724,86442724,PL
-86442725,86442751,FR
+86442725,86442739,FR
+86442740,86442743,ES
+86442744,86442751,FR
86442752,86443007,GB
-86443008,86444319,FR
-86444320,86444323,ES
-86444324,86446407,FR
+86443008,86443047,FR
+86443048,86443051,ES
+86443052,86443451,FR
+86443452,86443455,ES
+86443456,86443535,FR
+86443536,86443539,ES
+86443540,86444119,FR
+86444120,86444123,ES
+86444124,86444287,FR
+86444288,86444291,NL
+86444292,86444315,FR
+86444316,86444323,ES
+86444324,86444387,FR
+86444388,86444391,NL
+86444392,86444519,FR
+86444520,86444523,ES
+86444524,86444563,FR
+86444564,86444567,NL
+86444568,86444575,FR
+86444576,86444579,ES
+86444580,86444687,FR
+86444688,86444691,ES
+86444692,86444835,FR
+86444836,86444839,NL
+86444840,86444843,ES
+86444844,86444879,FR
+86444880,86444883,NL
+86444884,86445059,FR
+86445060,86445063,NL
+86445064,86445111,FR
+86445112,86445115,NL
+86445116,86445251,FR
+86445252,86445255,NL
+86445256,86445559,FR
+86445560,86445563,NL
+86445564,86446407,FR
86446408,86446408,DE
86446409,86446411,FR
86446412,86446412,DE
@@ -378,7 +427,9 @@
86446428,86446431,DE
86446432,86446619,FR
86446620,86446620,DE
-86446621,86447095,FR
+86446621,86446679,FR
+86446680,86446683,ES
+86446684,86447095,FR
86447096,86447103,ES
86447104,86447255,FR
86447256,86447263,PL
@@ -393,31 +444,49 @@
86448856,86448859,PT
86448860,86449363,FR
86449364,86449367,DE
-86449368,86449883,FR
+86449368,86449499,FR
+86449500,86449503,ES
+86449504,86449883,FR
86449884,86449884,DE
86449885,86450235,FR
86450236,86450239,GB
-86450240,86452671,FR
+86450240,86452067,FR
+86452068,86452071,ES
+86452072,86452671,FR
86452672,86452735,GB
-86452736,86453836,FR
+86452736,86453199,FR
+86453200,86453203,ES
+86453204,86453311,FR
+86453312,86453315,ES
+86453316,86453836,FR
86453837,86453838,PT
86453839,86454335,FR
86454336,86454343,DE
-86454344,86455623,FR
+86454344,86454615,FR
+86454616,86454619,ES
+86454620,86455623,FR
86455624,86455624,DE
86455625,86456195,FR
86456196,86456211,DE
86456212,86456351,FR
86456352,86456367,CH
-86456368,86457059,FR
+86456368,86456371,FR
+86456372,86456375,ES
+86456376,86457059,FR
86457060,86457060,DE
86457061,86457087,FR
86457088,86457091,DE
86457092,86457111,FR
86457112,86457112,DE
-86457113,86457455,FR
+86457113,86457187,FR
+86457188,86457191,ES
+86457192,86457403,FR
+86457404,86457407,ES
+86457408,86457455,FR
86457456,86457456,DE
-86457457,86467320,FR
+86457457,86457799,FR
+86457800,86457803,ES
+86457804,86467320,FR
86467321,86467321,FI
86467322,86467999,FR
86468000,86468003,PL
@@ -425,7 +494,9 @@
86468056,86468056,DE
86468057,86468447,FR
86468448,86468479,CZ
-86468480,86469183,FR
+86468480,86468587,FR
+86468588,86468591,ES
+86468592,86469183,FR
86469184,86469247,GB
86469248,86469691,FR
86469692,86469695,DE
@@ -459,8 +530,8 @@
86638592,86671359,RU
86671360,86671615,JE
86671616,86671871,GB
-86671872,86672639,JE
-86672640,86673407,GB
+86671872,86672895,JE
+86672896,86673407,GB
86673408,86675455,DE
86675456,86677503,IT
86677504,86679551,FR
@@ -562,23 +633,21 @@
87642112,87646207,GB
87646208,87646463,FR
87646464,87646719,RE
-87646720,87647231,FR
+87646720,87646975,YT
+87646976,87647231,FR
87647232,87647743,RE
-87647744,87647999,YT
-87648000,87648511,FR
+87647744,87648511,FR
87648512,87649535,RE
-87649536,87650047,FR
-87650048,87650815,RE
-87650816,87650943,FR
-87650944,87651071,RE
-87651072,87651583,FR
+87649536,87649791,FR
+87649792,87650815,RE
+87650816,87651583,FR
87651584,87651839,RE
-87651840,87652095,FR
-87652096,87652351,RE
-87652352,87652607,FR
-87652608,87653375,RE
-87653376,87653887,FR
-87653888,87654399,RE
+87651840,87653119,FR
+87653120,87653375,RE
+87653376,87653631,FR
+87653632,87653887,RE
+87653888,87654143,FR
+87654144,87654399,RE
87654400,87670783,PL
87670784,87672831,DE
87672832,87674879,CH
@@ -594,7 +663,10 @@
87818240,87883775,PL
87883776,87885823,IT
87885824,87889919,RU
-87889920,87891967,US
+87889920,87890431,IR
+87890432,87890943,US
+87890944,87891199,NL
+87891200,87891967,US
87891968,87902207,DE
87902208,87904255,IR
87904256,87906303,DE
@@ -611,7 +683,10 @@
87945216,87947263,HU
87947264,87949311,NL
87949312,87965695,GB
-87965696,87982079,DE
+87965696,87967743,DE
+87967744,87969791,IT
+87969792,87973887,IM
+87973888,87982079,DE
87982080,88014847,RU
88014848,88016895,LY
88016896,88018943,IR
@@ -677,7 +752,8 @@
90503168,90505215,IL
90505216,90529791,RU
90529792,90533887,NL
-90533888,90540031,RU
+90533888,90537983,EE
+90537984,90540031,RU
90540032,90544127,GB
90544128,90546175,RU
90546176,90548223,DE
@@ -769,7 +845,11 @@
92734736,92734739,DE
92734740,92735615,FR
92735616,92735616,DE
-92735617,92735875,FR
+92735617,92735619,FR
+92735620,92735623,ES
+92735624,92735823,FR
+92735824,92735827,ES
+92735828,92735875,FR
92735876,92735876,DE
92735877,92735999,FR
92736000,92736255,GB
@@ -777,19 +857,29 @@
92736480,92736480,DE
92736481,92738719,FR
92738720,92738727,GB
-92738728,92747711,FR
+92738728,92742815,FR
+92742816,92742819,ES
+92742820,92744263,FR
+92744264,92744267,NL
+92744268,92747711,FR
92747712,92747775,GB
92747776,92749067,FR
92749068,92749071,GB
-92749072,92751711,FR
+92749072,92749747,FR
+92749748,92749751,ES
+92749752,92751711,FR
92751712,92751712,DE
-92751713,92757311,FR
+92751713,92754579,FR
+92754580,92754583,ES
+92754584,92757311,FR
92757312,92757375,ES
92757376,92762127,FR
92762128,92762135,ES
92762136,92782687,FR
92782688,92782719,ES
-92782720,92786827,FR
+92782720,92783543,FR
+92783544,92783547,ES
+92783548,92786827,FR
92786828,92786831,IT
92786832,92798975,FR
92798976,93323263,RU
@@ -836,8 +926,9 @@
93693952,93695999,IE
93696000,93700095,FR
93700096,93702143,PL
-93702144,93704191,RU
-93704192,93708287,UA
+93702144,93705983,RU
+93705984,93706239,UA
+93706240,93708287,RU
93708288,93712383,DE
93712384,93714431,HU
93714432,93716479,NL
@@ -845,9 +936,17 @@
93749248,93753343,IT
93753344,93765631,GB
93765632,93774847,SE
-93774848,93775871,NO
-93775872,93782015,SE
-93782016,93847551,GB
+93774848,93776127,NO
+93776128,93782015,SE
+93782016,93833983,GB
+93833984,93834239,NL
+93834240,93835263,GB
+93835264,93835519,NL
+93835520,93836287,GB
+93836288,93836799,NL
+93836800,93842351,GB
+93842352,93842359,NL
+93842360,93847551,GB
93847552,93880319,GE
93880320,93888511,IT
93888512,93890559,PL
@@ -859,17 +958,20 @@
93906944,93908991,BA
93908992,93911039,IT
93911040,93913087,AE
-93913088,93913327,NL
-93913328,93913335,US
-93913336,93914357,NL
+93913088,93914319,NL
+93914320,93914323,AZ
+93914324,93914357,NL
93914358,93914358,GB
-93914359,93914710,NL
+93914359,93914671,NL
+93914672,93914679,US
+93914680,93914710,NL
93914711,93914711,GB
-93914712,93914975,NL
-93914976,93914983,US
-93914984,93915327,NL
+93914712,93914951,NL
+93914952,93914959,US
+93914960,93915327,NL
93915328,93915391,US
-93915392,93915855,NL
+93915392,93915847,NL
+93915848,93915855,TR
93915856,93915863,US
93915864,93915895,NL
93915896,93915903,AT
@@ -877,11 +979,11 @@
93916336,93916343,US
93916344,93916527,NL
93916528,93916543,US
-93916544,93916971,NL
+93916544,93916591,NL
+93916592,93916599,US
+93916600,93916971,NL
93916972,93916975,US
-93916976,93917751,NL
-93917752,93917759,US
-93917760,93918103,NL
+93916976,93918103,NL
93918104,93918111,US
93918112,93918215,NL
93918216,93918223,US
@@ -895,9 +997,7 @@
93919264,93919279,US
93919280,93919391,NL
93919392,93919395,US
-93919396,93919487,NL
-93919488,93919551,US
-93919552,93919951,NL
+93919396,93919951,NL
93919952,93919959,US
93919960,93920059,NL
93920060,93920063,US
@@ -905,7 +1005,9 @@
93920164,93920167,US
93920168,93920575,NL
93920576,93920639,US
-93920640,93921055,NL
+93920640,93920855,NL
+93920856,93920863,US
+93920864,93921055,NL
93921056,93921059,US
93921060,93921063,NL
93921064,93921071,GB
@@ -915,25 +1017,31 @@
93923568,93923575,US
93923576,93923855,NL
93923856,93923863,US
-93923864,93924119,NL
-93924120,93924123,US
-93924124,93924407,NL
+93923864,93924407,NL
93924408,93924415,JP
93924416,93924591,NL
93924592,93924599,US
93924600,93924927,NL
93924928,93924935,ES
-93924936,93925783,NL
-93925784,93925791,US
-93925792,93926399,NL
-93926400,93926463,US
-93926464,93926527,NL
-93926528,93926591,US
-93926592,93927143,NL
+93924936,93925807,NL
+93925808,93925815,KE
+93925816,93927143,NL
93927144,93927151,JP
93927152,93927231,NL
93927232,93927247,CL
-93927248,93929471,NL
+93927248,93927871,NL
+93927872,93927879,US
+93927880,93927887,NL
+93927888,93927895,US
+93927896,93927927,NL
+93927928,93927935,US
+93927936,93929031,NL
+93929032,93929039,US
+93929040,93929079,NL
+93929080,93929087,US
+93929088,93929191,NL
+93929192,93929199,US
+93929200,93929471,NL
93929472,93939711,GB
93939712,93941759,NO
93941760,93945855,CH
@@ -942,7 +1050,8 @@
93972480,93974527,SE
93974528,93976575,CH
93976576,93978623,GB
-93978624,94175231,RO
+93978624,94011391,ES
+94011392,94175231,RO
94175232,94178303,SE
94178304,94178559,NO
94178560,94179071,SE
@@ -1024,7 +1133,48 @@
95371264,95375359,IT
95375360,95377407,NL
95377408,95387647,RU
-95387648,95420415,DE
+95387648,95387903,GB
+95387904,95388927,DE
+95388928,95389183,AU
+95389184,95389695,DE
+95389696,95390207,GB
+95390208,95393151,DE
+95393152,95393279,RS
+95393280,95393407,DE
+95393408,95393535,AE
+95393536,95393663,DE
+95393664,95393791,QA
+95393792,95394047,GB
+95394048,95395327,AU
+95395328,95395839,GB
+95395840,95398399,DE
+95398400,95398655,GB
+95398656,95400447,DE
+95400448,95400703,GB
+95400704,95401471,DE
+95401472,95401727,GB
+95401728,95402111,DE
+95402112,95402239,KW
+95402240,95402623,DE
+95402624,95402751,US
+95402752,95403519,DE
+95403520,95403775,GB
+95403776,95404799,DE
+95404800,95405055,GB
+95405056,95405567,DE
+95405568,95405823,GB
+95405824,95406335,DE
+95406336,95407359,GB
+95407360,95407871,US
+95407872,95408639,DE
+95408640,95409151,GB
+95409152,95409663,DE
+95409664,95409919,US
+95409920,95410175,DE
+95410176,95410431,AU
+95410432,95410687,DE
+95410688,95410943,GB
+95410944,95420415,DE
95420416,95551487,TR
95551488,95555583,AZ
95555584,95557631,GB
@@ -1050,7 +1200,6 @@
95649792,95666175,IT
95666176,95668223,FR
95668224,95682559,DE
-95682560,95944703,UA
95944704,96075775,PL
96075776,96143359,DE
96143360,96145407,GE
@@ -1066,13 +1215,17 @@
96167424,96167679,FR
96167680,96167935,GP
96167936,96168191,MQ
-96168192,96169215,FR
-96169216,96169727,MQ
+96168192,96169471,FR
+96169472,96169727,MQ
96169728,96170751,FR
-96170752,96171007,GF
-96171008,96174079,FR
+96170752,96171263,GF
+96171264,96173055,FR
+96173056,96173311,MQ
+96173312,96174079,FR
96174080,96206847,HU
-96206848,96337919,RU
+96206848,96305151,RU
+96305152,96321535,DE
+96321536,96337919,RU
96337920,96403455,IR
96403456,96468991,AZ
96468992,96731135,RO
@@ -1131,16 +1284,41 @@
98746368,98762751,TR
98762752,98893823,RU
98893824,98959359,TR
-98959360,99090431,DE
+98959360,99024895,DE
+99024896,99025151,GB
+99025152,99025407,IT
+99025408,99025663,NL
+99025664,99025919,DE
+99025920,99026175,SE
+99026176,99026943,DE
+99026944,99027199,GB
+99027200,99027455,CA
+99027456,99027711,PL
+99027712,99028735,DE
+99028736,99028991,EG
+99028992,99029247,GB
+99029248,99029503,DE
+99029504,99029759,TR
+99029760,99031295,DE
+99031296,99031551,GB
+99031552,99031807,DE
+99031808,99032063,FR
+99032064,99044863,DE
+99044864,99045119,GB
+99045120,99045375,NL
+99045376,99090431,DE
99090432,99614719,IR
99614720,99876863,SE
99876864,100139007,SA
100139008,100204543,UA
100204544,100237311,PT
100237312,100245503,IT
-100245504,100246527,SE
+100245504,100246015,SE
+100246016,100246271,GB
+100246272,100246527,NL
100246528,100246783,DE
-100246784,100247551,SE
+100246784,100247039,FR
+100247040,100247551,SE
100247552,100249599,CH
100249600,100253695,SI
100253696,100261887,RU
@@ -1167,9 +1345,11 @@
100560960,100561023,RO
100561024,100561151,GB
100561152,100564991,RO
-100564992,100566527,SE
-100566528,100566783,FR
-100566784,100573183,SE
+100564992,100569087,SE
+100569088,100569343,FR
+100569344,100569599,SE
+100569600,100569855,FR
+100569856,100573183,SE
100573184,100575231,GB
100575232,100577279,DK
100577280,100579327,RU
@@ -1187,33 +1367,51 @@
100663296,134874866,US
134874867,134874867,DO
134874868,135192575,US
-135192576,135193343,MX
-135193344,135193599,US
-135193600,135194367,MX
-135194368,135194623,US
-135194624,135194879,MX
-135194880,135195391,US
-135195392,135195647,MX
-135195648,135197951,US
-135197952,135198207,MX
-135198208,135607039,US
+135192576,135200767,MX
+135200768,135432191,US
+135432192,135434239,CA
+135434240,135603199,US
+135603200,135604223,CA
+135604224,135607039,US
135607040,135607295,CA
135607296,135776255,US
135776256,135776511,GU
-135776512,135790847,US
-135790848,135791615,CA
-135791616,136415665,US
+135776512,135790591,US
+135790592,135790847,CA
+135790848,135791103,US
+135791104,135791615,CA
+135791616,135792639,US
+135792640,135794687,CA
+135794688,136237055,US
+136237056,136239103,CA
+136239104,136404991,US
+136404992,136407039,CA
+136407040,136413183,US
+136413184,136415231,CA
+136415232,136415665,US
136415666,136415666,FR
-136415667,136700159,US
-136700160,136700415,IN
-136700416,152305663,US
+136415667,136689919,US
+136689920,136690175,CA
+136690176,139954241,US
+139954242,139954242,ES
+139954243,152305663,US
152305664,152338431,GB
152338432,167772159,US
-184549376,203659007,US
+184549376,201897983,US
+201897984,201898239,PR
+201898240,202182143,US
+202182144,202182399,GB
+202182400,202385407,US
+202385408,202385919,PR
+202385920,202706431,US
+202706432,202706943,PR
+202706944,202935551,US
+202935552,202935807,PR
+202935808,203272959,US
+203272960,203273215,GB
+203273216,203659007,US
203659008,203659263,VI
-203659264,204047487,US
-204047488,204047615,VI
-204047616,204047871,US
+203659264,204047871,US
204047872,204047999,PR
204048000,204048031,US
204048032,204048047,PR
@@ -1224,29 +1422,35 @@
211126912,211263999,US
211264000,211264255,SA
211264256,211597311,US
-211597312,211597439,VI
-211597440,211597719,US
+211597312,211597567,VI
+211597568,211597719,US
211597720,211597727,VI
211597728,212787199,US
212787200,212788223,PR
-212788224,212788863,US
+212788224,212788479,US
+212788480,212788735,VI
+212788736,212788863,US
212788864,212788991,PR
212788992,212789087,US
212789088,212789095,VI
-212789096,212791807,US
-212791808,212792063,VI
+212789096,212791831,US
+212791832,212791839,VI
+212791840,212791935,US
+212791936,212792063,VI
212792064,212793087,US
212793088,212793343,PR
212793344,212794575,US
212794576,212794583,VI
-212794584,214698239,US
+212794584,214237247,US
+214237248,214237311,PR
+214237312,214698239,US
214698240,214698255,VI
214698256,214698303,US
214698304,214698311,VI
214698312,214699519,US
214699520,214699647,PR
-214699648,214700031,VI
-214700032,214778367,US
+214699648,214699775,VI
+214699776,214778367,US
214778368,214778623,PR
214778624,216417663,US
216417664,216417727,PR
@@ -1265,9 +1469,7 @@
234947584,234950655,JP
234950656,234951679,AU
234951680,234952703,HK
-234954752,234961663,NZ
-234961664,234961919,US
-234961920,234971135,NZ
+234954752,234971135,NZ
234979328,235012095,MY
235012096,235077631,AU
235077632,235143167,JP
@@ -1363,7 +1565,9 @@
266586368,266586623,CA
266586624,266598655,US
266598656,266598911,BR
-266598912,288167423,US
+266598912,288130047,US
+288130048,288131071,CA
+288131072,288167423,US
288167424,288167935,CA
288167936,288169471,US
288169472,288169983,CA
@@ -1481,11 +1685,7 @@
344260608,344260863,GB
344260864,344262655,US
344262656,344262911,GB
-344262912,344270847,US
-344270848,344270860,DE
-344270861,344270861,GB
-344270862,344271103,DE
-344271104,344588543,US
+344262912,344588543,US
344588544,344589055,GB
344589056,344592895,US
344592896,344592945,GB
@@ -1511,14 +1711,176 @@
344881152,344881407,IN
344881408,344977407,US
344977408,344977663,IN
-344977664,386862079,US
+344977664,386035711,US
+386035712,386039807,NL
+386039808,386060287,US
+386060288,386068479,NL
+386068480,386109439,US
+386109440,386113535,NL
+386113536,386125823,US
+386125824,386134015,NL
+386134016,386519039,US
+386519040,386523135,NL
+386523136,386613247,US
+386613248,386617343,NL
+386617344,386662399,US
+386662400,386670591,NL
+386670592,386736127,US
+386736128,386740223,NL
+386740224,386842623,US
+386842624,386854911,NL
+386854912,386862079,US
386862080,386862335,JP
-386862336,386924543,US
+386862336,386875391,US
+386875392,386879487,NL
+386879488,386887679,US
+386887680,386891775,NL
+386891776,386924543,US
386924544,387055615,CA
387055616,387121151,PR
-387121152,387825663,US
+387121152,387802879,US
+387802880,387803135,PR
+387803136,387825663,US
387825664,387833855,CA
-387833856,390733823,US
+387833856,387985407,US
+387985408,387993599,NL
+387993600,387997695,US
+387997696,388001791,NL
+388001792,388038655,US
+388038656,388042751,NL
+388042752,388055039,US
+388055040,388059135,NL
+388059136,388091903,US
+388091904,388100095,NL
+388100096,388149247,US
+388149248,388153343,NL
+388153344,388198399,US
+388198400,388202495,NL
+388202496,388222975,US
+388222976,388227071,NL
+388227072,388235263,US
+388235264,388239359,NL
+388239360,388251647,US
+388251648,388255743,NL
+388255744,388272127,US
+388272128,388284415,NL
+388284416,388288511,US
+388288512,388300799,NL
+388300800,388308991,US
+388308992,388317183,NL
+388317184,388325375,US
+388325376,388329471,NL
+388329472,388341759,US
+388341760,388345855,NL
+388345856,388354047,US
+388354048,388358143,NL
+388358144,388362239,US
+388362240,388390911,NL
+388390912,388440063,US
+388440064,388444159,NL
+388444160,388472831,US
+388472832,388476927,NL
+388476928,388513791,US
+388513792,388517887,NL
+388517888,388526079,US
+388526080,388530175,NL
+388530176,388538367,US
+388538368,388542463,NL
+388542464,388567039,US
+388567040,388571135,NL
+388571136,388632575,US
+388632576,388636671,NL
+388636672,388677631,US
+388677632,388681727,NL
+388681728,388698111,US
+388698112,388702207,NL
+388702208,388710399,US
+388710400,388730879,NL
+388730880,388812799,US
+388812800,388816895,NL
+388816896,388849663,US
+388849664,388853759,NL
+388853760,388857855,US
+388857856,388861951,NL
+388861952,388866047,US
+388866048,388878335,NL
+388878336,388919295,US
+388919296,388923391,NL
+388923392,389066751,US
+389066752,389074943,NL
+389074944,389079039,US
+389079040,389083135,NL
+389083136,389136383,US
+389136384,389140479,NL
+389140480,389177343,US
+389177344,389181439,NL
+389181440,389185535,US
+389185536,389201919,NL
+389201920,389206015,US
+389206016,389210111,NL
+389210112,389234687,US
+389234688,389238783,NL
+389238784,389242879,US
+389242880,389251071,NL
+389251072,389259263,US
+389259264,389292031,NL
+389292032,389296127,US
+389296128,389300223,NL
+389300224,389328895,US
+389328896,389365759,NL
+389365760,389390335,US
+389390336,389398527,NL
+389398528,389402623,US
+389402624,389427199,NL
+389427200,389431295,US
+389431296,389451775,NL
+389451776,389480447,US
+389480448,389484543,NL
+389484544,389509119,US
+389509120,389513215,NL
+389513216,389515263,US
+389515264,389521407,NL
+389521408,389537791,US
+389537792,389541887,NL
+389541888,389607423,US
+389607424,389611519,NL
+389611520,389619711,US
+389619712,389627903,NL
+389627904,389631999,US
+389632000,389640191,NL
+389640192,389730303,US
+389730304,389734399,NL
+389734400,389754879,US
+389754880,389763071,NL
+389763072,389767167,US
+389767168,389775359,NL
+389775360,389812223,US
+389812224,389824511,NL
+389824512,389926911,US
+389926912,389935103,NL
+389935104,389967871,US
+389967872,389976063,NL
+389976064,389988351,US
+389988352,389992447,NL
+389992448,390021119,US
+390021120,390029311,NL
+390029312,390033407,US
+390033408,390041599,NL
+390041600,390123519,US
+390123520,390131711,NL
+390131712,390143999,US
+390144000,390148095,NL
+390148096,390184959,US
+390184960,390193151,NL
+390193152,390205439,US
+390205440,390209535,NL
+390209536,390262783,US
+390262784,390270975,NL
+390270976,390287359,US
+390287360,390295551,NL
+390295552,390299647,US
+390299648,390303743,NL
+390303744,390733823,US
390733824,390737919,NL
390737920,390746111,US
390746112,390758399,NL
@@ -1533,50 +1895,149 @@
391086080,391110655,US
391110656,391110911,IL
391110912,391111167,GB
-391111168,391114751,NL
+391111168,391111679,NL
+391111680,391111935,US
+391111936,391113471,NL
+391113472,391113983,US
+391113984,391114751,NL
391114752,391872511,US
391872512,391888895,CA
391888896,391897087,US
+391897088,391905279,CA
391905280,391938047,US
391938048,391946239,CA
-391946240,394264575,US
-398458880,400760831,US
+391946240,392765439,US
+392765440,392765695,GB
+392765696,394264575,US
+398458880,398635007,US
+398635008,398643199,NL
+398643200,398647295,US
+398647296,398655487,NL
+398655488,398659583,US
+398659584,398675967,NL
+398675968,398684159,US
+398684160,398692351,NL
+398692352,398782463,US
+398782464,398790655,NL
+398790656,398856191,US
+398856192,398876671,NL
+398876672,398970879,US
+398970880,398974975,NL
+398974976,399007743,US
+399007744,399011839,NL
+399011840,399020031,US
+399020032,399028223,NL
+399028224,399097855,US
+399097856,399106047,NL
+399106048,399147007,US
+399147008,399155199,NL
+399155200,399331327,US
+399331328,399339519,NL
+399339520,399368191,US
+399368192,399376383,NL
+399376384,399380479,US
+399380480,399405055,NL
+399405056,399458303,US
+399458304,399466495,NL
+399466496,399601663,US
+399601664,399618047,NL
+399618048,399630335,US
+399630336,399638527,NL
+399638528,399818751,US
+399818752,399831039,NL
+399831040,399908863,US
+399908864,399917055,NL
+399917056,399921151,US
+399921152,399929343,NL
+399929344,399933439,US
+399933440,399958015,NL
+399958016,399970303,US
+399970304,399978495,NL
+399978496,399990783,US
+399990784,399998975,NL
+399998976,400154623,US
+400154624,400162815,NL
+400162816,400232447,US
+400232448,400248831,NL
+400248832,400252927,US
+400252928,400269311,NL
+400269312,400273407,US
+400273408,400281599,NL
+400281600,400293887,US
+400293888,400302079,NL
+400302080,400412671,US
+400412672,400429055,NL
+400429056,400433151,US
+400433152,400441343,NL
+400441344,400490495,US
+400490496,400556031,NL
+400556032,400760831,US
400760832,400769023,CA
400769024,400805887,US
400805888,400809983,CA
-400809984,400911103,US
+400809984,400884479,US
+400884480,400884735,TR
+400884736,400884991,GB
+400884992,400887551,US
+400887552,400887807,GB
+400887808,400888575,US
+400888576,400888831,GB
+400888832,400911103,US
400911104,400911359,PA
400911360,400911615,AU
400911616,400911871,CR
400911872,400912127,US
400912128,400912383,SG
-400912384,401145855,US
+400912384,401130495,US
+401130496,401130751,DE
+401130752,401145855,US
401145856,401211391,CA
401211392,401293311,US
401293312,401297407,CA
401297408,401342463,US
401342464,401346559,BB
-401346560,401547263,US
+401346560,401378303,US
+401378304,401378559,EG
+401378560,401386495,US
+401386496,401387007,SE
+401387008,401387263,RU
+401387264,401547263,US
401547264,401555455,CA
-401555456,402128895,US
+401555456,402096639,US
+402096640,402096895,FR
+402096896,402105087,US
+402105088,402105343,GB
+402105344,402107391,US
+402107392,402107647,IT
+402107648,402122751,US
+402122752,402123007,SE
+402123008,402124287,US
+402124288,402124543,TR
+402124544,402128895,US
402128896,402169855,CA
402169856,402223103,US
402223104,402227199,CA
402227200,402231295,PR
402231296,402239301,US
402239302,402239302,CA
-402239303,402243583,US
+402239303,402239473,US
+402239474,402239474,CA
+402239475,402243583,US
402243584,402247679,CA
402247680,402263807,US
402263808,402264063,CA
-402264064,402366463,US
+402264064,402279935,US
+402279936,402280191,CA
+402280192,402366463,US
402366464,402374655,CA
402374656,402399231,US
402399232,402403327,CA
402403328,402415615,US
402415616,402417663,CA
-402417664,402522111,US
-402554880,405012479,US
+402417664,402550015,US
+402550016,402550271,CA
+402550272,402550783,GB
+402550784,405012479,US
405012480,405143551,CA
405143552,405180415,US
405180416,405184511,CA
@@ -1593,7 +2054,9 @@
405929984,405938175,US
405938176,405962751,CA
405962752,405970943,US
+405970944,405979135,CA
405979136,405995519,PR
+405995520,406003711,CA
406003712,406011903,US
406011904,406028287,BS
406028288,406052863,US
@@ -1613,12 +2076,12 @@
406323200,406388735,US
406388736,406454271,CA
406454272,406683647,US
-406683648,406683903,CA
-406683904,406684031,US
-406684032,406684159,CA
+406683648,406683775,CA
+406683776,406683903,US
+406683904,406684159,CA
406684160,406838783,US
-406838784,406838911,CA
-406838912,406847487,US
+406838784,406839295,CA
+406839296,406847487,US
406847488,407408639,CA
407408640,407613439,US
407613440,407617535,CA
@@ -1634,8 +2097,8 @@
409255936,409272319,CA
409272320,409337855,US
409337856,409354239,CA
-409370624,409509887,US
-409534464,409550847,US
+409354240,409509887,US
+409518080,409550847,US
409567232,409731071,US
409731072,409862143,CA
409862144,410124287,US
@@ -1667,7 +2130,7 @@
411988992,411989247,GB
411989248,412057599,US
412073984,412221439,US
-412221440,412229631,CA
+412221440,412237823,CA
412254208,412483583,US
412483584,412549119,CA
412549120,412614655,US
@@ -1676,8 +2139,7 @@
412688384,412704767,US
412704768,412708863,CA
412708864,412909567,US
-412909568,412921855,CA
-412925952,412942335,CA
+412909568,412942335,CA
412942336,412946431,US
412946432,412950527,PR
412950528,412958719,US
@@ -1705,12 +2167,16 @@
417398784,417431551,US
417431552,417529855,CA
417529856,417538047,PR
-417538048,417775615,US
+417538048,417726463,US
+417726464,417734655,JP
+417734656,417775615,US
417775616,417796095,CA
417796096,417800191,US
417800192,417808383,BS
417808384,417820671,CA
-417820672,417857535,US
+417820672,417832191,US
+417832192,417832447,VI
+417832448,417857535,US
417857536,417923071,AR
417923072,418062335,US
418062336,418070527,CA
@@ -1834,7 +2300,10 @@
460226560,460259327,PH
460259328,460261375,AU
460261376,460262399,KH
-460262400,460263423,NZ
+460262400,460262655,US
+460262656,460262911,AU
+460262912,460263167,NZ
+460263168,460263423,GB
460263424,460267519,NP
460267520,460275711,ID
460275712,460277759,AU
@@ -1911,7 +2380,9 @@
461051904,461053951,AU
461053952,461062143,HK
461062144,461078527,IN
-461078528,461094911,FJ
+461078528,461078783,FJ
+461078784,461079039,AU
+461079040,461094911,FJ
461094912,461096959,HK
461096960,461099007,TW
461099008,461100031,JP
@@ -1994,7 +2465,9 @@
520323072,520325119,CH
520325120,520327167,FR
520327168,520329215,DE
-520329216,520331263,SE
+520329216,520330239,SE
+520330240,520330751,NL
+520330752,520331263,SE
520331264,520339455,IT
520339456,520343551,UA
520343552,520355839,GB
@@ -2025,7 +2498,8 @@
520497920,520498175,FR
520498176,520498431,CH
520498432,520498687,SE
-520498688,520499199,FR
+520498688,520498943,IT
+520498944,520499199,FR
520499200,520500223,IT
520500224,520500479,LU
520500480,520500735,DE
@@ -2090,7 +2564,9 @@
520988672,520990719,DE
520990720,520992767,RU
520994816,521011199,BG
-521011200,521057279,RO
+521011200,521020415,RO
+521020416,521021439,MD
+521021440,521057279,RO
521057280,521058303,MD
521058304,521076735,RO
521076736,521078783,ES
@@ -2195,8 +2671,13 @@
521953280,521961471,RU
521961472,521969663,CZ
521969664,521977855,UA
-521977856,521986047,RU
-521986048,521994239,UA
+521977856,521986303,RU
+521986304,521986559,UA
+521986560,521989631,RU
+521989632,521989887,UA
+521989888,521991679,RU
+521991680,521991935,UA
+521991936,521994239,RU
521994240,522002431,KG
522002432,522010623,IR
522010624,522018815,AE
@@ -2227,7 +2708,7 @@
522721280,522741759,RU
522741760,522743807,UA
522743808,522747903,RU
-522747904,522780671,UA
+522747904,522764287,UA
522780672,522782719,RU
522782720,522784767,UA
522784768,522786815,BG
@@ -2287,7 +2768,9 @@
523038720,523042815,RU
523042816,523075583,NO
523075584,523108351,HR
-523108352,523173887,HU
+523108352,523119615,HU
+523119616,523120639,RO
+523120640,523173887,HU
523173888,523182079,BA
523182080,523190271,IR
523190272,523192319,FI
@@ -2340,8 +2823,8 @@
528687104,528689151,UA
528689152,528691199,RO
528691200,528695295,PL
-528695296,528699391,UA
-528699392,528703487,RU
+528695296,528695551,UA
+528695552,528703487,RU
528703488,528715775,UA
528715776,528719871,RU
528719872,528721919,RO
@@ -2400,7 +2883,9 @@
529596416,529661951,TR
529661952,529727487,GE
529727488,529793023,HR
-529793024,529826815,CZ
+529793024,529819647,CZ
+529819648,529826303,RU
+529826304,529826815,CZ
529826816,529827839,RU
529827840,529828863,CZ
529828864,529835007,RU
@@ -2430,9 +2915,11 @@
529924096,529989631,DE
529989632,530055167,NL
530055168,530120703,GR
-530120704,530165759,CY
-530165760,530173951,GR
-530173952,530186239,CY
+530120704,530153471,CY
+530153472,530173951,GR
+530173952,530174207,CY
+530174208,530180095,GR
+530180096,530186239,CY
530186240,530251775,IL
530251776,530317311,TR
530317312,530579455,IT
@@ -2488,51 +2975,55 @@
531372288,531372543,CH
531372544,531372799,DE
531372800,531380223,CH
-531380224,531382271,DE
-531382272,531394559,CH
+531380224,531390463,DE
+531390464,531394559,CH
531394560,531398655,DE
531398656,531400703,RU
531400704,531402751,UA
531402752,531404799,LU
531404800,531406847,FI
531406848,531408895,FR
-531408896,531415039,PL
+531410944,531415039,PL
531415040,531423231,RU
531423232,531425279,NO
531425280,531427327,FR
-531427328,531428351,GB
+531427328,531427703,GB
+531427704,531427711,IT
+531427712,531427951,GB
+531427952,531427959,IT
+531427960,531428263,GB
+531428264,531428271,IT
+531428272,531428351,GB
531428352,531428359,IT
531428360,531428495,GB
531428496,531428503,IT
-531428504,531429135,GB
+531428504,531429095,GB
+531429096,531429103,IT
+531429104,531429135,GB
531429136,531429143,IT
531429144,531429167,GB
531429168,531429175,IT
531429176,531429239,GB
531429240,531429247,IT
-531429248,531429391,GB
+531429248,531429335,GB
+531429336,531429343,IT
+531429344,531429391,GB
531429392,531429399,IT
531429400,531429407,GB
531429408,531429415,IT
531429416,531429599,GB
531429600,531429607,IT
-531429608,531429679,GB
-531429680,531429687,IT
-531429688,531430079,GB
-531430080,531430087,IT
-531430088,531430319,GB
+531429608,531430319,GB
531430320,531430327,IT
-531430328,531430663,GB
-531430664,531430671,IT
-531430672,531430823,GB
+531430328,531430823,GB
531430824,531430831,IT
531430832,531430847,GB
531430848,531430855,IT
-531430856,531430903,GB
-531430904,531430911,IT
-531430912,531430927,GB
+531430856,531430927,GB
531430928,531430935,IT
-531430936,531431423,GB
+531430936,531431031,GB
+531431032,531431039,IT
+531431040,531431423,GB
531431424,531496959,RO
531496960,531628031,PL
531628032,531660799,TR
@@ -2564,15 +3055,11 @@
532211712,532212223,LU
532212224,532213759,RU
532213760,532214015,GB
-532214016,532214783,RU
-532214784,532215807,DE
-532215808,532221951,RU
+532214016,532221951,RU
532221952,532223999,IT
532224000,532226047,NO
532226048,532234239,GB
-532234240,532240127,DK
-532240128,532240255,DE
-532240256,532242431,DK
+532234240,532242431,DK
532242432,532244479,IT
532244480,532246527,DE
532246528,532250623,BA
@@ -2603,12 +3090,14 @@
532347392,532347903,DE
532347904,532348671,GB
532348672,532348927,NL
-532348928,532365311,PL
+532348928,532365311,IE
532365312,532365567,LU
532365568,532365823,NL
532365824,532366079,DE
-532366080,532366335,NL
-532366336,532371455,DE
+532366080,532366207,NL
+532366208,532366239,AR
+532366240,532366271,PA
+532366272,532371455,DE
532371456,532373503,NL
532373504,532375551,RU
532375552,532377599,IT
@@ -2616,7 +3105,8 @@
532381696,532414463,NL
532414464,532676607,IT
532676608,532692991,GE
-532692992,532701183,CZ
+532692992,532700927,CZ
+532700928,532701183,SK
532701184,532703231,GB
532703232,532705279,RU
532705280,532709375,NL
@@ -2624,8 +3114,7 @@
532725760,532729855,SE
532729856,532731903,TR
532731904,532733951,PL
-532733952,532734975,US
-532734976,532735999,SE
+532733952,532735999,SE
532736000,532738047,RU
532738048,532740095,GB
532740096,532742143,KG
@@ -2657,7 +3146,9 @@
532805632,532807679,SE
532807680,533200895,IT
533200896,533233663,TR
-533233664,533250047,IE
+533233664,533236991,IE
+533236992,533237247,GB
+533237248,533250047,IE
533250048,533254143,RU
533254144,533256191,NL
533256192,533262335,RU
@@ -2703,11 +3194,11 @@
533837824,533839871,DE
533839872,533856255,IS
533856256,533858303,FR
-533858304,533859231,HU
-533859232,533859263,TR
-533859264,533859647,HU
+533858304,533858751,TR
+533858752,533858815,AT
+533858816,533859647,TR
533859648,533859663,AT
-533859664,533860351,HU
+533859664,533860351,TR
533862400,533864447,GB
533864448,533889023,TR
533889024,533891071,GB
@@ -2732,9 +3223,7 @@
533970944,533987327,SE
533987328,534118399,DE
534118400,534151167,KW
-534151168,534177791,DE
-534177792,534179839,NL
-534179840,534183935,DE
+534151168,534183935,DE
534183936,534249471,RO
534249472,534253567,GB
534253568,534257663,FR
@@ -2767,12 +3256,13 @@
534380544,534511615,AE
534511616,534512639,BZ
534512640,534512895,NL
-534512896,534513151,US
+534512896,534513151,SE
534513152,534513215,BS
534513216,534513279,VG
-534513280,534513663,NL
-534513664,534514687,US
-534514688,534515711,DE
+534513280,534513407,NL
+534513408,534513663,SE
+534513664,534515455,US
+534515456,534515711,DE
534515712,534517759,US
534517760,534518783,NL
534518784,534519039,DE
@@ -2789,15 +3279,17 @@
534519456,534519487,BR
534519488,534519519,MX
534519520,534519551,CN
-534519552,534519807,GB
+534519552,534519807,NL
534519808,534521855,US
534521856,534522367,DE
534522368,534522879,NL
534522880,534523135,DE
534523136,534523391,NL
534523392,534523903,DE
-534523904,534527999,US
-534528000,534544383,DE
+534523904,534530047,US
+534530048,534541311,DE
+534541312,534543359,US
+534543360,534544383,DE
534544384,534546431,RO
534546432,534548479,DE
534548480,534550527,PL
@@ -2849,7 +3341,11 @@
539631040,539631047,IT
539631048,539656191,US
539656192,539660287,IN
-539660288,539671103,US
+539660288,539668819,US
+539668820,539668823,NZ
+539668824,539668891,US
+539668892,539668892,AU
+539668893,539671103,US
539671104,539671135,JP
539671136,540737535,US
540737536,540737757,BZ
@@ -2961,9 +3457,9 @@
543881728,543883263,GB
543883264,544436771,US
544436772,544436775,CA
-544436776,586973439,US
-586973440,586973695,CA
-586973696,586977023,US
+544436776,586972927,US
+586972928,586973183,CA
+586973184,586977023,US
586977024,586977279,AU
586977280,587006719,US
587006720,587006975,GB
@@ -3061,8 +3557,10 @@
621404160,621408255,IT
621408256,621410303,RU
621410304,621412351,IR
-621412352,621430783,DE
-621430784,621436927,CZ
+621412352,621428735,NL
+621428736,621430783,DE
+621430784,621432831,ES
+621432832,621436927,IT
621436928,621445119,DE
621445120,621805567,ES
621805568,621813759,NL
@@ -3070,7 +3568,6 @@
621821952,621823999,DE
621824000,621826047,FR
621826048,621828095,RU
-621828096,621830143,GB
621830144,621838335,FI
621838336,621871103,SA
621871104,621903871,BY
@@ -3090,11 +3587,12 @@
621939712,621940479,RU
621940480,621942527,GB
621942528,621969407,RU
-621971456,621971711,GB
-621971712,621972223,IM
+621971456,621971711,IM
+621971712,621971967,GB
+621971968,621972223,IM
621972224,621972479,GB
-621972480,621972735,IM
-621972736,621973503,GB
+621972480,621972991,IM
+621972992,621973503,GB
621973504,621975551,IE
621975552,621977599,RU
621977600,621981695,FR
@@ -3196,7 +3694,24 @@
623071232,623073279,FI
623073280,623075327,GB
623075328,623077375,DK
-623077376,623083519,CH
+623077376,623077783,CH
+623077784,623077791,NL
+623077792,623077807,CH
+623077808,623077815,BE
+623077816,623077819,SE
+623077820,623077827,CH
+623077828,623077831,US
+623077832,623077833,PT
+623077834,623077835,ES
+623077836,623077837,CR
+623077838,623077839,KN
+623077840,623077843,BR
+623077844,623077849,HK
+623077850,623077851,ZA
+623077852,623077855,SG
+623077856,623077857,WS
+623077858,623077859,NZ
+623077860,623083519,CH
623083520,623116287,RO
623116288,623378431,KW
623378432,623509503,OM
@@ -3226,9 +3741,9 @@
623800320,623801087,SE
623801088,623801599,US
623801600,623801855,SE
-623801856,623802111,NL
-623802112,623803135,SE
-623803136,623804415,NL
+623801856,623802367,NL
+623802368,623802879,SE
+623802880,623804415,NL
623804416,623806463,RU
623806464,623808511,NL
623808512,623810559,RU
@@ -3268,9 +3783,7 @@
624570368,624574463,DE
624574464,624574715,NL
624574716,624574719,US
-624574720,624574919,NL
-624574920,624574927,US
-624574928,624575063,NL
+624574720,624575063,NL
624575064,624575071,US
624575072,624575135,NL
624575136,624575143,US
@@ -3278,9 +3791,7 @@
624575400,624575403,US
624575404,624575679,NL
624575680,624575743,US
-624575744,624575883,NL
-624575884,624575887,US
-624575888,624576127,NL
+624575744,624576127,NL
624576128,624576131,US
624576132,624576471,NL
624576472,624576479,US
@@ -3296,7 +3807,9 @@
624577484,624577487,US
624577488,624578719,NL
624578720,624578723,GB
-624578724,624578951,NL
+624578724,624578887,NL
+624578888,624578895,US
+624578896,624578951,NL
624578952,624578955,US
624578956,624579075,NL
624579076,624579079,US
@@ -3328,30 +3841,84 @@
624582288,624582295,US
624582296,624582399,NL
624582400,624582403,US
-624582404,624590847,NL
+624582404,624584111,NL
+624584112,624584119,US
+624584120,624584159,NL
+624584160,624584175,US
+624584176,624584383,NL
+624584384,624584391,US
+624584392,624584415,NL
+624584416,624584423,US
+624584424,624584639,NL
+624584640,624584655,US
+624584656,624585359,NL
+624585360,624585367,US
+624585368,624590847,NL
624590848,624640951,FR
624640952,624640959,PT
-624640960,624658323,FR
+624640960,624646343,FR
+624646344,624646347,NL
+624646348,624647171,FR
+624647172,624647175,ES
+624647176,624648139,FR
+624648140,624648143,ES
+624648144,624657711,FR
+624657712,624657715,ES
+624657716,624657883,FR
+624657884,624657887,ES
+624657888,624658323,FR
624658324,624658327,IE
624658328,624658479,FR
624658480,624658483,DE
-624658484,624661787,FR
+624658484,624660827,FR
+624660828,624660831,ES
+624660832,624661247,FR
+624661248,624661251,ES
+624661252,624661787,FR
624661788,624661788,RO
624661789,624661955,FR
624661956,624661959,PL
-624661960,624664676,FR
+624661960,624663951,FR
+624663952,624663955,ES
+624663956,624664527,FR
+624664528,624664531,ES
+624664532,624664676,FR
624664677,624664677,IE
624664678,624665587,FR
624665588,624665591,DE
-624665592,624673535,FR
+624665592,624665951,FR
+624665952,624665955,NL
+624665956,624668639,FR
+624668640,624668643,NL
+624668644,624669795,FR
+624669796,624669799,ES
+624669800,624672547,FR
+624672548,624672551,ES
+624672552,624673451,FR
+624673452,624673455,ES
+624673456,624673535,FR
624673536,624673791,ES
624673792,624673903,FR
624673904,624673919,ES
-624673920,624676003,FR
+624673920,624675691,FR
+624675692,624675695,ES
+624675696,624675775,FR
+624675776,624675779,ES
+624675780,624676003,FR
624676004,624676007,DE
624676008,624676087,FR
624676088,624676091,DE
-624676092,624683775,FR
+624676092,624676715,FR
+624676716,624676719,ES
+624676720,624677463,FR
+624677464,624677467,ES
+624677468,624679199,FR
+624679200,624679203,ES
+624679204,624679843,FR
+624679844,624679847,ES
+624679848,624681807,FR
+624681808,624681823,BE
+624681824,624683775,FR
624683776,624683779,DE
624683780,624683783,FR
624683784,624683787,DE
@@ -3361,11 +3928,38 @@
624684208,624684211,ES
624684212,624684799,FR
624684800,624684803,DE
-624684804,624687343,FR
+624684804,624685711,FR
+624685712,624685715,ES
+624685716,624685799,FR
+624685800,624685803,ES
+624685804,624685919,FR
+624685920,624685923,ES
+624685924,624686627,FR
+624686628,624686631,ES
+624686632,624686667,FR
+624686668,624686671,ES
+624686672,624686711,FR
+624686712,624686715,ES
+624686716,624687343,FR
624687344,624687346,CZ
-624687347,624688731,FR
-624688732,624688735,PL
-624688736,624689076,FR
+624687347,624687347,ES
+624687348,624687827,FR
+624687828,624687831,ES
+624687832,624688307,FR
+624688308,624688311,ES
+624688312,624688487,FR
+624688488,624688491,ES
+624688492,624688639,FR
+624688640,624688643,ES
+624688644,624688691,FR
+624688692,624688695,ES
+624688696,624688779,FR
+624688780,624688783,ES
+624688784,624688791,FR
+624688792,624688795,ES
+624688796,624688831,FR
+624688832,624688835,ES
+624688836,624689076,FR
624689077,624689078,BE
624689079,624689151,FR
624689152,624691199,DE
@@ -3415,8 +4009,8 @@
625508352,625512447,AZ
625512448,625514495,DE
625514496,625515263,GB
-625515264,625515519,GG
-625515520,625516543,GB
+625515264,625516031,GG
+625516032,625516543,GB
625516544,625518591,BE
625518592,625518847,NL
625518848,625519103,US
@@ -3473,13 +4067,15 @@
625868800,625999871,RU
625999872,627048447,DE
627048448,627113983,DK
-627113984,627179519,RO
+627113984,627145727,RO
+627145728,627146751,ES
+627146752,627179519,NL
627179520,627212287,IR
627212288,627216383,FI
627216384,627218431,GB
627218432,627220479,TJ
627220480,627228671,RU
-627228672,627230719,AT
+627228672,627230719,GR
627230720,627232767,IR
627232768,627236863,PL
627236864,627238911,IQ
@@ -3516,7 +4112,8 @@
628277248,628293631,IR
628293632,628359167,UA
628359168,628621311,IT
-628621312,628662271,RO
+628621312,628654079,DE
+628654080,628662271,RO
628662272,628670463,DE
628670464,628686847,RO
628686848,628752383,SA
@@ -3541,9 +4138,11 @@
628847360,628847615,FR
628847616,628848639,GB
628848640,628850687,DE
-628850688,628851711,SE
-628851712,628852223,NO
-628852224,628867071,SE
+628850688,628850943,SE
+628850944,628851199,NO
+628851200,628851455,SE
+628851456,628852479,NO
+628852480,628867071,SE
628867072,628869119,IR
628869120,628871167,PL
628871168,628873215,US
@@ -3655,8 +4254,12 @@
630513664,630515711,IT
630515712,630517759,DE
630517760,630519807,GB
-630521856,630523135,GR
-630523136,630587391,CY
+630521856,630538239,GR
+630538240,630539263,CY
+630539264,630554623,GR
+630554624,630556671,CY
+630556672,630571007,GR
+630571008,630587391,CY
630587392,630718463,KZ
630718464,630720511,JO
630720512,630722559,NL
@@ -3680,11 +4283,22 @@
630816768,630833151,RO
630833152,630849535,NL
630849536,630980607,TR
-630980608,630998271,RO
+630980608,630981631,MD
+630981632,630982655,RO
+630982656,630984703,MD
+630984704,630998271,RO
630998272,630998783,MD
630998784,631001087,RO
631001088,631005183,MD
-631005184,631046143,RO
+631005184,631006207,RO
+631006208,631007231,MD
+631007232,631017471,RO
+631017472,631018495,MD
+631018496,631039999,RO
+631040000,631042047,MD
+631042048,631044095,RO
+631044096,631045119,MD
+631045120,631046143,RO
631046144,631048191,DK
631048192,631050239,FR
631050240,631054335,RU
@@ -3713,7 +4327,17 @@
632946688,632963071,AT
632963072,632979455,AM
632979456,633012223,IT
-633012224,633077759,FR
+633012224,633063679,FR
+633063680,633063935,PL
+633063936,633064191,FR
+633064192,633064447,GB
+633064448,633065727,FR
+633065728,633065983,DE
+633065984,633066239,FR
+633066240,633066495,ES
+633066496,633066751,FR
+633066752,633067007,IT
+633067008,633077759,FR
633077760,633094143,RU
633094144,633098239,NL
633098240,633100287,HU
@@ -3757,9 +4381,7 @@
634075136,634077183,NL
634077184,634093567,BA
634093568,634109951,GB
-634109952,634110975,IE
-634110976,634111231,GB
-634111232,634111999,IE
+634109952,634111999,IE
634112000,634114047,RU
634114048,634116095,SE
634116096,634118143,NL
@@ -3768,7 +4390,9 @@
634124288,634126335,CH
634126336,634191871,RU
634191872,634193919,TR
-634193920,634195967,SK
+634193920,634194687,SK
+634194688,634194815,CZ
+634194816,634195967,SK
634195968,634198015,RU
634198016,634200063,BA
634200064,634202111,IS
@@ -3848,9 +4472,7 @@
635200632,635200639,IT
635200640,635200727,GB
635200728,635200735,IT
-635200736,635200903,GB
-635200904,635200911,IT
-635200912,635200959,GB
+635200736,635200959,GB
635200960,635200967,IT
635200968,635200991,GB
635200992,635200999,IT
@@ -3952,7 +4574,9 @@
636952576,636956671,NL
636956672,636958719,IT
636958720,636960767,PL
-636960768,636967167,DE
+636960768,636966655,DE
+636966656,636966911,IT
+636966912,636967167,DE
636967168,636967935,FR
636967936,636968191,IT
636968192,636968447,ES
@@ -3980,11 +4604,11 @@
637319168,637321215,AT
637321216,637323263,GB
637323264,637325311,FR
-637325312,637327359,NO
+637325312,637325567,US
+637325568,637327359,NO
637327360,637329407,IR
637329408,637329663,SI
-637329664,637329919,FR
-637329920,637330175,AT
+637329664,637330175,FR
637330176,637330431,DE
637330432,637330943,JP
637330944,637331199,GB
@@ -4017,24 +4641,28 @@
641737728,641761535,US
641761536,641761791,CA
641761792,641763071,US
-641763072,641763327,CA
-641763328,641765375,US
+641763072,641763583,CA
+641763584,641765375,US
641765376,641765887,CA
641765888,641766399,US
-641766400,641767167,CA
-641767168,641768703,US
-641768704,641768959,CA
+641766400,641767423,CA
+641767424,641768447,US
+641768448,641768959,CA
641768960,641769727,US
641769728,641769983,CA
641769984,641771519,US
641771520,641771775,CA
641771776,642093055,US
-642093056,642093695,CA
-642093696,642093823,US
-642093824,642094079,CA
-642094080,642793471,US
+642093056,642094591,CA
+642094592,642388479,US
+642388480,642388735,CA
+642388736,642793471,US
642793472,642793983,CA
-642793984,643219519,US
+642793984,642925055,US
+642925056,642925311,MX
+642925312,642926335,US
+642926336,642926591,MX
+642926592,643219519,US
643219520,643219523,CA
643219524,643219526,US
643219527,643219527,CA
@@ -4045,18 +4673,20 @@
643242752,643295231,US
643295232,643295487,PR
643295488,643295743,US
-643295744,643296255,PR
-643296256,643296767,US
+643295744,643296127,PR
+643296128,643296767,US
643296768,643297023,PR
643297024,643302911,US
643302912,643303167,CA
-643303168,643346431,US
+643303168,643317759,US
+643317760,643318015,CA
+643318016,643346431,US
643346432,643346687,CA
-643346688,644055039,US
-644055040,644055295,CA
-644055296,644055551,US
-644055552,644056047,CA
-644056048,644056063,US
+643346688,643351551,US
+643351552,643351807,GB
+643351808,644055039,US
+644055040,644055807,CA
+644055808,644056063,US
644056064,644056319,CA
644056320,644056575,US
644056576,644056831,CA
@@ -4064,83 +4694,79 @@
644057088,644057599,CA
644057600,644058111,US
644058112,644058879,CA
-644058880,644060989,US
-644060990,644060990,CA
-644060991,644063487,US
-644063488,644063743,CA
-644063744,644063999,US
-644064000,644064255,CA
-644064256,644064511,US
+644058880,644059391,US
+644059392,644059647,CA
+644059648,644060927,US
+644060928,644061183,CA
+644061184,644063231,US
+644063232,644063743,CA
+644063744,644064511,US
644064512,644064767,CA
644064768,644065055,US
644065056,644065279,CA
-644065280,644066559,US
-644066560,644066815,CA
-644066816,644067071,US
+644065280,644067071,US
644067072,644067327,CA
644067328,644069631,US
-644069632,644069887,CA
-644069888,644070143,US
-644070144,644070399,CA
-644070400,644248831,US
+644069632,644070143,CA
+644070144,644084479,US
+644084480,644084735,GU
+644084736,644248831,US
644248832,644249087,CA
644249088,644323391,US
644323392,644323407,CA
644323408,644323583,US
644323584,644323839,CA
-644323840,644389375,US
-644389376,644390399,CA
-644390400,644390655,US
-644390656,644390911,CA
+644323840,644389631,US
+644389632,644390911,CA
644390912,644403199,US
644403200,644403455,CA
-644403456,644414207,US
+644403456,644408063,US
+644408064,644408319,CA
+644408320,644414207,US
644414208,644414463,CA
644414464,644422911,US
644422912,644423423,JP
644423424,644569087,US
-644569088,644569599,PR
-644569600,644569855,US
-644569856,644570367,PR
-644570368,644570623,US
-644570624,644570879,PR
-644570880,644582143,US
+644569088,644569343,PR
+644569344,644570111,US
+644570112,644570175,PR
+644570176,644570623,US
+644570624,644571135,PR
+644571136,644582143,US
644582144,644582399,CA
644582400,644628735,US
644628736,644628991,CA
-644628992,644631039,US
-644631040,644631295,CA
-644631296,644632319,US
-644632320,644632831,CA
-644632832,644634367,US
+644628992,644634367,US
644634368,644634623,CA
-644634624,644718591,US
-644718592,644718911,CA
-644718912,644759551,US
-644759552,644759807,CA
-644759808,644760575,US
+644634624,644718847,US
+644718848,644719103,CA
+644719104,644760575,US
644760576,644760831,CA
644760832,644761343,US
644761344,644761599,CA
-644761600,644767878,US
+644761600,644762879,US
+644762880,644763135,CA
+644763136,644765439,US
+644765440,644765695,CA
+644765696,644767878,US
644767879,644767879,CA
-644767880,644833535,US
-644833536,644834303,CA
+644767880,644767999,US
+644768000,644768255,CA
+644768256,644833535,US
+644833536,644833791,CA
+644833792,644834047,US
+644834048,644834303,CA
644834304,644834815,US
644834816,644835327,CA
644835328,644836351,US
644836352,644836607,CA
-644836608,644836863,US
-644836864,644837119,CA
-644837120,644838655,US
+644836608,644838655,US
644838656,644840447,CA
-644840448,644840959,US
-644840960,644841215,CA
-644841216,644894975,US
-644894976,644895231,CA
-644895232,644896511,US
-644896512,644896767,CA
-644896768,644898815,US
+644840448,644840703,US
+644840704,644841215,CA
+644841216,644897791,US
+644897792,644898047,CA
+644898048,644898815,US
644898816,644899071,CA
644899072,644899839,US
644899840,644900095,CA
@@ -4154,9 +4780,7 @@
644987136,644987391,CA
644987392,645185535,US
645185536,645185791,CA
-645185792,645187327,US
-645187328,645187583,CA
-645187584,645188095,US
+645185792,645188095,US
645188096,645188351,CA
645188352,645221631,US
645221632,645222399,CA
@@ -4166,14 +4790,18 @@
645225472,645225727,CA
645225728,645227519,US
645227520,645228287,CA
-645228288,645482495,US
+645228288,645229311,US
+645229312,645229567,CA
+645229568,645482495,US
645482496,645482751,CA
645482752,645525759,US
645525760,645526271,CA
645526272,645526783,US
-645526784,645527295,CA
-645527296,645527551,US
-645527552,645529343,CA
+645526784,645527039,CA
+645527040,645527551,US
+645527552,645527807,CA
+645527808,645528063,US
+645528064,645529343,CA
645529344,645540351,US
645540352,645540607,CA
645540608,645547007,US
@@ -4196,8 +4824,8 @@
645737984,645738239,PR
645738240,645873663,US
645873664,645874175,CA
-645874176,645875839,US
-645875840,645876735,CA
+645874176,645875711,US
+645875712,645876735,CA
645876736,654311423,US
654311424,654311679,CN
654311680,654311935,AU
@@ -4465,7 +5093,8 @@
693107712,693239807,KE
693239808,693370879,SN
693370880,693403647,ZA
-693403648,693411839,KE
+693403648,693411583,KE
+693411584,693411839,MU
693411840,693420031,NG
693420032,693423103,UG
693423104,693424127,KE
@@ -4568,7 +5197,9 @@
700340224,700341247,GH
700341248,700342271,MW
700342272,700350463,NA
-700350464,700358655,UG
+700350464,700351231,MU
+700351232,700352511,UG
+700352512,700358655,MU
700358656,700366847,MZ
700366848,700375039,UG
700375040,700376063,CM
@@ -4611,9 +5242,7 @@
700588288,700588543,KM
700588544,700593151,ZA
700593152,700594175,NG
-700594176,700595967,ZA
-700595968,700596223,CD
-700596224,700710911,ZA
+700594176,700710911,ZA
700710912,700776447,EG
700776448,700841983,RW
700841984,700846079,MU
@@ -4622,9 +5251,7 @@
700851456,700851711,ZA
700851712,700854271,MU
700854272,700855295,NA
-700855296,700858367,MU
-700858368,700858879,ZA
-700858880,700866559,MU
+700855296,700866559,MU
700866560,700866815,NG
700866816,700867327,MU
700867328,700867583,NG
@@ -4666,7 +5293,9 @@
701308928,701317119,AO
701317120,701325311,CM
701325312,701333503,EG
-701333504,701341695,NA
+701333504,701338111,NA
+701338112,701338367,ZM
+701338368,701341695,NA
701341696,701349887,NG
701349888,701358079,MA
701358080,701366271,SL
@@ -4675,7 +5304,8 @@
701382656,701390847,CI
701390848,701392127,MU
701392128,701392383,TZ
-701392384,701399039,MU
+701392384,701392639,ZA
+701392640,701399039,MU
701399040,701407231,EG
701407232,701423615,ZA
701423616,701431807,NG
@@ -4701,7 +5331,9 @@
701495296,701496319,NG
701496320,701497343,GH
701497344,701513727,ZA
-701513728,701530111,LY
+701513728,701523711,LY
+701523712,701523967,CA
+701523968,701530111,LY
701530112,701546495,SN
701546496,701562879,ZA
701562880,701579263,KE
@@ -4758,7 +5390,7 @@
702137344,702138367,MG
702138368,702139391,TZ
702139392,702140415,NG
-702140416,702140671,MZ
+702140416,702141439,MZ
702141440,702142463,MU
702142464,702143487,MW
702143488,702144511,KE
@@ -4897,8 +5529,7 @@
702533632,702534655,CI
702534656,702535679,GM
702535680,702536703,SC
-702536704,702537727,MU
-702537728,702538751,RW
+702536704,702538751,MU
702538752,702539775,TZ
702539776,702540799,BF
702540800,702541823,DZ
@@ -4912,368 +5543,253 @@
702729216,702729471,GP
702729472,703070207,TN
703070208,703594495,EG
-703594496,703595263,SD
-703595264,703596031,ZA
-703596032,703596543,SD
-703596544,703596799,ZA
-703596800,703598079,SD
-703598080,703598335,ZA
-703598336,703600383,SD
-703600384,703600895,ZA
-703600896,703601151,SD
+703594496,703595775,SD
+703595776,703596031,ZA
+703596032,703600383,SD
+703600384,703600639,ZA
+703600640,703601151,SD
703601152,703601407,ZA
703601408,703603455,SD
703603456,703603711,ZA
703603712,703604991,SD
703604992,703605247,ZA
-703605248,703605759,SD
-703605760,703606015,ZA
-703606016,703607039,SD
-703607040,703607295,ZA
-703607296,703608319,SD
-703608320,703608575,ZA
-703608576,703609087,SD
+703605248,703609087,SD
703609088,703609343,ZA
-703609344,703609599,SD
-703609600,703609855,ZA
-703609856,703610367,SD
-703610368,703610879,ZA
-703610880,703612927,SD
-703612928,703613183,ZA
-703613184,703613695,SD
+703609344,703613695,SD
703613696,703613951,ZA
-703613952,703614207,SD
-703614208,703614719,ZA
-703614720,703618559,SD
+703613952,703618559,SD
703618560,703619071,ZA
-703619072,703619583,SD
-703619584,703620607,ZA
-703620608,703620863,SD
-703620864,703622143,ZA
+703619072,703619839,SD
+703619840,703620095,ZA
+703620096,703621887,SD
+703621888,703622143,ZA
703622144,703622655,SD
703622656,703622911,ZA
-703622912,703623423,SD
-703623424,703624191,ZA
-703624192,703624703,SD
-703624704,703624959,ZA
-703624960,703625215,SD
+703622912,703625215,SD
703625216,703625471,ZA
-703625472,703625983,SD
-703625984,703626239,ZA
-703626240,703627263,SD
+703625472,703627263,SD
703627264,703627519,ZA
703627520,703631871,SD
703631872,703632127,ZA
-703632128,703632383,SD
-703632384,703632639,ZA
-703632640,703633151,SD
+703632128,703633151,SD
703633152,703633407,ZA
-703633408,703633919,SD
-703633920,703634431,ZA
-703634432,703635199,SD
-703635200,703635455,ZA
-703635456,703636735,SD
-703636736,703636991,ZA
-703636992,703637247,SD
-703637248,703637759,ZA
-703637760,703638015,SD
-703638016,703638527,ZA
-703638528,703639039,SD
-703639040,703639807,ZA
-703639808,703640063,SD
-703640064,703640831,ZA
-703640832,703641343,SD
-703641344,703641855,ZA
-703641856,703642111,SD
-703642112,703642623,ZA
-703642624,703643135,SD
-703643136,703643391,ZA
-703643392,703643647,SD
-703643648,703644927,ZA
-703644928,703645183,SD
-703645184,703645951,ZA
-703645952,703646207,SD
-703646208,703647487,ZA
-703647488,703647743,SD
-703647744,703647999,ZA
-703648000,703648255,SD
-703648256,703650047,ZA
+703633408,703638271,SD
+703638272,703638527,ZA
+703638528,703639551,SD
+703639552,703639807,ZA
+703639808,703642367,SD
+703642368,703642623,ZA
+703642624,703643903,SD
+703643904,703644415,ZA
+703644416,703645439,SD
+703645440,703645695,ZA
+703645696,703646719,SD
+703646720,703647231,ZA
+703647232,703648767,SD
+703648768,703649023,ZA
+703649024,703649279,SD
+703649280,703650047,ZA
703650048,703650815,SD
703650816,703651071,ZA
-703651072,703653887,SD
-703653888,703654143,ZA
-703654144,703654399,SD
-703654400,703654655,ZA
-703654656,703656191,SD
-703656192,703656447,ZA
-703656448,703657727,SD
-703657728,703657983,ZA
-703657984,703658239,SD
-703658240,703658495,ZA
-703658496,703659263,SD
-703659264,703659775,ZA
-703659776,703665663,SD
+703651072,703665663,SD
703665664,703665919,ZA
-703665920,703666943,SD
-703666944,703667199,ZA
-703667200,703670783,SD
-703670784,703671039,ZA
-703671040,703672063,SD
-703672064,703672319,ZA
-703672320,703673343,SD
-703673344,703673855,ZA
-703673856,703674111,SD
-703674112,703674367,ZA
-703674368,703674623,SD
-703674624,703675391,ZA
-703675392,703675647,SD
-703675648,703675903,ZA
-703675904,703676159,SD
-703676160,703676415,ZA
-703676416,703676671,SD
-703676672,703676927,ZA
-703676928,703678463,SD
-703678464,703679231,ZA
-703679232,703679999,SD
-703680000,703680255,ZA
-703680256,703680511,SD
-703680512,703680767,ZA
-703680768,703681791,SD
-703681792,703682303,ZA
-703682304,703682559,SD
-703682560,703683071,ZA
-703683072,703683583,SD
-703683584,703684095,ZA
-703684096,703684351,SD
-703684352,703684607,ZA
-703684608,703684863,SD
-703684864,703686143,ZA
-703686144,703686399,SD
-703686400,703686655,ZA
-703686656,703687423,SD
-703687424,703687679,ZA
-703687680,703688191,SD
-703688192,703688959,ZA
-703688960,703689215,SD
+703665920,703678463,SD
+703678464,703678719,ZA
+703678720,703682559,SD
+703682560,703682815,ZA
+703682816,703685119,SD
+703685120,703685631,ZA
+703685632,703685887,SD
+703685888,703686143,ZA
+703686144,703688447,SD
+703688448,703688703,ZA
+703688704,703689215,SD
703689216,703689471,ZA
703689472,703689727,SD
703689728,703689983,ZA
703689984,703690239,SD
-703690240,703691519,ZA
-703691520,703692031,SD
-703692032,703692287,ZA
-703692288,703692543,SD
-703692544,703692799,ZA
-703692800,703693055,SD
-703693056,703694079,ZA
-703694080,703694335,SD
-703694336,703694591,ZA
-703694592,703694847,SD
-703694848,703695359,ZA
-703695360,703695615,SD
-703695616,703695871,ZA
-703695872,703696127,SD
+703690240,703690751,ZA
+703690752,703696127,SD
703696128,703696383,ZA
703696384,703696895,SD
-703696896,703698943,ZA
-703698944,703699199,SD
-703699200,703699711,ZA
-703699712,703700223,SD
-703700224,703700479,ZA
-703700480,703702015,SD
-703702016,703702271,ZA
-703702272,703702527,SD
+703696896,703697151,ZA
+703697152,703699199,SD
+703699200,703699455,ZA
+703699456,703702527,SD
703702528,703703039,ZA
-703703040,703703807,SD
-703703808,703704063,ZA
-703704064,703704831,SD
-703704832,703705343,ZA
-703705344,703705599,SD
+703703040,703705599,SD
703705600,703705855,ZA
703705856,703706111,SD
703706112,703706367,ZA
-703706368,703706623,SD
-703706624,703706879,ZA
-703706880,703707903,SD
-703707904,703708159,ZA
-703708160,703708671,SD
-703708672,703708927,ZA
-703708928,703709183,SD
-703709184,703709439,ZA
-703709440,703709695,SD
-703709696,703710463,ZA
-703710464,703710719,SD
+703706368,703709695,SD
+703709696,703709951,ZA
+703709952,703710719,SD
703710720,703710975,ZA
703710976,703711487,SD
-703711488,703711999,ZA
-703712000,703712255,SD
-703712256,703712511,ZA
-703712512,703712767,SD
-703712768,703713023,ZA
-703713024,703713791,SD
+703711488,703711743,ZA
+703711744,703713791,SD
703713792,703714047,ZA
703714048,703714303,SD
-703714304,703714815,ZA
-703714816,703716863,SD
-703716864,703717119,ZA
-703717120,703718399,SD
-703718400,703718911,ZA
-703718912,703719935,SD
-703719936,703720191,ZA
-703720192,703722239,SD
-703722240,703722495,ZA
-703722496,703723775,SD
-703723776,703724799,ZA
-703724800,703725311,SD
-703725312,703726591,ZA
+703714304,703714559,ZA
+703714560,703724031,SD
+703724032,703724287,ZA
+703724288,703724543,SD
+703724544,703724799,ZA
+703724800,703725567,SD
+703725568,703725589,ZA
+703725590,703725590,KE
+703725591,703726591,ZA
703726592,703727615,KE
-703727616,703728127,TZ
-703728128,703728639,ZA
-703728640,703732735,LY
-703732736,703732991,ZA
-703732992,703733759,LY
+703727616,703728383,TZ
+703728384,703728639,ZA
+703728640,703733759,LY
703733760,703734527,CM
-703734528,703735039,ZA
-703735040,703735807,CM
+703734528,703734783,ZA
+703734784,703735807,CM
703735808,703737855,ZA
703737856,703746047,NG
703746048,703747071,ZA
703747072,703748095,CD
703748096,703748351,ZA
-703748352,703748863,GN
-703748864,703749119,ZA
+703748352,703749119,GN
703749120,703750143,NG
-703750144,703751167,ZA
+703750144,703750655,ZA
+703750656,703750911,MG
+703750912,703751167,ZA
703751168,703751679,MG
-703751680,703752191,ZA
-703752192,703752447,MG
+703751680,703751935,ZA
+703751936,703752447,MG
703752448,703752703,ZA
703752704,703753215,MG
-703753216,703753727,ZA
-703753728,703754239,MG
+703753216,703753471,ZA
+703753472,703754239,MG
703754240,703755263,GH
703755264,703757311,ZA
703757312,703758335,RE
-703758336,703758591,CD
-703758592,703758847,ZA
-703758848,703759103,CD
-703759104,703791103,ZA
+703758336,703759359,CD
+703759360,703760383,ZA
+703760384,703761407,GH
+703761408,703791103,ZA
703791104,703791359,CD
703791360,703791871,ZA
-703791872,703792127,CD
-703792128,703792383,ZA
-703792384,703792895,CD
-703792896,703793919,ZA
-703793920,703794175,CD
-703794176,703795455,ZA
-703795456,703795711,CD
-703795712,703796479,ZA
-703796480,703797247,CD
-703797248,703797503,ZA
-703797504,703798015,CD
-703798016,703799295,ZA
-703799296,703799551,CD
-703799552,703800063,ZA
-703800064,703800319,CD
-703800320,703802111,ZA
-703802112,703802623,CD
-703802624,703802879,ZA
-703802880,703803391,CD
-703803392,703804415,ZA
+703791872,703792895,CD
+703792896,703793151,ZA
+703793152,703794175,CD
+703794176,703794687,ZA
+703794688,703795199,CD
+703795200,703795455,ZA
+703795456,703798527,CD
+703798528,703799039,ZA
+703799040,703799807,CD
+703799808,703800063,ZA
+703800064,703800575,CD
+703800576,703800831,ZA
+703800832,703801855,CD
+703801856,703802111,ZA
+703802112,703804159,CD
+703804160,703804415,ZA
703804416,703806719,CD
703806720,703806975,ZA
-703806976,703808255,CD
-703808256,703808767,ZA
-703808768,703809023,CD
-703809024,703809535,ZA
-703809536,703810559,CD
+703806976,703809023,CD
+703809024,703809279,ZA
+703809280,703810559,CD
703810560,703810815,ZA
-703810816,703811327,CD
-703811328,703812863,ZA
-703812864,703813119,CD
-703813120,703813887,ZA
-703813888,703814143,CD
-703814144,703814399,ZA
-703814400,703814655,CD
-703814656,703814911,ZA
-703814912,703815167,CD
-703815168,703815423,ZA
-703815424,703816703,CD
-703816704,703816959,ZA
-703816960,703817215,CD
-703817216,703819007,ZA
-703819008,703819263,CD
-703819264,703819775,ZA
-703819776,703820543,CD
-703820544,703820799,ZA
-703820800,703821567,CD
-703821568,703821823,ZA
-703821824,703822079,CD
-703822080,703822847,ZA
-703822848,703823871,CD
-703823872,703824127,ZA
-703824128,703825407,CD
+703810816,703811839,CD
+703811840,703812351,ZA
+703812352,703813119,CD
+703813120,703813375,ZA
+703813376,703817471,CD
+703817472,703817727,ZA
+703817728,703817983,CD
+703817984,703818239,ZA
+703818240,703822335,CD
+703822336,703822591,ZA
+703822592,703825407,CD
703825408,703825663,ZA
-703825664,703826175,CD
-703826176,703826431,ZA
-703826432,703827711,CD
-703827712,703828223,ZA
-703828224,703828735,CD
-703828736,703828991,ZA
-703828992,703830783,CD
-703830784,703831039,ZA
-703831040,703831295,CD
+703825664,703827967,CD
+703827968,703828223,ZA
+703828224,703831295,CD
703831296,703831551,ZA
703831552,703832319,CD
703832320,703832575,ZA
-703832576,703832831,CD
-703832832,703833087,ZA
-703833088,703833599,CD
-703833600,703833855,ZA
-703833856,703835903,CD
-703835904,703836159,ZA
-703836160,703836671,CD
-703836672,703836927,ZA
-703836928,703838207,CD
+703832576,703838207,CD
703838208,703838463,ZA
703838464,703838719,CD
-703838720,703839487,ZA
-703839488,703839743,CD
+703838720,703838975,ZA
+703838976,703839743,CD
703839744,703839999,ZA
-703840000,703840255,CD
-703840256,703840767,ZA
-703840768,703841023,CD
-703841024,703842047,ZA
-703842048,703842559,CD
-703842560,703843071,ZA
-703843072,703843327,CD
-703843328,703843583,ZA
-703843584,703843839,CD
-703843840,703844095,ZA
-703844096,703844351,CD
-703844352,703845119,ZA
-703845120,703845375,CD
+703840000,703841279,CD
+703841280,703841535,ZA
+703841536,703842559,CD
+703842560,703842815,ZA
+703842816,703845375,CD
703845376,703845631,ZA
703845632,703846911,CD
-703846912,703847679,ZA
-703847680,703848447,CD
-703848448,703848703,ZA
-703848704,703849215,CD
+703846912,703847167,ZA
+703847168,703847423,CD
+703847424,703847679,ZA
+703847680,703849215,CD
703849216,703849471,ZA
-703849472,703850239,CD
-703850240,703850495,ZA
-703850496,703851775,CD
-703851776,703852287,ZA
-703852288,703853567,CD
-703853568,703853823,ZA
-703853824,703854079,CD
-703854080,703854591,ZA
-703854592,703855103,CD
-703855104,703855359,ZA
-703855360,703855871,CD
-703855872,703856383,ZA
-703856384,703856639,CD
-703856640,704118783,ZA
+703849472,703856639,CD
+703856640,703856895,ZA
+703856896,703857919,CM
+703857920,703858431,ZA
+703858432,703858943,CM
+703858944,703859199,ZA
+703859200,703864063,CM
+703864064,703864319,ZA
+703864320,703864575,CM
+703864576,703865855,ZA
+703865856,703866623,CM
+703866624,703867135,ZA
+703867136,703867391,CM
+703867392,703867647,ZA
+703867648,703869439,CM
+703869440,703869951,ZA
+703869952,703870975,CM
+703870976,703871487,ZA
+703871488,703871743,CM
+703871744,703871999,ZA
+703872000,703876607,CM
+703876608,703876863,ZA
+703876864,703884287,CM
+703884288,703884799,ZA
+703884800,703885055,CM
+703885056,703885311,ZA
+703885312,703886079,CM
+703886080,703886335,ZA
+703886336,703888639,CM
+703888640,703888895,ZA
+703888896,703889151,CM
+703889152,703889407,ZA
+703889408,703889663,CM
+703889664,703890175,ZA
+703890176,703891455,CM
+703891456,703892223,ZA
+703892224,703897343,CM
+703897344,703897599,ZA
+703897600,703901183,CM
+703901184,703901695,ZA
+703901696,703902975,CM
+703902976,703903231,ZA
+703903232,703903487,CM
+703903488,703903743,ZA
+703903744,703905535,CM
+703905536,703905791,ZA
+703905792,703912447,CM
+703912448,703912703,ZA
+703912704,703912959,CM
+703912960,703913215,ZA
+703913216,703913727,CM
+703913728,703913983,ZA
+703913984,703914239,CM
+703914240,703914495,ZA
+703914496,703914751,CM
+703914752,703915519,ZA
+703915520,703919359,CM
+703919360,703919615,ZA
+703919616,703922175,CM
+703922176,704118783,ZA
704118784,704380927,MA
704380928,704643071,LY
704643072,704644095,CN
@@ -5345,6 +5861,11 @@
738197504,746717183,US
746717184,746782719,DE
746782720,755105791,US
+759234560,759235583,SG
+759235584,759236607,NZ
+759236608,759237631,IN
+759237632,759238655,AU
+765460480,767557631,UY
771751936,771817471,RU
771817472,771948543,TR
771948544,772014079,RU
@@ -5390,7 +5911,15 @@
772841472,772843519,GB
772843520,772845567,IT
772845568,772847615,RU
-772847616,772849663,GB
+772847616,772848871,GB
+772848872,772848879,US
+772848880,772849231,GB
+772849232,772849247,MY
+772849248,772849255,GB
+772849256,772849263,US
+772849264,772849271,GB
+772849272,772849279,US
+772849280,772849663,GB
772849664,772851711,BG
772851712,772853759,CH
772853760,772855807,GB
@@ -5432,9 +5961,9 @@
772927488,772929535,UA
772929536,772931583,RU
772931584,772933631,UA
-772933632,772933919,GB
-772933920,772933927,IE
-772933928,772935679,GB
+772933632,772933887,GB
+772933888,772934143,IE
+772934144,772935679,GB
772935680,772937727,PS
772937728,772939775,IT
772939776,772941823,BE
@@ -5489,11 +6018,12 @@
773048320,773050367,LV
773050368,773052415,IE
773052416,773054463,NL
-773054464,773055343,AL
-773055344,773055347,XK
-773055348,773055871,AL
+773054464,773055231,AL
+773055232,773055359,XK
+773055360,773055871,AL
773055872,773055999,RS
-773056000,773056511,AL
+773056000,773056255,XK
+773056256,773056511,AL
773056512,773058559,IT
773058560,773060607,BE
773060608,773062655,DK
@@ -5514,7 +6044,9 @@
773120000,773124095,GB
773124096,773128191,CH
773128192,773132287,DE
-773132288,773136383,IT
+773132288,773134335,IT
+773134336,773135359,CH
+773135360,773136383,IT
773136384,773140479,DK
773140480,773144575,CY
773144576,773148671,RU
@@ -5530,9 +6062,7 @@
773167208,773167359,US
773167360,773167615,NL
773167616,773168127,US
-773168128,773168383,NL
-773168384,773168391,US
-773168392,773168415,NL
+773168128,773168415,NL
773168416,773168639,US
773168640,773168895,NL
773168896,773169151,US
@@ -5615,7 +6145,8 @@
773646336,773648383,TR
773648384,773650431,PL
773650432,773652479,GB
-773652480,773653503,SK
+773652480,773652735,TR
+773652736,773653503,SK
773653504,773654527,TR
773654528,773656575,RU
773656576,773658623,PL
@@ -5757,8 +6288,13 @@
774078464,774086655,BA
774086656,774094847,BG
774094848,774103039,HU
-774103040,774111231,UA
-774111232,774119423,RU
+774103040,774104831,RU
+774104832,774105087,UA
+774105088,774105343,RU
+774105344,774105599,UA
+774105600,774109695,RU
+774109696,774109951,UA
+774109952,774119423,RU
774119424,774127615,CZ
774127616,774135807,LT
774135808,774143999,IR
@@ -5779,7 +6315,8 @@
774160703,774160735,CH
774160736,774160768,GR
774160769,774160801,IL
-774160802,774160832,BG
+774160802,774160802,VA
+774160803,774160832,BG
774160833,774160864,NO
774160865,774160869,BR
774160870,774160873,CA
@@ -5824,7 +6361,7 @@
774161273,774161282,MT
774161283,774161292,SE
774161293,774161302,US
-774161303,774161312,HK
+774161303,774161312,VA
774161313,774161322,IE
774161323,774161332,PK
774161333,774161337,KW
@@ -5840,24 +6377,30 @@
774161383,774161387,EE
774161388,774161392,LU
774161393,774161397,SK
-774161398,774161402,SI
+774161398,774161402,VA
774161403,774161405,LC
774161406,774161408,VA
-774161409,774161418,GB
+774161409,774161409,GB
+774161410,774161417,US
+774161418,774161418,GB
774161419,774161428,GL
774161429,774161438,HU
774161439,774161448,MK
774161449,774161458,PS
774161459,774161468,UZ
774161469,774161478,MS
-774161479,774161488,GB
+774161479,774161479,GB
+774161480,774161487,US
+774161488,774161488,GB
774161489,774161498,MN
774161499,774161518,US
774161519,774161528,TW
774161529,774161538,DO
774161539,774161548,PY
774161549,774161558,EE
-774161559,774161568,SK
+774161559,774161559,SK
+774161560,774161566,BR
+774161567,774161568,SK
774161569,774161578,LC
774161579,774161588,VE
774161589,774161598,TC
@@ -5867,7 +6410,8 @@
774161649,774161658,HK
774161659,774161664,VA
774161665,774161674,US
-774161675,774161684,CL
+774161675,774161675,CL
+774161676,774161684,VA
774161685,774161694,GR
774161695,774161695,AG
774161696,774161704,GR
@@ -5881,90 +6425,38 @@
774161775,774161784,SN
774161785,774161794,MA
774161795,774161804,BH
-774161805,774161814,JE
+774161805,774161805,JE
+774161806,774161813,US
+774161814,774161814,JE
774161815,774161824,TV
-774161825,774161834,PF
+774161825,774161825,PF
+774161826,774161833,US
+774161834,774161834,PF
774161835,774161844,SB
774161845,774161854,VU
774161855,774161855,CW
774161856,774161863,MX
774161864,774161864,CW
-774161865,774161869,AR
+774161865,774161865,AR
+774161866,774161869,VA
774161870,774161874,ES
-774161875,774161879,GE
-774161880,774161884,RS
-774161885,774161889,DE
-774161890,774161894,IT
-774161895,774161899,BE
+774161875,774161899,VA
774161900,774161904,FR
-774161905,774161909,CZ
-774161910,774161914,LT
-774161915,774161917,PL
-774161918,774161920,VA
-774161921,774161940,GB
-774161941,774161950,AU
-774161951,774161955,IT
-774161956,774161960,NZ
-774161961,774161965,PL
-774161966,774161970,NL
-774161971,774161975,CA
-774161976,774161980,US
-774161981,774161985,GB
-774161986,774161990,IQ
-774161991,774161995,LT
-774161996,774162000,ER
-774162001,774162005,KE
-774162006,774162010,DE
-774162011,774162015,TN
-774162016,774162020,TT
-774162021,774162025,BO
-774162026,774162030,CH
-774162031,774162035,AU
-774162036,774162040,AL
-774162041,774162045,AD
-774162046,774162050,HR
-774162051,774162055,ME
-774162056,774162060,BR
+774161905,774162060,VA
774162061,774162065,US
-774162066,774162070,BR
-774162071,774162075,EC
-774162076,774162080,SH
-774162081,774162085,CR
-774162086,774162090,KH
-774162091,774162095,VN
-774162096,774162100,CR
-774162101,774162105,US
+774162066,774162105,VA
774162106,774162110,GB
-774162111,774162115,SO
-774162116,774162120,FI
-774162121,774162125,DZ
+774162111,774162125,VA
774162126,774162130,MO
-774162131,774162135,MR
-774162136,774162140,CM
-774162141,774162145,SV
-774162146,774162150,HN
-774162151,774162155,US
-774162156,774162160,UY
-774162161,774162165,LV
-774162166,774162170,MD
+774162131,774162170,VA
774162171,774162173,GB
-774162174,774162176,VA
-774162177,774162181,LK
-774162182,774162186,IE
-774162187,774162196,CR
-774162197,774162206,DE
-774162207,774162216,CX
-774162217,774162225,VA
+774162174,774162225,VA
774162226,774162236,GB
-774162237,774162246,CH
-774162247,774162266,US
-774162267,774162276,PT
-774162277,774162286,AE
-774162287,774162296,IO
+774162237,774162246,VA
+774162247,774162256,US
+774162257,774162296,VA
774162297,774162306,GB
-774162307,774162316,RE
-774162317,774162326,TK
-774162327,774162336,CV
+774162307,774162336,VA
774162337,774162346,AZ
774162347,774162366,US
774162367,774162376,MX
@@ -6025,7 +6517,9 @@
774162689,774162693,US
774162694,774162698,MZ
774162699,774162703,NP
-774162704,774162778,US
+774162704,774162738,US
+774162739,774162743,VA
+774162744,774162778,US
774162779,774162787,CA
774162788,774162788,VA
774162789,774162798,CA
@@ -6034,7 +6528,8 @@
774162809,774162813,US
774162814,774162818,IT
774162819,774162823,KZ
-774162824,774162828,MV
+774162824,774162827,US
+774162828,774162828,MV
774162829,774162833,PN
774162834,774162835,SM
774162836,774162838,PN
@@ -6059,7 +6554,8 @@
774162967,774162967,LI
774162968,774162969,MX
774162970,774162970,BY
-774162971,774162974,MX
+774162971,774162971,MX
+774162972,774162974,VA
774162975,774162975,MY
774162976,774162979,VA
774162980,774162980,IN
@@ -6073,27 +6569,11 @@
774163006,774163009,BO
774163010,774163010,VE
774163011,774163014,BO
-774163015,774163024,RU
-774163025,774163034,UA
-774163035,774163071,VA
-774163072,774163079,GW
-774163080,774163087,LS
-774163088,774163094,ML
-774163095,774163104,IT
-774163105,774163111,PW
-774163112,774163114,SL
-774163115,774163124,IT
-774163125,774163134,TJ
-774163135,774163139,TG
-774163140,774163144,AS
-774163145,774163149,BD
-774163150,774163154,BT
-774163155,774163159,GF
-774163160,774163164,GP
-774163165,774163169,GN
-774163170,774163174,MU
-774163175,774163179,CG
-774163180,774163203,VA
+774163015,774163071,VA
+774163072,774163074,GW
+774163075,774163124,IT
+774163125,774163127,TJ
+774163128,774163203,VA
774163204,774163210,AU
774163211,774163215,TD
774163216,774163220,CD
@@ -6111,27 +6591,21 @@
774163276,774163280,GB
774163281,774163283,KP
774163284,774163290,FK
-774163291,774163295,BJ
-774163296,774163300,BI
-774163301,774163303,CI
-774163304,774163307,GQ
-774163308,774163315,GA
-774163316,774163320,GH
-774163321,774163323,NE
-774163324,774163327,RW
-774163328,774163335,UG
+774163291,774163330,IT
+774163331,774163331,UG
+774163332,774163335,VA
774163336,774163339,MP
774163340,774163343,TL
774163344,774163347,WF
774163348,774163351,SD
-774163352,774163359,SS
+774163352,774163359,VA
774163360,774163367,BQ
774163368,774163375,CW
774163376,774163383,IT
-774163384,774163399,GE
-774163400,774163415,US
-774163416,774163454,IT
-774163455,774163455,VA
+774163384,774163391,GE
+774163392,774163399,VA
+774163400,774163411,US
+774163412,774163455,VA
774163456,774166527,DK
774166528,774168575,EE
774168576,774176767,PL
@@ -6230,10 +6704,16 @@
778043392,778108927,UA
778108928,778174463,RO
778174464,778239999,UA
-778240000,778247679,AL
+778240000,778244095,AL
+778244096,778244351,RS
+778244352,778245119,AL
+778245120,778245375,RS
+778245376,778247679,AL
778247680,778247935,XK
778247936,778248191,RS
-778248192,778305535,AL
+778248192,778249727,AL
+778249728,778249983,RS
+778249984,778305535,AL
778305536,778371071,IR
778371072,778436607,RU
778436608,778476031,RO
@@ -6245,7 +6725,9 @@
778500096,778502143,RO
778502144,778567679,GR
778567680,778633215,TR
-778633216,778666479,FR
+778633216,778666259,FR
+778666260,778666263,ES
+778666264,778666479,FR
778666480,778666495,DE
778666496,778666879,FR
778666880,778666943,GB
@@ -6253,27 +6735,77 @@
778668864,778668895,DE
778668896,778670975,FR
778670976,778670976,DE
-778670977,778675763,FR
+778670977,778673187,FR
+778673188,778673191,ES
+778673192,778673207,FR
+778673208,778673211,ES
+778673212,778673883,FR
+778673884,778673887,ES
+778673888,778675763,FR
778675764,778675767,PL
-778675768,778677471,FR
+778675768,778675795,FR
+778675796,778675799,ES
+778675800,778675891,FR
+778675892,778675895,ES
+778675896,778677071,FR
+778677072,778677075,NL
+778677076,778677471,FR
778677472,778677475,DE
778677476,778677503,FR
778677504,778677507,GB
-778677508,778679212,FR
+778677508,778677519,FR
+778677520,778677523,ES
+778677524,778679212,FR
778679213,778679214,FI
-778679215,778680227,FR
+778679215,778679491,FR
+778679492,778679495,ES
+778679496,778680227,FR
778680228,778680231,IE
-778680232,778681503,FR
+778680232,778680683,FR
+778680684,778680687,ES
+778680688,778681503,FR
778681504,778681507,DE
-778681508,778691711,FR
+778681508,778681519,FR
+778681520,778681523,ES
+778681524,778691711,FR
778691712,778691727,GB
-778691728,778695471,FR
+778691728,778692499,FR
+778692500,778692503,ES
+778692504,778692743,FR
+778692744,778692747,ES
+778692748,778693095,FR
+778693096,778693099,ES
+778693100,778693427,FR
+778693428,778693431,ES
+778693432,778693759,FR
+778693760,778693763,ES
+778693764,778695471,FR
778695472,778695475,ES
778695476,778695487,FR
778695488,778695503,BE
-778695504,778698751,FR
+778695504,778696495,FR
+778696496,778696499,ES
+778696500,778696991,FR
+778696992,778696995,ES
+778696996,778697067,FR
+778697068,778697071,ES
+778697072,778697175,FR
+778697176,778697179,ES
+778697180,778697815,FR
+778697816,778697819,ES
+778697820,778697955,FR
+778697956,778697959,ES
+778697960,778698447,FR
+778698448,778698451,ES
+778698452,778698643,FR
+778698644,778698647,ES
+778698648,778698703,FR
+778698704,778698707,ES
+778698708,778698751,FR
778698752,778764287,TR
-778764288,778829823,HU
+778764288,778823167,HU
+778823168,778823423,UA
+778823424,778829823,HU
778829824,778895359,RO
778895360,778960895,LV
778960896,779026431,DE
@@ -6308,7 +6840,7 @@
781189120,781320191,NL
781320192,781451263,RU
781451264,781455359,PL
-781455360,781459455,UA
+781455360,781459455,LT
781459456,781463551,IR
781463552,781467647,RU
781467648,781475839,PL
@@ -6351,8 +6883,7 @@
781676544,781678591,PL
781678592,781682687,RS
781682688,781684735,PL
-781684736,781686783,UA
-781686784,781688831,RU
+781684736,781688831,RU
781688832,781690879,RO
781690880,781692927,RU
781692928,781694975,UA
@@ -6383,7 +6914,8 @@
782434304,782446591,SI
782446592,782447359,BA
782447360,782447615,HR
-782447616,782450687,SI
+782447616,782449663,SI
+782449664,782450687,BA
782450688,782467071,DE
782467072,782483455,RU
782483456,782499839,FI
@@ -6392,7 +6924,9 @@
782532608,782548991,UA
782548992,782581759,RU
782581760,782598143,FR
-782598144,782630911,DE
+782598144,782616643,DE
+782616644,782616644,RU
+782616645,782630911,DE
782630912,782647295,MD
782647296,782663679,RU
782663680,782667519,NL
@@ -6480,7 +7014,9 @@
783687680,783689727,PT
783689728,783691775,FR
783691776,783693823,BY
-783693824,783695871,GB
+783693824,783694367,GB
+783694368,783694399,DE
+783694400,783695871,GB
783695872,783697919,TR
783697920,783699967,FR
783699968,783702015,UA
@@ -6517,7 +7053,7 @@
783765504,783767551,RU
783767552,783769599,IL
783769600,783771647,DE
-783771648,783773695,GB
+783771648,783773695,FR
783773696,783775743,ES
783775744,783777791,AL
783777792,783779839,RU
@@ -6550,7 +7086,9 @@
784269312,784302079,BY
784302080,784334847,RU
784334848,784465919,FR
-784465920,784596991,SE
+784465920,784524287,SE
+784524288,784524543,PL
+784524544,784596991,SE
784596992,784728063,TR
784728064,784793599,GR
784793600,784859135,CY
@@ -6579,9 +7117,7 @@
786567168,786569215,CZ
786569216,786571263,NO
786571264,786575359,ES
-786575360,786575871,GB
-786575872,786576127,SE
-786576128,786577407,GB
+786575360,786577407,GB
786577408,786579455,NL
786579456,786581503,RU
786581504,786583551,GB
@@ -6613,8 +7149,7 @@
786632704,786634751,FR
786634752,786636799,RU
786636800,786638847,PL
-786638848,786640895,ES
-786640896,786642943,GB
+786638848,786642943,GB
786642944,786644991,GR
786644992,786649087,SE
786649088,786651135,FR
@@ -6683,9 +7218,15 @@
786915328,786917375,SK
786917376,786919423,RO
786919424,786919431,IT
-786919432,786919879,GB
+786919432,786919639,GB
+786919640,786919647,IT
+786919648,786919799,GB
+786919800,786919807,IT
+786919808,786919879,GB
786919880,786919887,IT
-786919888,786920191,GB
+786919888,786919967,GB
+786919968,786919975,IT
+786919976,786920191,GB
786920192,786920199,IT
786920200,786920343,GB
786920344,786920351,IT
@@ -6695,9 +7236,9 @@
786920840,786920847,IT
786920848,786920855,GB
786920856,786920863,IT
-786920864,786921015,GB
-786921016,786921023,IT
-786921024,786921471,GB
+786920864,786921455,GB
+786921456,786921463,IT
+786921464,786921471,GB
786921472,786923519,ES
786923520,786925567,FR
786925568,786927615,DE
@@ -6740,6 +7281,7 @@
787054592,787070975,IT
787070976,787087359,RU
787087360,787095551,TR
+787095680,787095711,CH
787096576,787097855,CH
787099392,787100671,CH
787101696,787102719,CH
@@ -6783,7 +7325,9 @@
787214336,787216383,DE
787216384,787218431,RU
787218432,787234815,GB
-787234816,787251199,SE
+787234816,787236559,SE
+787236560,787236575,NO
+787236576,787251199,SE
787251200,787267583,RU
787267584,787283967,DE
787283968,787300351,RU
@@ -6792,35 +7336,28 @@
787333120,787349503,DE
787349504,787365887,BG
787365888,787382271,PL
-787382272,787386367,GP
-787386368,787386623,MQ
-787386624,787387391,GP
-787387392,787387647,MQ
-787387648,787387903,GP
-787387904,787388415,MQ
-787388416,787388927,GP
-787388928,787389183,MQ
-787389184,787389695,GP
-787389696,787389951,MQ
-787389952,787390463,GP
+787382272,787387647,GP
+787387648,787388671,MQ
+787388672,787388927,GP
+787388928,787390207,MQ
+787390208,787390463,GP
787390464,787391231,FR
-787391232,787391999,MQ
-787392000,787392255,FR
-787392256,787392511,MQ
+787391232,787391487,MQ
+787391488,787391743,FR
+787391744,787392255,MQ
+787392256,787392511,FR
787392512,787392767,GP
-787392768,787394047,FR
-787394048,787394303,GP
+787392768,787393791,FR
+787393792,787394303,GP
787394304,787394559,FR
787394560,787394815,GF
787394816,787395071,FR
-787395072,787396095,GF
+787395072,787395327,GF
+787395328,787395583,FR
+787395584,787396095,GF
787396096,787396351,FR
787396352,787396607,GF
-787396608,787397119,FR
-787397120,787397375,MQ
-787397376,787397631,FR
-787397632,787397887,MQ
-787397888,787398399,FR
+787396608,787398399,FR
787398400,787398655,MQ
787398656,787415039,PL
787415040,787431423,BA
@@ -6840,7 +7377,6 @@
787685376,787687423,IT
787687424,787689471,NL
787689472,787691519,CZ
-787691520,787693567,IT
787693568,787695615,SK
787695616,787697663,RU
787697664,787701759,DE
@@ -6852,8 +7388,8 @@
787724288,787726335,UA
787726336,787742719,RU
787742720,787759103,NL
-787759104,787763199,PS
-787763200,787775487,NL
+787759104,787767295,PS
+787767296,787775487,NL
787775488,787808255,DE
787808256,787841023,IR
787841024,787843071,RU
@@ -6964,9 +7500,7 @@
788455424,788457471,FR
788457472,788459519,IT
788459520,788461567,RU
-788461568,788462335,JE
-788462336,788462591,GB
-788462592,788462847,JE
+788461568,788462847,JE
788462848,788465663,GB
788465664,788467711,CZ
788467712,788469759,NO
@@ -6984,19 +7518,20 @@
788490240,788492287,NL
788492288,788494335,GB
788494336,788494591,US
-788494592,788495103,SE
+788494592,788495103,CY
788495104,788495615,US
788495616,788495871,GB
-788495872,788496383,SE
+788495872,788496383,CY
788496384,788498431,FR
788498432,788500479,RU
788500480,788502527,AL
788502528,788504575,IE
788504576,788506623,FR
788506624,788508671,CH
-788508672,788508927,FR
-788508928,788509695,AT
-788509696,788509951,FR
+788508672,788508927,AT
+788508928,788509183,FR
+788509184,788509439,AT
+788509440,788509951,FR
788509952,788510463,AT
788510464,788510719,FR
788510720,788512767,ES
@@ -7012,7 +7547,9 @@
789577728,790102015,US
790102016,792002559,CA
792002560,792068095,US
-792068096,792330239,CA
+792068096,792096767,CA
+792096768,792097279,US
+792097280,792330239,CA
792330240,792723455,ES
792723456,793247743,DE
793247744,793313279,NZ
@@ -7088,7 +7625,9 @@
831389696,831512575,KR
831512576,831513599,AU
831513600,831514623,NZ
-831514624,831515647,HK
+831514624,831514975,HK
+831514976,831515007,AU
+831515008,831515647,HK
831515648,831516671,AU
831516672,831518719,JP
831518720,831519743,AU
@@ -7147,27 +7686,36 @@
838467584,838729727,JP
838729728,838795263,KR
838795264,838860799,AU
-838860800,838995711,US
-838995712,838995967,CA
+838860800,838995455,US
+838995456,838995967,CA
838995968,838996991,US
838996992,838997247,CA
-838997248,839027967,US
+838997248,839016191,US
+839016192,839016447,CA
+839016448,839027967,US
839027968,839030015,IN
839030016,839056447,US
839056448,839056455,CN
-839056456,839062271,US
+839056456,839061503,US
+839061504,839061759,CA
+839061760,839062271,US
839062272,839064063,CA
839064064,839069183,US
839069184,839071231,CA
-839071232,839352319,US
-839352320,839355391,NL
-839355392,839359487,US
+839071232,839095807,US
+839095808,839096063,CA
+839096064,839104255,US
+839104256,839104511,CA
+839104512,839112191,US
+839112192,839112703,CA
+839112704,839352319,US
+839352320,839356415,NL
+839356416,839359487,US
839359488,839360511,DE
-839360512,839364607,NL
-839364608,839366911,US
+839360512,839366655,NL
+839366656,839366911,AT
839366912,839367167,CZ
-839367168,839367679,NL
-839367680,839368703,US
+839367168,839368703,NL
839368704,839385087,CZ
839385088,840269823,US
840269824,840273919,CA
@@ -7175,7 +7723,15 @@
840278016,840282111,CA
840282112,840294399,US
840294400,840298495,CA
-840298496,840953855,US
+840298496,840838508,US
+840838509,840838509,UA
+840838510,840838510,US
+840838511,840838512,UA
+840838513,840898047,US
+840898048,840898559,CA
+840898560,840909055,US
+840909056,840909311,CA
+840909312,840953855,US
840953856,840954367,JP
840954368,840956927,US
840956928,840957951,JP
@@ -7193,17 +7749,26 @@
846561280,846594047,CA
846594048,846626815,US
846626816,846627071,CN
-846627072,850506751,US
-850506752,850507007,CA
-850507008,855638015,US
+846627072,855638015,US
855638016,872415231,GB
872415232,889192447,US
889192448,905969663,DE
-905969664,918683647,US
+905969664,910688255,US
+910688256,911147007,IE
+911147008,911212543,AU
+911212544,912195583,US
+912195584,912261119,JP
+912261120,917635071,US
+917635072,917700607,JP
+917700608,917766143,SG
+917766144,918683647,US
918683648,918814719,IE
-918814720,919470079,US
+918814720,919011327,US
+919011328,919076863,JP
+919076864,919470079,US
919470080,919535615,AU
-919535616,920125439,US
+919535616,919601151,BR
+919601152,920125439,US
920125440,920256511,IE
920256512,920387583,US
920387584,920453119,IE
@@ -7218,7 +7783,9 @@
921632768,922091519,US
922091520,922189311,IE
922189312,922189567,US
-922189568,922222591,IE
+922189568,922205775,IE
+922205776,922205776,DE
+922205777,922222591,IE
922222592,922419199,JP
922419200,922484735,SG
922484736,922615807,AU
@@ -7247,12 +7814,16 @@
960671744,960676607,DE
960676608,960676863,PL
960676864,960692223,DE
-960692224,960726783,FR
+960692224,960724991,FR
+960724992,960726783,NL
960726784,960727039,ZA
960727040,960727295,US
-960727296,960729343,FR
+960727296,960728319,NL
+960728320,960728575,FR
+960728576,960729343,NL
960729344,960729599,ZA
-960729600,960733183,FR
+960729600,960729855,FR
+960729856,960733183,NL
960733184,960733439,BE
960733440,960733695,FR
960733696,960733951,BE
@@ -7265,8 +7836,20 @@
960757760,960888831,US
960888832,960921599,AU
960921600,960929791,NZ
-960929792,960954367,AU
-960954368,961019903,FR
+960929792,960933887,KI
+960933888,960937983,MH
+960937984,960942079,FM
+960942080,960946175,NR
+960946176,960950271,FJ
+960950272,960954367,PW
+960954368,960958463,PG
+960958464,960962559,WS
+960962560,960966655,SB
+960966656,960970751,TO
+960970752,960974847,TV
+960974848,960978943,VU
+960978944,960983039,NC
+960983040,961019903,FR
961019904,961021439,HK
961021440,961021695,FR
961021696,961021951,HK
@@ -7306,11 +7889,21 @@
961200128,961208319,CO
961208320,961216511,VE
961216512,961224703,PE
-961224704,961249279,FR
+961224704,961228799,EC
+961228800,961232895,BO
+961232896,961236991,PY
+961236992,961241087,FR
+961241088,961245183,GF
+961245184,961247231,GY
+961247232,961249279,SR
961249280,961253375,GT
-961253376,961265663,FR
+961253376,961257471,BZ
+961257472,961261567,HN
+961261568,961265663,NI
961265664,961269759,SV
-961269760,961282047,FR
+961269760,961273855,PA
+961273856,961277951,CR
+961277952,961282047,FR
961282048,961314815,MX
961314816,961380351,US
961380352,961413119,CA
@@ -7318,13 +7911,26 @@
961445888,961478655,ES
961478656,961511423,CH
961511424,961519615,PT
-961519616,961527807,FR
+961519616,961523711,SE
+961523712,961527807,LI
961527808,961531903,MC
-961531904,961535999,SM
-961536000,961540095,VA
-961540096,961544191,FR
+961531904,961533951,SM
+961533952,961540095,VA
+961540096,961542143,AD
+961542144,961544191,MC
961544192,961675263,US
-961675264,961740799,ZA
+961675264,961683455,ZA
+961683456,961687551,DZ
+961687552,961691647,AO
+961691648,961695743,BJ
+961695744,961699839,BW
+961699840,961703935,BF
+961703936,961708031,BI
+961708032,961712127,CM
+961712128,961716223,CV
+961716224,961720319,CF
+961720320,961724415,TD
+961724416,961740799,ZA
961740800,961806335,FR
961806336,961810431,MR
961810432,961826815,FR
@@ -7380,13 +7986,35 @@
962416640,962461695,FR
962461696,962469887,IE
962469888,962527231,TR
-962527232,972744447,FR
+962527232,962592767,FR
+962592768,962594815,IN
+962594816,962596863,FR
+962596864,962598911,SG
+962598912,962600959,FR
+962600960,962609151,HK
+962609152,962613247,JP
+962613248,962617343,FR
+962617344,962621439,AU
+962621440,962674687,FR
+962674688,962676735,BR
+962676736,962680831,FR
+962680832,962689023,US
+962689024,962723839,FR
+962723840,962732031,GB
+962732032,962740223,DE
+962740224,962744319,SE
+962744320,962748415,FR
+962748416,962752511,BH
+962752512,962756607,ZA
+962756608,968818687,FR
+968818688,968819711,DE
+968819712,968851455,FR
+968851456,968852479,US
+968852480,972744447,FR
972744448,972744703,IN
972744704,972747263,FR
972747264,972747519,US
-972747520,972749823,FR
-972749824,972750079,US
-972750080,973078527,FR
+972747520,973078527,FR
973078528,973209599,JP
973209600,973275135,IN
973275136,973471743,JP
@@ -7419,9 +8047,7 @@
977797120,978321407,KR
978321408,978452479,JP
978452480,978583551,CN
-978599936,978638591,AU
-978638592,978638847,PG
-978638848,978640895,AU
+978599936,978640895,AU
978640896,978644991,NZ
978644992,978714623,JP
978714624,978780159,TW
@@ -7433,7 +8059,9 @@
979369984,979410943,AU
979410944,979419135,HK
979419136,979435519,AU
-979435520,979468287,TH
+979435520,979436799,TH
+979436800,979437055,OM
+979437056,979468287,TH
979468288,979501055,BD
979501056,979566591,JP
979566592,979599359,TW
@@ -7513,7 +8141,11 @@
999800832,999817215,KR
999817216,999849983,BD
999849984,999866367,KR
-999866368,999882751,HK
+999866368,999873919,HK
+999873920,999873941,VN
+999873942,999873943,HK
+999873944,999874047,VN
+999874048,999882751,HK
999948288,1000013823,AU
1000013824,1000079359,CN
1000079360,1000341503,JP
@@ -7616,7 +8248,9 @@
1024365728,1024365759,SG
1024365760,1024372543,JP
1024372544,1024372607,HK
-1024372608,1024375295,JP
+1024372608,1024373263,JP
+1024373264,1024373279,HK
+1024373280,1024375295,JP
1024375296,1024375551,AU
1024375552,1024376831,JP
1024376832,1024393215,PH
@@ -7653,7 +8287,9 @@
1025376256,1025507327,TW
1025507328,1026293759,KR
1026293760,1026311423,JP
-1026311424,1026311679,US
+1026311424,1026311530,US
+1026311531,1026311531,JP
+1026311532,1026311679,US
1026311680,1026392063,JP
1026392064,1026408447,CN
1026408448,1026416639,JP
@@ -7683,7 +8319,9 @@
1030674432,1030676223,JP
1030676224,1030750207,KR
1030750208,1031798783,JP
-1031798784,1035993087,CN
+1031798784,1032668159,CN
+1032668160,1032668415,HK
+1032668416,1035993087,CN
1035993088,1037565951,JP
1037565952,1038614527,TW
1038614528,1039007743,CN
@@ -7746,9 +8384,9 @@
1041235968,1041244159,UA
1041244160,1041268735,RU
1041268736,1041301503,NO
-1041301504,1041338879,IE
-1041338880,1041339135,GB
-1041339136,1041367039,IE
+1041301504,1041310975,IE
+1041310976,1041311231,GB
+1041311232,1041367039,IE
1041367040,1041498111,IT
1041498112,1041563647,SE
1041563648,1041596415,PL
@@ -7768,11 +8406,11 @@
1041704416,1041704423,FR
1041704424,1041706551,GB
1041706552,1041706559,FR
-1041706560,1041706871,GB
-1041706872,1041706879,FR
-1041706880,1041707007,GB
-1041707008,1041707263,FR
-1041707264,1041709823,GB
+1041706560,1041706751,GB
+1041706752,1041707263,FR
+1041707264,1041708543,GB
+1041708544,1041708799,FR
+1041708800,1041709823,GB
1041709824,1041710079,FR
1041710080,1041710423,GB
1041710424,1041710431,FR
@@ -7782,11 +8420,9 @@
1041711552,1041711559,FR
1041711560,1041712631,GB
1041712632,1041712639,FR
-1041712640,1041713663,GB
-1041713664,1041713919,FR
-1041713920,1041714943,GB
-1041714944,1041715199,FR
-1041715200,1041715567,GB
+1041712640,1041715071,GB
+1041715072,1041715079,FR
+1041715080,1041715567,GB
1041715568,1041715583,FR
1041715584,1041716039,GB
1041716040,1041716047,FR
@@ -7794,29 +8430,27 @@
1041716224,1041716231,FR
1041716232,1041716455,GB
1041716456,1041716463,FR
-1041716464,1041718055,GB
-1041718056,1041718063,FR
-1041718064,1041719223,GB
+1041716464,1041718015,GB
+1041718016,1041718271,FR
+1041718272,1041719223,GB
1041719224,1041719224,FR
1041719225,1041719227,GB
1041719228,1041719228,FR
1041719229,1041719407,GB
1041719408,1041719423,FR
-1041719424,1041719807,GB
-1041719808,1041720063,FR
-1041720064,1041720575,GB
+1041719424,1041720575,GB
1041720576,1041720831,FR
1041720832,1041721599,GB
1041721600,1041721727,FR
1041721728,1041721759,GB
1041721760,1041721775,FR
-1041721776,1041722911,GB
-1041722912,1041722919,FR
-1041722920,1041722951,GB
+1041721776,1041722951,GB
1041722952,1041722959,FR
1041722960,1041723263,GB
1041723264,1041723279,FR
-1041723280,1041729559,GB
+1041723280,1041723775,GB
+1041723776,1041723839,FR
+1041723840,1041729559,GB
1041729560,1041729561,FR
1041729562,1041729564,GB
1041729565,1041729566,FR
@@ -7826,7 +8460,9 @@
1041731072,1041731327,FR
1041731328,1041732031,GB
1041732032,1041732047,FR
-1041732048,1041736675,GB
+1041732048,1041736381,GB
+1041736382,1041736382,FR
+1041736383,1041736675,GB
1041736676,1041736676,FR
1041736677,1041737583,GB
1041737584,1041737591,FR
@@ -7874,7 +8510,9 @@
1042120704,1042153471,PL
1042153472,1042284543,GB
1042284544,1042292735,CH
-1042292736,1042295551,NL
+1042292736,1042294527,NL
+1042294528,1042294783,GB
+1042294784,1042295551,NL
1042295552,1042296575,GE
1042296576,1042300903,NL
1042300904,1042300911,UA
@@ -7896,7 +8534,9 @@
1042840674,1042840674,PT
1042840675,1042841599,GB
1042841600,1042874367,AT
-1042874368,1042879999,NL
+1042874368,1042875135,NL
+1042875136,1042875391,FR
+1042875392,1042879999,NL
1042880000,1042880255,GB
1042880256,1042889983,NL
1042889984,1042890239,GB
@@ -7961,8 +8601,6 @@
1044201472,1044217855,FI
1044217856,1044226047,DK
1044226048,1044234239,OM
-1044260352,1044261119,BE
-1044270080,1044271103,BE
1044283392,1044316159,FR
1044316160,1044332543,NO
1044332544,1044348927,RU
@@ -7974,8 +8612,7 @@
1044414464,1044447231,GB
1044447232,1044453233,SE
1044453234,1044453234,NO
-1044453235,1044455167,SE
-1044455168,1044455423,NO
+1044453235,1044455423,SE
1044455424,1044463615,EE
1044463616,1044479999,SE
1044480000,1044488191,CH
@@ -7997,7 +8634,9 @@
1044668416,1044676607,BA
1044676608,1044684799,RU
1044684800,1044692991,HU
-1044692992,1044698111,AT
+1044692992,1044697087,AT
+1044697088,1044697343,DE
+1044697344,1044698111,AT
1044698112,1044698367,DE
1044698368,1044698623,AT
1044698624,1044699135,DE
@@ -8028,7 +8667,9 @@
1044933500,1044933503,BE
1044933504,1044935439,GB
1044935440,1044935455,BE
-1044935456,1044935759,GB
+1044935456,1044935663,GB
+1044935664,1044935671,BE
+1044935672,1044935759,GB
1044935760,1044935775,BE
1044935776,1044936115,GB
1044936116,1044936119,BE
@@ -8046,9 +8687,13 @@
1045004288,1045020671,GB
1045020672,1045037055,NO
1045037056,1045135359,GR
-1045135360,1045136065,DE
-1045136066,1045136066,UA
-1045136067,1045168127,DE
+1045135360,1045152603,DE
+1045152604,1045152606,SG
+1045152607,1045154629,DE
+1045154630,1045154630,SG
+1045154631,1045159711,DE
+1045159712,1045159712,EG
+1045159713,1045168127,DE
1045168128,1045233663,RU
1045233664,1045241855,GB
1045241856,1045250047,IT
@@ -8117,8 +8762,8 @@
1046323200,1046331391,ES
1046347776,1046413311,IT
1046413312,1046446079,SE
-1046446080,1046478847,DE
-1046478848,1046479839,GB
+1046446080,1046478879,DE
+1046478880,1046479839,GB
1046479840,1046479871,DE
1046479872,1046480511,GB
1046480512,1046480543,DE
@@ -8132,9 +8777,21 @@
1046485304,1046485311,DE
1046485312,1046485903,GB
1046485904,1046485911,DE
-1046485912,1046489087,GB
-1046489088,1046489103,DE
-1046489104,1046492471,GB
+1046485912,1046487289,GB
+1046487290,1046487290,DE
+1046487291,1046487551,GB
+1046487552,1046487807,DE
+1046487808,1046488319,GB
+1046488320,1046488575,DE
+1046488576,1046489087,GB
+1046489088,1046489119,DE
+1046489120,1046489391,GB
+1046489392,1046489407,IT
+1046489408,1046489471,GB
+1046489472,1046489487,ES
+1046489488,1046489503,GB
+1046489504,1046489519,DE
+1046489520,1046492471,GB
1046492472,1046492479,DE
1046492480,1046492719,GB
1046492720,1046492727,DE
@@ -8148,9 +8805,9 @@
1046493984,1046493999,DE
1046494000,1046494191,GB
1046494192,1046494199,DE
-1046494200,1046494975,GB
-1046494976,1046495231,DE
-1046495232,1046495415,GB
+1046494200,1046495127,GB
+1046495128,1046495135,DE
+1046495136,1046495415,GB
1046495416,1046495423,DE
1046495424,1046495607,GB
1046495608,1046495615,DE
@@ -8180,11 +8837,13 @@
1046504448,1046508543,DE
1046508544,1046511615,GB
1046511616,1046515711,DE
-1046515712,1046525351,GB
-1046525352,1046525359,DE
-1046525360,1046525439,GB
-1046525440,1046525695,DE
-1046525696,1046531839,GB
+1046515712,1046519615,GB
+1046519616,1046519623,AT
+1046519624,1046525183,GB
+1046525184,1046525695,DE
+1046525696,1046529023,GB
+1046529024,1046530047,DE
+1046530048,1046531839,GB
1046531840,1046532095,DE
1046532096,1046533375,GB
1046533376,1046533383,DE
@@ -8196,7 +8855,9 @@
1046537024,1046537039,DE
1046537040,1046538751,GB
1046538752,1046539007,DE
-1046539008,1046543343,GB
+1046539008,1046543209,GB
+1046543210,1046543210,DE
+1046543211,1046543343,GB
1046543344,1046543359,DE
1046543360,1046544383,GB
1046544384,1046560767,IT
@@ -8244,9 +8905,9 @@
1047314432,1047322623,SE
1047322624,1047330815,IT
1047330816,1047339007,RU
-1047339008,1047343871,SE
-1047343872,1047344127,NO
-1047344128,1047347199,SE
+1047339008,1047346175,SE
+1047346176,1047346431,FI
+1047346432,1047347199,SE
1047347200,1047363583,DE
1047363584,1047371775,CZ
1047371776,1047373559,RU
@@ -8270,6 +8931,7 @@
1047642112,1047658495,DE
1047658496,1047724031,EG
1047728128,1047732223,SE
+1047787520,1047787775,ES
1047789568,1047822335,AT
1047822336,1047838719,DE
1047838720,1047846911,DK
@@ -8279,11 +8941,7 @@
1047871488,1047887871,RU
1047887872,1047920639,ES
1047920640,1047986175,RU
-1047986176,1048006655,SE
-1048006656,1048006744,DK
-1048006745,1048006872,SE
-1048006873,1048006911,DK
-1048006912,1048051711,SE
+1047986176,1048051711,SE
1048051712,1048117247,SA
1048117248,1048125439,GB
1048125440,1048133631,FI
@@ -8319,7 +8977,9 @@
1048576000,1048584191,DE
1048584192,1048592383,IL
1048592384,1048600575,IT
-1048600576,1048608767,UA
+1048600576,1048603391,UA
+1048603392,1048603647,LV
+1048603648,1048608767,UA
1048608768,1048616959,GB
1048616960,1048617215,DE
1048617216,1048618751,KE
@@ -8342,12 +9002,11 @@
1048936448,1048944639,PL
1048944640,1048952831,RU
1048952832,1048969215,NL
+1048979712,1048980223,DE
1049006080,1049006335,DE
1049008128,1049009151,DE
1049016320,1049018367,DE
-1049018624,1049021439,DE
-1049021440,1049021695,GB
-1049021696,1049022463,DE
+1049018624,1049022463,DE
1049026816,1049029375,DE
1049030656,1049031679,DE
1049031744,1049031871,DE
@@ -8379,9 +9038,7 @@
1049709824,1049710079,NL
1049710080,1049710335,GB
1049710336,1049710591,NL
-1049710592,1049714687,GB
-1049714688,1049715711,IR
-1049715712,1049716735,GB
+1049710592,1049716735,GB
1049716736,1049717759,IQ
1049717760,1049722879,GB
1049722880,1049731071,IS
@@ -8466,7 +9123,9 @@
1051795456,1051803647,RU
1051803648,1051820031,CZ
1051820032,1051852799,NL
-1051852800,1051919359,AT
+1051852800,1051918335,AT
+1051918336,1051918591,PL
+1051918592,1051919359,AT
1051919360,1051920383,PL
1051920384,1051920895,AT
1051920896,1051921919,PL
@@ -8481,7 +9140,8 @@
1052001280,1052002303,DE
1052003584,1052003839,DE
1052011264,1052012031,DE
-1052017536,1052017567,DE
+1052017536,1052017663,DE
+1052019712,1052019967,GB
1052045312,1052046079,DE
1052049408,1052057599,PL
1052057600,1052065791,RU
@@ -8507,7 +9167,9 @@
1052151808,1052153855,PL
1052153856,1052157951,UA
1052157952,1052159999,DK
-1052160000,1052162047,LU
+1052160000,1052160703,LU
+1052160704,1052161215,BE
+1052161216,1052162047,LU
1052162048,1052164095,CH
1052164096,1052168191,RU
1052168192,1052170239,PL
@@ -8556,10 +9218,8 @@
1052488704,1052489727,GB
1052494336,1052494591,NL
1052498432,1052498463,RO
-1052508160,1052667903,GB
-1052667904,1052668159,US
-1052668160,1052706815,GB
-1052706816,1052712959,NL
+1052508160,1052704767,GB
+1052704768,1052712959,NL
1052712960,1052770303,GB
1052770304,1052778495,CH
1052778496,1052786687,RU
@@ -8585,10 +9245,9 @@
1053147136,1053163519,SK
1053163520,1053294591,DK
1053295616,1053296639,AT
-1053299712,1053299967,GB
1053307904,1053308159,GB
1053313280,1053313535,GB
-1053316608,1053316863,GB
+1053316688,1053316695,GB
1053320224,1053320239,DE
1053327616,1053327871,ZA
1053329440,1053329471,ES
@@ -8686,6 +9345,7 @@
1053868008,1053868015,DE
1053868032,1053868447,ES
1053868448,1053868455,GB
+1053868456,1053868463,ES
1053868480,1053868543,FR
1053868800,1053869567,DE
1053870080,1053870335,DE
@@ -8719,7 +9379,9 @@
1054015488,1054089215,IT
1054089216,1054097407,GE
1054097408,1054105599,NL
-1054105600,1054113791,FR
+1054105600,1054107135,FR
+1054107136,1054107391,GB
+1054107392,1054113791,FR
1054113792,1054121983,NL
1054121984,1054130175,AT
1054130176,1054138367,LT
@@ -8736,21 +9398,18 @@
1054186241,1054186495,GB
1054186496,1054187264,DE
1054187265,1054187519,GB
-1054187520,1054195711,BG
+1054187520,1054192639,FR
+1054192640,1054192895,BG
+1054192896,1054195455,FR
+1054195456,1054195711,BG
1054195712,1054212095,BE
1054212096,1054277631,DE
-1054277632,1054328063,KW
-1054328064,1054328075,GB
-1054328076,1054328076,KW
-1054328077,1054328319,GB
-1054328320,1054343167,KW
+1054277632,1054343167,KW
1054343168,1054351359,NL
1054351360,1054359551,UA
1054359552,1054367743,RO
1054367744,1054375935,FI
-1054375936,1054381567,GB
-1054381568,1054381823,US
-1054381824,1054384127,GB
+1054375936,1054384127,GB
1054384128,1054400511,DE
1054400512,1054408703,GB
1054408704,1054416895,FR
@@ -8800,9 +9459,7 @@
1054711808,1054719999,IT
1054720000,1054867455,NL
1054867456,1055129599,DE
-1055129600,1055164415,CY
-1055164416,1055164671,GB
-1055164672,1055195135,CY
+1055129600,1055195135,CY
1055195136,1055203327,CH
1055211520,1055219711,PT
1055219712,1055223807,NL
@@ -8867,23 +9524,71 @@
1056875008,1056875663,GB
1056875664,1056875671,IE
1056875672,1056964607,GB
-1056964608,1061558271,US
+1056964608,1061227263,US
+1061227264,1061227519,BO
+1061227520,1061558271,US
1061558272,1061559295,PK
-1061559296,1062069247,US
+1061559296,1061588735,US
+1061588736,1061588991,GU
+1061588992,1061853695,US
+1061853696,1061854207,GB
+1061854208,1061939711,US
+1061939712,1061940223,JM
+1061940224,1061987839,US
+1061987840,1061988095,CA
+1061988096,1062069247,US
1062069248,1062070271,PR
-1062070272,1062473731,US
+1062070272,1062219519,US
+1062219520,1062219775,IN
+1062219776,1062262783,US
+1062262784,1062263039,PH
+1062263040,1062473731,US
1062473732,1062473732,IN
-1062473733,1062530047,US
+1062473733,1062486271,US
+1062486272,1062486527,MX
+1062486528,1062530047,US
1062530048,1062531071,EC
-1062531072,1063053311,US
-1063053312,1063053375,CA
-1063053376,1063057432,US
+1062531072,1062545919,US
+1062545920,1062546431,BM
+1062546432,1062597375,US
+1062597376,1062597631,PR
+1062597632,1062871551,US
+1062871552,1062872063,PR
+1062872064,1063057432,US
1063057433,1063057433,CA
-1063057434,1063727615,US
+1063057434,1063305727,US
+1063305728,1063305983,CA
+1063305984,1063568895,US
+1063568896,1063569151,TZ
+1063569152,1063727615,US
1063727616,1063728127,GU
-1063728128,1063895039,US
+1063728128,1063748607,US
+1063748608,1063749119,GH
+1063749120,1063749631,US
+1063749632,1063749887,LR
+1063749888,1063750143,SA
+1063750144,1063750399,NG
+1063750400,1063750655,US
+1063750656,1063751679,NG
+1063751680,1063895039,US
1063895040,1063899135,KR
-1063899136,1065530879,US
+1063899136,1064124927,US
+1064124928,1064125695,EC
+1064125696,1064125951,US
+1064125952,1064126207,PE
+1064126208,1064126719,US
+1064126720,1064126975,EC
+1064126976,1064127487,US
+1064127488,1064127999,EC
+1064128000,1064171263,US
+1064171264,1064171519,NG
+1064171520,1064204287,US
+1064204288,1064205311,MX
+1064205312,1064221951,US
+1064221952,1064222207,MX
+1064222208,1064445183,US
+1064445184,1064445439,PK
+1064445440,1065530879,US
1065530880,1065533439,TC
1065533440,1065537535,US
1065537536,1065541631,TC
@@ -8900,30 +9605,74 @@
1065906176,1065908223,KY
1065908224,1066311679,US
1066311680,1066315775,CA
-1066315776,1066332159,US
-1066332160,1066336255,CA
+1066315776,1066333183,US
+1066333184,1066336255,CA
1066336256,1066352639,US
1066352640,1066354943,JM
1066354944,1066355199,BB
-1066355200,1066369023,JM
-1066369024,1067575295,US
+1066355200,1066355711,JM
+1066355712,1066355967,BB
+1066355968,1066369023,JM
+1066369024,1067238143,US
+1067238144,1067238399,JP
+1067238400,1067481855,US
+1067481856,1067482111,CA
+1067482112,1067532287,US
+1067532288,1067532799,HN
+1067532800,1067575295,US
1067575296,1067577343,HN
-1067577344,1067736831,US
+1067577344,1067617791,US
+1067617792,1067618047,CN
+1067618048,1067693055,US
+1067693056,1067693567,CO
+1067693568,1067726847,US
+1067726848,1067727359,EC
+1067727360,1067736831,US
1067736832,1067737087,PR
1067737088,1067740159,US
1067740160,1067741183,HN
-1067741184,1068199935,US
+1067741184,1067780607,US
+1067780608,1067780863,GB
+1067780864,1067824895,US
+1067824896,1067825151,PR
+1067825152,1067989247,US
+1067989248,1067989503,EC
+1067989504,1067998463,US
+1067998464,1067998719,CO
+1067998720,1068004351,US
+1068004352,1068004607,CA
+1068004608,1068017663,US
+1068017664,1068018175,YE
+1068018176,1068123135,US
+1068123136,1068123391,BB
+1068123392,1068175871,US
+1068175872,1068176383,YE
+1068176384,1068199935,US
1068199936,1068204031,CA
-1068204032,1068419071,US
+1068204032,1068230655,US
+1068230656,1068230911,CO
+1068230912,1068326911,US
+1068326912,1068327167,EC
+1068327168,1068346367,US
+1068346368,1068346879,YE
+1068346880,1068419071,US
1068419072,1068421119,CO
-1068421120,1068473343,US
+1068421120,1068425983,US
+1068425984,1068426239,EC
+1068426240,1068473343,US
1068473344,1068474367,BB
-1068474368,1069622866,US
+1068474368,1068481023,US
+1068481024,1068481535,PR
+1068481536,1068491263,US
+1068491264,1068491519,HN
+1068491520,1069622866,US
1069622867,1069622867,MX
1069622868,1070701055,US
1070701056,1070701311,DO
1070701312,1070701567,HT
-1070701568,1071100927,US
+1070701568,1070729471,US
+1070729472,1070729727,CA
+1070729728,1071100927,US
1071100928,1071101951,PR
1071101952,1071134719,US
1071134720,1071136767,HK
@@ -8940,24 +9689,16 @@
1071163392,1071165439,HK
1071165440,1071169535,US
1071169536,1071171583,TW
-1071171584,1071196159,US
-1071196160,1071198207,HK
-1071198208,1071199231,JP
-1071199232,1071201279,US
-1071201280,1071202303,TH
-1071202304,1071204351,US
-1071204352,1071205375,HK
-1071205376,1071206399,US
-1071206400,1071208447,HK
-1071208448,1071210495,TW
-1071210496,1071216639,US
-1071216640,1071217663,AU
-1071217664,1071251711,US
+1071171584,1071206911,US
+1071206912,1071207167,HK
+1071207168,1071251711,US
1071251712,1071252479,HK
1071252480,1071254783,US
1071254784,1071255039,GB
1071255040,1071255295,US
-1071255296,1071255551,LB
+1071255296,1071255525,LB
+1071255526,1071255526,DE
+1071255527,1071255551,LB
1071255552,1071256319,US
1071256320,1071256575,HK
1071256576,1071258879,US
@@ -9065,61 +9806,98 @@
1071487712,1071489023,HK
1071489024,1071517695,US
1071517696,1071519743,HK
-1071519744,1071579391,US
+1071519744,1071522817,US
+1071522818,1071522818,MW
+1071522819,1071579391,US
1071579392,1071579647,CA
1071579648,1071954303,US
1071954304,1071954319,GB
-1071954320,1072922623,US
-1072922624,1072923391,CA
-1072923392,1072923647,US
-1072923648,1072932863,CA
-1072932864,1072933119,US
-1072933120,1072933247,CA
-1072933248,1072933375,US
-1072933376,1072934775,CA
+1071954320,1072157631,US
+1072157632,1072157663,DE
+1072157664,1072228863,US
+1072228864,1072229375,CA
+1072229376,1072360703,US
+1072360704,1072360959,HK
+1072360960,1072707327,US
+1072707328,1072707583,IN
+1072707584,1072923135,US
+1072923136,1072923391,CA
+1072923392,1072924159,US
+1072924160,1072924671,HT
+1072924672,1072925183,US
+1072925184,1072925695,GB
+1072925696,1072926207,CA
+1072926208,1072926463,US
+1072926464,1072926719,CA
+1072926720,1072926975,PH
+1072926976,1072927487,CA
+1072927488,1072927743,US
+1072927744,1072927999,CA
+1072928000,1072928511,US
+1072928512,1072928767,CA
+1072928768,1072929023,US
+1072929024,1072929535,CA
+1072929536,1072930303,US
+1072930304,1072931071,CA
+1072931072,1072931327,US
+1072931328,1072931583,CA
+1072931584,1072931839,SY
+1072931840,1072932607,CA
+1072932608,1072932863,NG
+1072932864,1072933887,US
+1072933888,1072934399,CA
+1072934400,1072934775,US
1072934776,1072934783,FR
-1072934784,1072936447,CA
+1072934784,1072935423,US
+1072935424,1072935679,CA
+1072935680,1072936191,US
+1072936192,1072936447,CA
1072936448,1072936703,PH
-1072936704,1072939263,CA
-1072939264,1072939311,US
-1072939312,1072940031,CA
-1072940032,1072940063,US
-1072940064,1072942079,CA
-1072942080,1072942111,US
-1072942112,1072942591,CA
-1072942592,1072943103,US
-1072943104,1072951551,CA
-1072951552,1072951807,US
-1072951808,1072953439,CA
-1072953440,1072953443,US
-1072953444,1072953455,CA
-1072953456,1072953471,US
-1072953472,1072955391,CA
-1072955392,1073022975,US
-1073022976,1073025023,HN
-1073025024,1073026303,US
+1072936704,1072937215,US
+1072937216,1072937471,IR
+1072937472,1072937727,US
+1072937728,1072938239,CA
+1072938240,1072938495,VG
+1072938496,1072939007,US
+1072939008,1072939263,CA
+1072939264,1072941055,US
+1072941056,1072942079,CA
+1072942080,1072943103,US
+1072943104,1072945151,CA
+1072945152,1073022975,US
+1073022976,1073025791,HN
+1073025792,1073026047,NI
+1073026048,1073026303,US
1073026304,1073026559,DO
1073026560,1073027071,PR
-1073027072,1073028095,NI
-1073028096,1073028607,US
+1073027072,1073028351,NI
+1073028352,1073028607,US
1073028608,1073029119,GD
1073029120,1073031167,PR
-1073031168,1073033215,US
-1073033216,1073035263,CW
+1073031168,1073031423,US
+1073031424,1073031679,CW
+1073031680,1073033215,US
+1073033216,1073034239,CW
+1073034240,1073034495,BB
+1073034496,1073035263,CW
1073035264,1073036032,GD
-1073036033,1073037823,US
+1073036033,1073036543,US
+1073036544,1073037055,MX
+1073037056,1073037311,CW
+1073037312,1073037823,CO
1073037824,1073038335,GD
1073038336,1073039359,US
1073039360,1073041407,GT
-1073041408,1073042431,CO
-1073042432,1073044735,US
+1073041408,1073043455,CO
+1073043456,1073043967,PR
+1073043968,1073044735,US
1073044736,1073044991,PR
1073044992,1073045247,US
1073045248,1073045503,PR
1073045504,1073047551,CO
1073047552,1073049599,US
-1073049600,1073053695,BS
-1073053696,1073075460,US
+1073049600,1073052671,BS
+1073052672,1073075460,US
1073075461,1073075716,NL
1073075717,1073373183,US
1073373184,1073381375,CA
@@ -9128,19 +9906,121 @@
1073454848,1074020351,US
1074020352,1074028543,CA
1074028544,1074118655,US
-1074118656,1074135039,CA
+1074118656,1074120959,CA
+1074120960,1074121215,US
+1074121216,1074125055,CA
+1074125056,1074125311,US
+1074125312,1074126847,CA
+1074126848,1074127359,US
+1074127360,1074130943,CA
+1074130944,1074131199,US
+1074131200,1074135039,CA
1074135040,1074184191,US
1074184192,1074188287,CA
-1074188288,1074229247,US
-1074229248,1074241535,CA
-1074241536,1074412543,US
-1074412544,1074412799,CA
-1074412800,1074733055,US
+1074188288,1074233343,US
+1074233344,1074241535,CA
+1074241536,1074397439,US
+1074397440,1074398975,CA
+1074398976,1074399231,US
+1074399232,1074406655,CA
+1074406656,1074407167,US
+1074407168,1074408191,CA
+1074408192,1074408447,US
+1074408448,1074409471,CA
+1074409472,1074409727,US
+1074409728,1074410495,CA
+1074410496,1074411007,US
+1074411008,1074413567,CA
+1074413568,1074413823,US
+1074413824,1074417407,CA
+1074417408,1074418431,US
+1074418432,1074419967,CA
+1074419968,1074420223,US
+1074420224,1074421247,CA
+1074421248,1074421503,US
+1074421504,1074426623,CA
+1074426624,1074427135,US
+1074427136,1074428671,CA
+1074428672,1074428927,US
+1074428928,1074430207,CA
+1074430208,1074430463,US
+1074430464,1074433535,CA
+1074433536,1074433791,US
+1074433792,1074437119,CA
+1074437120,1074437375,US
+1074437376,1074438911,CA
+1074438912,1074439167,US
+1074439168,1074441727,CA
+1074441728,1074441983,US
+1074441984,1074444031,CA
+1074444032,1074444287,US
+1074444288,1074445311,CA
+1074445312,1074445567,US
+1074445568,1074446079,CA
+1074446080,1074446335,US
+1074446336,1074453247,CA
+1074453248,1074453503,US
+1074453504,1074455039,CA
+1074455040,1074455295,US
+1074455296,1074456319,CA
+1074456320,1074456575,US
+1074456576,1074459135,CA
+1074459136,1074459391,US
+1074459392,1074462207,CA
+1074462208,1074463743,US
+1074463744,1074465535,CA
+1074465536,1074465791,US
+1074465792,1074466815,CA
+1074466816,1074467071,US
+1074467072,1074469887,CA
+1074469888,1074470143,US
+1074470144,1074472191,CA
+1074472192,1074472447,US
+1074472448,1074474751,CA
+1074474752,1074475263,US
+1074475264,1074479871,CA
+1074479872,1074480127,US
+1074480128,1074482175,CA
+1074482176,1074482431,US
+1074482432,1074484479,CA
+1074484480,1074484735,US
+1074484736,1074488319,CA
+1074488320,1074488831,US
+1074488832,1074493695,CA
+1074493696,1074494207,US
+1074494208,1074494719,CA
+1074494720,1074495743,US
+1074495744,1074497023,CA
+1074497024,1074497279,US
+1074497280,1074498815,CA
+1074498816,1074499071,US
+1074499072,1074501375,CA
+1074501376,1074501631,US
+1074501632,1074503935,CA
+1074503936,1074504191,US
+1074504192,1074505215,CA
+1074505216,1074505471,US
+1074505472,1074508031,CA
+1074508032,1074508287,US
+1074508288,1074509823,CA
+1074509824,1074510079,US
+1074510080,1074513151,CA
+1074513152,1074703615,US
+1074703616,1074703871,GB
+1074703872,1074704383,US
+1074704384,1074704639,GB
+1074704640,1074707967,US
+1074707968,1074708223,GB
+1074708224,1074708991,US
+1074708992,1074709247,PH
+1074709248,1074733055,US
1074733056,1074737151,AU
1074737152,1074745343,CA
1074745344,1074757631,US
1074757632,1074765823,CA
-1074765824,1074871591,US
+1074765824,1074777343,US
+1074777344,1074777599,AU
+1074777600,1074871591,US
1074871592,1074871599,CA
1074871600,1074871807,US
1074871808,1074872319,CA
@@ -9156,21 +10036,18 @@
1075265536,1075269631,KR
1075269632,1075384319,US
1075385600,1075386111,US
+1075387136,1075387391,US
1075388416,1075421183,US
1075421184,1075429375,CA
1075429376,1075478527,US
1075478528,1075494911,CA
-1075494912,1075497983,US
-1075497984,1075498239,IN
-1075498240,1075558143,US
+1075494912,1075558143,US
1075558144,1075558911,VI
1075558912,1075576831,US
-1075576832,1075579909,GB
-1075579910,1075579910,NO
-1075579911,1075580415,GB
-1075580416,1075580671,NO
-1075580672,1075580927,GB
-1075580928,1075585023,NO
+1075576832,1075577087,GB
+1075577088,1075579391,NO
+1075579392,1075579903,GB
+1075579904,1075585023,NO
1075585024,1075609599,US
1075609600,1075613695,TT
1075613696,1075769343,US
@@ -9179,63 +10056,137 @@
1075855360,1075871743,DO
1075871744,1075970047,US
1075970048,1075972095,CA
-1075972096,1075976127,US
+1075972096,1075972351,GB
+1075972352,1075973887,US
+1075973888,1075974143,CA
+1075974144,1075975167,US
+1075975168,1075975679,CA
+1075975680,1075976127,US
1075976128,1075976159,CA
-1075976160,1075976959,US
-1075976960,1075977215,CA
-1075977216,1075987711,US
-1075987712,1075988223,CA
+1075976160,1075976191,US
+1075976192,1075976447,CA
+1075976448,1075976959,US
+1075976960,1075978239,CA
+1075978240,1075982335,US
+1075982336,1075982591,CA
+1075982592,1075982847,US
+1075982848,1075983103,CA
+1075983104,1075983359,US
+1075983360,1075984383,CA
+1075984384,1075985919,US
+1075985920,1075987455,CA
+1075987456,1075987967,US
+1075987968,1075988223,CA
1075988224,1075988319,US
1075988320,1075988351,CA
1075988352,1075988479,US
-1075988480,1075988735,CA
-1075988736,1075989231,US
+1075988480,1075988991,CA
+1075988992,1075989231,US
1075989232,1075989239,CA
-1075989240,1075989247,US
-1075989248,1075989503,CA
-1075989504,1075994623,US
+1075989240,1075989503,US
+1075989504,1075989759,CA
+1075989760,1075990015,US
+1075990016,1075990527,CA
+1075990528,1075994623,US
1075994624,1075995007,CA
1075995008,1075995103,US
1075995104,1075995135,CA
-1075995136,1075996159,US
-1075996160,1075996415,CA
-1075996416,1075998207,US
+1075995136,1075995647,US
+1075995648,1075996671,CA
+1075996672,1075997183,US
+1075997184,1075997439,CA
+1075997440,1075998207,US
1075998208,1075998271,CA
1075998272,1075998463,US
-1075998464,1075998719,CA
-1075998720,1076000767,US
+1075998464,1075999231,CA
+1075999232,1075999999,US
+1076000000,1076000255,CA
+1076000256,1076000767,US
1076000768,1076002047,CA
-1076002048,1076004095,US
-1076004096,1076004351,CA
-1076004352,1076005311,US
+1076002048,1076003071,US
+1076003072,1076003327,CA
+1076003328,1076003583,US
+1076003584,1076004351,CA
+1076004352,1076004863,US
+1076004864,1076005119,CA
+1076005120,1076005311,US
1076005312,1076005319,CA
-1076005320,1076007423,US
-1076007424,1076007679,CA
-1076007680,1076008447,US
-1076008448,1076008703,CA
-1076008704,1076009727,US
+1076005320,1076005375,US
+1076005376,1076005631,CA
+1076005632,1076006399,US
+1076006400,1076006655,CA
+1076006656,1076006911,US
+1076006912,1076007167,CA
+1076007168,1076007423,US
+1076007424,1076007935,CA
+1076007936,1076008447,US
+1076008448,1076009215,CA
+1076009216,1076009727,US
1076009728,1076009983,CA
-1076009984,1076029951,US
-1076029952,1076030207,CA
-1076030208,1076035519,US
+1076009984,1076026623,US
+1076026624,1076026879,CA
+1076026880,1076028159,US
+1076028160,1076028415,CA
+1076028416,1076028927,US
+1076028928,1076029183,BZ
+1076029184,1076029439,US
+1076029440,1076030207,CA
+1076030208,1076031743,US
+1076031744,1076031999,CA
+1076032000,1076032255,US
+1076032256,1076032511,CA
+1076032512,1076035519,US
1076035520,1076035583,IN
-1076035584,1076174847,US
+1076035584,1076049151,US
+1076049152,1076049407,DE
+1076049408,1076049919,US
+1076049920,1076050175,IL
+1076050176,1076174847,US
1076174848,1076178943,BM
-1076178944,1076233177,US
+1076178944,1076183807,US
+1076183808,1076184063,CA
+1076184064,1076193279,US
+1076193280,1076193535,PK
+1076193536,1076194559,US
+1076194560,1076194815,CA
+1076194816,1076195071,US
+1076195072,1076195327,IN
+1076195328,1076196095,US
+1076196096,1076196351,CA
+1076196352,1076197119,US
+1076197120,1076197375,CA
+1076197376,1076198655,US
+1076198656,1076198911,AE
+1076198912,1076233177,US
1076233178,1076233178,TC
-1076233179,1076338687,US
+1076233179,1076283903,US
+1076283904,1076284159,NO
+1076284160,1076307967,US
+1076307968,1076308223,DE
+1076308224,1076310015,US
+1076310016,1076310271,DE
+1076310272,1076338687,US
1076338688,1076346879,CA
1076346880,1076387839,US
-1076387840,1076396031,CA
+1076387840,1076393727,CA
+1076393728,1076394239,US
+1076394240,1076396031,CA
1076396032,1076408319,US
1076408320,1076412415,CA
1076412416,1076424703,US
1076424704,1076428799,CA
1076428800,1076543487,US
1076543488,1076559871,CA
-1076559872,1076756479,US
+1076559872,1076628991,US
+1076628992,1076629247,VI
+1076629248,1076756479,US
1076756480,1076772863,CA
-1076772864,1077055487,US
+1076772864,1076850687,US
+1076850688,1076850943,CA
+1076850944,1076880383,US
+1076880384,1076880639,CH
+1076880640,1076880895,GB
+1076880896,1077055487,US
1077055488,1077059583,CA
1077059584,1077444607,US
1077444608,1077452799,CA
@@ -9244,9 +10195,23 @@
1077469184,1077477375,CA
1077477376,1077506047,US
1077506048,1077510143,LS
-1077510144,1077641215,US
+1077510144,1077512191,US
+1077512192,1077513983,SE
+1077513984,1077641215,US
1077641216,1077657599,CA
-1077657600,1077977087,US
+1077657600,1077841151,US
+1077841152,1077841407,GB
+1077841408,1077848575,US
+1077848576,1077848831,GR
+1077848832,1077852671,US
+1077852672,1077852927,CA
+1077852928,1077857279,US
+1077857280,1077857535,CA
+1077857536,1077865983,US
+1077865984,1077866239,CA
+1077866240,1077870335,US
+1077870336,1077870591,CN
+1077870592,1077977087,US
1077977088,1077985279,CA
1077985280,1077993471,US
1077993472,1078001663,CA
@@ -9271,8 +10236,8 @@
1078281600,1078281663,CA
1078281664,1078281727,US
1078281728,1078281735,CA
-1078281736,1078283007,US
-1078283008,1078283015,CA
+1078281736,1078282239,US
+1078282240,1078283015,CA
1078283016,1078284031,US
1078284032,1078284159,CA
1078284160,1078284479,US
@@ -9285,40 +10250,55 @@
1078284864,1078284991,CA
1078284992,1078285151,US
1078285152,1078285167,CA
-1078285168,1078286351,US
+1078285168,1078285311,US
+1078285312,1078285567,CA
+1078285568,1078286351,US
1078286352,1078286367,CA
1078286368,1078287231,US
1078287232,1078287239,CA
-1078287240,1078287807,US
+1078287240,1078287359,US
+1078287360,1078287615,CA
+1078287616,1078287807,US
1078287808,1078287839,CA
1078287840,1078287871,US
-1078287872,1078288127,CA
-1078288128,1078306559,US
+1078287872,1078288383,CA
+1078288384,1078306559,US
1078306560,1078306815,GB
1078306816,1078312260,US
1078312261,1078312261,GB
-1078312262,1078413311,US
-1078415360,1078455551,US
+1078312262,1078349311,US
+1078349312,1078349823,PH
+1078349824,1078413311,US
+1078415360,1078429695,US
+1078429696,1078429951,GR
+1078429952,1078438399,US
+1078438400,1078438655,CA
+1078438656,1078438911,US
+1078438912,1078438929,CN
+1078438930,1078438930,US
+1078438931,1078439167,CN
+1078439168,1078439679,US
+1078439680,1078439935,NL
+1078439936,1078455551,US
1078455552,1078455807,NL
1078455808,1078456319,US
1078456320,1078460415,CA
-1078460416,1078517759,US
+1078460416,1078504959,US
+1078504960,1078505471,CA
+1078505472,1078517759,US
1078517760,1078525951,CA
-1078525952,1078722559,US
+1078525952,1078575359,US
+1078575360,1078575615,CA
+1078575616,1078621695,US
+1078621696,1078621951,IN
+1078621952,1078722559,US
1078722560,1078734847,AR
-1078734848,1078736895,CO
-1078736896,1078737535,US
-1078737536,1078737567,CO
-1078737568,1078737919,US
+1078734848,1078737919,CO
1078737920,1078738943,EC
-1078738944,1078738967,US
-1078738968,1078738975,VE
-1078738976,1078739199,US
-1078739200,1078739455,VE
+1078738944,1078739455,VE
1078739456,1078739967,US
1078739968,1078743039,PE
-1078743040,1078744063,US
-1078744064,1078746111,CO
+1078743040,1078746111,CO
1078746112,1078747135,PE
1078747136,1078749183,CL
1078749184,1078751231,PE
@@ -9333,54 +10313,137 @@
1078773760,1078775807,PE
1078775808,1078777855,CO
1078777856,1078780927,EC
-1078780928,1079320575,US
+1078780928,1078782463,US
+1078782464,1078782719,PA
+1078782720,1078895103,US
+1078895104,1078895359,CN
+1078895360,1078945023,US
+1078945024,1078945279,GB
+1078945280,1078956799,US
+1078956800,1078957055,GB
+1078957056,1079320575,US
1079320576,1079322831,CA
1079322832,1079322839,US
1079322840,1079327616,CA
1079327617,1079327617,US
1079327618,1079328767,CA
1079328768,1079377919,US
-1079377920,1079380927,CA
+1079377920,1079378943,CA
+1079378944,1079379199,US
+1079379200,1079379455,CA
+1079379456,1079379711,US
+1079379712,1079380927,CA
1079380928,1079380991,US
-1079380992,1079385471,CA
+1079380992,1079381759,CA
+1079381760,1079382271,US
+1079382272,1079382527,CA
+1079382528,1079383039,US
+1079383040,1079383295,VG
+1079383296,1079383551,CA
+1079383552,1079383807,US
+1079383808,1079384063,MH
+1079384064,1079384319,LR
+1079384320,1079384575,CA
+1079384576,1079385087,ZW
+1079385088,1079385343,US
+1079385344,1079385471,CA
1079385472,1079385479,US
-1079385480,1079394303,CA
+1079385480,1079386623,CA
+1079386624,1079386879,SG
+1079386880,1079387135,EG
+1079387136,1079387903,US
+1079387904,1079388159,PH
+1079388160,1079389695,CA
+1079389696,1079389951,US
+1079389952,1079390719,CA
+1079390720,1079391487,US
+1079391488,1079391743,CA
+1079391744,1079392255,HT
+1079392256,1079393791,CA
+1079393792,1079394047,US
+1079394048,1079394303,CA
1079394304,1079395327,EC
-1079395328,1079396351,CA
+1079395328,1079396095,US
+1079396096,1079396351,CA
1079396352,1079397375,MP
1079397376,1079397631,MH
-1079397632,1079399935,CA
+1079397632,1079397887,CA
+1079397888,1079398399,US
+1079398400,1079399935,CA
1079399936,1079400447,US
-1079400448,1079403775,CA
+1079400448,1079401215,CA
+1079401216,1079401471,US
+1079401472,1079403263,CA
+1079403264,1079403519,US
+1079403520,1079403775,CA
1079403776,1079403807,US
1079403808,1079403903,CA
1079403904,1079403935,US
1079403936,1079403999,CA
1079404000,1079404031,US
-1079404032,1079404799,CA
-1079404800,1079405055,US
+1079404032,1079404543,CA
+1079404544,1079404799,US
+1079404800,1079404959,CA
+1079404960,1079404991,US
+1079404992,1079405023,CA
+1079405024,1079405055,US
1079405056,1079405439,CA
1079405440,1079405567,US
1079405568,1079407103,CA
1079407104,1079407359,US
-1079407360,1079411711,CA
+1079407360,1079407615,CA
+1079407616,1079408127,US
+1079408128,1079408639,CA
+1079408640,1079408895,US
+1079408896,1079409407,PK
+1079409408,1079409919,US
+1079409920,1079410687,CA
+1079410688,1079410943,US
+1079410944,1079411199,CA
+1079411200,1079411455,US
+1079411456,1079411711,PK
1079411712,1079411743,US
-1079411744,1079413311,CA
+1079411744,1079412735,CA
+1079412736,1079413247,US
+1079413248,1079413311,CA
1079413312,1079413343,US
-1079413344,1079415295,CA
-1079415296,1079415807,US
-1079415808,1079429263,CA
-1079429264,1079429267,US
-1079429268,1079429375,CA
+1079413344,1079414271,CA
+1079414272,1079415039,US
+1079415040,1079415295,HN
+1079415296,1079415871,US
+1079415872,1079415879,CA
+1079415880,1079415887,US
+1079415888,1079421951,CA
+1079421952,1079422207,US
+1079422208,1079425023,CA
+1079425024,1079425279,US
+1079425280,1079427583,CA
+1079427584,1079428095,PW
+1079428096,1079429263,CA
+1079429264,1079429271,US
+1079429272,1079429279,CA
+1079429280,1079429295,US
+1079429296,1079429375,CA
1079429376,1079429631,US
-1079429632,1079433215,CA
+1079429632,1079431679,CA
+1079431680,1079432191,ZM
+1079432192,1079432703,CA
+1079432704,1079432959,US
+1079432960,1079433215,CA
1079433216,1079435263,CR
-1079435264,1079437311,CA
+1079435264,1079435775,CO
+1079435776,1079437311,CA
1079437312,1079439359,US
-1079439360,1079443455,CA
+1079439360,1079442431,CA
+1079442432,1079442687,US
+1079442688,1079443455,CA
1079443456,1079459839,US
1079459840,1079508991,CA
-1079508992,1079574527,US
+1079508992,1079566847,US
+1079566848,1079567103,GB
+1079567104,1079567359,US
+1079567360,1079567615,AU
+1079567616,1079574527,US
1079574528,1079578623,PR
1079578624,1079623679,US
1079623680,1079627775,PR
@@ -9388,12 +10451,16 @@
1079664640,1079668735,CA
1079668736,1079861247,US
1079861248,1079865343,CA
-1079865344,1080033279,US
+1079865344,1079962879,US
+1079962880,1079963135,GB
+1079963136,1080024319,US
+1080024320,1080024575,CA
+1080024576,1080033279,US
1080033280,1080164351,KY
1080164352,1080295423,CA
-1080295424,1080492287,US
-1080492288,1080492543,BE
-1080492544,1080498431,US
+1080295424,1080496639,US
+1080496640,1080496895,ES
+1080496896,1080498431,US
1080498432,1080498664,GB
1080498665,1080498665,US
1080498666,1080498687,GB
@@ -9401,49 +10468,88 @@
1080513536,1080513791,GB
1080513792,1080550399,US
1080550400,1080550655,IN
-1080550656,1080569343,US
+1080550656,1080552447,US
+1080552448,1080552703,IN
+1080552704,1080569343,US
1080569344,1080569599,JP
1080569600,1080569730,US
1080569731,1080569731,JP
-1080569732,1080610559,US
+1080569732,1080589567,US
+1080589568,1080589823,CN
+1080589824,1080610559,US
1080610560,1080610815,AU
-1080610816,1080613631,US
-1080613632,1080613887,AU
-1080613888,1080621055,US
+1080610816,1080621055,US
1080621056,1080621567,AU
1080621568,1080622079,US
1080622080,1080622335,AU
1080622336,1080954879,US
1080956774,1080956774,GB
-1080957952,1080963839,DE
+1080957952,1080958207,DE
+1080958208,1080958463,BH
+1080958464,1080958719,DE
+1080958720,1080958975,BH
+1080958976,1080960255,DE
+1080960256,1080960511,BH
+1080960512,1080963839,DE
1080963840,1080967167,US
-1080967168,1080975039,DE
+1080967168,1080968191,DE
+1080968192,1080968447,BH
+1080968448,1080969471,DE
+1080969472,1080969727,BH
+1080969728,1080975039,DE
1080975040,1080975103,BJ
1080975104,1080983551,DE
1080986624,1080987647,US
-1080987648,1080988671,DE
+1080987648,1080987903,IT
+1080987904,1080988671,DE
1080988672,1080989951,US
1080989952,1080990207,DE
1080990208,1080999935,US
1080999936,1081016319,CA
-1081016320,1081038335,US
+1081016320,1081037311,US
+1081037312,1081037567,CA
+1081037568,1081038335,US
1081038336,1081040895,CA
1081040896,1081057535,US
-1081061376,1081212927,US
+1081061376,1081122559,US
+1081122560,1081122815,VI
+1081122816,1081212927,US
1081212928,1081278463,CA
-1081278464,1081377663,US
+1081278464,1081369599,US
+1081369600,1081370111,CO
+1081370112,1081377663,US
1081377664,1081377791,VE
1081377792,1081378495,US
1081378496,1081378559,VE
-1081378560,1081391103,US
+1081378560,1081379327,US
+1081379328,1081379839,VE
+1081379840,1081385215,US
+1081385216,1081385471,PA
+1081385472,1081387519,US
+1081387520,1081388031,PA
+1081388032,1081391103,US
1081391104,1081393151,PA
-1081393152,1081395199,US
-1081395200,1081397247,CL
-1081397248,1081399295,US
+1081393152,1081393407,US
+1081393408,1081393663,CL
+1081393664,1081393919,US
+1081393920,1081397247,CL
+1081397248,1081397759,US
+1081397760,1081398783,CL
+1081398784,1081399295,US
1081399296,1081401343,CL
-1081401344,1081410559,US
+1081401344,1081401855,US
+1081401856,1081402367,AR
+1081402368,1081403135,US
+1081403136,1081403391,AR
+1081403392,1081409791,US
+1081409792,1081410047,PR
+1081410048,1081410559,US
1081410560,1081411583,PR
-1081411584,1081421311,US
+1081411584,1081416191,US
+1081416192,1081416447,PR
+1081416448,1081419775,US
+1081419776,1081420287,PR
+1081420288,1081421311,US
1081421312,1081421567,MF
1081421568,1081443327,US
1081443328,1081444351,CL
@@ -9465,20 +10571,26 @@
1082139411,1082314751,US
1082314752,1082318847,CA
1082318848,1082351359,US
-1082351360,1082351615,SA
-1082351616,1082679807,US
+1082351360,1082351487,SA
+1082351488,1082679807,US
1082683392,1082687487,CA
1082687488,1082786591,US
1082786592,1082786623,HK
1082786624,1082790143,US
1082790144,1082790399,IN
-1082790400,1082819839,US
+1082790400,1082791167,US
+1082791168,1082791423,IN
+1082791424,1082819839,US
1082819840,1082820351,IN
1082820352,1082945535,US
1082945536,1082949631,CA
-1082949632,1082982399,US
+1082949632,1082952703,US
+1082952704,1082952959,CA
+1082952960,1082982399,US
1082982400,1083015167,CA
-1083015168,1083396095,US
+1083015168,1083265023,US
+1083265024,1083265279,CA
+1083265280,1083396095,US
1083396096,1083400191,BM
1083400192,1083437055,US
1083437056,1083441151,CA
@@ -9488,10 +10600,14 @@
1083686912,1083703295,CA
1083703296,1083738111,US
1083738112,1083740159,PR
-1083740160,1085439999,US
+1083740160,1084067583,US
+1084067584,1084067839,CA
+1084067840,1085439999,US
1085440000,1085448191,CA
1085448192,1085456383,US
-1085456384,1085464575,PR
+1085456384,1085457919,PR
+1085457920,1085458175,US
+1085458176,1085464575,PR
1085464576,1085526015,US
1085526016,1085530111,CA
1085530112,1085538303,US
@@ -9505,23 +10621,33 @@
1086013440,1086042111,US
1086042112,1086046207,CA
1086046208,1086050815,US
-1086054400,1086922751,US
+1086054400,1086309887,US
+1086309888,1086310143,AU
+1086310144,1086317823,US
+1086317824,1086318079,CA
+1086318080,1086421503,US
+1086421504,1086422015,MP
+1086422016,1086922751,US
1086922752,1086930943,CA
-1086930944,1086955519,US
+1086930944,1086942975,US
+1086942976,1086943231,CA
+1086943232,1086955519,US
1086955520,1086971903,CA
1086971904,1087016959,US
1087016960,1087021055,CA
1087021056,1087395327,US
-1087395328,1087395503,GB
-1087395504,1087395511,US
-1087395512,1087395583,GB
-1087395584,1087405407,US
+1087395328,1087395455,GB
+1087395456,1087399167,US
+1087399168,1087399423,GB
+1087399424,1087405407,US
1087405408,1087405423,MX
1087405424,1087413895,US
1087413896,1087413903,DE
1087413904,1087419135,US
1087419136,1087419391,GB
-1087419392,1087432447,US
+1087419392,1087419903,US
+1087419904,1087420159,CA
+1087420160,1087432447,US
1087432448,1087432607,FR
1087432608,1087432639,US
1087432640,1087432703,FR
@@ -9531,25 +10657,29 @@
1087440896,1087442943,PR
1087442944,1087443551,US
1087443552,1087443583,DE
-1087443584,1087464945,US
+1087443584,1087444223,US
+1087444224,1087444479,GB
+1087444480,1087464945,US
1087464946,1087464949,GB
1087464950,1087466489,US
1087466490,1087466493,GB
1087466494,1087467291,US
1087467292,1087467295,BR
-1087467296,1087515647,US
-1087515648,1087515903,BB
-1087515904,1087586303,US
-1087586304,1087586559,GB
-1087586560,1087593983,US
+1087467296,1087496703,US
+1087496704,1087496959,CA
+1087496960,1087593983,US
1087593984,1087594239,MX
1087594240,1087608319,US
1087608320,1087608575,GB
1087608576,1087643723,US
1087643724,1087643727,FR
-1087643728,1087678623,US
+1087643728,1087654143,US
+1087654144,1087654399,VE
+1087654400,1087678623,US
1087678624,1087678655,GB
-1087678656,1087689215,US
+1087678656,1087686655,US
+1087686656,1087686911,PR
+1087686912,1087689215,US
1087689216,1087689471,AR
1087689472,1087695319,US
1087695320,1087695323,GB
@@ -9568,12 +10698,14 @@
1087735648,1087746079,US
1087746080,1087746083,HK
1087746084,1087758335,US
-1087758336,1087766527,PR
+1087758336,1087761919,PR
+1087761920,1087762431,US
+1087762432,1087766527,PR
1087766528,1087798943,US
1087798944,1087798975,CA
-1087798976,1087799295,US
-1087799296,1087799551,DE
-1087799552,1087799787,US
+1087798976,1087799413,US
+1087799414,1087799414,DE
+1087799415,1087799787,US
1087799788,1087799791,CH
1087799792,1087825663,US
1087825664,1087825919,SA
@@ -9589,13 +10721,15 @@
1087873024,1087873279,CA
1087873280,1087883263,US
1087883264,1087883519,AR
-1087883520,1087950111,US
+1087883520,1087884001,US
+1087884002,1087884002,GB
+1087884003,1087950111,US
1087950112,1087950119,PR
1087950120,1088012767,US
1088012768,1088012775,PR
-1088012776,1088317439,US
-1088317440,1088317567,CA
-1088317568,1088684031,US
+1088012776,1088398591,US
+1088398592,1088398719,CA
+1088398720,1088684031,US
1088684032,1088946175,CA
1088946176,1089053183,US
1089053184,1089053439,BR
@@ -9645,7 +10779,19 @@
1089393224,1089393231,CA
1089393232,1089393343,US
1089393344,1089393359,CA
-1089393360,1089961983,US
+1089393360,1089526783,US
+1089526784,1089527039,VE
+1089527040,1089579519,US
+1089579520,1089580031,VE
+1089580032,1089598975,US
+1089598976,1089599231,HK
+1089599232,1089881599,US
+1089881600,1089882111,GB
+1089882112,1089882623,US
+1089882624,1089883135,GB
+1089883136,1089887231,US
+1089887232,1089887743,GB
+1089887744,1089961983,US
1089961984,1089970175,CA
1089970176,1089974271,PR
1089974272,1090146303,US
@@ -9660,7 +10806,19 @@
1090424832,1090428927,CA
1090428928,1090445311,US
1090445312,1090453503,CA
-1090453504,1091960831,US
+1090453504,1091798783,US
+1091798784,1091799039,CN
+1091799040,1091802111,US
+1091802112,1091802367,CA
+1091802368,1091803135,US
+1091803136,1091803391,CN
+1091803392,1091807231,US
+1091807232,1091807487,CA
+1091807488,1091807999,US
+1091808000,1091808511,CA
+1091808512,1091812351,US
+1091812352,1091812607,CN
+1091812608,1091960831,US
1091960832,1092026367,CA
1092026368,1092075519,US
1092075520,1092091903,PR
@@ -9668,56 +10826,103 @@
1093017600,1093021695,CA
1093021696,1093025791,US
1093025792,1093033983,CA
-1093033984,1093058559,US
-1093058560,1093066751,PR
+1093033984,1093055487,US
+1093055488,1093055743,AR
+1093055744,1093058559,US
+1093058560,1093063167,PR
+1093063168,1093063679,DO
+1093063680,1093066751,PR
1093066752,1093074943,US
1093074944,1093091327,CA
-1093091328,1093109871,US
+1093091328,1093107967,US
+1093107968,1093108479,CA
+1093108480,1093108735,US
+1093108736,1093109247,CA
+1093109248,1093109503,US
+1093109504,1093109759,CA
+1093109760,1093109871,US
1093109872,1093109879,CA
-1093109880,1093110927,US
+1093109880,1093110015,US
+1093110016,1093110271,CA
+1093110272,1093110527,US
+1093110528,1093110783,CA
+1093110784,1093110927,US
1093110928,1093110935,CA
-1093110936,1093111727,US
+1093110936,1093111039,US
+1093111040,1093111551,CA
+1093111552,1093111727,US
1093111728,1093111743,CA
1093111744,1093111903,US
1093111904,1093111935,CA
-1093111936,1093114843,US
+1093111936,1093113855,US
+1093113856,1093114111,CA
+1093114112,1093114843,US
1093114844,1093114847,CA
-1093114848,1093120511,US
+1093114848,1093114879,US
+1093114880,1093115647,CA
+1093115648,1093115903,US
+1093115904,1093116415,CA
+1093116416,1093116927,US
+1093116928,1093117183,HK
+1093117184,1093117951,US
+1093117952,1093118207,CA
+1093118208,1093118463,HK
+1093118464,1093119999,US
+1093120000,1093120255,CA
+1093120256,1093120511,US
1093120512,1093120767,CA
-1093120768,1093121535,US
-1093121536,1093121791,CA
-1093121792,1093122175,US
+1093120768,1093121023,US
+1093121024,1093122047,CA
+1093122048,1093122175,US
1093122176,1093122303,CA
1093122304,1093122751,US
1093122752,1093122767,CA
-1093122768,1093123583,US
-1093123584,1093123839,CA
+1093122768,1093122815,US
+1093122816,1093123839,CA
1093123840,1093123951,US
1093123952,1093123967,CA
-1093123968,1093126143,US
+1093123968,1093124607,US
+1093124608,1093124863,CA
+1093124864,1093125119,US
+1093125120,1093125631,CA
+1093125632,1093126143,US
1093126144,1093126399,CA
-1093126400,1093128703,US
-1093128704,1093128959,CA
-1093128960,1093131007,US
-1093131008,1093131263,CA
-1093131264,1093135359,US
+1093126400,1093126911,US
+1093126912,1093127167,CA
+1093127168,1093128447,US
+1093128448,1093129215,CA
+1093129216,1093130751,US
+1093130752,1093131007,CA
+1093131008,1093132543,US
+1093132544,1093133055,CA
+1093133056,1093135359,US
1093135360,1093135615,CA
-1093135616,1093136127,US
-1093136128,1093136639,CA
+1093135616,1093135871,US
+1093135872,1093136639,CA
1093136640,1093136895,US
1093136896,1093137151,CA
-1093137152,1093137663,US
-1093137664,1093138431,CA
-1093138432,1093697535,US
+1093137152,1093137407,US
+1093137408,1093137791,CA
+1093137792,1093137919,US
+1093137920,1093138431,CA
+1093138432,1093139711,US
+1093139712,1093140223,CA
+1093140224,1093697535,US
1093697536,1093699071,BB
1093699072,1093700607,GD
-1093700608,1093716479,BB
-1093716480,1093717504,GD
-1093717505,1093724933,BB
-1093724934,1093724934,VC
-1093724935,1093724941,BB
-1093724942,1093724942,VC
-1093724943,1093730303,BB
+1093700608,1093701631,VC
+1093701632,1093708287,BB
+1093708288,1093709311,LC
+1093709312,1093716479,BB
+1093716480,1093717759,GD
+1093717760,1093719807,BB
+1093719808,1093720319,LC
+1093720320,1093721343,VG
+1093721344,1093723391,BB
+1093723392,1093723647,VC
+1093723648,1093724415,BB
+1093724416,1093725183,VC
+1093725184,1093730303,BB
1093730304,1093965960,US
1093965961,1093965961,NL
1093965962,1093966163,US
@@ -9736,7 +10941,9 @@
1095450624,1095467007,BS
1095467008,1095483391,US
1095484416,1095484671,US
-1095491584,1096278015,US
+1095491584,1095627775,US
+1095627776,1095628287,CA
+1095628288,1096278015,US
1096278016,1096286207,CA
1096286208,1096519167,US
1096519168,1096519423,CD
@@ -9745,9 +10952,13 @@
1096548352,1096810495,CA
1096810496,1096884223,US
1096884224,1096888319,CA
-1096888320,1096925183,US
+1096888320,1096890879,US
+1096890880,1096891135,GB
+1096891136,1096925183,US
1096925184,1096941567,CA
-1096941568,1097727999,US
+1096941568,1097076123,US
+1097076124,1097076127,DE
+1097076128,1097727999,US
1097728000,1097736191,CA
1097736192,1097768959,US
1097768960,1097785343,CA
@@ -9757,20 +10968,30 @@
1097834496,1097837197,US
1097837198,1097837198,AE
1097837199,1097896191,US
-1097896192,1097896703,VI
-1097896704,1097947135,US
+1097896192,1097897215,VI
+1097897216,1097947135,US
1097947136,1097947735,VI
1097947736,1097947743,US
-1097947744,1097947991,VI
-1097947992,1097947999,US
-1097948000,1097948015,VI
-1097948016,1097948031,US
-1097948032,1097949183,VI
+1097947744,1097949183,VI
1097949184,1097951231,US
1097951232,1097953279,VI
1097953280,1098507263,US
1098507264,1098507519,CA
-1098507520,1101304831,US
+1098507520,1101121535,US
+1101121536,1101121791,EC
+1101121792,1101182975,US
+1101182976,1101183487,YE
+1101183488,1101190655,US
+1101190656,1101191167,EC
+1101191168,1101224959,US
+1101224960,1101225215,EC
+1101225216,1101263103,US
+1101263104,1101263359,CW
+1101263360,1101267711,US
+1101267712,1101267967,CA
+1101267968,1101304063,US
+1101304064,1101304319,EC
+1101304320,1101304831,US
1101304832,1101305855,HN
1101305856,1101306047,US
1101306048,1101306079,PR
@@ -9778,7 +10999,9 @@
1101352960,1101355007,HN
1101355008,1101402031,US
1101402032,1101402047,PR
-1101402048,1101459455,US
+1101402048,1101425919,US
+1101425920,1101426175,EC
+1101426176,1101459455,US
1101459456,1101461503,BB
1101461504,1101469695,US
1101469696,1101471743,HN
@@ -9786,33 +11009,84 @@
1101475840,1101479935,CO
1101479936,1101484031,US
1101484032,1101488127,CO
-1101488128,1101521599,US
-1101521600,1101521615,AS
-1101521616,1101521663,US
-1101521664,1101521919,AS
-1101521920,1101676543,US
+1101488128,1101521407,US
+1101521408,1101521919,AS
+1101521920,1101542399,US
+1101542400,1101542911,CO
+1101542912,1101574655,US
+1101574656,1101575167,EC
+1101575168,1101635327,US
+1101635328,1101635583,HN
+1101635584,1101650431,US
+1101650432,1101650943,HN
+1101650944,1101668095,US
+1101668096,1101668351,EC
+1101668352,1101676543,US
1101676544,1101678591,EC
-1101678592,1101797375,US
+1101678592,1101681407,US
+1101681408,1101681663,NL
+1101681664,1101750783,US
+1101750784,1101751295,BM
+1101751296,1101767935,US
+1101767936,1101768191,CW
+1101768192,1101797375,US
1101797376,1101798399,BB
1101798400,1101803519,US
1101803520,1101804543,HN
-1101804544,1101871103,US
+1101804544,1101837311,US
+1101837312,1101837567,EC
+1101837568,1101869055,US
+1101869056,1101869567,GH
+1101869568,1101871103,US
1101871104,1101873151,BO
-1101873152,1102389247,US
+1101873152,1101905407,US
+1101905408,1101905663,GH
+1101905664,1101992063,US
+1101992064,1101992191,NL
+1101992192,1102004735,US
+1102004736,1102004991,IN
+1102004992,1102005247,US
+1102005248,1102005503,CA
+1102005504,1102005759,PK
+1102005760,1102006271,US
+1102006272,1102006527,CA
+1102006528,1102007295,US
+1102007296,1102007551,PK
+1102007552,1102010623,US
+1102010624,1102010879,PK
+1102010880,1102389247,US
1102389248,1102393343,CA
1102393344,1102446591,US
1102446592,1102448383,HN
-1102448384,1102449407,US
+1102448384,1102449151,US
+1102449152,1102449407,SV
1102449408,1102454527,CR
-1102454528,1102512127,US
+1102454528,1102454783,HN
+1102454784,1102512127,US
1102512128,1102516223,JM
-1102516224,1103548415,US
+1102516224,1103244799,US
+1103244800,1103245055,EC
+1103245056,1103548415,US
1103548416,1103550463,BS
1103550464,1103603711,US
1103603712,1103605759,EC
-1103605760,1104166911,US
+1103605760,1103623167,US
+1103623168,1103623679,CO
+1103623680,1103930879,US
+1103930880,1103931135,MX
+1103931136,1103987967,US
+1103987968,1103988223,BR
+1103988224,1103992319,US
+1103992320,1103992575,FI
+1103992576,1103996927,US
+1103996928,1103997439,EC
+1103997440,1104166911,US
1104166912,1104168959,CO
-1104168960,1104629247,US
+1104168960,1104265215,US
+1104265216,1104265727,PH
+1104265728,1104492287,US
+1104492288,1104492543,PH
+1104492544,1104629247,US
1104629248,1104629759,GH
1104629760,1104753151,US
1104753152,1104753407,SX
@@ -9820,10 +11094,23 @@
1104842752,1104844799,PR
1104844800,1104924415,US
1104924416,1104924671,IN
-1104924672,1106469887,US
+1104924672,1105034495,US
+1105034496,1105034751,IT
+1105034752,1105099519,US
+1105099520,1105099775,EC
+1105099776,1106469887,US
1106469888,1106470911,BS
-1106470912,1106767871,US
-1106767872,1106769919,CO
+1106470912,1106475007,US
+1106475008,1106475519,CO
+1106475520,1106740991,US
+1106740992,1106741247,CR
+1106741248,1106758655,US
+1106758656,1106759167,EC
+1106759168,1106759679,CO
+1106759680,1106767871,US
+1106767872,1106768383,CO
+1106768384,1106768895,EC
+1106768896,1106769919,CO
1106769920,1107239935,US
1107239936,1107240191,CN
1107240192,1107240447,US
@@ -9842,17 +11129,27 @@
1107820544,1107853311,ZA
1107853312,1107895039,US
1107895040,1107895807,GB
-1107895808,1107899391,US
-1107899392,1107899647,GB
-1107899648,1107907839,US
+1107895808,1107898367,US
+1107898368,1107899903,GB
+1107899904,1107900671,US
+1107900672,1107900927,GB
+1107900928,1107906559,US
+1107906560,1107907071,GB
+1107907072,1107907839,US
1107907840,1107908095,GB
1107908096,1107909375,US
1107909376,1107909631,GB
-1107909632,1107927039,US
+1107909632,1107909887,US
+1107909888,1107910143,GB
+1107910144,1107927039,US
1107927040,1107927551,GB
-1107927552,1107935999,US
-1107936000,1107936255,GB
-1107936256,1107948543,US
+1107927552,1107935743,US
+1107935744,1107936767,GB
+1107936768,1107946495,US
+1107946496,1107947007,GB
+1107947008,1107947775,US
+1107947776,1107948031,GB
+1107948032,1107948543,US
1107948544,1107948799,GB
1107948800,1108025343,US
1108025344,1108029439,CA
@@ -9860,7 +11157,9 @@
1108033536,1108041727,CA
1108041728,1108054015,US
1108054016,1108066303,CA
-1108066304,1108492287,US
+1108066304,1108443391,US
+1108443392,1108443647,CA
+1108443648,1108492287,US
1108492288,1108500479,ZA
1108500480,1108525055,US
1108525056,1108541439,CA
@@ -9868,45 +11167,83 @@
1109688320,1109696511,CA
1109696512,1109705928,US
1109705929,1109705929,LB
-1109705930,1109709823,US
+1109705930,1109707007,US
+1109707008,1109707263,JM
+1109707264,1109707519,US
+1109707520,1109707775,MW
+1109707776,1109709823,US
1109709824,1109710847,ZM
-1109710848,1109772223,US
-1109772224,1109772239,HK
-1109772240,1109776575,US
-1109776576,1109776607,CN
-1109776608,1109819391,US
+1109710848,1109819391,US
1109819392,1109852159,CA
-1109852160,1110126591,US
+1109852160,1109918463,US
+1109918464,1109918719,GB
+1109918720,1109919743,US
+1109919744,1109919999,GB
+1109920000,1109927167,US
+1109927168,1109927423,AU
+1109927424,1109934591,US
+1109934592,1109934847,GB
+1109934848,1110126591,US
1110126592,1110130687,CA
1110130688,1110310911,US
1110310912,1110376447,CA
-1110376448,1110443535,US
+1110376448,1110441983,US
+1110441984,1110442239,CA
+1110442240,1110443535,US
1110443536,1110443543,CA
-1110443544,1110445311,US
-1110445312,1110446591,CA
-1110446592,1110452223,US
-1110452224,1110453247,CA
+1110443544,1110444287,US
+1110444288,1110444799,CA
+1110444800,1110445055,US
+1110445056,1110446591,CA
+1110446592,1110447359,US
+1110447360,1110448383,CA
+1110448384,1110448639,US
+1110448640,1110448895,CA
+1110448896,1110449151,US
+1110449152,1110449663,CA
+1110449664,1110450431,US
+1110450432,1110450943,CA
+1110450944,1110451455,US
+1110451456,1110451711,CA
+1110451712,1110451967,US
+1110451968,1110453247,CA
1110453248,1110454271,US
1110454272,1110455295,CA
-1110455296,1110540287,US
+1110455296,1110463999,US
+1110464000,1110464767,CA
+1110464768,1110465023,US
+1110465024,1110465535,CA
+1110465536,1110466047,US
+1110466048,1110466303,CA
+1110466304,1110472447,US
+1110472448,1110473727,CA
+1110473728,1110473983,US
+1110473984,1110474239,CA
+1110474240,1110540287,US
1110540288,1110573055,CA
1110573056,1110587391,PR
-1110587392,1110587647,US
-1110587648,1110588159,PR
-1110588160,1110588415,US
-1110588416,1110589183,PR
-1110589184,1110589695,US
-1110589696,1110590207,PR
+1110587392,1110587903,US
+1110587904,1110588159,PR
+1110588160,1110588671,US
+1110588672,1110589183,PR
+1110589184,1110589439,US
+1110589440,1110590207,PR
1110590208,1110590463,US
1110590464,1110591231,PR
1110591232,1110591487,US
-1110591488,1110593535,PR
+1110591488,1110592255,PR
+1110592256,1110592511,US
+1110592512,1110593023,PR
+1110593024,1110593279,US
+1110593280,1110593535,PR
1110593536,1110593791,US
1110593792,1110594047,PR
1110594048,1110594303,US
-1110594304,1110595071,PR
-1110595072,1110595583,US
-1110595584,1110638591,PR
+1110594304,1110594815,PR
+1110594816,1110595583,US
+1110595584,1110598655,PR
+1110598656,1110598911,US
+1110598912,1110638591,PR
1110638592,1110654463,US
1110654464,1110654719,HT
1110654720,1110663167,US
@@ -9922,8 +11259,12 @@
1110858752,1110859007,US
1110859008,1110859263,AU
1110859264,1110863871,US
-1110863872,1110867967,JM
-1110867968,1110929407,US
+1110863872,1110865919,JM
+1110865920,1110867455,KY
+1110867456,1110867967,JM
+1110867968,1110887423,US
+1110887424,1110887679,IE
+1110887680,1110929407,US
1110929408,1110933503,BM
1110933504,1111195647,US
1111195648,1111212031,CA
@@ -9933,9 +11274,7 @@
1112432640,1112440831,CA
1112440832,1112530943,US
1112530944,1112539135,CA
-1112539136,1112869887,US
-1112870144,1112870399,US
-1112870912,1112873215,US
+1112539136,1112873215,US
1112875008,1112875519,US
1112875776,1112877311,US
1112877568,1112877823,US
@@ -9947,20 +11286,34 @@
1113595904,1113596415,CL
1113596416,1113596927,GT
1113596928,1113597183,PE
-1113597184,1113597695,US
+1113597184,1113597439,US
+1113597440,1113597695,PE
1113597696,1113598463,PA
-1113598464,1113601023,US
-1113601024,1113603071,VE
-1113603072,1113603327,US
+1113598464,1113599487,US
+1113599488,1113599999,VE
+1113600000,1113600255,US
+1113600256,1113603071,VE
+1113603072,1113603327,CL
1113603328,1113603583,GT
-1113603584,1113657343,US
+1113603584,1113603839,US
+1113603840,1113604095,CA
+1113604096,1113657343,US
1113657344,1113661439,CA
1113661440,1113669631,US
+1113669632,1113670143,CA
+1113670144,1113670911,US
+1113670912,1113671167,CA
+1113671168,1113671423,US
+1113671424,1113677823,CA
1113677824,1113718783,US
1113718784,1113743359,DO
1113743360,1113752332,US
1113752333,1113752333,AE
-1113752334,1113983999,US
+1113752334,1113854207,US
+1113854208,1113854463,CA
+1113854464,1113854975,US
+1113854976,1113855487,CA
+1113855488,1113983999,US
1113984000,1113984255,NL
1113984256,1113997311,US
1113997312,1114005503,CA
@@ -9969,29 +11322,44 @@
1114062848,1114095615,US
1114095616,1114103807,CA
1114103808,1114505215,US
-1114505216,1114507455,CA
-1114507456,1114507459,US
-1114507460,1114513407,CA
+1114505216,1114506239,CA
+1114506240,1114506751,US
+1114506752,1114507263,CA
+1114507264,1114511871,US
+1114511872,1114512127,CA
+1114512128,1114513407,US
1114513408,1114515455,SA
1114515456,1114517503,US
-1114517504,1114523647,CA
-1114523648,1114523903,US
-1114523904,1114529791,CA
-1114529792,1114530047,US
-1114530048,1114533887,CA
+1114517504,1114518015,CA
+1114518016,1114520063,US
+1114520064,1114520319,PH
+1114520320,1114520575,US
+1114520576,1114520831,PH
+1114520832,1114524159,US
+1114524160,1114524671,ZA
+1114524672,1114533375,US
+1114533376,1114533887,ZA
1114533888,1114537983,AO
1114537984,1114550271,CA
1114550272,1114681343,US
1114681344,1114685439,CA
1114685440,1114730495,US
1114730496,1114734591,CA
-1114734592,1115112575,US
+1114734592,1114877183,US
+1114877184,1114877439,CY
+1114877440,1114877951,US
+1114877952,1114878207,PA
+1114878208,1115112575,US
1115112576,1115112607,IN
1115112608,1115113471,US
1115113472,1115114495,HN
-1115114496,1115115519,US
+1115114496,1115114751,MX
+1115114752,1115115007,GT
+1115115008,1115115519,US
1115115520,1115116543,HN
-1115116544,1115117567,US
+1115116544,1115117055,US
+1115117056,1115117311,GB
+1115117312,1115117567,US
1115117568,1115118591,HN
1115118592,1115119615,SV
1115119616,1115127807,US
@@ -9999,6 +11367,7 @@
1115131904,1115135999,US
1115136000,1115144191,CA
1115144192,1115693055,US
+1115693056,1115697151,AR
1115697152,1115705343,US
1115705344,1115709439,CA
1115709440,1115783167,US
@@ -10016,35 +11385,73 @@
1116016128,1116021247,US
1116021248,1116021503,CI
1116021504,1116024063,US
-1116024064,1116024319,PG
-1116024320,1116027135,US
+1116024064,1116024127,PG
+1116024128,1116027135,US
1116027136,1116027903,DE
1116027904,1116168191,US
1116168192,1116176383,CA
1116176384,1116897279,US
1116897280,1116905471,CA
-1116905472,1117274111,US
+1116905472,1117137919,US
+1117137920,1117138175,CA
+1117138176,1117142271,US
+1117142272,1117142527,CA
+1117142528,1117198591,US
+1117198592,1117198847,CA
+1117198848,1117274111,US
1117274112,1117282303,CA
1117282304,1117413375,US
1117413376,1117415423,CA
1117415424,1117416191,CW
-1117416192,1117420415,CA
+1117416192,1117416447,CA
+1117416448,1117416703,US
+1117416704,1117419775,CA
+1117419776,1117420031,US
+1117420032,1117420415,CA
1117420416,1117420447,US
1117420448,1117421567,CA
-1117421568,1117683711,US
+1117421568,1117460223,US
+1117460224,1117460287,GB
+1117460288,1117683711,US
1117683712,1117691903,CA
1117691904,1117724671,US
1117724672,1117728767,CA
-1117728768,1117741567,US
-1117742080,1117744127,US
+1117728768,1117744127,US
1117745152,1117749247,CA
-1117749248,1117978623,US
+1117749248,1117815295,US
+1117815296,1117815551,CN
+1117815552,1117823231,US
+1117823232,1117823487,CA
+1117823488,1117823743,CN
+1117823744,1117823999,US
+1117824000,1117824511,GR
+1117824512,1117829375,US
+1117829376,1117829631,GR
+1117829632,1117978623,US
1117978624,1117986815,CA
1117986816,1117995007,US
1117995008,1117999103,CA
1117999104,1118027775,US
1118027776,1118031871,CA
-1118031872,1118158847,US
+1118031872,1118126335,US
+1118126336,1118126591,CA
+1118126592,1118130687,US
+1118130688,1118131455,CA
+1118131456,1118131967,US
+1118131968,1118132479,CA
+1118132480,1118132991,US
+1118132992,1118133247,CA
+1118133248,1118135807,US
+1118135808,1118136063,CA
+1118136064,1118138879,US
+1118138880,1118139135,CA
+1118139136,1118139903,US
+1118139904,1118140415,CA
+1118140416,1118141183,US
+1118141184,1118141439,CA
+1118141440,1118141695,US
+1118141696,1118141951,CA
+1118141952,1118158847,US
1118158848,1118167039,CA
1118167040,1118474239,US
1118474240,1118478335,CA
@@ -10057,19 +11464,56 @@
1118535680,1118539775,CA
1118539776,1118543871,US
1118543872,1118547967,CA
-1118547968,1118824447,US
+1118547968,1118790655,US
+1118790656,1118790911,IL
+1118790912,1118793471,US
+1118793472,1118793727,CO
+1118793728,1118796543,US
+1118796544,1118796799,GB
+1118796800,1118824447,US
1118826496,1118962943,US
1118962944,1118963199,AS
1118963200,1118965247,US
1118965248,1118965503,AS
1118965504,1118966015,US
1118966016,1118966271,BR
-1118966272,1118993151,US
+1118966272,1118969855,US
+1118969856,1118970111,LB
+1118970112,1118970367,US
+1118970368,1118970623,GB
+1118970624,1118971647,US
+1118971648,1118971903,GY
+1118971904,1118972159,US
+1118972160,1118972415,VE
+1118972416,1118972671,GB
+1118972672,1118973183,US
+1118973184,1118973439,VE
+1118973440,1118973695,US
+1118973696,1118973951,NG
+1118973952,1118975487,US
+1118975488,1118975743,KE
+1118975744,1118975999,US
+1118976000,1118976255,GB
+1118976256,1118980607,US
+1118980608,1118980863,TZ
+1118980864,1118981119,CW
+1118981120,1118983423,US
+1118983424,1118983679,NI
+1118983680,1118984447,US
+1118984448,1118984703,SA
+1118984704,1118986239,US
+1118986240,1118987007,GB
+1118987008,1118988799,US
+1118988800,1118989055,VE
+1118989056,1118989311,US
+1118989312,1118989823,KE
+1118989824,1118993151,US
1118993152,1118993407,GY
-1118993408,1119109119,US
+1118993408,1118994175,US
+1118994176,1118994431,LR
+1118994432,1119109119,US
1119109120,1119111167,CA
-1119113216,1119150079,US
-1119154176,1119173135,US
+1119113216,1119173135,US
1119173136,1119173143,MX
1119173144,1119173167,US
1119173168,1119173175,MX
@@ -10096,7 +11540,9 @@
1119215616,1119289343,US
1119289344,1119354879,CA
1119354880,1119428607,US
-1119428608,1119432703,VI
+1119428608,1119431663,VI
+1119431664,1119432191,US
+1119432192,1119432703,VI
1119432704,1119436799,CA
1119436800,1119440895,US
1119440896,1119444991,CA
@@ -10104,38 +11550,62 @@
1119469568,1119477759,CA
1119477760,1119502335,US
1119502336,1119510527,CA
-1119510528,1119571967,US
+1119510528,1119558143,US
+1119558144,1119558655,PR
+1119558656,1119568383,US
+1119568384,1119568639,GB
+1119568640,1119568767,US
+1119568768,1119568895,GB
+1119568896,1119570175,US
+1119570176,1119570303,GB
+1119570304,1119571967,US
1119571968,1119576063,CA
1119576064,1119580159,US
1119580160,1119584255,CA
1119584256,1119612927,US
1119617024,1120149503,US
1120149504,1120153599,CA
-1120153600,1120272383,US
-1120272384,1120274431,CA
-1120274432,1120274687,US
-1120274688,1120277247,CA
-1120277248,1120277503,US
-1120277504,1120278527,CA
-1120278528,1120278543,US
-1120278544,1120283647,CA
+1120153600,1120274943,US
+1120274944,1120274991,CA
+1120274992,1120282367,US
+1120282368,1120282623,SY
+1120282624,1120282879,US
+1120282880,1120283135,SY
+1120283136,1120283647,US
1120283648,1120284671,EC
1120284672,1120286719,CA
-1120286720,1120288767,US
-1120288768,1120307199,CA
+1120286720,1120294911,US
+1120294912,1120297215,CA
+1120297216,1120299007,US
+1120299008,1120299263,PK
+1120299264,1120299519,US
+1120299520,1120300799,PK
+1120300800,1120306687,US
+1120306688,1120306943,PH
+1120306944,1120307199,US
1120307200,1120307967,EC
-1120307968,1120310015,CA
-1120310016,1120310271,PH
-1120310272,1120312063,CA
+1120307968,1120308223,PH
+1120308224,1120310015,US
+1120310016,1120310783,PH
+1120310784,1120312063,US
1120312064,1120312319,PH
-1120312320,1120317815,CA
-1120317816,1120317823,US
-1120317824,1120321535,CA
-1120321536,1120346111,US
+1120312320,1120312575,US
+1120312576,1120312831,PH
+1120312832,1120346111,US
1120346112,1120350207,CA
-1120350208,1120373759,US
-1120373760,1120374015,CA
-1120374016,1120376303,US
+1120350208,1120370687,US
+1120370688,1120371199,CA
+1120371200,1120372223,US
+1120372224,1120372479,CA
+1120372480,1120372735,US
+1120372736,1120373247,CA
+1120373248,1120373503,US
+1120373504,1120374015,CA
+1120374016,1120374527,US
+1120374528,1120375039,CA
+1120375040,1120375551,US
+1120375552,1120376063,CA
+1120376064,1120376303,US
1120376304,1120376319,CA
1120376320,1120376479,US
1120376480,1120376494,CA
@@ -10143,7 +11613,15 @@
1120376560,1120376575,CA
1120376576,1120376695,US
1120376696,1120376703,CA
-1120376704,1120379199,US
+1120376704,1120376831,US
+1120376832,1120377087,CA
+1120377088,1120377343,US
+1120377344,1120377599,CA
+1120377600,1120377855,US
+1120377856,1120378367,CA
+1120378368,1120378623,US
+1120378624,1120378879,CA
+1120378880,1120379199,US
1120379200,1120379263,CA
1120379264,1120379295,US
1120379296,1120379311,CA
@@ -10155,31 +11633,63 @@
1120380672,1120380991,CA
1120380992,1120381087,US
1120381088,1120381095,CA
-1120381096,1120382439,US
+1120381096,1120381183,US
+1120381184,1120382207,CA
+1120382208,1120382439,US
1120382440,1120382447,CA
1120382448,1120382463,US
-1120382464,1120382719,CA
-1120382720,1120385279,US
+1120382464,1120382975,CA
+1120382976,1120385279,US
1120385280,1120385535,CA
1120385536,1120386559,US
-1120386560,1120386815,CA
-1120386816,1120509951,US
+1120386560,1120387071,CA
+1120387072,1120486655,US
+1120486656,1120486911,CA
+1120486912,1120487423,US
+1120487424,1120487679,CA
+1120487680,1120489471,US
+1120489472,1120489727,CA
+1120489728,1120491519,US
+1120491520,1120491775,CA
+1120491776,1120492543,US
+1120492544,1120493055,CA
+1120493056,1120493823,US
+1120493824,1120494079,CA
+1120494080,1120494335,US
+1120494336,1120494591,CA
+1120494592,1120496639,US
+1120496640,1120496895,CA
+1120496896,1120497407,US
+1120497408,1120497663,CA
+1120497664,1120498943,US
+1120498944,1120499199,CA
+1120499200,1120501247,US
+1120501248,1120501503,CA
+1120501504,1120509951,US
1120509952,1120515583,SV
1120515584,1120515839,GT
1120515840,1120516095,SV
-1120516096,1120518143,US
+1120516096,1120517119,US
+1120517120,1120517375,CN
+1120517376,1120517631,AR
+1120517632,1120517887,US
+1120517888,1120518143,CL
1120518144,1120534527,CA
1120534528,1120641023,US
1120641024,1120657407,CA
-1120657408,1120740351,US
+1120657408,1120737023,US
+1120737024,1120737279,BS
+1120737280,1120740351,US
1120740352,1120741375,TT
-1120741376,1120788479,US
-1120789248,1120789503,US
-1120789760,1120790015,US
-1120792576,1120792831,US
+1120741376,1120741631,US
+1120741632,1120741887,MX
+1120741888,1120743423,US
+1120743424,1120743679,KN
+1120743680,1120744447,US
+1120744448,1120744703,KN
+1120744704,1120792575,US
1120793272,1120793279,US
1120793856,1120794111,US
-1120794368,1120794623,US
1120795136,1120854015,US
1120854016,1120862207,CA
1120862208,1120875007,US
@@ -10197,31 +11707,43 @@
1121042432,1121230847,US
1121230848,1121239039,CA
1121239040,1121247231,US
-1121247232,1121255423,CA
+1121247232,1121250303,CA
+1121250304,1121250815,BZ
+1121250816,1121252863,CA
+1121252864,1121253119,BZ
+1121253120,1121253887,CA
+1121253888,1121254143,BZ
+1121254144,1121255423,CA
1121255424,1121714998,US
1121714999,1121714999,KW
1121715000,1121878015,US
1121878016,1121910783,CA
1121910784,1122074623,US
-1122074624,1122086655,CA
-1122086656,1122086911,US
-1122086912,1122087935,CA
+1122074624,1122087935,CA
1122087936,1122088191,US
1122088192,1122091007,CA
-1122091008,1122140159,US
+1122091008,1122092799,US
+1122092800,1122093055,CA
+1122093056,1122140159,US
1122140160,1122148351,CA
-1122148352,1122412497,US
+1122148352,1122203135,US
+1122203136,1122203391,GB
+1122203392,1122412497,US
1122412498,1122412498,LB
-1122412499,1122430975,US
+1122412499,1122416383,US
+1122416384,1122416639,DM
+1122416640,1122417919,US
+1122417920,1122418175,AU
+1122418176,1122430975,US
1122434048,1122451455,US
1122451456,1122455551,CO
1122455552,1122476031,US
1122476032,1122480127,PR
-1122480128,1122497791,US
+1122480128,1122494975,US
+1122494976,1122495231,PR
+1122495232,1122497791,US
1122497792,1122498047,PR
-1122498048,1122498815,US
-1122498816,1122499071,PR
-1122499072,1122533375,US
+1122498048,1122533375,US
1122533376,1122535423,GB
1122535424,1122538495,KR
1122538496,1122635775,US
@@ -10236,32 +11758,67 @@
1123398656,1123399679,US
1123401728,1123534847,US
1123534848,1123536895,AW
-1123536896,1123590143,US
+1123536896,1123584511,US
+1123584512,1123584767,ES
+1123584768,1123589631,US
+1123589632,1123589887,DE
+1123589888,1123590143,US
1123590144,1123598335,VI
1123598336,1123606527,CA
-1123606528,1123651583,US
-1123651584,1123652863,JM
+1123606528,1123635199,US
+1123635200,1123635455,AU
+1123635456,1123635639,GB
+1123635640,1123635640,RU
+1123635641,1123635670,GB
+1123635671,1123635671,RU
+1123635672,1123635711,GB
+1123635712,1123638527,US
+1123638528,1123638783,FR
+1123638784,1123651583,US
+1123651584,1123651839,JM
+1123651840,1123652095,BB
+1123652096,1123652863,JM
1123652864,1123653119,HT
-1123653120,1123653631,JM
+1123653120,1123653375,BB
+1123653376,1123653631,JM
1123653632,1123654655,KY
1123654656,1123655679,JM
1123655680,1123663871,US
-1123663872,1123664895,SV
-1123664896,1123666943,US
-1123666944,1123667967,SV
+1123663872,1123667967,SV
1123667968,1123670015,PR
1123670016,1123671039,US
1123671040,1123672063,PY
1123672064,1123694591,US
1123694592,1123694847,CA
1123694848,1123778559,US
-1123794944,1123848191,US
+1123794944,1123795199,DO
+1123795200,1123801087,US
+1123801088,1123801343,RU
+1123801344,1123848191,US
1123848192,1123852287,CA
1123852288,1123950591,US
1123950592,1123958783,CA
-1123958784,1125087999,US
+1123958784,1125064703,US
+1125064704,1125065215,GB
+1125065216,1125081855,US
+1125081856,1125082111,DE
+1125082112,1125082367,US
+1125082368,1125082623,DE
+1125082624,1125087999,US
1125088000,1125088255,CA
-1125088256,1125238553,US
+1125088256,1125099775,US
+1125099776,1125100031,GB
+1125100032,1125112831,US
+1125112832,1125113087,MA
+1125113088,1125116415,US
+1125116416,1125116671,MA
+1125116672,1125117183,US
+1125117184,1125117439,MA
+1125117440,1125120255,US
+1125120256,1125120511,MA
+1125120512,1125156304,US
+1125156305,1125156305,DE
+1125156306,1125238553,US
1125238554,1125238554,ES
1125238555,1125290241,US
1125290242,1125290242,AE
@@ -10269,21 +11826,30 @@
1125458944,1125459455,US
1125462016,1125474303,US
1125474304,1125478399,CA
-1125478400,1125498879,US
+1125478400,1125481215,US
+1125481216,1125481727,CA
+1125481728,1125498879,US
1125498880,1125501439,CA
1125501440,1125501695,US
-1125501696,1125515263,CA
+1125501696,1125508095,CA
+1125508096,1125508351,PA
+1125508352,1125514239,CA
+1125514240,1125514495,CY
+1125514496,1125514751,US
+1125514752,1125515263,CA
1125515264,1125531647,US
1125531648,1125543887,CA
1125543888,1125543903,US
1125543904,1125543935,CA
1125543936,1125545983,US
-1125548032,1125552127,CA
+1125548032,1125550079,CA
+1125550080,1125550335,US
+1125550336,1125552127,CA
1125552128,1125572607,US
-1125572608,1125575167,CA
-1125575168,1125575423,US
-1125575424,1125576703,CA
-1125576704,1125613567,US
+1125572608,1125576703,CA
+1125576704,1125593371,US
+1125593372,1125593375,GB
+1125593376,1125613567,US
1125613568,1125617663,CA
1125617664,1126924287,US
1126924288,1126928383,CA
@@ -10305,28 +11871,30 @@
1130538752,1130539007,GU
1130539008,1133461247,US
1133461248,1133461503,CA
-1133461504,1134444543,US
+1133461504,1133789695,US
+1133789696,1133789823,GB
+1133789824,1134444543,US
1134444544,1134448639,CA
1134448640,1134546943,US
1134546944,1134551039,CA
-1134551040,1136523647,US
-1136523648,1136523775,CA
+1134551040,1136523263,US
+1136523264,1136523775,CA
1136523776,1136721919,US
1136721920,1136787455,CA
-1136787456,1137278975,US
+1136787456,1137195519,US
+1137195520,1137195775,JP
+1137195776,1137278975,US
1137278976,1137283071,CA
1137283072,1137287167,US
1137287168,1137295359,CA
-1137295360,1137369727,US
+1137295360,1137369343,US
+1137369344,1137369599,CA
+1137369600,1137369727,US
1137369728,1137369759,CA
-1137369760,1137376271,US
-1137376272,1137376287,CA
-1137376288,1137376351,US
-1137376352,1137376367,CA
-1137376368,1137376415,US
-1137376416,1137376447,CA
-1137376448,1137376463,US
-1137376464,1137376543,CA
+1137369760,1137369855,US
+1137369856,1137370111,CA
+1137370112,1137376255,US
+1137376256,1137376543,CA
1137376544,1137376575,US
1137376576,1137376591,CA
1137376592,1137376623,US
@@ -10345,12 +11913,14 @@
1137541120,1137623039,US
1137623040,1137639423,PR
1137639424,1137704959,US
-1137704960,1137706239,CA
-1137706240,1137706312,US
-1137706313,1137706313,CA
-1137706314,1137706495,US
-1137706496,1137713151,CA
-1137713152,1137868799,US
+1137704960,1137712383,CA
+1137712384,1137712639,US
+1137712640,1137713151,CA
+1137713152,1137758207,US
+1137758208,1137758463,GB
+1137758464,1137840127,US
+1137840128,1137840383,CA
+1137840384,1137868799,US
1137868800,1137872895,CA
1137872896,1137876991,US
1137876992,1137881087,CA
@@ -10359,10 +11929,16 @@
1137893376,1137917951,US
1137917952,1137922047,CA
1137922048,1137926143,US
-1137926144,1137934335,CA
+1137926144,1137926655,CA
+1137926656,1137926911,AW
+1137926912,1137929727,CA
+1137929728,1137929983,IE
+1137929984,1137934335,CA
1137934336,1137950719,US
-1137950720,1137954815,CA
-1137954816,1137963007,US
+1137950720,1137952255,CA
+1137952256,1137952767,US
+1137952768,1137954303,CA
+1137954304,1137963007,US
1137963008,1137967103,VI
1137967104,1137975295,CA
1137975296,1137983487,US
@@ -10385,29 +11961,35 @@
1138196480,1138204671,CA
1138204672,1138212863,US
1138212864,1138216959,CA
-1138216960,1138372607,US
-1138372608,1138373119,AS
+1138216960,1138372863,US
+1138372864,1138373119,AS
1138373120,1138373887,US
1138373888,1138374655,AS
1138374656,1138374911,US
-1138374912,1138375167,AS
-1138375168,1138375423,US
-1138375424,1138375679,AS
-1138375680,1138499583,US
+1138374912,1138375679,AS
+1138375680,1138419711,US
+1138419712,1138419967,DE
+1138419968,1138499583,US
1138499584,1138503679,CA
1138503680,1138508575,US
1138508576,1138508591,IT
1138508592,1138509823,US
1138509824,1138510847,IN
-1138510848,1138593791,US
+1138510848,1138544895,US
+1138544896,1138545151,GB
+1138545152,1138593791,US
1138593792,1138597887,CA
-1138597888,1138712575,US
+1138597888,1138600447,US
+1138600448,1138600703,BE
+1138600704,1138712575,US
1138712576,1138716671,CA
1138716672,1138720767,US
1138720768,1138728959,CA
1138728960,1138774015,US
1138774016,1138778111,CA
-1138778112,1138786303,US
+1138778112,1138780671,US
+1138780672,1138780679,CA
+1138780680,1138786303,US
1138786304,1138819071,PR
1138819072,1138851839,CA
1138851840,1138917375,US
@@ -10417,24 +11999,30 @@
1138950144,1139146751,US
1139146752,1139154943,GT
1139154944,1139167231,JM
-1139167232,1139168511,US
-1139168512,1139168639,PR
-1139168640,1139169279,US
+1139167232,1139167743,US
+1139167744,1139168767,PR
+1139168768,1139169279,US
1139169280,1139170303,PR
-1139170304,1139171327,US
-1139171328,1139175423,GT
-1139175424,1139175679,US
-1139175680,1139175935,PR
-1139175936,1139179519,US
+1139170304,1139171071,US
+1139171072,1139171327,PR
+1139171328,1139175679,US
+1139175680,1139175807,PR
+1139175808,1139179519,US
1139179520,1139195903,CA
1139195904,1139216383,US
1139216384,1139220479,CA
1139220480,1139265535,US
1139265536,1139269631,CA
-1139269632,1143726207,US
-1143726208,1143726335,CA
-1143726336,1145141247,US
-1145142784,1145188351,US
+1139269632,1144796671,US
+1144796672,1144796799,CA
+1144796800,1144796927,US
+1144796928,1144797055,CA
+1144797056,1145089791,US
+1145089792,1145090047,JP
+1145090048,1145141247,US
+1145142784,1145158143,US
+1145158144,1145158655,CA
+1145158656,1145188351,US
1145188352,1145192447,CA
1145192448,1145242111,US
1145242112,1145242367,NO
@@ -10496,13 +12084,17 @@
1151946240,1151946751,GB
1151946752,1152073727,US
1152073728,1152077823,CA
-1152077824,1152116479,US
+1152077824,1152083455,US
+1152083456,1152083711,MO
+1152083712,1152116479,US
1152116480,1152116735,CA
-1152116736,1152116991,US
-1152116992,1152117247,CA
-1152117248,1152117759,US
-1152117760,1152118015,IL
-1152118016,1152581631,US
+1152116736,1152117759,US
+1152117760,1152117952,IL
+1152117953,1152117953,CA
+1152117954,1152118015,IL
+1152118016,1152121855,US
+1152121856,1152122111,ID
+1152122112,1152581631,US
1152581632,1152614399,CA
1152614400,1152778239,US
1152778240,1152843775,CA
@@ -10512,7 +12104,11 @@
1156263936,1156265983,CA
1156265984,1156296703,US
1156296704,1156300799,CA
-1156300800,1157912703,US
+1156300800,1157753087,US
+1157753088,1157753343,GB
+1157753344,1157758207,US
+1157758208,1157758463,RU
+1157758464,1157912703,US
1157912704,1157912831,CA
1157912832,1157913215,US
1157913216,1157913279,CA
@@ -10520,23 +12116,38 @@
1157931008,1157935103,BS
1157935104,1157943295,US
1157943296,1157947391,CA
-1157947392,1158120959,US
+1157947392,1158027263,US
+1158027264,1158027519,CA
+1158027520,1158028287,US
+1158028288,1158028543,CA
+1158028544,1158120959,US
1158120960,1158121215,GB
1158121216,1158148095,US
1158148096,1158152191,CA
1158152192,1158234111,US
1158234112,1158250495,CA
-1158250496,1158316031,US
+1158250496,1158295807,US
+1158295808,1158296063,GB
+1158296064,1158316031,US
1158316032,1158324223,CA
1158324224,1158340607,US
1158340608,1158344703,CA
1158344704,1158348799,US
1158348800,1158381567,CA
-1158381568,1158724607,US
+1158381568,1158414591,US
+1158416336,1158416351,US
+1158416384,1158418431,US
+1158420480,1158439167,US
+1158439296,1158439423,US
+1158439680,1158439935,US
+1158440448,1158440703,US
+1158440960,1158724607,US
1158724608,1158724863,NL
1158724864,1158774783,US
1158774784,1158791167,CA
-1158791168,1158799359,BM
+1158791168,1158794239,BM
+1158794240,1158794495,US
+1158794496,1158799359,BM
1158799360,1158807551,CA
1158807552,1158995967,US
1158995968,1159004159,CA
@@ -10544,52 +12155,103 @@
1159213056,1159217151,CA
1159217152,1159249919,US
1159249920,1159254015,PR
-1159254016,1159348223,US
+1159254016,1159269119,US
+1159269120,1159269375,AR
+1159269376,1159274495,US
+1159274496,1159274751,GB
+1159274752,1159281919,US
+1159281920,1159282175,GB
+1159282176,1159300607,US
+1159300608,1159300863,SE
+1159300864,1159341103,US
+1159341104,1159341111,BR
+1159341112,1159348223,US
1159348224,1159356415,CA
1159356416,1159421951,US
1159421952,1159430143,CA
-1159430144,1159515135,US
-1159515136,1159515391,CA
-1159515392,1159517695,US
+1159430144,1159512575,US
+1159512576,1159512831,CA
+1159512832,1159513087,US
+1159513088,1159513343,CA
+1159513344,1159513599,US
+1159513600,1159514879,CA
+1159514880,1159515135,US
+1159515136,1159515647,CA
+1159515648,1159515903,US
+1159515904,1159516159,CA
+1159516160,1159516415,US
+1159516416,1159516671,NL
+1159516672,1159517695,US
1159517696,1159517951,CA
1159517952,1159518015,US
1159518016,1159518047,CA
1159518048,1159518191,US
1159518192,1159518199,CA
-1159518200,1159525375,US
-1159525376,1159525759,CA
-1159525760,1159700479,US
+1159518200,1159519743,US
+1159519744,1159520767,CA
+1159520768,1159521279,US
+1159521280,1159521791,CA
+1159521792,1159522815,US
+1159522816,1159523071,CA
+1159523072,1159523583,US
+1159523584,1159524351,CA
+1159524352,1159525375,US
+1159525376,1159526399,CA
+1159526400,1159527935,US
+1159527936,1159528191,CA
+1159528192,1159694591,US
+1159694592,1159694847,CA
+1159694848,1159700479,US
1159700480,1159725055,CA
-1159725056,1159767039,US
-1159767040,1159767295,CA
-1159767296,1160011775,US
+1159725056,1160011775,US
1160011776,1160019967,CA
1160019968,1160202239,US
1160202240,1160202495,CA
1160202496,1160364031,US
1160364032,1160368127,CA
-1160368128,1160392703,US
+1160368128,1160373247,US
+1160373248,1160373503,AE
+1160373504,1160392703,US
1160392704,1160396799,CA
-1160396800,1160406319,US
+1160396800,1160405759,US
+1160405760,1160406015,DO
+1160406016,1160406319,US
1160406320,1160406335,DO
-1160406336,1160410511,US
+1160406336,1160408319,US
+1160408320,1160408575,CA
+1160408576,1160409599,US
+1160409600,1160410111,CO
+1160410112,1160410511,US
1160410512,1160410519,EC
1160410520,1160410551,US
1160410552,1160410559,EC
1160410560,1160425471,US
1160425472,1160429567,CA
-1160429568,1160609791,US
+1160429568,1160486911,US
+1160486912,1160487423,AU
+1160487424,1160505343,US
+1160505344,1160505855,AU
+1160505856,1160547839,US
+1160547840,1160548351,MX
+1160548352,1160563199,US
+1160563200,1160563711,MP
+1160563712,1160609791,US
1160609792,1160610815,MX
1160610816,1160667135,US
-1160667136,1160675327,CA
-1160675328,1160683519,US
+1160667136,1160667903,CA
+1160667904,1160668159,US
+1160668160,1160675327,CA
+1160675328,1160678399,US
+1160678400,1160678655,MX
+1160678656,1160683519,US
1160683520,1160691711,CA
-1160691712,1160699903,US
-1160704000,1160847359,US
+1160691712,1160810495,US
+1160810496,1160810751,CA
+1160810752,1160847359,US
1160847360,1160855551,CA
-1160855552,1160868351,US
-1160868352,1160868607,CA
-1160868608,1160921087,US
+1160855552,1160863999,US
+1160864000,1160864255,CA
+1160864256,1160921087,US
1160921088,1160925183,AG
1160925184,1160945663,US
1160945664,1160953855,CA
@@ -10597,18 +12259,41 @@
1161019392,1161035775,CA
1161035776,1161052671,US
1161052672,1161052927,GB
-1161052928,1161293823,US
+1161052928,1161053439,US
+1161053440,1161053695,GB
+1161053696,1161293823,US
1161293824,1161297919,CA
1161297920,1161363455,US
1161363456,1161367551,CA
1161367552,1161416703,US
1161416704,1161420799,CA
-1161420800,1161425151,AG
+1161420800,1161421311,AG
+1161421312,1161421567,AI
+1161421568,1161422079,AG
+1161422080,1161422335,VG
+1161422336,1161422591,LC
+1161422592,1161422847,AG
+1161422848,1161423103,LC
+1161423104,1161423359,VG
+1161423360,1161423615,AI
+1161423616,1161423871,AG
+1161423872,1161424127,LC
+1161424128,1161424383,AI
+1161424384,1161424639,KN
+1161424640,1161424895,LC
+1161424896,1161425151,VG
1161425152,1161425407,DM
-1161425408,1161428543,AG
-1161428544,1161428607,KN
-1161428608,1161428991,AG
-1161428992,1161431039,CA
+1161425408,1161425663,AG
+1161425664,1161425919,AI
+1161425920,1161426943,AG
+1161426944,1161427199,AI
+1161427200,1161427455,VG
+1161427456,1161428223,AG
+1161428224,1161428991,KN
+1161428992,1161429247,US
+1161429248,1161429503,CA
+1161429504,1161429759,US
+1161429760,1161431039,CA
1161431040,1161433087,US
1161433088,1161437183,CA
1161437184,1161453567,US
@@ -10627,25 +12312,39 @@
1161631624,1161631631,KW
1161631632,1161634079,US
1161634080,1161634087,AF
-1161634088,1161764863,US
+1161634088,1161634559,US
+1161634560,1161634815,IN
+1161634816,1161649407,US
+1161649408,1161649663,AR
+1161649664,1161764863,US
1161764864,1161773055,CA
1161773056,1161777151,SZ
1161777152,1161818111,US
1161818112,1161822207,CA
1161822208,1161830425,US
1161830426,1161830426,UA
-1161830427,1161831384,US
+1161830427,1161830596,US
+1161830597,1161830597,UA
+1161830598,1161831384,US
1161831385,1161831385,UA
1161831386,1161832483,US
1161832484,1161832484,UA
-1161832485,1161835230,US
+1161832485,1161835225,US
+1161835226,1161835226,UA
+1161835227,1161835230,US
1161835231,1161835231,PH
-1161835232,1161885695,US
+1161835232,1161837567,US
+1161837568,1161837823,JP
+1161837824,1161885695,US
1161885696,1161886207,JP
1161886208,1161886975,US
1161886976,1161887231,DE
1161887232,1161887743,AU
-1161887744,1162018815,US
+1161887744,1161925631,US
+1161925632,1161925887,EC
+1161925888,1161926399,US
+1161926400,1161926655,EC
+1161926656,1162018815,US
1162018816,1162022911,CA
1162022912,1162027007,US
1162027008,1162031103,ZA
@@ -10660,62 +12359,25 @@
1162305536,1162461183,US
1162461184,1162461695,BB
1162461696,1162462207,GD
-1162462208,1162463008,BB
-1162463009,1162463009,VC
-1162463010,1162463011,BB
-1162463012,1162463012,VC
-1162463013,1162463018,BB
-1162463019,1162463019,VC
-1162463020,1162463052,BB
-1162463053,1162463053,VC
-1162463054,1162463057,BB
-1162463058,1162463058,VC
-1162463059,1162463061,BB
-1162463062,1162463062,VC
-1162463063,1162463087,BB
-1162463088,1162463088,VC
-1162463089,1162463117,BB
-1162463118,1162463119,VC
-1162463120,1162463123,BB
-1162463124,1162463124,VC
-1162463125,1162463131,BB
-1162463132,1162463132,VC
-1162463133,1162463135,BB
-1162463136,1162463136,VC
-1162463137,1162463143,BB
-1162463144,1162463144,VC
-1162463145,1162463153,BB
-1162463154,1162463154,VC
-1162463155,1162463155,BB
-1162463156,1162463156,VC
-1162463157,1162463161,BB
-1162463162,1162463163,VC
-1162463164,1162463170,BB
-1162463171,1162463171,VC
-1162463172,1162463179,BB
-1162463180,1162463181,VC
-1162463182,1162463183,BB
-1162463184,1162463184,VC
-1162463185,1162463187,BB
-1162463188,1162463188,VC
-1162463189,1162463216,BB
-1162463217,1162463217,VC
-1162463218,1162465279,BB
+1162462208,1162462975,BB
+1162462976,1162463999,VC
+1162464000,1162465279,BB
1162465280,1162465535,GD
1162465536,1162470911,BB
1162470912,1162471423,GD
-1162471424,1162472959,BB
-1162472960,1162473215,VC
-1162473216,1162473727,BB
-1162473728,1162474751,GD
-1162474752,1162477567,BB
+1162471424,1162472703,BB
+1162472704,1162473471,VC
+1162473472,1162475007,GD
+1162475008,1162477567,BB
1162477568,1162715135,US
-1162715136,1162715647,CA
-1162715648,1162715903,US
-1162715904,1162723327,CA
-1162723328,1162807295,US
+1162715136,1162723327,CA
+1162723328,1162806527,US
+1162806528,1162806783,PR
+1162806784,1162807295,US
1162807296,1162809343,PR
-1162809344,1162812159,US
+1162809344,1162811391,US
+1162811392,1162811647,CW
+1162811648,1162812159,US
1162812160,1162812415,DO
1162812416,1162813439,BS
1162813440,1162817535,US
@@ -10726,58 +12388,92 @@
1162831872,1162833919,PR
1162833920,1162835967,GT
1162835968,1162836223,BS
-1162836224,1162836991,US
+1162836224,1162836735,CW
+1162836736,1162836991,US
1162836992,1162838015,BS
-1162838016,1162854399,US
+1162838016,1162840063,PR
+1162840064,1162853375,US
+1162853376,1162854399,PR
1162854400,1162858495,JM
1162858496,1162862591,HN
-1162862592,1162863359,PR
-1162863360,1162863615,US
-1162863616,1162866687,PR
+1162862592,1162866687,PR
1162866688,1162870783,US
-1162870784,1162872575,BB
-1162872576,1162872831,LC
-1162872832,1162881023,BB
-1162881024,1162881279,DM
-1162881280,1162882559,BB
-1162882560,1162883583,GD
-1162883584,1162887167,BB
-1162887168,1163378943,US
-1163382784,1163383295,US
-1163383808,1163384063,US
-1163386880,1163400959,US
+1162870784,1162871295,BB
+1162871296,1162879999,LC
+1162880000,1162882559,DM
+1162882560,1162883839,GD
+1162883840,1162884863,BB
+1162884864,1162885887,VC
+1162885888,1162887167,BB
+1162887168,1163398655,US
+1163398656,1163398911,BD
+1163398912,1163400959,US
1163400960,1163401215,BD
1163401216,1163401471,US
1163401472,1163401727,ID
-1163401728,1163407359,US
+1163401728,1163401983,US
+1163401984,1163402239,BD
+1163402240,1163402495,US
+1163402496,1163402751,BD
+1163402752,1163407359,US
1163407360,1163411455,CA
1163411456,1163468799,US
-1163468800,1163472895,PR
-1163472896,1163526143,US
-1163526144,1163526655,CA
-1163526656,1163530655,US
+1163468800,1163469055,PR
+1163469056,1163469311,US
+1163469312,1163472895,PR
+1163472896,1163479295,US
+1163479296,1163479551,CA
+1163479552,1163526143,US
+1163526144,1163526399,CA
+1163526400,1163526655,US
+1163526656,1163526911,CA
+1163526912,1163527167,US
+1163527168,1163527679,CA
+1163527680,1163527935,US
+1163527936,1163529215,CA
+1163529216,1163530655,US
1163530656,1163530663,CA
1163530664,1163530991,US
-1163530992,1163531007,CA
-1163531008,1163531263,US
-1163531264,1163532287,CA
-1163532288,1163533807,US
+1163530992,1163532799,CA
+1163532800,1163533055,US
+1163533056,1163533311,CA
+1163533312,1163533807,US
1163533808,1163533823,CA
1163533824,1163534255,US
1163534256,1163534271,CA
-1163534272,1163538175,US
-1163538176,1163539455,CA
+1163534272,1163535359,US
+1163535360,1163535615,CA
+1163535616,1163535871,US
+1163535872,1163536383,CA
+1163536384,1163537663,US
+1163537664,1163539455,CA
1163539456,1163540351,US
1163540352,1163540479,CA
-1163540480,1163542015,US
-1163542016,1163542527,CA
-1163542528,1163545343,US
-1163545344,1163545597,CA
-1163545598,1163545598,US
-1163545599,1163545599,CA
+1163540480,1163540735,US
+1163540736,1163541503,CA
+1163541504,1163542015,US
+1163542016,1163542783,CA
+1163542784,1163543039,US
+1163543040,1163543551,CA
+1163543552,1163544063,US
+1163544064,1163544319,CA
+1163544320,1163544831,US
+1163544832,1163545087,CA
+1163545088,1163545343,US
+1163545344,1163545599,CA
1163545600,1163546015,US
1163546016,1163546031,CA
-1163546032,1163550815,US
+1163546032,1163546623,US
+1163546624,1163546879,CA
+1163546880,1163547135,US
+1163547136,1163547391,CA
+1163547392,1163548159,US
+1163548160,1163548927,CA
+1163548928,1163549183,US
+1163549184,1163549695,CA
+1163549696,1163549951,US
+1163549952,1163550207,CA
+1163550208,1163550815,US
1163550816,1163550831,CA
1163550832,1163550847,US
1163550848,1163550975,CA
@@ -10787,64 +12483,83 @@
1163551456,1163551487,CA
1163551488,1163551631,US
1163551632,1163551647,CA
-1163551648,1163552519,US
+1163551648,1163551743,US
+1163551744,1163552255,CA
+1163552256,1163552519,US
1163552520,1163552527,CA
1163552528,1163552543,US
1163552544,1163552559,CA
1163552560,1163552607,US
1163552608,1163552623,CA
-1163552624,1163554047,US
-1163554048,1163554303,CA
-1163554304,1163554815,US
+1163552624,1163552767,US
+1163552768,1163553791,CA
+1163553792,1163554047,US
+1163554048,1163554559,CA
+1163554560,1163554815,US
1163554816,1163555839,CA
1163555840,1163556095,US
-1163556096,1163556351,CA
-1163556352,1163561215,US
-1163561216,1163561471,CA
-1163561472,1163562239,US
-1163562240,1163562495,CA
-1163562496,1163564031,US
-1163564032,1163564543,CA
-1163564544,1163564799,US
-1163564800,1163565311,CA
+1163556096,1163556607,CA
+1163556608,1163559679,US
+1163559680,1163559935,CA
+1163559936,1163560959,US
+1163560960,1163561983,CA
+1163561984,1163562239,US
+1163562240,1163563007,CA
+1163563008,1163564031,US
+1163564032,1163565311,CA
1163565312,1163567103,US
1163567104,1163568127,CA
1163568128,1163571199,US
-1163571200,1163571711,CA
-1163571712,1163575039,US
+1163571200,1163571967,CA
+1163571968,1163572223,US
+1163572224,1163572479,CA
+1163572480,1163575039,US
1163575040,1163575295,IN
-1163575296,1163576063,US
-1163576064,1163576319,CA
-1163576320,1163582031,US
+1163575296,1163576575,CA
+1163576576,1163579903,US
+1163579904,1163580159,NL
+1163580160,1163580927,US
+1163580928,1163581183,CA
+1163581184,1163581695,US
+1163581696,1163581951,CA
+1163581952,1163582031,US
1163582032,1163582039,CA
1163582040,1163582079,US
1163582080,1163582111,CA
-1163582112,1163582975,US
-1163582976,1163583487,CA
-1163583488,1163588351,US
+1163582112,1163582207,US
+1163582208,1163583487,CA
+1163583488,1163587583,US
+1163587584,1163588095,CA
+1163588096,1163588351,US
1163588352,1163588607,CA
-1163588608,1167851519,US
+1163588608,1163588863,US
+1163588864,1163589631,CA
+1163589632,1167851519,US
1167851520,1168113663,CA
1168113664,1168138239,US
1168138240,1168146431,JM
1168146432,1168211967,US
1168211968,1168220159,CA
-1168220160,1168393503,US
+1168220160,1168318719,US
+1168318720,1168318975,CA
+1168318976,1168321535,US
+1168321536,1168321791,CA
+1168321792,1168393215,US
+1168393216,1168393471,CA
+1168393472,1168393503,US
1168393504,1168393519,CA
1168393520,1168393543,US
1168393544,1168393567,CA
1168393568,1168393663,US
-1168393664,1168393791,CA
-1168393792,1168393935,US
-1168393936,1168393943,CA
-1168393944,1168393951,US
-1168393952,1168393983,CA
+1168393664,1168393983,CA
1168393984,1168394143,US
1168394144,1168394151,CA
1168394152,1168394239,US
1168394240,1168394495,CA
-1168394496,1168394687,US
-1168394688,1168394751,CA
+1168394496,1168394575,US
+1168394576,1168394591,CA
+1168394592,1168394719,US
+1168394720,1168394751,CA
1168394752,1168420863,US
1168420864,1168424959,CA
1168424960,1168461823,US
@@ -10857,45 +12572,74 @@
1168535552,1168539647,CA
1168539648,1168670719,US
1168670720,1168687103,CA
-1168687104,1168859135,US
+1168687104,1168697599,US
+1168697600,1168697855,GB
+1168697856,1168698111,NL
+1168698112,1168727551,US
+1168727552,1168727807,ES
+1168727808,1168859135,US
1168859136,1168863231,CA
1168863232,1168867327,US
1168867328,1168875519,CA
-1168875520,1168887807,US
-1168887808,1168891903,CA
-1168891904,1168916479,US
+1168875520,1168916479,US
1168916480,1168932863,CA
1168932864,1168936959,US
1168936960,1168949247,CA
-1168949248,1168950783,US
-1168950784,1168951295,CA
+1168949248,1168949503,US
+1168949504,1168949759,CA
+1168949760,1168950271,US
+1168950272,1168951295,CA
1168951296,1168952575,US
1168952576,1168952831,CA
1168952832,1168952887,US
1168952888,1168952895,CA
-1168952896,1168955903,US
-1168955904,1168956159,CA
-1168956160,1168957183,US
+1168952896,1168955647,US
+1168955648,1168956415,CA
+1168956416,1168957183,US
1168957184,1168957311,IN
-1168957312,1168957951,US
-1168957952,1168958207,CA
+1168957312,1168957439,US
+1168957440,1168958207,CA
1168958208,1168958271,US
1168958272,1168958303,CA
1168958304,1168958527,US
1168958528,1168958559,IN
1168958560,1168960671,US
1168960672,1168960703,CA
-1168960704,1168961887,US
+1168960704,1168961023,US
+1168961024,1168961791,CA
+1168961792,1168961807,US
+1168961808,1168961815,CA
+1168961816,1168961887,US
1168961888,1168961919,CA
-1168961920,1168963583,US
-1168963584,1168964863,CA
-1168964864,1168973823,US
+1168961920,1168962303,US
+1168962304,1168962559,CA
+1168962560,1168963071,US
+1168963072,1168965631,CA
+1168965632,1168973823,US
1168973824,1168982015,CA
-1168982016,1169203199,US
+1168982016,1169182975,US
+1169182976,1169183487,CA
+1169183488,1169184767,US
+1169184768,1169185023,CA
+1169185024,1169185535,US
+1169185536,1169186047,CA
+1169186048,1169186303,SG
+1169186304,1169203199,US
1169203200,1169211391,CA
1169211392,1170190335,US
1170190336,1170190847,GB
-1170190848,1170472959,US
+1170190848,1170227199,US
+1170227200,1170231295,NL
+1170231296,1170461183,US
+1170461184,1170461695,CO
+1170461696,1170465791,US
+1170465792,1170466047,CY
+1170466048,1170467839,US
+1170467840,1170468351,DO
+1170468352,1170470911,US
+1170470912,1170471167,ES
+1170471168,1170472703,US
+1170472704,1170472959,VG
1170472960,1170481151,CA
1170481152,1170489343,US
1170489344,1170497535,CA
@@ -10903,9 +12647,7 @@
1170505728,1170522111,CA
1170522112,1175728639,US
1175728640,1175728895,CA
-1175728896,1175730815,US
-1175730816,1175730943,CA
-1175730944,1175977983,US
+1175728896,1175977983,US
1175977984,1176502271,CA
1176502272,1176616959,US
1176616960,1176620031,CA
@@ -10913,17 +12655,25 @@
1176620448,1176620479,CA
1176620480,1176621311,US
1176621312,1176621575,CA
-1176621576,1176622591,US
+1176621576,1176622079,US
+1176622080,1176622335,GB
+1176622336,1176622591,US
1176622592,1176623103,CA
-1176623104,1176626111,US
+1176623104,1176623871,US
+1176623872,1176625151,CA
+1176625152,1176626111,US
1176626112,1176626127,CA
-1176626128,1176631039,US
-1176631040,1176631295,CA
-1176631296,1176702975,US
+1176626128,1176630271,US
+1176630272,1176631295,CA
+1176631296,1176631423,NL
+1176631424,1176702975,US
1176702976,1176707071,CA
1176707072,1176731647,US
1176731648,1176735743,PR
-1176735744,1176739839,US
+1176735744,1176738303,US
+1176738304,1176739071,CO
+1176739072,1176739583,US
+1176739584,1176739839,CO
1176739840,1176743935,CA
1176743936,1176752127,US
1176752128,1176756223,CA
@@ -10931,7 +12681,10 @@
1176764416,1176768511,PM
1176768512,1176770927,US
1176770928,1176770935,DO
-1176770936,1176776703,US
+1176770936,1176771327,US
+1176771328,1176771583,KR
+1176771584,1176771839,GB
+1176771840,1176776703,US
1176776704,1176780799,CA
1176780800,1176895487,US
1176895488,1176897047,CA
@@ -10947,7 +12700,15 @@
1176917840,1176925007,CA
1176925008,1176925015,NG
1176925016,1176928255,CA
-1176928256,1177030655,US
+1176928256,1177000703,US
+1177000704,1177000711,CA
+1177000712,1177000719,US
+1177000720,1177000735,CA
+1177000736,1177000751,US
+1177000752,1177000759,CA
+1177000760,1177022975,US
+1177022976,1177023231,GB
+1177023232,1177030655,US
1177030656,1177033727,AG
1177033728,1177059327,US
1177059328,1177061375,CA
@@ -10958,20 +12719,26 @@
1177164896,1177165055,US
1177165056,1177165311,CA
1177165312,1177354239,US
-1177354240,1177419775,PR
+1177354240,1177357311,PR
+1177357312,1177357567,US
+1177357568,1177405695,PR
+1177405696,1177405951,US
+1177405952,1177419775,PR
1177419776,1177505401,US
1177505402,1177505402,BB
1177505403,1177550847,US
-1177550848,1177592831,CA
-1177592832,1177593087,US
-1177593088,1178075135,CA
+1177550848,1178075135,CA
1178075136,1178599423,US
1178599424,1179910143,CA
-1179910144,1180124865,US
+1179910144,1180113919,US
+1180113920,1180114431,AE
+1180114432,1180124865,US
1180124866,1180124866,AE
1180124867,1191673855,US
1191673856,1191706623,CA
-1191706624,1192296447,US
+1191706624,1192232127,US
+1192232128,1192232159,PA
+1192232160,1192296447,US
1192296448,1192361983,CA
1192361984,1192427519,US
1192427520,1192460287,CA
@@ -10979,13 +12746,17 @@
1192468480,1192476671,CA
1192476672,1192488959,US
1192488960,1192493055,CA
-1192493056,1207975935,US
+1192493056,1207932159,US
+1207932160,1207932415,CA
+1207932416,1207975935,US
1207975936,1207980031,CA
1207980032,1208008703,US
1208008704,1208016895,CA
1208016896,1208020991,US
1208020992,1208025087,CA
-1208025088,1208074239,US
+1208025088,1208050943,US
+1208050944,1208051199,CA
+1208051200,1208074239,US
1208074240,1208082431,CA
1208082432,1208090623,US
1208090624,1208107007,CA
@@ -11016,7 +12787,8 @@
1208935976,1208935983,TW
1208935984,1208935991,IN
1208935992,1208935999,JP
-1208936000,1208936191,US
+1208936000,1208936003,HK
+1208936004,1208936191,US
1208936192,1208936199,AU
1208936200,1208936207,SG
1208936208,1208936215,HK
@@ -11026,7 +12798,9 @@
1208936240,1208936247,JP
1208936248,1208936255,IN
1208936256,1208936263,MY
-1208936264,1208954879,US
+1208936264,1208936295,US
+1208936296,1208936299,HK
+1208936300,1208954879,US
1208954880,1208958975,CA
1208958976,1208975359,US
1208975360,1208983551,CA
@@ -11034,7 +12808,9 @@
1209358592,1209358847,DE
1209358848,1209359103,GB
1209359104,1209434111,US
-1209434112,1209440767,BB
+1209434112,1209436671,BB
+1209436672,1209437183,VC
+1209437184,1209440767,BB
1209440768,1209441279,GD
1209441280,1209442303,BB
1209442304,1209647103,US
@@ -11046,23 +12822,41 @@
1209729024,1209786367,JM
1209786368,1209810943,US
1209810944,1209819135,CA
-1209819136,1209917439,US
-1209917440,1209918367,CA
-1209918368,1209918399,US
-1209918400,1209925631,CA
+1209819136,1209824511,US
+1209824512,1209824767,CN
+1209824768,1209861119,US
+1209861120,1209861375,CA
+1209861376,1209862143,US
+1209862144,1209862399,CA
+1209862400,1209863167,US
+1209863168,1209863423,CA
+1209863424,1209863679,IN
+1209863680,1209863935,US
+1209863936,1209864191,CA
+1209864192,1209867263,US
+1209867264,1209867519,CA
+1209867520,1209917439,US
+1209917440,1209925631,CA
1209925632,1210253311,US
-1210253312,1210261503,CA
-1210261504,1210310655,US
-1210314752,1210420223,US
+1210253312,1210258431,CA
+1210258432,1210258687,US
+1210258688,1210261503,CA
+1210261504,1210420223,US
1210420224,1210420479,IT
-1210420480,1210449919,US
+1210420480,1210421503,US
+1210421504,1210421551,CA
+1210421552,1210449919,US
1210449920,1210580991,CA
1210580992,1210847231,US
1210851328,1210925055,US
1210925056,1210941439,CA
-1210941440,1211035711,US
+1210941440,1211033087,US
+1211033088,1211033599,CO
+1211033600,1211035711,US
1211035712,1211035775,CA
-1211035776,1211236351,US
+1211035776,1211038719,US
+1211038720,1211038975,CY
+1211038976,1211236351,US
1211236352,1211269119,PR
1211269120,1211303679,US
1211303680,1211303935,CA
@@ -11078,19 +12872,26 @@
1211308168,1211308175,CA
1211308176,1211308287,US
1211308288,1211308543,CA
-1211308544,1211316479,US
-1211316480,1211316735,CA
-1211316736,1211318271,US
+1211308544,1211308799,US
+1211308800,1211310079,CA
+1211310080,1211316479,US
+1211316480,1211316991,CA
+1211316992,1211317503,US
+1211317504,1211317759,CA
+1211317760,1211318271,US
1211318272,1211321343,BB
-1211321344,1211322111,VC
-1211322112,1211322623,BB
-1211322624,1211322879,GD
-1211322880,1211323135,BB
-1211323136,1211324159,GD
-1211324160,1211333631,BB
+1211321344,1211322367,VC
+1211322368,1211322623,BB
+1211322624,1211324159,GD
+1211324160,1211324927,VC
+1211324928,1211333119,BB
+1211333120,1211333631,VC
1211333632,1211333887,GD
-1211333888,1211334655,BB
-1211334656,1211432959,US
+1211333888,1211334655,VG
+1211334656,1211367935,US
+1211367936,1211368191,CA
+1211368192,1211368447,EE
+1211368448,1211432959,US
1211432960,1211473919,CA
1211473920,1211596799,US
1211596800,1211605999,CA
@@ -11117,9 +12918,7 @@
1224475648,1224476671,US
1224476672,1224476927,CW
1224476928,1224477183,US
-1224477184,1224478207,CW
-1224478208,1224478463,US
-1224478464,1224478719,CW
+1224477184,1224478719,CW
1224478720,1224480767,US
1224480768,1224484863,JM
1224484864,1224493055,GT
@@ -11148,13 +12947,19 @@
1245050690,1245050690,SA
1245050691,1245052289,US
1245052290,1245052545,SA
-1245052546,1245183999,US
+1245052546,1245144575,US
+1245144576,1245144831,CH
+1245144832,1245183999,US
1245184000,1245446143,CA
1245446144,1246890431,US
1246890432,1246890463,CA
1246890464,1246890464,US
1246890465,1246890495,CA
-1246890496,1246937087,US
+1246890496,1246902783,US
+1246902784,1246903039,NL
+1246903040,1246923519,US
+1246923520,1246923775,AU
+1246923776,1246937087,US
1246937088,1246945279,CA
1246945280,1247119439,US
1247119440,1247119447,KW
@@ -11189,9 +12994,7 @@
1248958464,1248959487,CA
1248959488,1248964607,US
1248964608,1248966655,CA
-1248966656,1248989311,US
-1248989312,1248989343,CA
-1248989344,1249003519,US
+1248966656,1249003519,US
1249003520,1249005567,CA
1249005568,1249010687,US
1249010688,1249011711,CA
@@ -11211,7 +13014,8 @@
1249083392,1249099775,US
1249099776,1249101823,CA
1249101824,1249102847,PR
-1249102848,1249103871,CA
+1249102848,1249103103,US
+1249103104,1249103871,CA
1249103872,1249106431,US
1249106432,1249106687,DE
1249106688,1249106943,US
@@ -11220,9 +13024,13 @@
1249130496,1249131519,JM
1249131520,1249139711,US
1249139712,1249140735,MF
-1249140736,1249163263,US
+1249140736,1249142015,US
+1249142016,1249142271,GB
+1249142272,1249163263,US
1249163264,1249165311,CA
-1249165312,1249171455,US
+1249165312,1249165823,US
+1249165824,1249166335,CA
+1249166336,1249171455,US
1249171456,1249173503,CA
1249173504,1249191935,US
1249191936,1249193983,CA
@@ -11234,7 +13042,9 @@
1249210368,1249212415,KY
1249212416,1249217535,US
1249217536,1249218559,CA
-1249218560,1249234687,US
+1249218560,1249227263,US
+1249227264,1249227519,VG
+1249227520,1249234687,US
1249234688,1249234943,GB
1249234944,1249236991,US
1249236992,1249239039,KY
@@ -11264,7 +13074,9 @@
1249396736,1249397759,CA
1249397760,1249409023,US
1249409024,1249410047,CA
-1249410048,1249452031,US
+1249410048,1249434623,US
+1249434624,1249435647,CA
+1249435648,1249452031,US
1249452032,1249453055,CA
1249453056,1249474559,US
1249474560,1249475583,CA
@@ -11275,7 +13087,9 @@
1249479936,1249480191,HK
1249480192,1249484799,US
1249484800,1249486847,CA
-1249486848,1249506303,US
+1249486848,1249492735,US
+1249492736,1249492991,CA
+1249492992,1249506303,US
1249506304,1249507327,CA
1249507328,1249516031,US
1249516032,1249516287,GB
@@ -11295,7 +13109,9 @@
1249592320,1249593343,CA
1249593344,1249598463,US
1249598464,1249599487,CA
-1249599488,1249710143,US
+1249599488,1249637887,US
+1249637888,1249638143,CA
+1249638144,1249710143,US
1249710144,1249710207,CN
1249710208,1249710271,NL
1249710272,1249710591,BE
@@ -11305,16 +13121,16 @@
1249715968,1249716735,US
1249716736,1249716991,DE
1249716992,1249720319,US
-1249720320,1249720367,AU
-1249720368,1249720383,SG
-1249720384,1249720575,AU
+1249720320,1249720511,AU
+1249720512,1249720527,IN
+1249720528,1249720575,AU
1249720576,1249720591,FR
1249720592,1249720599,GB
1249720600,1249720607,IT
1249720608,1249720831,GB
-1249720832,1249721120,US
-1249721121,1249721121,CA
-1249721122,1249721343,US
+1249720832,1249721119,US
+1249721120,1249721135,CA
+1249721136,1249721343,US
1249721344,1249721351,AT
1249721352,1249721359,BE
1249721360,1249721367,CH
@@ -11336,7 +13152,9 @@
1249721512,1249721519,TR
1249721520,1249721527,ZA
1249721528,1249721535,DK
-1249721536,1249721599,US
+1249721536,1249721543,US
+1249721544,1249721551,GB
+1249721552,1249721599,US
1249721600,1249721607,AT
1249721608,1249721615,BE
1249721616,1249721623,CH
@@ -11363,12 +13181,9 @@
1249721792,1249721799,KE
1249721800,1249721807,TR
1249721808,1249721815,ZA
-1249721816,1249721855,GB
-1249721856,1249722111,US
+1249721816,1249722111,US
1249722112,1249722367,IN
-1249722368,1249723903,US
-1249723904,1249724159,CN
-1249724160,1249725439,US
+1249722368,1249725439,US
1249725440,1249725695,NL
1249725696,1249725951,US
1249725952,1249726207,NL
@@ -11380,25 +13195,45 @@
1249754391,1249754391,DE
1249754392,1249796095,US
1249796096,1249804287,CA
-1249804288,1249886207,US
+1249804288,1249851903,US
+1249851904,1249852159,FR
+1249852160,1249886207,US
1249886208,1249902591,CA
1249902592,1254490111,US
1254490112,1254555647,CA
1254555648,1254621183,US
-1254621184,1254629375,CA
-1254629376,1254978751,US
+1254621184,1254622207,CA
+1254622208,1254622463,US
+1254622464,1254629375,CA
+1254629376,1254704383,US
+1254704384,1254704639,PH
+1254704640,1254978751,US
1254978752,1254978767,LB
1254978768,1254989823,US
1254989824,1254998015,CA
1254998016,1255002111,US
1255002112,1255006207,CA
-1255006208,1255047167,US
+1255006208,1255011583,US
+1255011584,1255011839,CA
+1255011840,1255047167,US
1255047168,1255055359,CA
-1255055360,1255245311,US
+1255055360,1255210495,US
+1255210496,1255211007,DE
+1255211008,1255245311,US
1255245312,1255245567,BR
-1255245568,1255276543,US
+1255245568,1255264511,US
+1255264512,1255264767,SG
+1255264768,1255274495,US
+1255274496,1255274751,SG
+1255274752,1255276543,US
1255276544,1255342079,CA
-1255342080,1255489535,US
+1255342080,1255367167,US
+1255367168,1255367423,DE
+1255367424,1255372287,US
+1255372288,1255372543,PA
+1255372544,1255372799,US
+1255372800,1255373055,DE
+1255373056,1255489535,US
1255489536,1255505919,PR
1255505920,1255514111,US
1255514112,1255522303,CA
@@ -11406,26 +13241,38 @@
1255571456,1255579647,CA
1255579648,1255669759,US
1255669760,1255735295,CA
-1255735296,1255907071,US
-1255907072,1255907327,PR
-1255907328,1255972863,US
+1255735296,1255770367,US
+1255770368,1255770623,CA
+1255770624,1255792127,US
+1255792128,1255792383,IL
+1255792384,1255972863,US
1255972864,1255981055,CA
1255981056,1256001535,US
1256001536,1256005631,CA
1256005632,1256030207,US
1256030208,1256034303,CA
-1256034304,1256054527,US
-1256054528,1256054783,CZ
+1256034304,1256054399,US
+1256054400,1256054783,CZ
1256054784,1256079359,US
1256079360,1256087551,KY
1256087552,1262783487,US
-1262783488,1262784511,CA
-1262784512,1264718591,US
+1262783488,1262783743,CA
+1262783744,1262783871,US
+1262783872,1262783999,CA
+1262784000,1262784127,US
+1262784128,1262784255,CA
+1262784256,1263271423,US
+1263271424,1263271679,CA
+1263271680,1264717823,US
+1264717824,1264718079,CA
+1264718080,1264718591,US
1264718592,1264718847,CA
1264718848,1264719103,US
1264719104,1264719871,CA
1264719872,1264762879,US
-1264762880,1264766975,CA
+1264762880,1264763391,CA
+1264763392,1264763647,IE
+1264763648,1264766975,CA
1264766976,1264990975,US
1264990976,1264991231,NL
1264991232,1266147327,US
@@ -11438,12 +13285,20 @@
1275600896,1275604991,BM
1275604992,1275621375,US
1275621376,1275625471,CA
-1275625472,1275666431,US
+1275625472,1275658239,US
+1275658240,1275658495,GB
+1275658496,1275659007,US
+1275659008,1275659263,GB
+1275659264,1275665151,US
+1275665152,1275665407,UA
+1275665408,1275666431,US
1275666432,1275674623,CA
1275674624,1275707391,US
1275707392,1275711487,CA
1275711488,1275712511,US
-1275712512,1275715583,CA
+1275712512,1275714047,CA
+1275714048,1275714559,US
+1275714560,1275715583,CA
1275715584,1275756543,US
1275756544,1275772927,CA
1275772928,1275789311,US
@@ -11456,17 +13311,25 @@
1279848448,1279851519,PR
1279851520,1279852031,VI
1279852032,1279852543,PR
-1279852544,1279951231,US
-1279951232,1279951359,CA
-1279951360,1279953151,US
-1279953152,1279953407,CA
-1279953408,1279960479,US
+1279852544,1279950847,US
+1279950848,1279951103,CA
+1279951104,1279951231,US
+1279951232,1279952127,CA
+1279952128,1279952383,US
+1279952384,1279952895,CA
+1279952896,1279953151,US
+1279953152,1279953663,CA
+1279953664,1279959551,US
+1279959552,1279959807,CA
+1279959808,1279960479,US
1279960480,1279960511,CA
1279960512,1279963135,US
1279963136,1279963391,IN
-1279963392,1279965695,US
-1279965696,1279966207,CA
-1279966208,1279968127,US
+1279963392,1279965183,US
+1279965184,1279966207,CA
+1279966208,1279967231,US
+1279967232,1279967487,CA
+1279967488,1279968127,US
1279968128,1279968255,CA
1279968256,1279969343,US
1279969344,1279969407,CA
@@ -11474,18 +13337,26 @@
1279969664,1279969791,CA
1279969792,1279970047,US
1279970048,1279970303,CA
-1279970304,1279970943,US
+1279970304,1279970559,US
+1279970560,1279970815,CA
+1279970816,1279970943,US
1279970944,1279971071,CA
-1279971072,1279973983,US
+1279971072,1279971583,US
+1279971584,1279972095,CA
+1279972096,1279973983,US
1279973984,1279974015,IN
-1279974016,1279976191,US
+1279974016,1279975423,US
+1279975424,1279975679,CA
+1279975680,1279976191,US
1279976192,1279976959,CA
1279976960,1279977215,US
1279977216,1279977471,CA
-1279977472,1279979775,US
+1279977472,1279977727,US
+1279977728,1279977983,CA
+1279977984,1279979775,US
1279979776,1279980031,CA
-1279980032,1279980799,US
-1279980800,1279981567,CA
+1279980032,1279980287,US
+1279980288,1279981567,CA
1279981568,1279999999,US
1280000000,1280032767,CA
1280032768,1280040959,US
@@ -11498,7 +13369,10 @@
1280092160,1280093183,KN
1280093184,1280094207,VG
1280094208,1280095231,AI
-1280095232,1280098303,AG
+1280095232,1280095487,KN
+1280095488,1280097279,AG
+1280097280,1280097791,LC
+1280097792,1280098303,AG
1280098304,1280102399,PR
1280102400,1280131071,US
1280131072,1280139263,CA
@@ -11583,14 +13457,25 @@
1296250464,1296250495,RO
1296250496,1296250527,FR
1296250528,1296250559,DK
-1296250560,1296251199,FR
+1296250560,1296250623,FR
+1296250624,1296250879,BE
+1296250880,1296251199,FR
1296251200,1296251231,NL
1296251232,1296251391,FR
1296251392,1296251775,NL
1296251776,1296251903,DE
1296251904,1296252479,FR
1296252480,1296252487,ES
-1296252488,1296252871,FR
+1296252488,1296252535,FR
+1296252536,1296252543,IT
+1296252544,1296252591,FR
+1296252592,1296252595,GB
+1296252596,1296252607,FR
+1296252608,1296252615,NL
+1296252616,1296252623,ES
+1296252624,1296252667,FR
+1296252668,1296252671,GB
+1296252672,1296252871,FR
1296252872,1296252879,DE
1296252880,1296256839,FR
1296256840,1296256847,US
@@ -11715,7 +13600,6 @@
1296738304,1296740351,CH
1296740352,1296744447,RU
1296744448,1296746495,GB
-1296746496,1296748543,SI
1296748544,1296750591,FR
1296750592,1296752639,NO
1296752640,1296754687,BA
@@ -11816,8 +13700,7 @@
1297727488,1297743871,MD
1297743872,1297760255,DE
1297760256,1297776639,LT
-1297776640,1297782783,DE
-1297782784,1297793023,US
+1297776640,1297793023,DE
1297793024,1297809407,UA
1297809408,1297825791,PL
1297825792,1297842175,RU
@@ -12018,9 +13901,7 @@
1307230208,1307238399,RU
1307238400,1307246591,SK
1307246592,1307254783,KG
-1307254784,1307261695,NL
-1307261696,1307261951,US
-1307261952,1307262975,NL
+1307254784,1307262975,NL
1307262976,1307271167,AT
1307271168,1307279359,MD
1307279360,1307287551,LB
@@ -12077,9 +13958,9 @@
1307631616,1307635711,IT
1307635712,1307636991,EE
1307636992,1307637247,LV
-1307637248,1307638527,EE
-1307638528,1307638783,LT
-1307638784,1307639551,EE
+1307637248,1307637503,EE
+1307637504,1307637759,LV
+1307637760,1307639551,EE
1307639552,1307639807,LT
1307639808,1307643903,IT
1307643904,1307652095,RU
@@ -12108,9 +13989,9 @@
1307742208,1307746303,HU
1307746304,1307750399,UA
1307750400,1307754495,IT
-1307754496,1307757055,GB
-1307757056,1307757311,FR
-1307757312,1307758591,GB
+1307754496,1307757289,GB
+1307757290,1307757293,FR
+1307757294,1307758591,GB
1307758592,1307762687,SM
1307762688,1307766783,PL
1307766784,1307770879,GB
@@ -12126,6 +14007,7 @@
1307817984,1307818048,GB
1307818049,1307818049,BE
1307818050,1307818239,GB
+1307819520,1307819775,GB
1307820032,1307824127,ES
1307824128,1307828223,HU
1307828224,1307832319,NL
@@ -12155,9 +14037,7 @@
1307926528,1307930623,KZ
1307930624,1307934719,RU
1307934720,1307938815,FR
-1307938816,1307939791,US
-1307939792,1307940370,TR
-1307940371,1307941119,US
+1307938816,1307941119,US
1307941120,1307942911,TR
1307942912,1307947007,RU
1307947008,1307951103,CH
@@ -12182,9 +14062,7 @@
1308024832,1308033023,RU
1308033024,1308033535,DE
1308033536,1308033791,GB
-1308033792,1308035327,DE
-1308035328,1308035583,GB
-1308035584,1308037119,DE
+1308033792,1308037119,DE
1308037120,1308041215,UA
1308041216,1308049407,RU
1308049408,1308053503,DK
@@ -12258,8 +14136,19 @@
1310588928,1310605311,RU
1310605312,1310621695,PL
1310621696,1310638079,RS
-1310638080,1310654463,UA
-1310654464,1310656511,RU
+1310638080,1310639615,RU
+1310639616,1310639871,UA
+1310639872,1310640639,RU
+1310640640,1310641407,UA
+1310641408,1310642175,RU
+1310642176,1310642431,UA
+1310642432,1310643711,RU
+1310643712,1310644223,UA
+1310644224,1310648063,RU
+1310648064,1310648319,UA
+1310648320,1310650623,RU
+1310650624,1310650879,UA
+1310650880,1310656511,RU
1310656512,1310657535,GB
1310657536,1310658559,SE
1310658560,1310660607,RU
@@ -12307,9 +14196,9 @@
1311246336,1311248383,IT
1311248384,1311250431,GB
1311250432,1311252479,RU
-1311252480,1311253247,GB
-1311253248,1311253255,IT
-1311253256,1311254447,GB
+1311252480,1311253447,GB
+1311253448,1311253455,IT
+1311253456,1311254447,GB
1311254448,1311254455,IT
1311254456,1311254527,GB
1311254528,1311256575,SE
@@ -12341,9 +14230,7 @@
1311310592,1311310847,GG
1311310848,1311310857,GB
1311310858,1311310858,GG
-1311310859,1311311103,GB
-1311311104,1311311359,GG
-1311311360,1311311871,GB
+1311310859,1311311871,GB
1311311872,1311315967,CZ
1311315968,1311318015,PL
1311318016,1311320063,RU
@@ -12374,7 +14261,9 @@
1311506432,1311637503,CZ
1311637504,1312292863,DE
1312292864,1312817151,LT
-1312817152,1313865727,SE
+1312817152,1313183103,SE
+1313183104,1313183231,DK
+1313183232,1313865727,SE
1313865728,1313931263,CZ
1313931264,1313996799,RU
1313996800,1314062335,SE
@@ -12409,11 +14298,13 @@
1315741696,1315745791,LB
1315745792,1315749887,CZ
1315749888,1315753983,RU
-1315758080,1315758335,RE
-1315758336,1315759615,FR
-1315759616,1315760127,RE
-1315760128,1315761407,FR
-1315761408,1315762175,RE
+1315758080,1315758847,RE
+1315758848,1315760639,FR
+1315760640,1315760895,RE
+1315760896,1315761407,FR
+1315761408,1315761663,RE
+1315761664,1315761919,FR
+1315761920,1315762175,RE
1315762176,1315766271,BG
1315766272,1315770367,NL
1315770368,1315774463,UA
@@ -12429,7 +14320,7 @@
1315815424,1315819519,IR
1315819520,1315823615,DK
1315823616,1315827711,IQ
-1315827712,1315831807,RU
+1315827712,1315831807,FR
1315831808,1315835903,SA
1315835904,1315839999,MT
1315840000,1315844095,EE
@@ -12457,7 +14348,9 @@
1315930112,1315934207,DE
1315934208,1315938303,RU
1315938304,1315942399,DK
-1315942400,1315946495,UA
+1315942400,1315945030,UA
+1315945031,1315945031,RU
+1315945032,1315946495,UA
1315946496,1315946751,GB
1315946752,1315950591,GG
1315950592,1315954687,UA
@@ -12490,21 +14383,17 @@
1317617664,1317625855,YE
1317625856,1317627903,DE
1317627904,1317629951,RU
-1317629952,1317634815,GB
-1317634816,1317635071,IE
-1317635072,1317636095,GB
+1317629952,1317636095,GB
1317636096,1317637119,IE
-1317637120,1317637887,GB
-1317637888,1317638143,IE
-1317638144,1317642239,GB
+1317637120,1317642239,GB
1317642240,1317642495,IE
1317642496,1317646551,GB
1317646552,1317646559,IE
1317646560,1317647015,GB
1317647016,1317647023,IE
-1317647024,1317647615,GB
-1317647616,1317647871,IE
-1317647872,1317650431,GB
+1317647024,1317650130,GB
+1317650131,1317650131,IE
+1317650132,1317650431,GB
1317650432,1317666815,PT
1317666816,1317679727,GB
1317679728,1317679735,CM
@@ -12517,9 +14406,7 @@
1317765120,1317781503,GE
1317781504,1317814271,RU
1317814272,1317830655,DE
-1317830656,1317841279,NL
-1317841280,1317841407,RU
-1317841408,1317847039,NL
+1317830656,1317847039,NL
1317847040,1317863423,RU
1317863424,1317879807,GB
1317879808,1317896191,SK
@@ -12533,7 +14420,9 @@
1318027264,1318043647,IE
1318043648,1318584319,GB
1318584320,1318592511,PL
-1318592512,1318600703,NL
+1318592512,1318597343,NL
+1318597344,1318597359,US
+1318597360,1318600703,NL
1318600704,1318608895,AT
1318608896,1318617087,IT
1318617088,1318625279,FR
@@ -12547,13 +14436,7 @@
1318690816,1318699007,DK
1318699008,1318707199,IE
1318707200,1318707455,FR
-1318707456,1318709247,GB
-1318709248,1318710015,FR
-1318710016,1318710271,GB
-1318710272,1318710527,FR
-1318710528,1318710783,GB
-1318710784,1318711039,FR
-1318711040,1318713023,GB
+1318707456,1318713023,GB
1318713024,1318713087,FR
1318713088,1318714367,GB
1318714368,1318715390,FR
@@ -12742,11 +14625,7 @@
1334126592,1334130687,DE
1334130688,1334131711,NL
1334131712,1334132735,DE
-1334132736,1334140927,RU
-1334140928,1334141951,GB
-1334141952,1334142975,RU
-1334142976,1334143999,GB
-1334144000,1334165503,RU
+1334132736,1334165503,RU
1334165504,1334173695,PL
1334173696,1334181887,LT
1334181888,1334190079,RU
@@ -12772,16 +14651,10 @@
1334378496,1334411263,IT
1334411264,1334444031,RU
1334444032,1334476799,SE
-1334476800,1334477311,DK
-1334477312,1334477567,SE
-1334477568,1334478591,DK
-1334478592,1334478847,SE
-1334478848,1334481151,DK
-1334481152,1334481407,SE
-1334481408,1334483455,DK
-1334483456,1334483711,SE
-1334483712,1334484223,DK
-1334484224,1334484991,SE
+1334476800,1334484223,DK
+1334484224,1334484479,SE
+1334484480,1334484735,DK
+1334484736,1334484991,SE
1334484992,1334495231,DK
1334495232,1334495743,SE
1334495744,1334495999,DK
@@ -12790,15 +14663,11 @@
1334497024,1334497279,SE
1334497280,1334497535,DK
1334497536,1334498047,SE
-1334498048,1334498303,DK
-1334498304,1334499071,SE
-1334499072,1334499327,DK
-1334499328,1334499583,SE
-1334499584,1334500351,DK
+1334498048,1334498559,DK
+1334498560,1334499071,SE
+1334499072,1334500351,DK
1334500352,1334500607,SE
-1334500608,1334501119,DK
-1334501120,1334501375,SE
-1334501376,1334509567,DK
+1334500608,1334509567,DK
1334509568,1334542335,PL
1334542336,1334575103,RU
1334575104,1334579199,UA
@@ -12854,9 +14723,16 @@
1334710272,1334714367,RU
1334714368,1334718463,DE
1334718464,1334722559,KZ
-1334722560,1334725631,NL
+1334722560,1334723583,NL
+1334723584,1334723839,BE
+1334723840,1334724095,PT
+1334724096,1334724351,NO
+1334724352,1334724863,US
+1334724864,1334725631,NL
1334725632,1334725887,SE
-1334725888,1334726655,NL
+1334725888,1334726143,NL
+1334726144,1334726399,LU
+1334726400,1334726655,SE
1334726656,1334734847,RU
1334734848,1334738943,LT
1334738944,1334743039,CH
@@ -12925,7 +14801,9 @@
1336619008,1336621055,AL
1336621056,1336623103,DE
1336623104,1336625151,BE
-1336625152,1336627199,GB
+1336625152,1336626286,GB
+1336626287,1336626287,IE
+1336626288,1336627199,GB
1336627200,1336629247,NO
1336629248,1336631295,DE
1336631296,1336633343,IS
@@ -12976,97 +14854,95 @@
1342177280,1342628207,GB
1342628208,1342628223,IE
1342628224,1342701567,GB
-1342701568,1342702847,MQ
-1342702848,1342703103,FR
-1342703104,1342705151,MQ
-1342705152,1342705407,FR
-1342705408,1342705919,MQ
+1342701568,1342704127,MQ
+1342704128,1342704383,FR
+1342704384,1342704895,MQ
+1342704896,1342705151,FR
+1342705152,1342705919,MQ
1342705920,1342706175,FR
-1342706176,1342706687,MQ
-1342706688,1342706943,FR
-1342706944,1342707711,MQ
+1342706176,1342707711,MQ
1342707712,1342707967,FR
-1342707968,1342711807,MQ
+1342707968,1342708223,MQ
+1342708224,1342708479,FR
+1342708480,1342708735,MQ
+1342708736,1342708991,FR
+1342708992,1342711807,MQ
1342711808,1342712063,FR
-1342712064,1342714111,MQ
-1342714112,1342714367,FR
-1342714368,1342716927,MQ
+1342712064,1342716159,MQ
+1342716160,1342716415,FR
+1342716416,1342716927,MQ
1342716928,1342717183,FR
1342717184,1342717951,MQ
-1342717952,1342719231,GP
+1342717952,1342718207,GP
+1342718208,1342718463,FR
+1342718464,1342719231,GP
1342719232,1342719487,FR
-1342719488,1342723327,GP
-1342723328,1342723583,FR
-1342723584,1342724095,GP
+1342719488,1342720255,GP
+1342720256,1342720511,FR
+1342720512,1342720767,GP
+1342720768,1342721023,FR
+1342721024,1342722303,GP
+1342722304,1342722559,FR
+1342722560,1342723071,GP
+1342723072,1342723327,FR
+1342723328,1342724095,GP
1342724096,1342724351,FR
-1342724352,1342724607,GP
-1342724608,1342724863,FR
-1342724864,1342728191,GP
-1342728192,1342728447,FR
-1342728448,1342729215,GP
+1342724352,1342725375,GP
+1342725376,1342725631,FR
+1342725632,1342727423,GP
+1342727424,1342727679,FR
+1342727680,1342729215,GP
1342729216,1342729471,FR
-1342729472,1342732031,GP
-1342732032,1342732287,FR
-1342732288,1342734335,GP
+1342729472,1342729727,GP
+1342729728,1342729983,FR
+1342729984,1342733823,GP
+1342733824,1342734079,FR
+1342734080,1342734335,GP
1342734336,1342734847,RE
1342734848,1342735103,FR
-1342735104,1342735359,RE
-1342735360,1342735615,FR
-1342735616,1342736639,RE
+1342735104,1342736639,RE
1342736640,1342736895,FR
1342736896,1342738175,RE
1342738176,1342738687,FR
1342738688,1342739199,RE
1342739200,1342739455,FR
-1342739456,1342741759,RE
-1342741760,1342742015,FR
-1342742016,1342742527,RE
-1342742528,1342742783,FR
+1342739456,1342741503,RE
+1342741504,1342742015,FR
+1342742016,1342742271,RE
+1342742272,1342742783,FR
1342742784,1342743039,RE
1342743040,1342743295,FR
1342743296,1342743807,RE
1342743808,1342744063,FR
-1342744064,1342744319,RE
-1342744320,1342744575,FR
-1342744576,1342746367,RE
-1342746368,1342746623,FR
-1342746624,1342747903,RE
-1342747904,1342748415,FR
-1342748416,1342749439,RE
-1342749440,1342750463,FR
-1342750464,1342753023,RE
+1342744064,1342749695,RE
+1342749696,1342750207,FR
+1342750208,1342753023,RE
1342753024,1342753279,FR
-1342753280,1342754047,RE
-1342754048,1342754303,FR
-1342754304,1342755839,RE
-1342755840,1342756095,FR
-1342756096,1342756863,RE
-1342756864,1342757119,FR
-1342757120,1342759167,RE
-1342759168,1342759679,FR
-1342759680,1342760447,RE
-1342760448,1342761471,FR
-1342761472,1342761727,RE
-1342761728,1342762239,FR
-1342762240,1342762495,RE
-1342762496,1342762751,FR
-1342762752,1342763007,RE
-1342763008,1342763775,FR
+1342753280,1342756351,RE
+1342756352,1342757119,FR
+1342757120,1342757887,RE
+1342757888,1342758399,FR
+1342758400,1342759167,RE
+1342759168,1342759423,FR
+1342759424,1342760447,RE
+1342760448,1342760703,FR
+1342760704,1342763519,RE
+1342763520,1342763775,FR
1342763776,1342764031,RE
1342764032,1342764287,FR
1342764288,1342766079,RE
-1342766080,1342988287,FR
+1342766080,1342766847,FR
+1342766848,1342767103,RE
+1342767104,1342988287,FR
1342988288,1342989055,US
1342989056,1342996479,FR
1342996480,1343000575,GF
1343000576,1343001087,FR
-1343001088,1343005695,GF
+1343001088,1343001855,GF
+1343001856,1343002111,FR
+1343002112,1343005695,GF
1343005696,1343005951,FR
-1343005952,1343009279,GF
-1343009280,1343009535,FR
-1343009536,1343012351,GF
-1343012352,1343012607,FR
-1343012608,1343012863,GF
+1343005952,1343012863,GF
1343012864,1343017983,FR
1343017984,1343018495,RE
1343018496,1343025151,FR
@@ -13075,14 +14951,14 @@
1343220480,1343220671,DE
1343220672,1343220735,FR
1343220736,1343220863,GB
-1343220864,1343223679,FR
+1343220864,1343221055,FR
+1343221056,1343221119,GB
+1343221120,1343223679,FR
1343223680,1343223687,LB
1343223688,1343224063,FR
1343224064,1343224303,US
1343224304,1343225855,FR
-1343225856,1343605503,IT
-1343605504,1343605759,US
-1343605760,1343750143,IT
+1343225856,1343750143,IT
1343750144,1344798719,ES
1344798720,1345323007,GB
1345323008,1345847295,PL
@@ -13098,9 +14974,8 @@
1346392064,1346396159,UA
1346396160,1346400255,RU
1346400256,1346404351,IT
-1346404352,1346404927,DE
-1346404928,1346404943,AT
-1346404944,1346408447,DE
+1346404352,1346407423,AT
+1346407424,1346408447,DE
1346408448,1346412543,LU
1346412544,1346416639,RU
1346416640,1346420735,DE
@@ -13172,9 +15047,10 @@
1346740224,1346744319,FI
1346744320,1346748415,RU
1346748416,1346752511,DE
-1346752512,1346753535,FR
-1346753536,1346754047,RE
-1346754048,1346754559,FR
+1346752512,1346753023,RE
+1346753024,1346753791,FR
+1346753792,1346754303,RE
+1346754304,1346754559,FR
1346754560,1346755071,RE
1346755072,1346755583,FR
1346755584,1346756095,RE
@@ -13257,7 +15133,9 @@
1347129344,1347133439,FR
1347133440,1347141631,EG
1347141632,1347145727,CH
-1347145728,1347149823,CA
+1347145728,1347147263,CA
+1347147264,1347147775,GB
+1347147776,1347149823,CA
1347149824,1347151423,HU
1347151424,1347158015,AT
1347158016,1347162111,CH
@@ -13571,7 +15449,11 @@
1347481600,1347485695,AT
1347485696,1347493887,DE
1347493888,1347502079,LV
-1347502080,1347518463,ES
+1347502080,1347505159,ES
+1347505160,1347505167,GB
+1347505168,1347505215,ES
+1347505216,1347505247,GB
+1347505248,1347518463,ES
1347518464,1347522559,AT
1347522560,1347526655,LB
1347526656,1347534847,FI
@@ -13631,7 +15513,8 @@
1347755160,1347755175,GR
1347755176,1347756031,CY
1347756032,1347760127,NL
-1347760128,1347764223,HU
+1347760128,1347762175,CZ
+1347762176,1347764223,HU
1347764224,1347772415,GB
1347772416,1347776511,MT
1347776512,1347780607,SE
@@ -13648,9 +15531,7 @@
1347821568,1347825663,GB
1347825664,1347829759,IT
1347829760,1347833855,SE
-1347833856,1347835810,DE
-1347835811,1347835811,IL
-1347835812,1347837951,DE
+1347833856,1347837951,DE
1347837952,1347846143,RO
1347846144,1347850239,NO
1347850240,1347854335,IT
@@ -13737,9 +15618,7 @@
1348194304,1348198399,GR
1348198400,1348202495,NO
1348206592,1348218879,RU
-1348218880,1348219647,DE
-1348219648,1348219903,US
-1348219904,1348222975,DE
+1348218880,1348222975,DE
1348222976,1348231167,LU
1348231168,1348235263,RU
1348235264,1348239359,AT
@@ -13831,19 +15710,15 @@
1353262296,1353262303,US
1353262304,1353272079,GB
1353272080,1353272095,ES
-1353272096,1353272287,GB
-1353272288,1353272303,ES
-1353272304,1353275167,GB
-1353275168,1353275199,ES
-1353275200,1353275247,GB
+1353272096,1353275247,GB
1353275248,1353275255,ES
1353275256,1353277439,GB
1353277440,1353279487,CH
-1353279488,1353287329,GB
-1353287330,1353287330,IE
-1353287331,1353287959,GB
+1353279488,1353287959,GB
1353287960,1353287967,IE
-1353287968,1353298687,GB
+1353287968,1353288191,GB
+1353288192,1353288447,IE
+1353288448,1353298687,GB
1353298688,1353299455,SE
1353299456,1353300079,GB
1353300080,1353300095,SE
@@ -13900,24 +15775,26 @@
1357185024,1357250559,GB
1357250560,1357316095,IL
1357317120,1357317375,GB
-1357318144,1357320191,QA
1357321024,1357321087,KE
1357321984,1357322239,GB
+1357322240,1357322255,DE
1357322496,1357322751,DE
1357323520,1357323775,GB
1357324288,1357325311,GB
-1357327360,1357328383,DE
+1357327360,1357327615,FR
1357328384,1357328639,GB
+1357329408,1357329415,BE
1357335808,1357336063,IT
1357340672,1357341695,GB
1357342976,1357343231,GB
1357343488,1357343503,GB
1357344260,1357344263,FR
1357344512,1357344767,FR
+1357347456,1357347583,FR
1357347616,1357347647,FR
1357347840,1357348095,PL
1357351168,1357351423,PL
-1357359872,1357360127,GB
+1357359872,1357360383,GB
1357361152,1357363199,GB
1357363200,1357364223,QA
1357364224,1357365247,ES
@@ -13925,9 +15802,12 @@
1357366960,1357366967,BE
1357366968,1357366975,FR
1357366976,1357367039,GB
-1357371392,1357371647,GB
+1357368576,1357368831,NL
1357372160,1357372927,GB
-1357373488,1357373503,GB
+1357373468,1357373471,GB
+1357373480,1357373483,GB
+1357373488,1357373519,GB
+1357373952,1357374463,GB
1357381632,1357414399,NO
1357414400,1357447167,LV
1357447168,1357479935,IE
@@ -13988,9 +15868,7 @@
1357983784,1357983791,IT
1357983792,1357984103,GB
1357984104,1357984119,IT
-1357984120,1357984303,GB
-1357984304,1357984311,IT
-1357984312,1357984319,GB
+1357984120,1357984319,GB
1357984320,1357984327,IT
1357984328,1357984367,GB
1357984368,1357984375,IT
@@ -14008,7 +15886,9 @@
1357984912,1357984919,IT
1357984920,1357985015,GB
1357985016,1357985023,IT
-1357985024,1357985575,GB
+1357985024,1357985343,GB
+1357985344,1357985351,IT
+1357985352,1357985575,GB
1357985576,1357985583,IT
1357985584,1357985791,GB
1357985792,1357987839,DE
@@ -14028,8 +15908,8 @@
1358036992,1358041087,IR
1358041088,1358045183,FI
1358045184,1358049279,SK
-1358049280,1358061567,RU
-1358061568,1358065663,UA
+1358049280,1358062591,RU
+1358062592,1358065663,UA
1358065664,1358069759,BA
1358069760,1358086143,DE
1358086144,1358090239,CH
@@ -14053,13 +15933,20 @@
1358164224,1358164479,MQ
1358164480,1358164991,FR
1358164992,1358165503,MQ
-1358165504,1358166527,FR
-1358166528,1358168063,MQ
+1358165504,1358166015,FR
+1358166016,1358166783,MQ
+1358166784,1358167551,FR
+1358167552,1358167807,MQ
+1358167808,1358168063,FR
1358168064,1358172159,GB
1358172160,1358176255,CY
1358176256,1358180351,RU
1358180352,1358184447,ES
-1358184448,1358192639,SE
+1358184448,1358186607,SE
+1358186608,1358186623,NO
+1358186624,1358187775,SE
+1358187776,1358187839,NO
+1358187840,1358192639,SE
1358192640,1358196735,HU
1358196736,1358200831,IT
1358200832,1358209023,PL
@@ -14073,7 +15960,6 @@
1358237696,1358249983,FR
1358249984,1358254079,DE
1358254080,1358258175,MD
-1358258176,1358262271,RU
1358262272,1358266367,UA
1358266368,1358274559,DE
1358274560,1358278655,GR
@@ -14121,7 +16007,8 @@
1358467072,1358471167,RU
1358471168,1358475263,FI
1358475264,1358479359,GB
-1358479360,1358483455,LI
+1358479360,1358479615,CH
+1358479616,1358483455,LI
1358483456,1358487551,FR
1358487552,1358491647,SE
1358491648,1358495743,FI
@@ -14138,8 +16025,9 @@
1358548992,1358551039,NL
1358551040,1358553087,GB
1358553088,1358557183,UA
-1358557184,1358557439,IE
-1358557440,1358560255,GB
+1358557184,1358557951,GB
+1358557952,1358558207,IE
+1358558208,1358560255,GB
1358560256,1358560511,IE
1358560512,1358561279,GB
1358561280,1358569471,CZ
@@ -14154,9 +16042,7 @@
1358610432,1358614527,IR
1358614528,1358622719,RU
1358622720,1358626815,SK
-1358626816,1358628863,GB
-1358628864,1358629119,IT
-1358629120,1358635007,GB
+1358626816,1358635007,GB
1358635008,1358639103,TR
1358639104,1358643199,RU
1358643200,1358647295,ES
@@ -14219,11 +16105,7 @@
1358843904,1358847999,MT
1358848000,1358856191,RU
1358856192,1358860287,DE
-1358860288,1358860879,GB
-1358860880,1358860895,NG
-1358860896,1358860951,GB
-1358860952,1358860959,SE
-1358860960,1358861361,GB
+1358860288,1358861361,GB
1358861362,1358861363,DE
1358861364,1358861449,GB
1358861450,1358861450,DE
@@ -14237,7 +16119,9 @@
1358862899,1358862899,NO
1358862900,1358863359,GB
1358863360,1358863615,US
-1358863616,1358864383,GB
+1358863616,1358863903,GB
+1358863904,1358863919,SA
+1358863920,1358864383,GB
1358864384,1358872575,CH
1358872576,1358876671,IT
1358876672,1358880767,LV
@@ -14300,9 +16184,9 @@
1359413248,1359429631,DE
1359429632,1359446015,LT
1359446016,1359462399,DK
-1359462400,1359467007,DE
-1359467008,1359467263,US
-1359467264,1359470591,DE
+1359462400,1359467775,DE
+1359467776,1359468031,US
+1359468032,1359470591,DE
1359470592,1359478783,CH
1359478784,1359511551,TR
1359511552,1359544319,SE
@@ -14382,7 +16266,9 @@
1360281728,1360281855,ES
1360281856,1360282495,NL
1360282496,1360282623,DE
-1360282624,1360285695,NL
+1360282624,1360284671,NL
+1360284672,1360284927,DK
+1360284928,1360285695,NL
1360285696,1360289791,DE
1360289792,1360293887,RU
1360293888,1360302079,DE
@@ -14680,9 +16566,7 @@
1365024768,1365028863,DE
1365028864,1365032959,NL
1365032960,1365041151,PT
-1365041152,1365041695,FR
-1365041696,1365041919,LU
-1365041920,1365042047,FR
+1365041152,1365042047,FR
1365042048,1365042055,GB
1365042056,1365044735,FR
1365044736,1365044799,LU
@@ -14724,7 +16608,22 @@
1365204992,1365209087,CZ
1365209088,1365213183,BE
1365213184,1365217279,RU
-1365217280,1365221375,GB
+1365217280,1365217343,GB
+1365217344,1365217351,US
+1365217352,1365217655,GB
+1365217656,1365217663,US
+1365217664,1365218191,GB
+1365218192,1365218199,US
+1365218200,1365219391,GB
+1365219392,1365219407,MY
+1365219408,1365220231,GB
+1365220232,1365220239,IE
+1365220240,1365220359,GB
+1365220360,1365220367,US
+1365220368,1365221231,GB
+1365221232,1365221239,NL
+1365221240,1365221247,US
+1365221248,1365221375,GB
1365221376,1365225471,GE
1365225472,1365229567,UA
1365229568,1365233663,PL
@@ -14732,7 +16631,9 @@
1365237760,1365241855,UZ
1365241856,1365245951,DK
1365245952,1366294527,GB
-1366294528,1367343103,IT
+1366294528,1366405831,IT
+1366405832,1366405835,SI
+1366405836,1367343103,IT
1367343104,1369440255,GB
1369440256,1369473023,DE
1369473024,1369505791,HU
@@ -14786,13 +16687,16 @@
1370128384,1370161151,SE
1370161152,1370174463,NL
1370174464,1370175487,US
-1370175488,1370181887,NL
+1370175488,1370178815,NL
+1370178816,1370179071,ES
+1370179072,1370181887,NL
1370181888,1370182143,US
1370182144,1370182911,NL
-1370182912,1370183167,US
+1370182912,1370183167,DE
1370183168,1370185983,NL
1370185984,1370186239,GB
-1370186240,1370188799,NL
+1370186240,1370188543,NL
+1370188544,1370188799,FR
1370188800,1370189055,US
1370189056,1370189311,NL
1370189312,1370189567,US
@@ -14871,7 +16775,9 @@
1372135424,1372139519,DE
1372139520,1372143615,CZ
1372143616,1372147711,RU
-1372147712,1372151807,BE
+1372147712,1372149247,BE
+1372149248,1372149375,HK
+1372149376,1372151807,BE
1372151808,1372159999,DE
1372160000,1372164095,GB
1372164096,1372168191,DE
@@ -14910,105 +16816,94 @@
1373569024,1373634559,AT
1373634560,1374683135,SE
1374683136,1375207423,BE
-1375207424,1375207679,MQ
-1375207680,1375207935,FR
+1375207424,1375207935,FR
1375207936,1375208447,MQ
1375208448,1375208703,GP
1375208704,1375210239,MQ
1375210240,1375210495,GP
1375210496,1375211519,MQ
-1375211520,1375212799,GP
+1375211520,1375211775,GP
+1375211776,1375212031,FR
+1375212032,1375212799,GP
1375212800,1375213055,FR
1375213056,1375215615,GP
-1375215616,1375216127,GF
-1375216128,1375216383,FR
-1375216384,1375216639,GF
-1375216640,1375216895,FR
-1375216896,1375217663,GF
-1375217664,1375217919,FR
-1375217920,1375218175,GF
+1375215616,1375215871,GF
+1375215872,1375216383,FR
+1375216384,1375218175,GF
1375218176,1375218687,FR
-1375218688,1375221759,GF
+1375218688,1375219455,GF
+1375219456,1375219711,FR
+1375219712,1375221247,GF
+1375221248,1375221503,FR
+1375221504,1375221759,GF
1375221760,1375222783,FR
1375222784,1375223807,GF
-1375223808,1375224319,MQ
-1375224320,1375224575,FR
-1375224576,1375225343,MQ
-1375225344,1375226111,FR
-1375226112,1375226623,MQ
-1375226624,1375226879,FR
-1375226880,1375227135,MQ
+1375223808,1375227135,MQ
1375227136,1375227647,FR
1375227648,1375230463,MQ
1375230464,1375230719,FR
-1375230720,1375231231,MQ
-1375231232,1375231487,FR
-1375231488,1375231999,MQ
-1375232000,1375232255,FR
-1375232256,1375232767,MQ
-1375232768,1375233023,FR
-1375233024,1375234047,MQ
-1375234048,1375235071,FR
-1375235072,1375235327,MQ
-1375235328,1375236863,FR
+1375230720,1375233023,MQ
+1375233024,1375233279,FR
+1375233280,1375233791,MQ
+1375233792,1375235071,FR
+1375235072,1375235583,MQ
+1375235584,1375236095,FR
+1375236096,1375236351,MQ
+1375236352,1375236863,FR
1375236864,1375237631,MQ
1375237632,1375237887,FR
-1375237888,1375238655,MQ
-1375238656,1375238911,FR
-1375238912,1375240191,MQ
-1375240192,1375240959,GP
+1375237888,1375239679,MQ
+1375239680,1375239935,FR
+1375239936,1375240191,MQ
+1375240192,1375240447,FR
+1375240448,1375240959,GP
1375240960,1375241215,FR
-1375241216,1375242239,GP
-1375242240,1375242495,BL
-1375242496,1375243263,FR
-1375243264,1375244799,GP
-1375244800,1375245055,FR
-1375245056,1375245311,GP
-1375245312,1375245567,FR
-1375245568,1375246335,GP
+1375241216,1375241983,GP
+1375241984,1375242239,FR
+1375242240,1375242495,MF
+1375242496,1375242751,GP
+1375242752,1375243263,FR
+1375243264,1375245311,GP
+1375245312,1375246079,FR
+1375246080,1375246335,GP
1375246336,1375246591,FR
-1375246592,1375246847,GP
-1375246848,1375247103,FR
-1375247104,1375247359,GP
+1375246592,1375247359,GP
1375247360,1375247615,FR
-1375247616,1375248895,GP
-1375248896,1375249151,FR
-1375249152,1375249663,GP
-1375249664,1375249919,FR
-1375249920,1375250431,GP
-1375250432,1375251711,FR
-1375251712,1375252223,GP
-1375252224,1375253503,FR
-1375253504,1375254271,GP
-1375254272,1375255039,FR
-1375255040,1375256319,GP
-1375256320,1375256575,FR
+1375247616,1375249919,GP
+1375249920,1375250175,FR
+1375250176,1375250431,GP
+1375250432,1375251455,FR
+1375251456,1375252223,GP
+1375252224,1375253247,FR
+1375253248,1375253759,GP
+1375253760,1375254527,FR
+1375254528,1375256063,GP
+1375256064,1375256319,FR
+1375256320,1375256575,GP
1375256576,1375257087,RE
1375257088,1375257343,FR
-1375257344,1375259135,RE
-1375259136,1375259391,FR
-1375259392,1375259647,RE
-1375259648,1375261183,FR
-1375261184,1375261439,RE
-1375261440,1375262207,FR
-1375262208,1375263743,RE
-1375263744,1375264255,FR
-1375264256,1375265791,RE
-1375265792,1375266047,FR
+1375257344,1375257855,RE
+1375257856,1375258111,FR
+1375258112,1375258879,RE
+1375258880,1375261183,FR
+1375261184,1375261695,RE
+1375261696,1375262207,FR
+1375262208,1375265535,RE
+1375265536,1375266047,FR
1375266048,1375266303,RE
-1375266304,1375266815,FR
-1375266816,1375267071,RE
-1375267072,1375268095,FR
+1375266304,1375268095,FR
1375268096,1375268351,RE
1375268352,1375268863,FR
-1375268864,1375269375,RE
-1375269376,1375269887,FR
-1375269888,1375270143,RE
+1375268864,1375269119,RE
+1375269120,1375269631,FR
+1375269632,1375270143,RE
1375270144,1375270655,FR
1375270656,1375271423,RE
1375271424,1375271679,FR
-1375271680,1375272703,RE
-1375272704,1375731711,FR
+1375271680,1375271935,RE
+1375271936,1375272191,FR
+1375272192,1375272959,RE
+1375272960,1375731711,FR
1375731712,1378877439,GB
1378877440,1379926015,IT
1379926016,1380188159,FR
@@ -15035,7 +16930,9 @@
1382213632,1382219775,GB
1382219776,1382222847,SE
1382222848,1382223103,FI
-1382223104,1382252543,SE
+1382223104,1382226943,SE
+1382226944,1382227199,NO
+1382227200,1382252543,SE
1382252544,1382268927,CZ
1382268928,1382285311,IR
1382285312,1382301695,CZ
@@ -15078,15 +16975,11 @@
1383211008,1383219199,CY
1383219200,1383223295,AL
1383223296,1383223551,XK
-1383223552,1383224063,AL
-1383224064,1383224191,XK
-1383224192,1383225855,AL
-1383225856,1383226111,XK
-1383226112,1383226207,AL
+1383223552,1383225983,AL
+1383225984,1383226007,RS
+1383226008,1383226207,AL
1383226208,1383226239,RS
-1383226240,1383226879,AL
-1383226880,1383227135,RS
-1383227136,1383227391,AL
+1383226240,1383227391,AL
1383227392,1383243775,RU
1383243776,1383251967,YE
1383251968,1383260159,CZ
@@ -15254,15 +17147,12 @@
1385537536,1385545727,DE
1385545728,1385553919,RU
1385553920,1385562111,DE
-1385562112,1385562367,ES
1385567232,1385568255,IE
1385570304,1385578495,HU
1385578496,1385580543,TR
1385580544,1385580799,DK
1385580800,1385586687,TR
-1385586688,1385587967,GB
-1385587968,1385588223,US
-1385588224,1385594879,GB
+1385586688,1385594879,GB
1385594880,1385603071,NL
1385603072,1385611263,CZ
1385611264,1385619455,AT
@@ -15342,13 +17232,17 @@
1388658688,1388666879,GB
1388666880,1388667135,FR
1388667136,1388667391,RE
-1388667392,1388668159,FR
-1388668160,1388668415,RE
-1388668416,1388675071,FR
+1388667392,1388668671,FR
+1388668672,1388668927,RE
+1388668928,1388669183,FR
+1388669184,1388669439,RE
+1388669440,1388675071,FR
1388677632,1388677887,NL
1388678144,1388679167,DE
1388681216,1388683263,DE
-1388683264,1388685599,CH
+1388683264,1388683903,CH
+1388683904,1388683919,DE
+1388683920,1388685599,CH
1388685600,1388685631,GB
1388685632,1388688127,CH
1388688128,1388688159,NL
@@ -15356,7 +17250,9 @@
1388691456,1388699647,NL
1388699648,1388707839,SE
1388707840,1388708095,LB
-1388708096,1388711679,RU
+1388708096,1388709631,RU
+1388709632,1388709887,LT
+1388709888,1388711679,RU
1388711680,1388711935,LB
1388711936,1388714239,RU
1388714240,1388714495,LB
@@ -15389,9 +17285,7 @@
1388746496,1388746751,IE
1388746752,1388746911,GB
1388746912,1388746927,IE
-1388746928,1388748287,GB
-1388748288,1388748543,IE
-1388748544,1388748799,GB
+1388746928,1388748799,GB
1388748800,1388756991,RU
1388756992,1388765183,DE
1388765184,1388773375,GB
@@ -15469,9 +17363,7 @@
1389707264,1389723647,IT
1389723648,1389756415,ES
1389756416,1389772799,SE
-1389772800,1389780991,SI
-1389780992,1389782015,HR
-1389782016,1389783039,SI
+1389772800,1389783039,SI
1389783040,1389785087,BA
1389785088,1389787135,MK
1389787136,1389789183,SI
@@ -15516,7 +17408,9 @@
1397071872,1397096447,RU
1397096448,1397227519,IE
1397227520,1397489663,DK
-1397489664,1397583615,CH
+1397489664,1397582847,CH
+1397582848,1397583103,DE
+1397583104,1397583615,CH
1397583616,1397583871,DE
1397583872,1397751807,CH
1397751808,1398276095,NL
@@ -15557,11 +17451,11 @@
1400373248,1400702463,DE
1400702976,1400705023,DE
1400706048,1400707071,DE
-1400709121,1400710142,DE
+1400709120,1400710143,DE
1400711168,1400712191,DE
1400713216,1400718335,DE
1400719360,1400721407,DE
-1400723456,1400725503,DE
+1400723456,1400727551,DE
1400729600,1400730623,DE
1400731648,1400733695,DE
1400897536,1400963071,NL
@@ -15634,9 +17528,9 @@
1401544704,1401546751,GB
1401546752,1401548799,IT
1401548800,1401550847,FR
-1401550848,1401551359,GB
-1401551360,1401552383,JE
-1401552384,1401552895,GB
+1401550848,1401551103,GB
+1401551104,1401552639,JE
+1401552640,1401552895,GB
1401552896,1401554943,NL
1401554944,1401556991,IE
1401556992,1401563135,GB
@@ -15735,7 +17629,9 @@
1402273792,1402277631,RU
1402277632,1402277887,TJ
1402277888,1402290175,RU
-1402290176,1402306559,NL
+1402290176,1402306204,NL
+1402306205,1402306205,DE
+1402306206,1402306559,NL
1402306560,1402322943,IT
1402322944,1402339327,RU
1402339328,1402355711,CH
@@ -15798,7 +17694,9 @@
1403781120,1403797503,RU
1403797504,1403813887,SE
1403813888,1403830271,NL
-1403830272,1403846655,CH
+1403830272,1403838719,CH
+1403838720,1403838975,RU
+1403838976,1403846655,CH
1403846656,1403863039,IS
1403863040,1403879423,FR
1403879424,1403895807,ES
@@ -15814,66 +17712,26 @@
1404043264,1404051455,EE
1404051456,1404059647,HR
1404059648,1404076031,NO
-1404076032,1404077055,EE
+1404076032,1404077055,SE
1404077056,1404081151,LV
-1404081152,1404082175,EE
+1404081152,1404082175,SE
1404082176,1404083199,DE
-1404083200,1404084223,EE
+1404083200,1404084223,SE
1404084224,1404092415,NO
-1404092416,1404094719,SE
-1404094720,1404094975,EE
-1404094976,1404095999,SE
-1404096000,1404096255,EE
-1404096256,1404098815,SE
-1404098816,1404099839,EE
-1404099840,1404100095,SE
-1404100096,1404100607,EE
-1404100608,1404102143,SE
-1404102144,1404102911,EE
-1404102912,1404103167,SE
-1404103168,1404104191,EE
-1404104192,1404104447,SE
-1404104448,1404104703,EE
-1404104704,1404107263,SE
-1404107264,1404107519,EE
-1404107520,1404108031,SE
-1404108032,1404108287,EE
-1404108288,1404108799,SE
+1404092416,1404108799,SE
1404108800,1404112895,NL
1404112896,1404114943,HR
1404114944,1404116991,SE
1404116992,1404125183,NO
-1404125184,1404127231,SE
-1404127232,1404127487,EE
-1404127488,1404127743,SE
-1404127744,1404127999,EE
-1404128000,1404135423,SE
+1404125184,1404135423,SE
1404135424,1404137471,NL
1404137472,1404139519,SE
1404139520,1404141567,NL
-1404141568,1404142335,EE
-1404142336,1404145663,SE
-1404145664,1404146943,EE
-1404146944,1404147199,SE
-1404147200,1404147967,EE
-1404147968,1404148991,SE
-1404148992,1404149759,EE
-1404149760,1404151807,SE
-1404151808,1404152319,EE
-1404152320,1404159999,SE
-1404160000,1404160255,EE
-1404160256,1404160511,SE
-1404160512,1404160767,EE
-1404160768,1404162303,SE
-1404162304,1404165119,EE
-1404165120,1404166143,SE
+1404141568,1404166143,SE
1404166144,1404174335,LV
-1404174336,1404184063,SE
-1404184064,1404184575,EE
-1404184576,1404186623,SE
-1404186624,1404187647,EE
-1404187648,1404188671,SE
-1404188672,1404190719,EE
+1404174336,1404182527,EE
+1404182528,1404189183,SE
+1404189184,1404190719,EE
1404190720,1404192767,SE
1404192768,1404194815,LV
1404194816,1404198911,LT
@@ -15888,73 +17746,51 @@
1404219392,1404220415,SE
1404220416,1404221439,EE
1404221440,1404222463,RU
-1404222464,1404222975,EE
-1404222976,1404225535,SE
+1404222464,1404225535,SE
1404225536,1404227071,RU
-1404227072,1404227583,EE
+1404227072,1404227583,SE
1404227584,1404231679,LV
-1404231680,1404232191,EE
+1404231680,1404232191,SE
1404232192,1404232703,NO
-1404232704,1404233215,EE
-1404233216,1404234239,SE
-1404234240,1404234751,EE
+1404232704,1404234751,SE
1404234752,1404239871,HR
-1404239872,1404240895,SE
-1404240896,1404241663,EE
-1404241664,1404241919,SE
-1404241920,1404242394,EE
-1404242395,1404242395,SE
-1404242396,1404242431,EE
-1404242432,1404242687,SE
-1404242688,1404242943,EE
-1404242944,1404243199,SE
-1404243200,1404243711,EE
-1404243712,1404248063,SE
-1404248064,1404248575,EE
-1404248576,1404249087,SE
-1404249088,1404249343,EE
-1404249344,1404256255,SE
+1404239872,1404256255,SE
1404256256,1404305407,RU
1404305408,1404313599,EE
1404313600,1404321791,HR
1404321792,1404338175,RU
-1404338176,1404339967,SE
-1404339968,1404340223,EE
+1404338176,1404340223,SE
1404340224,1404342271,HR
-1404342272,1404370943,SE
-1404370944,1404371199,EE
-1404371200,1404372991,SE
-1404372992,1404373503,EE
-1404373504,1404373759,SE
-1404373760,1404374783,EE
-1404374784,1404376063,SE
-1404376064,1404376831,EE
-1404376832,1404377087,SE
-1404377088,1404377343,EE
-1404377344,1404379135,SE
+1404342272,1404379135,SE
1404379136,1404383231,AT
1404383232,1404385279,HR
1404385280,1404386047,LT
1404386048,1404387327,SE
1404387328,1404420095,LT
1404420096,1404436479,RU
-1404436480,1404502527,SE
-1404502528,1404502783,EE
-1404502784,1404507391,SE
-1404507392,1404507453,EE
-1404507454,1404507454,SE
-1404507455,1404507647,EE
-1404507648,1404507903,SE
-1404507904,1404507975,EE
-1404507976,1404507976,SE
-1404507977,1404508415,EE
-1404508416,1404509951,SE
-1404509952,1404510207,EE
-1404510208,1404515583,SE
-1404515584,1404515839,HR
-1404515840,1404517375,SE
-1404517376,1404517631,HR
-1404517632,1404522495,SE
+1404436480,1404444671,SE
+1404444672,1404445951,NO
+1404445952,1404446207,SE
+1404446208,1404446719,NO
+1404446720,1404446975,SE
+1404446976,1404447999,NO
+1404448000,1404448255,SE
+1404448256,1404452863,NO
+1404452864,1404510207,SE
+1404510208,1404510975,HR
+1404510976,1404511231,SE
+1404511232,1404512255,HR
+1404512256,1404512767,SE
+1404512768,1404513023,HR
+1404513024,1404514303,SE
+1404514304,1404514559,HR
+1404514560,1404514815,SE
+1404514816,1404515071,HR
+1404515072,1404515327,SE
+1404515328,1404515839,HR
+1404515840,1404516095,SE
+1404516096,1404518143,HR
+1404518144,1404522495,SE
1404522496,1404526591,LV
1404526592,1404538879,SE
1404538880,1404542975,LV
@@ -15963,67 +17799,125 @@
1404563456,1404567551,SE
1404567552,1404583935,HR
1404583936,1404600319,NO
-1404600320,1404645375,SE
-1404645376,1404645887,EE
-1404645888,1404677888,SE
-1404677889,1404678143,EE
+1404600320,1404678143,SE
1404678144,1404680191,HR
-1404680192,1404764159,SE
+1404680192,1404731391,SE
+1404731392,1404732159,HR
+1404732160,1404732671,SE
+1404732672,1404733951,HR
+1404733952,1404734207,SE
+1404734208,1404736511,HR
+1404736512,1404736767,SE
+1404736768,1404740095,HR
+1404740096,1404740351,SE
+1404740352,1404740863,HR
+1404740864,1404741119,SE
+1404741120,1404742911,HR
+1404742912,1404743679,SE
+1404743680,1404744959,HR
+1404744960,1404745215,SE
+1404745216,1404745983,HR
+1404745984,1404746495,SE
+1404746496,1404748031,HR
+1404748032,1404748287,SE
+1404748288,1404748799,HR
+1404748800,1404749311,SE
+1404749312,1404749567,HR
+1404749568,1404750079,SE
+1404750080,1404752639,HR
+1404752640,1404752895,SE
+1404752896,1404754943,HR
+1404754944,1404755199,SE
+1404755200,1404755967,HR
+1404755968,1404756223,SE
+1404756224,1404756479,HR
+1404756480,1404756735,SE
+1404756736,1404757247,HR
+1404757248,1404757503,SE
+1404757504,1404759551,HR
+1404759552,1404759807,SE
+1404759808,1404760063,HR
+1404760064,1404760319,SE
+1404760320,1404760831,HR
+1404760832,1404761087,SE
+1404761088,1404762111,HR
+1404762112,1404762367,SE
+1404762368,1404762623,HR
+1404762624,1404763135,SE
+1404763136,1404763647,HR
+1404763648,1404763903,SE
+1404763904,1404764159,HR
1404764160,1404780543,NL
-1404780544,1404796927,SE
+1404780544,1404788735,SE
+1404788736,1404790527,NL
+1404790528,1404790783,SE
+1404790784,1404791039,NL
+1404791040,1404791295,SE
+1404791296,1404791807,NL
+1404791808,1404792063,SE
+1404792064,1404792575,NL
+1404792576,1404792831,SE
+1404792832,1404793599,NL
+1404793600,1404793855,SE
+1404793856,1404795135,NL
+1404795136,1404795391,SE
+1404795392,1404795647,NL
+1404795648,1404795903,SE
+1404795904,1404796927,NL
1404796928,1404801023,EE
-1404801024,1404802047,SE
-1404802048,1404803583,EE
+1404801024,1404803071,SE
+1404803072,1404803327,LV
+1404803328,1404803583,SE
1404803584,1404804095,LV
-1404804096,1404804351,EE
-1404804352,1404804607,SE
-1404804608,1404805119,EE
+1404804096,1404805119,SE
1404805120,1404813311,AT
1404813312,1404815871,EE
1404815872,1404816383,LT
1404816384,1404821503,NL
-1404821504,1404829695,SE
+1404821504,1404821759,SE
+1404821760,1404822271,NL
+1404822272,1404822527,SE
+1404822528,1404822783,NL
+1404822784,1404823039,SE
+1404823040,1404825087,NL
+1404825088,1404825343,SE
+1404825344,1404826367,NL
+1404826368,1404826623,SE
+1404826624,1404827135,NL
+1404827136,1404827903,SE
+1404827904,1404829695,NL
1404829696,1404870655,RU
1404870656,1404872703,LT
1404872704,1404874751,SE
1404874752,1404875775,LV
-1404875776,1404876799,EE
-1404876800,1404887039,SE
-1404887040,1404887295,NL
-1404887296,1404887551,SE
-1404887552,1404893951,NL
-1404893952,1404894207,SE
-1404894208,1404927999,NL
+1404875776,1404887039,SE
+1404887040,1404927999,NL
1404928000,1404944383,SE
1404944384,1404960767,LT
1404960768,1405026303,SE
1405026304,1405042687,NO
-1405042688,1405043711,SE
-1405043712,1405044735,EE
-1405044736,1405046783,SE
-1405046784,1405047551,EE
-1405047552,1405048831,SE
+1405042688,1405048831,SE
1405048832,1405050879,HR
1405050880,1405059071,AT
-1405059072,1405059327,SE
-1405059328,1405061119,EE
-1405061120,1405062143,SE
-1405062144,1405062911,EE
-1405062912,1405063167,SE
+1405059072,1405063167,SE
1405063168,1405067263,NO
-1405067264,1405083903,EE
-1405083904,1405084159,SE
-1405084160,1405087231,EE
-1405087232,1405087743,SE
-1405087744,1405087999,EE
-1405088000,1405088255,SE
-1405088256,1405088767,EE
-1405088768,1405089023,SE
-1405089024,1405089279,EE
-1405089280,1405089535,SE
-1405089536,1405090559,EE
-1405090560,1405091839,SE
-1405091840,1406140415,FR
+1405067264,1405083647,EE
+1405083648,1405091839,SE
+1405091840,1405815295,FR
+1405815296,1405815551,MQ
+1405815552,1405820927,FR
+1405820928,1405821183,MQ
+1405821184,1405822719,FR
+1405822720,1405822975,MQ
+1405822976,1405834751,FR
+1405834752,1405835007,MQ
+1405835008,1405850879,FR
+1405850880,1405851135,MQ
+1405851136,1405858815,FR
+1405858816,1405859071,MQ
+1405859072,1405871103,FR
+1405871104,1405871359,MQ
+1405871360,1406140415,FR
1406140416,1406205951,CZ
1406205952,1406271487,SE
1406271488,1406337023,IE
@@ -16038,51 +17932,42 @@
1406689280,1406697471,SE
1406697472,1406705663,GB
1406705664,1406713855,IT
-1406713856,1406717951,AT
-1406717952,1406718975,GB
-1406718976,1406719103,AT
-1406719104,1406719487,GB
-1406719488,1406719743,AT
+1406713856,1406719743,AT
1406719744,1406719999,GB
-1406720000,1406721023,AT
-1406721024,1406722047,GB
+1406720000,1406722047,AT
1406722048,1406730239,DE
1406730240,1406746623,RU
1406746624,1406754815,BE
1406754816,1406763007,GB
-1406763008,1406763519,BE
-1406763520,1406764543,LU
-1406764544,1406765055,BE
-1406765056,1406765567,LU
-1406765568,1406765823,BE
-1406765824,1406766847,LU
-1406766848,1406767103,BE
+1406763008,1406763263,BE
+1406763264,1406764799,LU
+1406764800,1406765055,BE
+1406765056,1406765311,LU
+1406765312,1406765823,BE
+1406765824,1406766335,LU
+1406766336,1406767103,BE
1406767104,1406767615,LU
1406767616,1406767871,BE
-1406767872,1406769407,LU
-1406769408,1406769919,BE
-1406769920,1406770687,LU
-1406770688,1406770943,GB
+1406767872,1406768127,LU
+1406768128,1406768383,BE
+1406768384,1406769407,LU
+1406769408,1406769663,BE
+1406769664,1406770431,LU
+1406770432,1406770687,BE
+1406770688,1406770943,LU
1406770944,1406771199,BE
1406771200,1406779391,GB
1406779392,1406787583,RU
-1406787584,1406789631,ES
-1406789632,1406789887,FR
-1406789888,1406791167,ES
+1406787584,1406791167,ES
1406791168,1406791295,GB
-1406791296,1406792719,ES
-1406792720,1406792735,GB
-1406792736,1406793843,ES
+1406791296,1406793843,ES
1406793844,1406793847,GB
1406793848,1406794751,ES
1406794752,1406795775,NL
1406795776,1406796543,GB
1406796544,1406796799,IM
-1406796800,1406797055,GB
-1406797056,1406797311,IM
-1406797312,1406803455,GB
-1406803456,1406803711,IM
-1406803712,1406803967,GB
+1406796800,1406803455,GB
+1406803456,1406803967,IM
1406803968,1406812159,DE
1406812160,1406820351,SE
1406820352,1406828543,PL
@@ -16143,11 +18028,7 @@
1407526232,1407526239,CD
1407526240,1407529178,GB
1407529179,1407529180,NG
-1407529181,1407533311,GB
-1407533312,1407533567,BR
-1407533568,1407534079,GB
-1407534080,1407534335,US
-1407534336,1407534365,GB
+1407529181,1407534365,GB
1407534366,1407534366,NG
1407534367,1407537087,GB
1407537088,1407537095,GH
@@ -16155,7 +18036,11 @@
1407549440,1407582207,RU
1407582208,1407614975,PL
1407614976,1407680511,ES
-1407680512,1407702271,GB
+1407680512,1407695763,GB
+1407695764,1407695767,DK
+1407695768,1407695771,GB
+1407695772,1407695775,DK
+1407695776,1407702271,GB
1407702272,1407702527,DE
1407702528,1407711239,GB
1407711240,1407711247,FR
@@ -16207,13 +18092,13 @@
1408696320,1408729087,NL
1408729088,1408761855,ES
1408761856,1409286143,SE
-1409286144,1409363199,HU
-1409363200,1409363967,BG
+1409286144,1409362431,HU
+1409362432,1409363967,BG
1409363968,1409378679,HU
1409378680,1409378687,RO
1409378688,1409413119,HU
-1409413120,1409414655,BG
-1409414656,1409430271,HU
+1409413120,1409415167,BG
+1409415168,1409430271,HU
1409430272,1409430783,RO
1409430784,1409548287,HU
1409548288,1409810431,FR
@@ -16237,7 +18122,7 @@
1410359296,1410367487,CZ
1410367488,1410375679,RU
1410375680,1410378015,DK
-1410378016,1410378031,NR
+1410378016,1410378031,NO
1410378032,1410383871,DK
1410383872,1410392063,NO
1410392064,1410400255,DE
@@ -16257,7 +18142,9 @@
1410514944,1410523135,GB
1410523136,1410531327,PT
1410531328,1410539519,DE
-1410539520,1410547711,GB
+1410539520,1410540671,GB
+1410540672,1410540799,US
+1410540800,1410547711,GB
1410547712,1410555903,CZ
1410555904,1410564095,GB
1410564096,1410572287,SE
@@ -16283,15 +18170,9 @@
1410711552,1410719743,BG
1410719744,1410727935,RU
1410727936,1410736127,BG
-1410736128,1410737663,RS
-1410737664,1410737919,XK
-1410737920,1410738175,RS
-1410738176,1410738431,XK
-1410738432,1410738687,RS
+1410736128,1410738687,RS
1410738688,1410738943,XK
-1410738944,1410743295,RS
-1410743296,1410743551,XK
-1410743552,1410744319,RS
+1410738944,1410744319,RS
1410744320,1410752511,FR
1410752512,1410760703,NL
1410760704,1410768895,RU
@@ -16355,7 +18236,9 @@
1411919872,1411923967,DE
1411923968,1411940351,BG
1411940352,1411973119,PL
-1411973120,1412002815,SI
+1411973120,1411999743,SI
+1411999744,1412001023,BA
+1412001024,1412002815,SI
1412002816,1412003839,BA
1412003840,1412005887,SI
1412005888,1412038655,NL
@@ -16369,9 +18252,7 @@
1412300800,1412333567,DE
1412333568,1412366335,LT
1412366336,1412399103,SK
-1412399104,1412412159,RU
-1412412160,1412412415,UA
-1412412416,1412415487,RU
+1412399104,1412415487,RU
1412415488,1412419583,AE
1412419584,1412427775,IR
1412427776,1412429823,AE
@@ -16408,17 +18289,15 @@
1412939776,1412956159,CH
1412956160,1413480447,DE
1413480448,1414004735,IN
-1414004736,1414036479,CH
-1414036480,1414036991,DE
+1414004736,1414036607,CH
+1414036608,1414036991,DE
1414036992,1414039551,CH
1414039552,1414040575,DE
1414040576,1414069218,CH
1414069219,1414069219,AT
1414069220,1414094847,CH
1414094848,1414095615,DE
-1414095616,1414119295,CH
-1414119296,1414119423,DE
-1414119424,1414266879,CH
+1414095616,1414266879,CH
1414266880,1414529023,ES
1414529024,1415053311,NL
1415053312,1415184383,ES
@@ -16460,14 +18339,15 @@
1422770176,1422786559,GR
1422786560,1422852095,HU
1422857088,1422857151,FR
-1422916864,1422917631,GB
+1422916608,1422916863,GB
+1422917120,1422917343,GB
+1422917344,1422917375,NL
+1422917376,1422917631,GB
1422917632,1423441919,NO
1423441920,1423704063,SE
1423704064,1423966207,IT
1423966208,1424097279,HU
-1424097280,1424163583,CH
-1424163584,1424163839,DE
-1424163840,1424228351,CH
+1424097280,1424228351,CH
1424228352,1424286719,IL
1424286720,1424287743,BG
1424287744,1424359423,IL
@@ -16477,9 +18357,11 @@
1424503716,1424523263,ES
1424523264,1424556031,RO
1424556032,1424588799,EG
-1424588800,1424595743,GB
-1424595744,1424595751,IT
-1424595752,1424597069,GB
+1424588800,1424592639,GB
+1424592640,1424592895,FR
+1424592896,1424595711,GB
+1424595712,1424595967,IT
+1424595968,1424597069,GB
1424597070,1424597070,CZ
1424597071,1424600575,GB
1424600576,1424600831,FR
@@ -16523,7 +18405,8 @@
1424850944,1424883711,LV
1424883712,1424916479,DK
1424916480,1424949247,BG
-1424949248,1424982015,RO
+1424949248,1424965631,RO
+1424965632,1424982015,FR
1424982016,1425014783,FI
1425014784,1425031167,LT
1425031168,1425047551,FI
@@ -16580,9 +18463,12 @@
1425506304,1425522687,NO
1425522688,1425539071,IT
1425539072,1425801215,FI
-1425801216,1425817599,BG
+1425801216,1425813759,BG
+1425813760,1425814015,MK
+1425814016,1425814271,BG
+1425814272,1425814527,MK
+1425814528,1425817599,BG
1425820160,1425820415,DE
-1425832448,1425832703,DE
1425833984,1425850367,RU
1425850368,1425866751,GB
1425866752,1425883135,CH
@@ -16601,15 +18487,17 @@
1426014208,1426030591,DK
1426030592,1426046975,BH
1426046976,1426063359,SI
-1426063360,1426088447,CH
-1426088448,1426088703,DE
-1426088704,1426090495,CH
-1426090496,1426090623,DE
-1426090624,1426168575,CH
+1426063360,1426094335,CH
+1426094336,1426094591,DE
+1426094592,1426112511,CH
+1426112512,1426112767,DE
+1426112768,1426118271,CH
+1426118272,1426118399,DE
+1426118400,1426168575,CH
1426168576,1426168831,DE
-1426168832,1426311679,CH
-1426311680,1426311935,DE
-1426311936,1426587647,CH
+1426168832,1426175999,CH
+1426176000,1426176255,DE
+1426176256,1426587647,CH
1426587648,1426604031,SE
1426604032,1426620415,DE
1426636800,1426653183,GB
@@ -16663,7 +18551,23 @@
1427570688,1427636223,FI
1427636224,1427668991,DK
1427668992,1427701759,SE
-1427701760,1427739889,DE
+1427701760,1427712304,DE
+1427712305,1427712305,SG
+1427712306,1427712369,DE
+1427712370,1427712373,SG
+1427712374,1427712374,DE
+1427712375,1427712381,SG
+1427712382,1427712382,DE
+1427712383,1427712388,SG
+1427712389,1427722027,DE
+1427722028,1427722030,SG
+1427722031,1427722031,DE
+1427722032,1427722033,SG
+1427722034,1427728088,DE
+1427728089,1427728100,SG
+1427728101,1427728599,DE
+1427728600,1427728600,SK
+1427728601,1427739889,DE
1427739890,1427739890,RU
1427739891,1427741372,DE
1427741373,1427741373,AT
@@ -16701,10 +18605,12 @@
1428145152,1428147519,GB
1428147520,1428147583,FR
1428147584,1428147711,GB
-1428147712,1428147967,FR
-1428147968,1428148735,GB
+1428147712,1428148223,FR
+1428148224,1428148735,GB
1428148736,1428148991,FR
-1428148992,1428152319,GB
+1428148992,1428151807,GB
+1428151808,1428152063,FR
+1428152064,1428152319,GB
1428152320,1428160511,PL
1428160512,1428260863,IT
1428260864,1428261119,GB
@@ -16739,9 +18645,7 @@
1431945216,1431953407,NO
1431953408,1431961599,DK
1431961600,1431969791,CH
-1431969792,1431971583,GB
-1431971584,1431971839,AO
-1431971840,1431977983,GB
+1431969792,1431977983,GB
1431977984,1431986175,NL
1431986176,1431994367,RU
1431994368,1432002559,AT
@@ -16751,9 +18655,7 @@
1432027136,1432035327,IE
1432035328,1432043519,GB
1432043520,1432051711,ES
-1432051712,1432058623,RU
-1432058624,1432058879,UA
-1432058880,1432059903,RU
+1432051712,1432059903,RU
1432059904,1432068095,BG
1432068096,1432076287,BE
1432076288,1432084479,RU
@@ -16821,8 +18723,12 @@
1433615028,1433615028,GB
1433615029,1433615359,DE
1433615360,1433615615,FR
-1433615616,1433616383,GB
-1433616384,1433624575,AE
+1433615616,1433615871,GB
+1433615872,1433616127,CH
+1433616128,1433616383,GB
+1433616384,1433621759,AE
+1433621760,1433622015,IN
+1433622016,1433624575,AE
1433624576,1433632767,LV
1433632768,1433640959,GI
1433640960,1433649151,RU
@@ -16901,17 +18807,17 @@
1434451968,1434517503,PL
1434517504,1434550271,DK
1434550272,1434583039,SA
-1434583040,1434611711,BG
+1434583040,1434595327,BG
+1434595328,1434596351,MK
+1434596352,1434611711,BG
1434611712,1434613759,MK
1434613760,1434615807,BG
1434615808,1434648575,IL
1434648576,1434681343,FI
-1434681344,1434696703,NL
-1434696704,1434697727,DE
-1434697728,1434705919,NL
-1434705920,1434707967,DE
-1434707968,1434714111,NL
-1434714112,1434746879,AZ
+1434681344,1434714111,DE
+1434714112,1434717951,AZ
+1434717952,1434718207,GB
+1434718208,1434746879,AZ
1434746880,1434779647,CZ
1434779648,1434812415,GB
1434812416,1434845183,IR
@@ -16942,14 +18848,20 @@
1436444672,1436446719,BE
1436446720,1436450815,FR
1436450816,1436452863,BH
-1436452864,1436454911,GB
+1436452864,1436453375,GB
+1436453376,1436453631,DE
+1436453632,1436454911,GB
1436454912,1436456959,AZ
1436456960,1436459007,GB
1436459008,1436461055,NL
1436461056,1436463103,ES
-1436463104,1436465151,DE
+1436463104,1436464383,DE
+1436464384,1436464639,AT
+1436464640,1436465151,DE
1436465152,1436467199,RU
-1436467200,1436469247,DE
+1436467200,1436468223,DE
+1436468224,1436468479,AT
+1436468480,1436469247,DE
1436469248,1436471295,NL
1436471296,1436473343,BE
1436473344,1436475391,RO
@@ -16999,7 +18911,9 @@
1438384128,1438400511,FI
1438400512,1438433279,SE
1438433280,1438515199,GB
-1438515200,1438580735,DE
+1438515200,1438560255,DE
+1438560256,1438562303,US
+1438562304,1438580735,DE
1438580736,1438646271,NL
1438646272,1438662655,RU
1438662656,1438679039,ES
@@ -17024,7 +18938,9 @@
1438878208,1438885887,RU
1438885888,1438889983,LT
1438889984,1438892031,RU
-1438892032,1438896127,IS
+1438892032,1438893823,IS
+1438893824,1438894079,CH
+1438894080,1438896127,IS
1438896128,1438900223,AQ
1438900224,1438908415,CH
1438908416,1438924799,GR
@@ -17060,8 +18976,11 @@
1439346688,1439350783,RU
1439354880,1439358975,PL
1439358976,1439367167,RU
-1439367168,1439432703,NL
-1439432704,1439498239,RO
+1439367168,1439399935,NL
+1439399936,1439432703,DK
+1439432704,1439477759,RO
+1439477760,1439479807,MD
+1439479808,1439498239,RO
1439498240,1439513599,DE
1439513600,1439514623,GB
1439514624,1439516671,IT
@@ -17137,9 +19056,9 @@
1441439744,1441447935,LV
1441447936,1441456127,BE
1441456128,1441464319,NL
-1441464320,1441469695,SE
-1441469696,1441469951,DK
-1441469952,1441472511,SE
+1441464320,1441468927,SE
+1441468928,1441469183,DK
+1441469184,1441472511,SE
1441472512,1441480703,RU
1441480704,1441488895,TR
1441488896,1441497087,GB
@@ -17187,11 +19106,9 @@
1441734656,1441742847,RU
1441742848,1441751039,CZ
1441751040,1441759231,DE
-1441759232,1441763327,BG
-1441763328,1441765375,RO
-1441765376,1441767423,BG
+1441759232,1441767423,BG
1441767424,1441775615,IT
-1441775616,1441783807,ES
+1441775616,1441783807,IR
1441783808,1441791999,CZ
1441792000,1442316287,PT
1442316288,1442381823,SK
@@ -17229,9 +19146,7 @@
1445986304,1446051839,DK
1446051840,1446117375,CZ
1446117376,1446182911,FI
-1446182912,1446230271,SA
-1446230272,1446230527,GB
-1446230528,1446248447,SA
+1446182912,1446248447,SA
1446248448,1446313983,DK
1446313984,1446445055,GB
1446445056,1446510591,RO
@@ -17240,11 +19155,10 @@
1446576128,1446608895,IR
1446608896,1446641663,BY
1446641664,1446674431,SI
-1446674432,1446707199,DK
+1446674432,1446707135,DK
+1446707136,1446707199,NO
1446707200,1446739967,AT
-1446739968,1446753023,HU
-1446753024,1446753279,CH
-1446753280,1446772735,HU
+1446739968,1446772735,HU
1446772736,1446805503,SA
1446805504,1446838271,FI
1446838272,1446871039,SI
@@ -17265,9 +19179,27 @@
1449459712,1449525247,HU
1449525248,1449590783,RU
1449590784,1449656319,DE
-1449656320,1449840639,RO
+1449656320,1449706495,RO
+1449706496,1449707519,MD
+1449707520,1449736191,RO
+1449736192,1449738239,MD
+1449738240,1449742335,RO
+1449742336,1449744383,MD
+1449744384,1449765887,RO
+1449765888,1449766911,MD
+1449766912,1449775103,RO
+1449775104,1449776127,MD
+1449776128,1449819135,RO
+1449819136,1449820159,MD
+1449820160,1449824255,RO
+1449824256,1449826303,MD
+1449826304,1449840639,RO
1449840640,1449852927,MD
-1449852928,1449918463,RO
+1449852928,1449869311,RO
+1449869312,1449870335,MD
+1449870336,1449893887,RO
+1449893888,1449895935,MD
+1449895936,1449918463,RO
1449918464,1449951231,JO
1449951232,1449983999,TR
1449984000,1449992191,NL
@@ -17506,7 +19438,10 @@
1475211264,1475213311,DE
1475213312,1475215359,FR
1475215360,1475223551,IT
-1475223552,1475233791,NO
+1475223552,1475226495,SE
+1475226496,1475227647,NO
+1475227648,1475231743,SE
+1475231744,1475233791,NO
1475233792,1475235839,GB
1475235840,1475237887,IE
1475237888,1475239935,ES
@@ -17577,9 +19512,7 @@
1475575808,1475592191,AT
1475592192,1475608575,GB
1475608576,1475624959,RU
-1475624960,1475634431,JE
-1475634432,1475634495,GB
-1475634496,1475637303,JE
+1475624960,1475637303,JE
1475637304,1475637311,GB
1475637312,1475637471,JE
1475637472,1475637479,GB
@@ -17601,11 +19534,19 @@
1475674112,1475690495,DE
1475690496,1475706879,CH
1475706880,1475723263,RU
-1475723264,1475726079,GB
+1475723264,1475724866,GB
+1475724867,1475724867,RU
+1475724868,1475724869,GB
+1475724870,1475724870,RU
+1475724871,1475725055,GB
+1475725056,1475725311,RU
+1475725312,1475726079,GB
1475726080,1475726335,RU
1475726336,1475729663,GB
1475729664,1475729671,UA
-1475729672,1475738111,GB
+1475729672,1475731007,GB
+1475731008,1475731071,UA
+1475731072,1475738111,GB
1475738112,1475738879,RU
1475738880,1475739647,GB
1475739648,1475756031,BG
@@ -17667,9 +19608,7 @@
1476164608,1476165631,BH
1476165632,1476173823,HR
1476173824,1476182015,BG
-1476182016,1476183807,GB
-1476183808,1476184063,IE
-1476184064,1476186367,GB
+1476182016,1476186367,GB
1476186368,1476186383,IE
1476186384,1476190207,GB
1476190208,1476198399,BY
@@ -17704,9 +19643,17 @@
1476378624,1476386815,KZ
1476386816,1476395007,RU
1476395008,1478492159,ES
-1478492160,1479400703,IT
-1479400704,1479400959,US
-1479400960,1479898367,IT
+1478492160,1478772671,IT
+1478772672,1478772675,SI
+1478772676,1478912623,IT
+1478912624,1478912631,SI
+1478912632,1479296487,IT
+1479296488,1479296495,SI
+1479296496,1479392487,IT
+1479392488,1479392495,SI
+1479392496,1479421151,IT
+1479421152,1479421159,SI
+1479421160,1479898367,IT
1479898368,1479898623,US
1479898624,1480589311,IT
1480589312,1481637887,DE
@@ -17800,7 +19747,10 @@
1485246464,1485250559,UA
1485250560,1485254655,IR
1485254656,1485258751,RU
-1485258752,1485266943,UA
+1485258752,1485262847,UA
+1485262848,1485263615,RU
+1485263616,1485263871,UA
+1485263872,1485266943,RU
1485266944,1485271039,RO
1485271040,1485275135,UA
1485275136,1485283327,LV
@@ -17866,13 +19816,29 @@
1489567744,1489600511,BH
1489600512,1489633279,RU
1489633280,1489634303,FR
-1489634304,1489642751,IT
-1489642752,1489643519,FR
-1489643520,1489644543,IT
+1489634304,1489635839,IT
+1489635840,1489636863,FR
+1489636864,1489637119,IT
+1489637120,1489637631,FR
+1489637632,1489638143,IT
+1489638144,1489639423,FR
+1489639424,1489639679,IT
+1489639680,1489640959,FR
+1489640960,1489641215,IT
+1489641216,1489641471,FR
+1489641472,1489641599,PT
+1489641600,1489641727,GR
+1489641728,1489642495,FR
+1489642496,1489642751,IT
+1489642752,1489644031,FR
+1489644032,1489644287,IT
+1489644288,1489644543,FR
1489644544,1489644799,IQ
1489644800,1489649663,IT
1489649664,1489650687,FR
-1489650688,1489666047,IT
+1489650688,1489660159,IT
+1489660160,1489660415,LY
+1489660416,1489666047,IT
1489666048,1489674239,GB
1489674240,1489676287,NL
1489676288,1489698815,GB
@@ -17895,14 +19861,29 @@
1490075648,1490092031,GB
1490092032,1490108415,DE
1490108416,1490124799,MC
-1490124800,1490157567,HU
+1490124800,1490141183,HU
+1490141184,1490142719,CZ
+1490142720,1490143231,HU
+1490143232,1490143999,CZ
+1490144000,1490144255,HU
+1490144256,1490146559,CZ
+1490146560,1490146815,HU
+1490146816,1490148863,CZ
+1490148864,1490149119,HU
+1490149120,1490151679,CZ
+1490151680,1490151935,HU
+1490151936,1490153983,CZ
+1490153984,1490154239,HU
+1490154240,1490154495,CZ
+1490154496,1490154751,HU
+1490154752,1490157567,CZ
1490157568,1490173951,RU
1490173952,1490190335,PT
1490190336,1490196991,GB
1490196992,1490197247,IE
-1490197248,1490201087,GB
-1490201088,1490201343,DE
-1490201344,1490206719,GB
+1490197248,1490205183,GB
+1490205184,1490205439,LY
+1490205440,1490206719,GB
1490206720,1490223103,GE
1490223104,1490255871,GB
1490255872,1490272255,NL
@@ -17947,37 +19928,31 @@
1493172224,1493303295,DE
1493303296,1493430527,FR
1493430528,1493430783,GP
-1493430784,1493431295,FR
-1493431296,1493431551,GP
+1493430784,1493431039,FR
+1493431040,1493431551,GP
1493431552,1493431807,FR
-1493431808,1493432063,GP
-1493432064,1493432319,FR
-1493432320,1493433087,MQ
-1493433088,1493433343,FR
-1493433344,1493433599,MQ
-1493433600,1493433855,FR
-1493433856,1493434111,MQ
+1493431808,1493432319,GP
+1493432320,1493434111,MQ
1493434112,1493434367,FR
1493434368,1493565439,SA
1493565440,1493696511,ES
1493696512,1493958655,NO
1493958656,1494220799,DE
1494220800,1494221823,FR
-1494221824,1494222079,RE
-1494222080,1494222591,FR
+1494221824,1494222335,RE
+1494222336,1494222591,FR
1494222592,1494222847,RE
1494222848,1494223615,FR
1494223616,1494223871,RE
-1494223872,1494225663,FR
-1494225664,1494225919,GP
-1494225920,1494226175,FR
-1494226176,1494226431,GP
-1494226432,1494226687,FR
+1494223872,1494225407,FR
+1494225408,1494225663,GP
+1494225664,1494226687,FR
1494226688,1494226943,GP
1494226944,1494227455,FR
-1494227456,1494228223,GP
-1494228224,1494228479,FR
-1494228480,1494228991,GP
+1494227456,1494227967,GP
+1494227968,1494228479,FR
+1494228480,1494228735,GP
+1494228736,1494228991,FR
1494228992,1494237183,RU
1494237184,1494245375,IE
1494245376,1494253567,RU
@@ -18073,6 +20048,8 @@
1495140352,1495142399,FR
1495148544,1495150591,FR
1495151616,1495153663,FR
+1495160240,1495160255,FR
+1495160256,1495160263,GB
1495163552,1495163567,FR
1495168768,1495169023,GB
1495170760,1495170763,DE
@@ -18106,29 +20083,96 @@
1495263232,1495265279,GB
1495265280,1495267327,US
1495267328,1495269375,SE
-1495269376,1495306239,RO
+1495269376,1495283711,RO
+1495283712,1495285759,MD
+1495285760,1495304191,RO
+1495304192,1495306239,MD
1495306240,1495306573,GB
1495306574,1495306574,RO
1495306575,1495308287,GB
-1495308288,1495326719,RO
-1495326720,1495332863,MD
-1495332864,1495334911,RO
-1495334912,1495335935,MD
-1495335936,1495759871,RO
+1495308288,1495313407,RO
+1495313408,1495314431,MD
+1495314432,1495326719,RO
+1495326720,1495335935,MD
+1495335936,1495416831,RO
+1495416832,1495418879,MD
+1495418880,1495429119,RO
+1495429120,1495431167,MD
+1495431168,1495449599,RO
+1495449600,1495451647,MD
+1495451648,1495452671,RO
+1495452672,1495453695,MD
+1495453696,1495459839,RO
+1495459840,1495460863,MD
+1495460864,1495468031,RO
+1495468032,1495470079,MD
+1495470080,1495476223,RO
+1495476224,1495478271,MD
+1495478272,1495517183,RO
+1495517184,1495518207,MD
+1495518208,1495571455,RO
+1495571456,1495572479,MD
+1495572480,1495608319,RO
+1495608320,1495609343,MD
+1495609344,1495670783,RO
+1495670784,1495671807,MD
+1495671808,1495678975,RO
+1495678976,1495679999,MD
+1495680000,1495682047,RO
+1495682048,1495683071,MD
+1495683072,1495747583,RO
+1495747584,1495748607,MD
+1495748608,1495749631,RO
+1495749632,1495750655,MD
+1495750656,1495752703,RO
+1495752704,1495755775,MD
+1495755776,1495756799,RO
+1495756800,1495758847,MD
+1495758848,1495759871,RO
1495759872,1495760127,MD
1495760128,1495790079,RO
1495790080,1495790335,MD
-1495790336,1495875583,RO
+1495790336,1495852031,RO
+1495852032,1495853055,MD
+1495853056,1495875583,RO
1495875584,1495891967,MD
-1495891968,1496078335,RO
+1495891968,1495941119,RO
+1495941120,1495942143,MD
+1495942144,1495943167,RO
+1495943168,1495945215,MD
+1495945216,1495951359,RO
+1495951360,1495952383,MD
+1495952384,1495957503,RO
+1495957504,1495958527,MD
+1495958528,1495970815,RO
+1495970816,1495971839,MD
+1495971840,1495982079,RO
+1495982080,1495983103,MD
+1495983104,1495986175,RO
+1495986176,1495988223,MD
+1495988224,1496018943,RO
+1496018944,1496020991,MD
+1496020992,1496023039,RO
+1496023040,1496024063,MD
+1496024064,1496033279,RO
+1496033280,1496034303,MD
+1496034304,1496053759,RO
+1496053760,1496055807,MD
+1496055808,1496078335,RO
1496078336,1496079359,MD
1496079360,1496084991,RO
1496084992,1496085247,MD
-1496085248,1496121343,RO
+1496085248,1496094719,RO
+1496094720,1496095743,MD
+1496095744,1496121343,RO
1496121344,1496122367,MD
-1496122368,1496197119,RO
+1496122368,1496131583,RO
+1496131584,1496132607,MD
+1496132608,1496197119,RO
1496197120,1496197631,MD
-1496197632,1496276735,RO
+1496197632,1496228863,RO
+1496228864,1496229887,MD
+1496229888,1496276735,RO
1496276736,1496276991,MD
1496276992,1496295423,RO
1496295424,1496297471,GB
@@ -18389,8 +20433,8 @@
1503899184,1503899191,GR
1503899192,1503899199,CH
1503899200,1503899271,DE
-1503899272,1503899287,BE
-1503899288,1503899295,DE
+1503899272,1503899279,BE
+1503899280,1503899295,DE
1503899296,1503899303,GR
1503899304,1503899311,NL
1503899312,1503899351,DE
@@ -18453,16 +20497,24 @@
1503903688,1503903695,IT
1503903696,1503903711,DE
1503903712,1503903719,IT
-1503903720,1503920127,DE
-1503920128,1503985663,HR
+1503903720,1503904319,DE
+1503904320,1503904327,IT
+1503904328,1503904343,DE
+1503904344,1503904351,BE
+1503904352,1503904367,DE
+1503904368,1503904375,CH
+1503904376,1503920127,DE
+1503920128,1503985151,HR
+1503985152,1503985407,DE
+1503985408,1503985663,HR
1503985664,1504018431,IR
1504018432,1504051199,RO
1504051200,1504083967,FI
1504083968,1504116735,DE
1504116736,1504149503,PL
-1504149504,1504152575,GB
-1504152576,1504152831,IE
-1504152832,1504154623,GB
+1504149504,1504149759,GB
+1504149760,1504150015,ES
+1504150016,1504154623,GB
1504154624,1504155647,IE
1504155648,1504247807,GB
1504247808,1504313343,RU
@@ -18490,7 +20542,9 @@
1505320960,1505329151,AT
1505329152,1505335807,IE
1505335808,1505336063,GB
-1505336064,1505337343,IE
+1505336064,1505336575,IE
+1505336576,1505336831,GB
+1505336832,1505337343,IE
1505337344,1505345535,FR
1505345536,1505353727,MK
1505353728,1505361919,CZ
@@ -18534,21 +20588,37 @@
1505665024,1505673215,IT
1505673216,1505681407,BG
1505681408,1505689599,RU
-1505689600,1505691391,NO
-1505691392,1505691418,DK
-1505691419,1505691423,NO
-1505691424,1505691647,DK
-1505691648,1505697791,NO
+1505689600,1505697791,NO
1505697792,1505705983,IE
1505705984,1505714175,DE
1505714176,1505722367,LV
1505722368,1505738751,PL
-1505738752,1505746943,GB
+1505738752,1505740543,GB
+1505740544,1505740607,IL
+1505740608,1505740631,GB
+1505740632,1505740799,IL
+1505740800,1505746943,GB
1505746944,1505755135,RU
1505755136,1506017279,GB
-1506017280,1506082815,DE
+1506017280,1506082815,IR
1506082816,1506148351,GB
-1506148352,1506279423,DE
+1506148352,1506218751,IR
+1506218752,1506219007,DE
+1506219008,1506219263,IR
+1506219264,1506219519,DE
+1506219520,1506219775,IR
+1506219776,1506220031,DE
+1506220032,1506261759,IR
+1506261760,1506262783,DE
+1506262784,1506265343,IR
+1506265344,1506267135,DE
+1506267136,1506270207,IR
+1506270208,1506271231,DE
+1506271232,1506274303,IR
+1506274304,1506274559,DE
+1506274560,1506274815,IR
+1506274816,1506275071,DE
+1506275072,1506279423,IR
1506279424,1506312191,NL
1506312192,1506316287,GB
1506316288,1506322431,PL
@@ -18567,8 +20637,8 @@
1506410496,1506422063,DE
1506422064,1506422079,GB
1506422080,1506443263,DE
-1506443264,1506445087,GB
-1506445088,1506445119,DE
+1506443264,1506445103,GB
+1506445104,1506445119,DE
1506445120,1506445135,GB
1506445136,1506445151,DE
1506445152,1506445167,GB
@@ -18579,24 +20649,15 @@
1506450048,1506450111,CH
1506450112,1506450863,GB
1506450864,1506450879,CZ
-1506450880,1506452223,GB
-1506452224,1506452479,DE
-1506452480,1506456319,GB
-1506456320,1506456575,IT
-1506456576,1506458244,GB
+1506450880,1506453311,GB
+1506453312,1506453319,SE
+1506453320,1506456831,GB
+1506456832,1506457087,IT
+1506457088,1506458244,GB
1506458245,1506458245,CH
-1506458246,1506459135,GB
-1506459136,1506459177,BE
-1506459178,1506459178,GB
-1506459179,1506459391,BE
-1506459392,1506460151,GB
+1506458246,1506460151,GB
1506460152,1506460159,FR
-1506460160,1506462463,GB
-1506462464,1506462719,FR
-1506462720,1506462975,IT
-1506462976,1506463231,GB
-1506463232,1506463487,SE
-1506463488,1506463679,GB
+1506460160,1506463679,GB
1506463680,1506463695,DE
1506463696,1506464895,GB
1506464896,1506464911,NL
@@ -18652,8 +20713,7 @@
1506789376,1506791423,DE
1506791424,1506793471,GB
1506793472,1506795519,RU
-1506795520,1506797567,IE
-1506797568,1506799615,ES
+1506795520,1506799615,CH
1506799616,1506801663,LV
1506801664,1506803135,DE
1506803136,1506803151,CH
@@ -18668,7 +20728,9 @@
1507262464,1507327999,BG
1507328000,1507393535,RS
1507393536,1507459071,CH
-1507459072,1507524607,KZ
+1507459072,1507502847,KZ
+1507502848,1507503103,GB
+1507503104,1507524607,KZ
1507524608,1507590143,EE
1507590144,1507655679,NL
1507655680,1507659775,DE
@@ -18710,21 +20772,13 @@
1508589568,1508605951,IR
1508605952,1508622335,RU
1508622336,1508638719,EE
-1508638720,1508639487,SE
-1508639488,1508639743,DK
-1508639744,1508639999,SE
+1508638720,1508639999,SE
1508640000,1508640255,DK
-1508640256,1508640511,SE
-1508640512,1508640767,DK
-1508640768,1508642559,SE
+1508640256,1508642559,SE
1508642560,1508642815,DK
1508642816,1508650751,SE
1508650752,1508651007,DK
-1508651008,1508653311,SE
-1508653312,1508653567,DK
-1508653568,1508653823,SE
-1508653824,1508654079,DK
-1508654080,1508655103,SE
+1508651008,1508655103,SE
1508655104,1508671487,FI
1508671488,1508687871,CH
1508687872,1508704255,UZ
@@ -18735,7 +20789,9 @@
1508769792,1508786175,PL
1508786176,1508802559,DE
1508802560,1508818943,GB
-1508818944,1508830719,RO
+1508818944,1508819711,RO
+1508819712,1508819967,DE
+1508819968,1508830719,RO
1508830720,1508831487,SK
1508831488,1508835327,RO
1508835328,1508851711,CZ
@@ -18817,78 +20873,79 @@
1509900288,1509916671,RU
1509916672,1509933055,GB
1509933056,1509949439,US
-1509949440,1511981055,FR
+1509949440,1510663167,FR
+1510663168,1510663423,RE
+1510663424,1511981055,FR
1511981056,1511981567,RE
-1511981568,1511982079,FR
-1511982080,1511983615,RE
-1511983616,1511983871,FR
-1511983872,1511986175,RE
+1511981568,1511982591,FR
+1511982592,1511983615,RE
+1511983616,1511984639,FR
+1511984640,1511985151,RE
+1511985152,1511985407,FR
+1511985408,1511986175,RE
1511986176,1511986431,FR
1511986432,1511986687,RE
-1511986688,1511987199,FR
-1511987200,1511987711,RE
-1511987712,1511987967,FR
-1511987968,1511989247,RE
+1511986688,1511986943,FR
+1511986944,1511987199,RE
+1511987200,1511987967,FR
+1511987968,1511988479,RE
+1511988480,1511988735,FR
+1511988736,1511989247,RE
1511989248,1511989503,FR
1511989504,1511990271,RE
1511990272,1511990527,FR
-1511990528,1511990783,RE
-1511990784,1511991039,FR
-1511991040,1511991295,RE
+1511990528,1511991295,RE
1511991296,1511991551,FR
-1511991552,1511993343,RE
-1511993344,1511993855,FR
-1511993856,1511994367,RE
+1511991552,1511992575,RE
+1511992576,1511993087,FR
+1511993088,1511994367,RE
1511994368,1511995135,FR
-1511995136,1511996159,RE
-1511996160,1511996415,FR
-1511996416,1511997183,RE
-1511997184,1511997439,FR
-1511997440,1511999487,MQ
+1511995136,1511995391,RE
+1511995392,1511995647,FR
+1511995648,1511996415,RE
+1511996416,1511996671,FR
+1511996672,1511996927,RE
+1511996928,1511997439,FR
+1511997440,1511998207,MQ
+1511998208,1511998463,FR
+1511998464,1511998719,MQ
+1511998720,1511998975,FR
+1511998976,1511999487,MQ
1511999488,1511999743,FR
-1511999744,1512000767,MQ
-1512000768,1512001279,FR
-1512001280,1512002303,MQ
-1512002304,1512002559,FR
-1512002560,1512003839,MQ
-1512003840,1512004351,FR
-1512004352,1512004863,MQ
-1512004864,1512005119,FR
-1512005120,1512005631,MQ
-1512005632,1512005887,BL
-1512005888,1512006143,FR
-1512006144,1512006655,BL
-1512006656,1512006911,FR
+1511999744,1512001023,MQ
+1512001024,1512001535,FR
+1512001536,1512003583,MQ
+1512003584,1512003839,FR
+1512003840,1512004095,MQ
+1512004096,1512004351,FR
+1512004352,1512005631,MQ
+1512005632,1512006143,BL
+1512006144,1512006399,FR
+1512006400,1512006911,BL
1512006912,1512007167,MF
-1512007168,1512007679,FR
-1512007680,1512007935,BL
+1512007168,1512007423,FR
+1512007424,1512007935,BL
1512007936,1512008191,FR
1512008192,1512008447,BL
1512008448,1512008703,MF
-1512008704,1512008959,BL
-1512008960,1512009215,FR
+1512008704,1512009215,BL
1512009216,1512009471,MF
-1512009472,1512009983,BL
-1512009984,1512010239,FR
-1512010240,1512010495,BL
-1512010496,1512010751,FR
-1512010752,1512011007,BL
-1512011008,1512011263,MF
-1512011264,1512011519,FR
-1512011520,1512011775,BL
-1512011776,1512012031,FR
-1512012032,1512012287,BL
+1512009472,1512010239,BL
+1512010240,1512010495,GP
+1512010496,1512010751,BL
+1512010752,1512011263,MF
+1512011264,1512012287,BL
1512012288,1512012543,FR
1512012544,1512013055,BL
-1512013056,1512013311,MF
+1512013056,1512013311,FR
1512013312,1512013567,BL
1512013568,1512013823,FR
1512013824,1512016639,GF
1512016640,1512016895,FR
-1512016896,1512017663,GF
-1512017664,1512017919,FR
-1512017920,1512020223,GF
-1512020224,1512022015,FR
+1512016896,1512018943,GF
+1512018944,1512019199,FR
+1512019200,1512020479,GF
+1512020480,1512022015,FR
1512022016,1512022271,GF
1512022272,1512022527,FR
1512022528,1512028415,GF
@@ -18897,116 +20954,132 @@
1512046592,1512767487,FR
1512767488,1512767743,RE
1512767744,1512767999,FR
-1512768000,1512771071,RE
-1512771072,1512771327,FR
-1512771328,1512772351,RE
-1512772352,1512773119,FR
-1512773120,1512774911,RE
-1512774912,1512775679,FR
-1512775680,1512777215,RE
+1512768000,1512768255,RE
+1512768256,1512768511,FR
+1512768512,1512770047,RE
+1512770048,1512770303,FR
+1512770304,1512770815,RE
+1512770816,1512771583,FR
+1512771584,1512772351,RE
+1512772352,1512772863,FR
+1512772864,1512777215,RE
1512777216,1512777471,FR
-1512777472,1512779519,RE
-1512779520,1512779775,FR
-1512779776,1512781567,RE
+1512777472,1512778495,RE
+1512778496,1512779007,FR
+1512779008,1512779519,RE
+1512779520,1512780031,FR
+1512780032,1512780287,RE
+1512780288,1512780543,FR
+1512780544,1512781567,RE
1512781568,1512782847,FR
1512782848,1512783103,RE
1512783104,1512783359,FR
-1512783360,1512783615,RE
-1512783616,1512783871,FR
-1512783872,1512784639,RE
-1512784640,1512784895,FR
-1512784896,1512785663,RE
-1512785664,1512786943,FR
-1512786944,1512787455,RE
-1512787456,1512787711,FR
-1512787712,1512787967,RE
-1512787968,1512788479,FR
-1512788480,1512788735,RE
-1512788736,1512788991,FR
-1512788992,1512789503,RE
-1512789504,1512789759,FR
-1512789760,1512791807,RE
-1512791808,1512792831,FR
-1512792832,1512794623,RE
+1512783360,1512785919,RE
+1512785920,1512787199,FR
+1512787200,1512787967,RE
+1512787968,1512788223,FR
+1512788224,1512791807,RE
+1512791808,1512793087,FR
+1512793088,1512794111,RE
+1512794112,1512794367,FR
+1512794368,1512794623,RE
1512794624,1512794879,FR
-1512794880,1512796415,RE
+1512794880,1512795135,RE
+1512795136,1512795391,FR
+1512795392,1512796415,RE
1512796416,1512796671,FR
1512796672,1512797183,RE
1512797184,1512797439,FR
-1512797440,1512798207,RE
-1512798208,1512800767,FR
-1512800768,1512801023,MQ
+1512797440,1512797695,RE
+1512797696,1512797951,FR
+1512797952,1512798207,RE
+1512798208,1512799231,FR
+1512799232,1512799487,RE
+1512799488,1512800511,FR
+1512800512,1512801023,MQ
1512801024,1512801535,FR
-1512801536,1512802047,MQ
-1512802048,1512802303,FR
-1512802304,1512803327,MQ
-1512803328,1512803583,FR
-1512803584,1512803839,MQ
+1512801536,1512802303,MQ
+1512802304,1512802815,FR
+1512802816,1512803071,MQ
+1512803072,1512803327,FR
+1512803328,1512803839,MQ
1512803840,1512804607,FR
1512804608,1512805375,MQ
1512805376,1512805631,FR
-1512805632,1512805887,MQ
-1512805888,1512806143,FR
-1512806144,1512807935,MQ
-1512807936,1512808191,FR
-1512808192,1512808959,MQ
+1512805632,1512806399,MQ
+1512806400,1512806655,FR
+1512806656,1512807423,MQ
+1512807424,1512807679,FR
+1512807680,1512807935,MQ
+1512807936,1512808447,FR
+1512808448,1512808959,MQ
1512808960,1512809215,FR
-1512809216,1512812031,MQ
-1512812032,1512812287,FR
-1512812288,1512812543,MQ
+1512809216,1512810495,MQ
+1512810496,1512810751,FR
+1512810752,1512812543,MQ
1512812544,1512812799,FR
-1512812800,1512813823,MQ
+1512812800,1512813311,MQ
+1512813312,1512813567,FR
+1512813568,1512813823,MQ
1512813824,1512814079,FR
-1512814080,1512814591,MQ
-1512814592,1512814847,FR
-1512814848,1512816639,MQ
-1512816640,1512816895,GP
-1512816896,1512817407,FR
-1512817408,1512824319,GP
-1512824320,1512824575,FR
-1512824576,1512825087,GP
-1512825088,1512825343,FR
-1512825344,1512826367,GP
-1512826368,1512826879,FR
-1512826880,1512827135,GP
-1512827136,1512827391,FR
-1512827392,1512830463,GP
+1512814080,1512815615,MQ
+1512815616,1512815871,FR
+1512815872,1512816639,MQ
+1512816640,1512818431,GP
+1512818432,1512818687,FR
+1512818688,1512819967,GP
+1512819968,1512820223,FR
+1512820224,1512822271,GP
+1512822272,1512822527,FR
+1512822528,1512824319,GP
+1512824320,1512824831,FR
+1512824832,1512826367,GP
+1512826368,1512826623,FR
+1512826624,1512828671,GP
+1512828672,1512828927,FR
+1512828928,1512830463,GP
1512830464,1512830719,FR
1512830720,1512831999,GP
1512832000,1512832255,FR
1512832256,1512832767,GP
1512832768,1514110975,FR
-1514110976,1514111743,GP
-1514111744,1514111999,FR
-1514112000,1514112255,GP
+1514110976,1514111487,GP
+1514111488,1514111743,FR
+1514111744,1514112255,GP
1514112256,1514112767,FR
1514112768,1514114047,GP
1514114048,1514114559,FR
-1514114560,1514115839,GP
-1514115840,1514118143,FR
-1514118144,1514119167,GP
-1514119168,1514119935,FR
-1514119936,1514120191,GP
-1514120192,1514121215,FR
-1514121216,1514122495,GP
-1514122496,1514122751,FR
-1514122752,1514123263,GP
-1514123264,1514123519,FR
-1514123520,1514124543,GP
-1514124544,1514127359,FR
-1514127360,1514127615,RE
-1514127616,1514127871,FR
-1514127872,1514128127,RE
-1514128128,1514128383,FR
-1514128384,1514128639,RE
-1514128640,1514128895,FR
-1514128896,1514129919,RE
+1514114560,1514116863,GP
+1514116864,1514117119,FR
+1514117120,1514117887,GP
+1514117888,1514118143,FR
+1514118144,1514119423,GP
+1514119424,1514119679,FR
+1514119680,1514119935,GP
+1514119936,1514120191,FR
+1514120192,1514121215,GP
+1514121216,1514121471,FR
+1514121472,1514123007,GP
+1514123008,1514123263,FR
+1514123264,1514125055,GP
+1514125056,1514125823,FR
+1514125824,1514126079,GP
+1514126080,1514126335,FR
+1514126336,1514126591,GP
+1514126592,1514127359,FR
+1514127360,1514127871,RE
+1514127872,1514128127,FR
+1514128128,1514128895,RE
+1514128896,1514129151,FR
+1514129152,1514129919,RE
1514129920,1514130175,FR
-1514130176,1514130431,RE
-1514130432,1514130943,FR
-1514130944,1514131199,RE
-1514131200,1514131711,FR
-1514131712,1514132735,RE
+1514130176,1514130687,RE
+1514130688,1514130943,FR
+1514130944,1514131455,RE
+1514131456,1514131711,FR
+1514131712,1514131967,RE
+1514131968,1514132223,FR
+1514132224,1514132735,RE
1514132736,1514132991,FR
1514132992,1514134015,RE
1514134016,1514134271,FR
@@ -19015,14 +21088,14 @@
1514135552,1514135807,RE
1514135808,1514136063,FR
1514136064,1514136831,RE
-1514136832,1514137599,FR
-1514137600,1514139391,RE
+1514136832,1514137855,FR
+1514137856,1514139391,RE
1514139392,1514139647,FR
-1514139648,1514140159,RE
-1514140160,1514140415,FR
-1514140416,1514141695,RE
-1514141696,1514141951,FR
-1514141952,1514143743,RE
+1514139648,1514140415,RE
+1514140416,1514140671,FR
+1514140672,1514142207,RE
+1514142208,1514142463,FR
+1514142464,1514143743,RE
1514143744,1515467007,FR
1515467008,1515467263,ES
1515467264,1515467519,FR
@@ -19043,7 +21116,21 @@
1515489168,1518338047,FR
1518338048,1518370815,DE
1518370816,1518403583,NL
-1518403584,1518452735,SE
+1518403584,1518436351,SE
+1518436352,1518439679,NO
+1518439680,1518439935,SE
+1518439936,1518441471,NO
+1518441472,1518441727,SE
+1518441728,1518444031,NO
+1518444032,1518444287,SE
+1518444288,1518444543,NO
+1518444544,1518444799,SE
+1518444800,1518445823,NO
+1518445824,1518446335,SE
+1518446336,1518448383,NO
+1518448384,1518448895,SE
+1518448896,1518452223,NO
+1518452224,1518452735,SE
1518452736,1518460927,AT
1518460928,1518470143,NL
1518470144,1518472191,SE
@@ -19064,7 +21151,49 @@
1518518272,1518542847,SE
1518542848,1518551039,LT
1518551040,1518565375,NL
-1518565376,1518633215,SE
+1518565376,1518567423,SE
+1518567424,1518568703,LV
+1518568704,1518568959,SE
+1518568960,1518570239,LV
+1518570240,1518570495,SE
+1518570496,1518572543,LV
+1518572544,1518572799,SE
+1518572800,1518573311,LV
+1518573312,1518573823,SE
+1518573824,1518574335,LV
+1518574336,1518574591,SE
+1518574592,1518576127,LV
+1518576128,1518576383,SE
+1518576384,1518577407,LV
+1518577408,1518577919,SE
+1518577920,1518578687,LV
+1518578688,1518578943,SE
+1518578944,1518580479,LV
+1518580480,1518580735,SE
+1518580736,1518582271,LV
+1518582272,1518582527,SE
+1518582528,1518583039,LV
+1518583040,1518583295,SE
+1518583296,1518585343,LV
+1518585344,1518585599,SE
+1518585600,1518585855,LV
+1518585856,1518586111,SE
+1518586112,1518586623,LV
+1518586624,1518586879,SE
+1518586880,1518587647,LV
+1518587648,1518587903,SE
+1518587904,1518591743,LV
+1518591744,1518591999,SE
+1518592000,1518592255,LV
+1518592256,1518592511,SE
+1518592512,1518594047,LV
+1518594048,1518594303,SE
+1518594304,1518594815,LV
+1518594816,1518595071,SE
+1518595072,1518595327,LV
+1518595328,1518595583,SE
+1518595584,1518600191,LV
+1518600192,1518633215,SE
1518633216,1518633471,NL
1518633472,1518635007,SE
1518635008,1518637055,NL
@@ -19089,28 +21218,49 @@
1518967808,1518977023,HR
1518977024,1518993407,SE
1518993408,1519190015,RU
-1519190016,1519259647,SE
+1519190016,1519206399,SE
+1519206400,1519208447,LV
+1519208448,1519259647,SE
1519259648,1519260671,NL
1519260672,1519263743,SE
1519263744,1519289343,NL
1519289344,1519292415,SE
1519292416,1519293951,LT
-1519293952,1519300607,SE
+1519293952,1519297023,SE
+1519297024,1519297279,LT
+1519297280,1519297535,SE
+1519297536,1519297791,LT
+1519297792,1519300607,SE
1519300608,1519304703,LT
-1519304704,1519321087,SE
+1519304704,1519313151,SE
+1519313152,1519313407,LT
+1519313408,1519313663,SE
+1519313664,1519313919,LT
+1519313920,1519314175,SE
+1519314176,1519318271,LT
+1519318272,1519318527,SE
+1519318528,1519321087,LT
1519321088,1519386623,RU
1519386624,1519394815,SE
1519394816,1519398911,HR
1519398912,1519403007,SE
-1519403008,1519411199,NL
-1519411200,1519452159,SE
+1519403008,1519411711,NL
+1519411712,1519411967,SE
+1519411968,1519415295,NL
+1519415296,1519415551,SE
+1519415552,1519416575,NL
+1519416576,1519416831,SE
+1519416832,1519419391,NL
+1519419392,1519452159,SE
1519452160,1519517695,NL
1519517696,1519583231,AT
1519583232,1519648767,IT
1519648768,1519714303,SA
1519714304,1519779839,NO
1519779840,1519910911,RU
-1519910912,1519931391,GB
+1519910912,1519928063,GB
+1519928064,1519928319,DK
+1519928320,1519931391,GB
1519931392,1519934463,NL
1519934464,1519936191,GB
1519936192,1519936255,DK
@@ -19139,7 +21289,9 @@
1522532352,1524629503,GB
1524629504,1525092351,SE
1525092352,1525092479,DK
-1525092480,1525678079,SE
+1525092480,1525122047,SE
+1525122048,1525122175,DK
+1525122176,1525678079,SE
1525678080,1526726655,GB
1526726656,1531183103,DE
1531183104,1531445247,FR
@@ -19214,8 +21366,8 @@
1533478912,1533480959,RS
1533480960,1533483007,NL
1533483008,1533485055,AM
-1533485056,1533485823,GB
-1533485824,1533486335,SE
+1533485056,1533486079,GB
+1533486080,1533486335,SE
1533486336,1533486591,NO
1533486592,1533487103,GB
1533487104,1533489151,FR
@@ -19252,7 +21404,9 @@
1533671424,1533673471,FI
1533673472,1533677567,DE
1533677568,1533679615,ES
-1533679616,1533681663,PL
+1533679616,1533680127,PL
+1533680128,1533680383,ES
+1533680384,1533681663,PL
1533681664,1533689855,IQ
1533689856,1533698047,IR
1533698048,1533702143,JO
@@ -19299,15 +21453,35 @@
1534590976,1534656511,HU
1534656512,1534711807,FR
1534711808,1534712831,BE
-1534712832,1534714751,FR
+1534712832,1534714415,FR
+1534714416,1534714431,ES
+1534714432,1534714751,FR
1534714752,1534714767,DE
-1534714768,1534717663,FR
+1534714768,1534715871,FR
+1534715872,1534715875,ES
+1534715876,1534715935,FR
+1534715936,1534715939,NL
+1534715940,1534716375,FR
+1534716376,1534716379,ES
+1534716380,1534717247,FR
+1534717248,1534717251,ES
+1534717252,1534717263,FR
+1534717264,1534717267,ES
+1534717268,1534717663,FR
1534717664,1534717679,GB
-1534717680,1534720003,FR
+1534717680,1534718763,FR
+1534718764,1534718767,ES
+1534718768,1534719747,FR
+1534719748,1534719751,ES
+1534719752,1534719783,FR
+1534719784,1534719787,ES
+1534719788,1534720003,FR
1534720004,1534720007,ES
1534720008,1534720023,FR
1534720024,1534720027,PL
-1534720028,1534720471,FR
+1534720028,1534720179,FR
+1534720180,1534720183,ES
+1534720184,1534720471,FR
1534720472,1534720479,DE
1534720480,1534721619,FR
1534721620,1534721623,ES
@@ -19329,7 +21503,8 @@
1534849024,1534853119,NL
1534853120,1534918655,UA
1534918656,1534984191,GB
-1534984192,1535049727,ES
+1534984192,1534985215,NO
+1534985216,1535049727,ES
1535049728,1535115263,SK
1535115264,1535197183,AT
1535197184,1535246335,SE
@@ -19340,7 +21515,8 @@
1535352832,1535361023,EE
1535361024,1535377407,NL
1535377408,1535442943,GR
-1535442944,1535459327,FI
+1535442944,1535451135,FI
+1535451136,1535459327,DK
1535459328,1535475711,AT
1535475712,1535508479,IR
1535508480,1535574015,BG
@@ -19497,7 +21673,9 @@
1538932736,1538940927,NO
1538940928,1538949119,RU
1538949120,1538957311,AT
-1538957312,1538965503,DE
+1538957312,1538964991,DE
+1538964992,1538965247,GB
+1538965248,1538965503,DE
1538965504,1538973695,IR
1538973696,1538981887,JO
1538981888,1538990079,BY
@@ -19514,7 +21692,6 @@
1539072000,1539080191,PL
1539080192,1539088383,UZ
1539088384,1539096575,RU
-1539105024,1539105279,TR
1539112960,1539115007,PL
1539115008,1539117055,AE
1539117056,1539123199,PL
@@ -19552,8 +21729,7 @@
1539211264,1539213311,CZ
1539213312,1539215359,SE
1539215360,1539219455,DE
-1539219456,1539219711,GB
-1539219712,1539221247,GG
+1539219456,1539221247,GG
1539221248,1539221503,GB
1539221504,1539223551,FR
1539223552,1539225599,RU
@@ -19884,9 +22060,7 @@
1539564544,1539565055,GB
1539565056,1539565567,UA
1539565568,1539566079,PL
-1539566080,1539566591,NL
-1539566592,1539566847,DE
-1539566848,1539567103,NL
+1539566080,1539567103,NL
1539567104,1539567615,CH
1539567616,1539568127,DE
1539568128,1539568639,NL
@@ -20478,9 +22652,7 @@
1539886080,1539887103,FR
1539887104,1539888127,IT
1539888128,1539889151,UA
-1539889152,1539889663,RU
-1539889664,1539889919,AU
-1539889920,1539890175,RU
+1539889152,1539890175,RU
1539890176,1539891199,UA
1539891200,1539893247,RU
1539893248,1539894271,UA
@@ -20510,7 +22682,7 @@
1539927040,1539928063,UA
1539928064,1539930111,RU
1539930112,1539931135,PL
-1539931136,1539932159,RU
+1539931136,1539932159,UA
1539932160,1539933183,DE
1539933184,1539934207,ES
1539934208,1539935231,RS
@@ -20602,7 +22774,6 @@
1540046848,1540047871,RU
1540047872,1540048895,LV
1540048896,1540049919,GB
-1540050688,1540050943,UA
1540050944,1540052991,RU
1540052992,1540054015,UA
1540055040,1540056063,NO
@@ -20746,7 +22917,7 @@
1540229120,1540229631,AT
1540229632,1540230143,NL
1540230144,1540232191,RU
-1540232192,1540232703,BG
+1540232192,1540232703,LU
1540232704,1540233215,RU
1540233216,1540233727,CH
1540233728,1540234239,PL
@@ -20765,7 +22936,7 @@
1540242944,1540243455,RU
1540243456,1540243967,PL
1540243968,1540244479,RU
-1540244480,1540244991,CH
+1540244480,1540244735,CH
1540244992,1540245503,DE
1540245504,1540246015,RU
1540246016,1540246527,IT
@@ -20907,6 +23078,7 @@
1540329984,1540330495,UA
1540330496,1540331007,PL
1540331008,1540331519,IT
+1540331520,1540332031,GB
1540332544,1540333055,PL
1540333056,1540333567,NO
1540333568,1540334079,RO
@@ -21007,7 +23179,6 @@
1540374784,1540375039,UA
1540375040,1540375551,GB
1540375552,1540375807,DE
-1540375808,1540376063,NL
1540376064,1540376319,TR
1540376320,1540376575,DK
1540376576,1540376831,PL
@@ -21397,7 +23568,6 @@
1540510720,1540511743,RU
1540511744,1540512767,BG
1540512768,1540514815,RU
-1540514816,1540515839,GB
1540515840,1540516863,RU
1540516864,1540517887,UA
1540517888,1540518911,RU
@@ -21595,7 +23765,7 @@
1540655360,1540655615,RU
1540655616,1540655871,GB
1540655872,1540656383,NL
-1540656384,1540656895,RU
+1540656640,1540656895,RU
1540656896,1540657151,RO
1540657152,1540657407,DE
1540657408,1540657663,CY
@@ -21763,8 +23933,6 @@
1540704000,1540704255,PL
1540704256,1540704511,KZ
1540704512,1540704767,IE
-1540704768,1540705023,UA
-1540705024,1540705279,HU
1540705280,1540705535,RO
1540705536,1540705791,AT
1540705792,1540706047,NL
@@ -21804,7 +23972,6 @@
1540715520,1540715775,DE
1540716032,1540716287,PL
1540716288,1540716543,UA
-1540716544,1540716799,RU
1540716800,1540717055,UA
1540717056,1540717311,CZ
1540717312,1540717823,PL
@@ -21949,7 +24116,9 @@
1540779008,1540780031,NL
1540780032,1540781055,UA
1540781056,1540783103,RU
-1540783104,1540787199,UA
+1540783104,1540784639,UA
+1540784640,1540784895,RU
+1540784896,1540787199,UA
1540787200,1540788223,KZ
1540788224,1540790271,RU
1540790272,1540791295,KW
@@ -22284,8 +24453,7 @@
1540964352,1540964863,IR
1540964864,1540965887,UA
1540965888,1540966399,RU
-1540966400,1540966655,GG
-1540966656,1540966911,GB
+1540966400,1540966911,GB
1540966912,1540967935,RU
1540967936,1540968447,UA
1540968960,1540969471,RO
@@ -22366,7 +24534,7 @@
1540995584,1540995839,SE
1540995840,1540996095,RO
1540996096,1540996351,DE
-1540996352,1540996607,NL
+1540996352,1540996607,SE
1540996608,1540996863,RU
1540996864,1540997119,NL
1540997120,1540997375,RU
@@ -22395,7 +24563,6 @@
1541004288,1541004543,RU
1541004544,1541004799,PL
1541004800,1541005055,SI
-1541005056,1541005311,NL
1541005312,1541005567,PL
1541005568,1541006079,AT
1541006080,1541006335,RU
@@ -22410,7 +24577,6 @@
1541008384,1541008639,RU
1541008640,1541008895,GB
1541008896,1541009151,TR
-1541009152,1541009407,RU
1541009408,1541009663,UA
1541009664,1541009919,CH
1541009920,1541010175,PL
@@ -22435,7 +24601,6 @@
1541024768,1541026815,UA
1541026816,1541027839,LV
1541028864,1541029887,PL
-1541029888,1541030911,UA
1541030912,1541031935,PL
1541031936,1541032959,UA
1541032960,1541033983,PL
@@ -22810,7 +24975,7 @@
1541234176,1541234687,RO
1541234688,1541235199,NL
1541235200,1541235455,RU
-1541235456,1541235711,MD
+1541235456,1541235711,NL
1541235712,1541236223,AT
1541236224,1541236735,RU
1541236736,1541237247,DE
@@ -22935,7 +25100,7 @@
1541338112,1541341183,UA
1541341184,1541341439,TR
1541341440,1541341695,RU
-1541341696,1541341951,DE
+1541341696,1541341951,HU
1541341952,1541342463,PL
1541342464,1541342719,FR
1541342720,1541342975,PL
@@ -23537,7 +25702,6 @@
1541666048,1541666815,GB
1541666816,1541667839,NO
1541667840,1541668095,CH
-1541668096,1541668351,GB
1541668352,1541668607,UA
1541668608,1541668863,GE
1541668864,1541669887,GB
@@ -23733,6 +25897,7 @@
1541781248,1541781503,RO
1541781504,1541781759,TR
1541781760,1541782015,RU
+1541782016,1541782271,RO
1541782272,1541782527,GB
1541782528,1541783551,RU
1541783552,1541783807,IE
@@ -23937,7 +26102,6 @@
1541885952,1541886975,PL
1541886976,1541887999,UA
1541888000,1541888255,RS
-1541888256,1541888511,RU
1541888512,1541889023,GB
1541889024,1541889535,PL
1541889536,1541890303,RU
@@ -24043,7 +26207,6 @@
1541954560,1541955583,RU
1541955584,1541956095,DE
1541956096,1541956351,RO
-1541956352,1541956607,UA
1541956608,1541957119,LB
1541957120,1541957375,PL
1541957376,1541957631,UA
@@ -24052,7 +26215,8 @@
1541958144,1541958655,RS
1541958656,1541959679,RU
1541959680,1541959935,PL
-1541959936,1541960703,RU
+1541959936,1541960191,RU
+1541960192,1541960703,NL
1541960704,1541961727,UA
1541961728,1541962751,RU
1541962752,1541963263,GB
@@ -24081,8 +26245,7 @@
1541977344,1541977599,GB
1541977600,1541977855,RO
1541977856,1541978111,PL
-1541978112,1541978623,RO
-1541978624,1541978879,MD
+1541978112,1541978879,RO
1541978880,1541979135,FR
1541979136,1541979647,RU
1541979648,1541981183,PL
@@ -24218,7 +26381,8 @@
1542060288,1542060543,RO
1542060544,1542061055,PL
1542061056,1542062079,IT
-1542062080,1542064127,UA
+1542062080,1542063103,UA
+1542063104,1542064127,RU
1542064128,1542064383,PL
1542064384,1542064639,FR
1542064640,1542065151,RU
@@ -24418,8 +26582,8 @@
1542183936,1542184191,GB
1542184192,1542184447,RU
1542184448,1542184959,PL
-1542184960,1542185727,UA
-1542185728,1542185983,BY
+1542184960,1542185471,UA
+1542185472,1542185983,BY
1542185984,1542187007,PL
1542187008,1542187263,DK
1542187264,1542187519,RU
@@ -24480,7 +26644,6 @@
1542220032,1542220287,PL
1542220288,1542220799,DE
1542220800,1542222591,RU
-1542222592,1542222847,PK
1542222848,1542223103,SE
1542223104,1542223359,GB
1542223360,1542223871,UA
@@ -24842,7 +27005,6 @@
1542428416,1542428671,RS
1542428672,1542429695,PL
1542429696,1542429951,GB
-1542429952,1542430207,VG
1542430208,1542430719,RU
1542430720,1542431743,UA
1542431744,1542432767,RO
@@ -25060,7 +27222,6 @@
1542542848,1542543359,GB
1542543360,1542544383,RU
1542544384,1542544639,IR
-1542544640,1542544895,UA
1542544896,1542545407,GR
1542545408,1542586367,UA
1542586368,1542594559,AZ
@@ -25175,7 +27336,7 @@
1542839296,1542839551,DE
1542839552,1542839807,UA
1542839808,1542840063,CY
-1542840064,1542848511,UA
+1542840064,1542840319,UA
1542848512,1542849535,RU
1542849536,1542850559,UA
1542850560,1542851583,GB
@@ -25244,9 +27405,24 @@
1545895936,1545928703,BA
1545928704,1545961471,SI
1545961472,1545994239,RU
-1545994240,1545996287,CZ
+1545994240,1545995263,CZ
+1545995264,1545995519,RU
+1545995520,1545996287,CZ
1545996288,1545998335,RU
-1545998336,1546027007,CZ
+1545998336,1546000383,CZ
+1546000384,1546001407,UZ
+1546001408,1546002943,RU
+1546002944,1546003199,UA
+1546003200,1546003455,RU
+1546003456,1546004479,CZ
+1546004480,1546004735,UA
+1546004736,1546005247,CZ
+1546005248,1546006527,RU
+1546006528,1546008575,UA
+1546008576,1546010623,BY
+1546010624,1546014719,CZ
+1546014720,1546015743,RU
+1546015744,1546027007,CZ
1546027008,1546059775,RU
1546059776,1546063871,SE
1546063872,1546067967,DE
@@ -25262,7 +27438,9 @@
1546104832,1546108927,IE
1546108928,1546113023,IM
1546113024,1546121215,RU
-1546121216,1546121983,FR
+1546121216,1546121855,FR
+1546121856,1546121856,IT
+1546121857,1546121983,FR
1546121984,1546121987,ES
1546121988,1546122649,FR
1546122650,1546122650,PT
@@ -25337,19 +27515,19 @@
1546698752,1546715135,NL
1546715136,1546731519,LV
1546731520,1546731775,RE
-1546731776,1546733823,FR
-1546733824,1546734079,RE
-1546734080,1546739711,FR
+1546731776,1546735103,FR
+1546735104,1546735359,RE
+1546735360,1546739711,FR
1546739712,1546739967,GP
-1546739968,1546741247,FR
-1546741248,1546742015,GP
-1546742016,1546742527,MQ
-1546742528,1546743551,GF
-1546743552,1546743807,FR
-1546743808,1546744575,MQ
-1546744576,1546745087,FR
-1546745088,1546745599,MQ
-1546745600,1546747903,FR
+1546739968,1546741503,FR
+1546741504,1546742015,GP
+1546742016,1546742527,FR
+1546742528,1546743295,GF
+1546743296,1546743551,FR
+1546743552,1546743807,GF
+1546743808,1546745087,FR
+1546745088,1546745855,MQ
+1546745856,1546747903,FR
1546747904,1546764287,RU
1546764288,1546780671,UA
1546780672,1546797055,IR
@@ -25405,7 +27583,11 @@
1547542528,1547546623,FR
1547546624,1547550719,IR
1547550720,1547554815,IE
-1547554816,1547558911,AT
+1547554816,1547555071,AT
+1547555072,1547555078,DE
+1547555079,1547555079,AT
+1547555080,1547555327,DE
+1547555328,1547558911,AT
1547558912,1547563007,IL
1547563008,1547565311,NL
1547565312,1547565823,US
@@ -25473,7 +27655,9 @@
1547685888,1547689983,AT
1547689984,1547694079,IT
1547694080,1547698175,HU
-1547698176,1548158599,NL
+1547698176,1548130303,NL
+1548130304,1548130559,BE
+1548130560,1548158599,NL
1548158600,1548158607,GB
1548158608,1548159231,NL
1548159232,1548159235,ES
@@ -25533,92 +27717,101 @@
1551577088,1551580159,NL
1551604480,1551604735,SE
1551630336,1551892479,RU
-1551892480,1553989631,FR
-1553989632,1553992191,MQ
-1553992192,1553992447,FR
-1553992448,1553992959,MQ
-1553992960,1553993215,FR
+1551892480,1553989887,FR
+1553989888,1553990911,MQ
+1553990912,1553991167,FR
+1553991168,1553992703,MQ
+1553992704,1553993215,FR
1553993216,1553996031,MQ
-1553996032,1553996287,FR
-1553996288,1553999103,MQ
-1553999104,1553999359,FR
-1553999360,1554001663,MQ
-1554001664,1554001919,FR
-1554001920,1554002175,MQ
-1554002176,1554002431,FR
-1554002432,1554005247,MQ
+1553996032,1553996543,FR
+1553996544,1553997311,MQ
+1553997312,1553997567,FR
+1553997568,1554001407,MQ
+1554001408,1554001663,FR
+1554001664,1554001919,MQ
+1554001920,1554002175,FR
+1554002176,1554005247,MQ
1554005248,1554005503,FR
1554005504,1554006015,MQ
1554006016,1554006783,GP
1554006784,1554007295,FR
-1554007296,1554010623,GP
-1554010624,1554011135,FR
-1554011136,1554013695,GP
+1554007296,1554007807,GP
+1554007808,1554008063,FR
+1554008064,1554009343,GP
+1554009344,1554009855,FR
+1554009856,1554011647,GP
+1554011648,1554011903,FR
+1554011904,1554013695,GP
1554013696,1554014207,FR
1554014208,1554015231,GP
-1554015232,1554015743,FR
-1554015744,1554015999,GP
-1554016000,1554016255,FR
-1554016256,1554018047,GP
+1554015232,1554015487,FR
+1554015488,1554016767,GP
+1554016768,1554017279,FR
+1554017280,1554018047,GP
1554018048,1554018303,FR
-1554018304,1554020863,GP
-1554020864,1554021375,FR
-1554021376,1554022143,GP
-1554022144,1554022399,FR
+1554018304,1554019583,GP
+1554019584,1554019839,FR
+1554019840,1554021119,GP
+1554021120,1554021375,FR
+1554021376,1554021887,GP
+1554021888,1554022399,FR
1554022400,1554023423,GP
1554023424,1554023679,FR
-1554023680,1554024703,GP
-1554024704,1554025215,FR
+1554023680,1554024959,GP
+1554024960,1554025215,FR
1554025216,1554025471,GP
1554025472,1554025727,FR
1554025728,1554026751,GP
1554026752,1554027007,FR
1554027008,1554027519,GP
1554027520,1554027775,FR
-1554027776,1554029311,GP
-1554029312,1554029567,FR
-1554029568,1554030591,GP
+1554027776,1554029055,GP
+1554029056,1554029311,FR
+1554029312,1554030079,GP
+1554030080,1554030335,FR
+1554030336,1554030591,GP
1554030592,1554031615,MQ
1554031616,1554032127,FR
1554032128,1554032383,MQ
1554032384,1554032639,FR
-1554032640,1554032895,MQ
-1554032896,1554033151,FR
-1554033152,1554035455,MQ
-1554035456,1554035711,FR
-1554035712,1554038271,MQ
+1554032640,1554035455,MQ
+1554035456,1554035967,FR
+1554035968,1554037503,MQ
+1554037504,1554037759,FR
+1554037760,1554038271,MQ
1554038272,1554038783,FR
1554038784,1554039295,RE
1554039296,1554039807,FR
-1554039808,1554040319,RE
-1554040320,1554040575,FR
-1554040576,1554041343,RE
-1554041344,1554041855,FR
-1554041856,1554042367,RE
+1554039808,1554040063,RE
+1554040064,1554040319,FR
+1554040320,1554041343,RE
+1554041344,1554041599,FR
+1554041600,1554042367,RE
1554042368,1554042879,FR
1554042880,1554043903,RE
1554043904,1554044159,FR
-1554044160,1554046719,RE
-1554046720,1554047999,FR
-1554048000,1554049023,RE
-1554049024,1554049279,FR
-1554049280,1554050303,RE
-1554050304,1554050559,FR
-1554050560,1554050815,RE
-1554050816,1554051327,FR
-1554051328,1554052351,RE
-1554052352,1554052863,FR
-1554052864,1554053119,RE
-1554053120,1554053375,FR
-1554053376,1554053887,RE
-1554053888,1554054399,FR
-1554054400,1554054655,RE
+1554044160,1554046463,RE
+1554046464,1554046719,FR
+1554046720,1554047231,RE
+1554047232,1554048255,FR
+1554048256,1554048767,RE
+1554048768,1554049279,FR
+1554049280,1554049535,RE
+1554049536,1554049791,FR
+1554049792,1554052351,RE
+1554052352,1554052607,FR
+1554052608,1554053887,RE
+1554053888,1554054143,FR
+1554054144,1554054655,RE
1554054656,1556086783,FR
1556086784,1557921791,DE
1557921792,1558052863,NO
-1558052864,1558118399,DE
-1558118400,1558151167,AT
-1558151168,1558708223,DE
+1558052864,1558118399,FR
+1558118400,1558119423,DE
+1558119424,1558122495,RU
+1558122496,1558151167,AT
+1558151168,1558183935,IT
+1558183936,1558708223,DE
1558708224,1559236607,GB
1559236608,1559240703,IL
1559240704,1559248895,BA
@@ -25679,13 +27872,21 @@
1559920640,1559924693,LU
1559924694,1559924694,GB
1559924695,1559932927,LU
-1559932928,1559953407,DE
+1559932928,1559943167,DE
+1559943168,1559944191,LU
+1559944192,1559945727,FR
+1559945728,1559946751,LU
+1559946752,1559950335,DE
+1559950336,1559950847,LU
+1559950848,1559953407,DE
1559953408,1559986175,MT
1559986176,1560018943,IE
1560018944,1560051711,DE
1560051712,1560084479,RU
1560084480,1560117247,JO
-1560117248,1560150015,CZ
+1560117248,1560133631,CZ
+1560133632,1560137727,RU
+1560137728,1560150015,CZ
1560150016,1560182783,NL
1560182784,1560215551,SE
1560215552,1560281087,RU
@@ -25786,7 +27987,7 @@
1566382080,1566384127,TR
1566384128,1566386175,CZ
1566386176,1566388223,FR
-1566388224,1566390271,HU
+1566388224,1566390271,LU
1566390272,1566392319,LT
1566392320,1566394367,ES
1566394368,1566394528,NO
@@ -25797,7 +27998,9 @@
1566394533,1566394533,NL
1566394534,1566394534,SE
1566394535,1566394535,PT
-1566394536,1566396415,NO
+1566394536,1566394538,NO
+1566394539,1566394539,RU
+1566394540,1566396415,NO
1566396416,1566398463,GB
1566398464,1566400511,RU
1566400512,1566402559,NO
@@ -25873,7 +28076,9 @@
1566556160,1566558207,RU
1566558208,1566560255,JO
1566560256,1566560767,IT
-1566560768,1566561023,SM
+1566560768,1566561015,SM
+1566561016,1566561017,IT
+1566561018,1566561023,SM
1566561024,1566564351,IT
1566564352,1566566399,IS
1566566400,1566568447,FR
@@ -25896,19 +28101,29 @@
1567555584,1567621119,AT
1567621120,1567696383,RO
1567696384,1567696895,MD
-1567696896,1567705087,RO
-1567705088,1567707135,MD
-1567707136,1567715327,RO
+1567696896,1567703039,RO
+1567703040,1567707391,MD
+1567707392,1567707647,RO
+1567707648,1567707903,MD
+1567707904,1567708671,RO
+1567708672,1567709183,MD
+1567709184,1567710207,RO
+1567710208,1567711231,MD
+1567711232,1567715327,RO
1567715328,1567717375,MD
1567717376,1567742975,RO
1567742976,1567743487,MD
-1567743488,1567752191,RO
+1567743488,1567749119,RO
+1567749120,1567750143,MD
+1567750144,1567752191,RO
1567752192,1567756287,MD
1567756288,1567775743,RO
1567775744,1567776767,MD
1567776768,1567830015,RO
1567830016,1567831039,MD
-1567831040,1567875071,RO
+1567831040,1567852543,RO
+1567852544,1567854591,MD
+1567854592,1567875071,RO
1567875072,1567879167,MD
1567879168,1567880191,RO
1567880192,1567881215,SE
@@ -25916,22 +28131,51 @@
1567883264,1567948799,MD
1567948800,1567961087,RO
1567961088,1567965183,MD
-1567965184,1568026623,RO
+1567965184,1567966207,RO
+1567966208,1567969279,MD
+1567969280,1567981567,RO
+1567981568,1567983615,MD
+1567983616,1567984639,RO
+1567984640,1567987711,MD
+1567987712,1567988735,RO
+1567988736,1567992831,MD
+1567992832,1567997951,RO
+1567997952,1568014335,NL
+1568014336,1568026623,RO
1568026624,1568030719,MD
-1568030720,1568083967,RO
+1568030720,1568059391,RO
+1568059392,1568063487,MD
+1568063488,1568083967,RO
1568083968,1568086015,MD
-1568086016,1568178175,RO
+1568086016,1568104447,RO
+1568104448,1568106495,MD
+1568106496,1568107519,RO
+1568107520,1568108543,MD
+1568108544,1568112639,RO
+1568112640,1568114687,MD
+1568114688,1568115711,RO
+1568115712,1568118783,MD
+1568118784,1568120831,RO
+1568120832,1568122879,MD
+1568122880,1568130047,RO
+1568130048,1568133119,MD
+1568133120,1568138239,RO
+1568138240,1568141311,MD
+1568141312,1568178175,RO
1568178176,1568210943,RU
1568210944,1568243711,GB
1568243712,1568243967,FR
1568243968,1568244735,GP
1568244736,1568244991,FR
1568244992,1568245759,GP
-1568245760,1568246527,FR
+1568245760,1568246271,FR
+1568246272,1568246527,GF
1568246528,1568247039,GP
-1568247040,1568247551,FR
+1568247040,1568247295,FR
+1568247296,1568247551,GF
1568247552,1568247807,MF
-1568247808,1568248831,GP
+1568247808,1568248063,FR
+1568248064,1568248831,GP
1568248832,1568249087,MQ
1568249088,1568249599,GP
1568249600,1568249855,MQ
@@ -25941,22 +28185,15 @@
1568251136,1568251647,GP
1568251648,1568251903,MF
1568251904,1568252159,MQ
-1568252160,1568252927,GP
+1568252160,1568252415,GP
+1568252416,1568252671,MQ
+1568252672,1568252927,GP
1568252928,1568253183,GF
1568253184,1568253951,GP
-1568253952,1568254207,FR
-1568254208,1568254463,GP
-1568254464,1568254975,FR
-1568254976,1568255231,GP
-1568255232,1568255743,FR
+1568253952,1568255743,FR
1568255744,1568255999,GF
-1568256000,1568256255,FR
-1568256256,1568256511,GP
-1568256512,1568257023,FR
-1568257024,1568257279,GP
-1568257280,1568257791,FR
-1568257792,1568258047,MQ
-1568258048,1568259071,FR
+1568256000,1568256511,GP
+1568256512,1568259071,FR
1568259072,1568259327,MQ
1568259328,1568260095,GP
1568260096,1568260351,FR
@@ -25964,42 +28201,40 @@
1568260608,1568261119,GP
1568261120,1568261375,FR
1568261376,1568262143,GP
-1568262144,1568262399,FR
-1568262400,1568262655,MQ
-1568262656,1568263167,GP
+1568262144,1568262655,MQ
+1568262656,1568262911,GP
+1568262912,1568263167,MQ
1568263168,1568263423,FR
-1568263424,1568263935,MQ
-1568263936,1568264447,FR
+1568263424,1568263679,MQ
+1568263680,1568264447,FR
1568264448,1568264703,GP
1568264704,1568265215,MF
-1568265216,1568266239,GP
+1568265216,1568265471,FR
+1568265472,1568266239,GP
1568266240,1568266495,FR
1568266496,1568267263,GP
1568267264,1568268543,FR
1568268544,1568269311,GP
1568269312,1568269567,MQ
-1568269568,1568269823,GP
-1568269824,1568270079,MQ
-1568270080,1568271359,GP
+1568269568,1568270079,GP
+1568270080,1568270335,MQ
+1568270336,1568271359,GP
1568271360,1568271615,FR
1568271616,1568272383,GP
1568272384,1568273151,FR
1568273152,1568273407,GF
-1568273408,1568273663,FR
-1568273664,1568273919,MQ
-1568273920,1568274175,FR
-1568274176,1568274431,MQ
-1568274432,1568274687,FR
-1568274688,1568274943,MQ
-1568274944,1568275455,GP
-1568275456,1568275711,MQ
-1568275712,1568276223,FR
+1568273408,1568274175,FR
+1568274176,1568274687,MQ
+1568274688,1568274943,GP
+1568274944,1568275199,MQ
+1568275200,1568275455,GP
+1568275456,1568275711,FR
+1568275712,1568275967,MQ
+1568275968,1568276223,FR
1568276224,1568276479,MQ
1568276480,1568309247,DE
1568309248,1568342015,RO
-1568342016,1568362495,BG
-1568362496,1568363264,RO
-1568363265,1568374783,BG
+1568342016,1568374783,BG
1568374784,1568440319,RU
1568440320,1568473087,NO
1568473088,1568505855,BY
@@ -26009,7 +28244,9 @@
1568571392,1568604159,LB
1568604160,1568636927,UA
1568636928,1569193983,DE
-1569193984,1569718271,HR
+1569193984,1569438463,HR
+1569438464,1569438719,BR
+1569438720,1569718271,HR
1569718272,1570242559,IT
1570242560,1570275327,GB
1570275328,1570308095,BG
@@ -26048,16 +28285,13 @@
1570644776,1570644991,FR
1570644992,1570645247,GB
1570645248,1570652159,FR
-1570652160,1570655999,SE
-1570656000,1570656063,GB
-1570656064,1570656127,SE
-1570656128,1570656255,GB
-1570656256,1570668543,SE
+1570652160,1570668543,SE
1570668544,1570686975,RU
1570686976,1570693119,NL
1570693120,1570695167,RU
1570695168,1570696191,PL
-1570696192,1570701311,RU
+1570696192,1570697215,BR
+1570697216,1570701311,RU
1570701312,1570717695,PL
1570717696,1570725887,HR
1570725888,1570734079,DE
@@ -26077,7 +28311,9 @@
1571424000,1571424255,KZ
1571424256,1571424511,KG
1571424512,1571424767,AM
-1571424768,1571425148,CZ
+1571424768,1571425023,CZ
+1571425024,1571425024,RU
+1571425025,1571425148,CZ
1571425149,1571425149,RU
1571425150,1571425231,CZ
1571425232,1571425232,RU
@@ -26088,18 +28324,23 @@
1571428608,1571428863,UA
1571428864,1571429375,CZ
1571429376,1571435519,UA
-1571435520,1571436287,CZ
+1571435520,1571435775,RU
+1571435776,1571436287,CZ
1571436288,1571436543,UA
1571436544,1571438591,RU
-1571438592,1571441663,UA
-1571441664,1571441791,RU
-1571441792,1571441919,DE
-1571441920,1571442687,CZ
+1571438592,1571440639,UA
+1571440640,1571441407,CZ
+1571441408,1571441663,UA
+1571441664,1571441919,RU
+1571441920,1571442175,CZ
+1571442176,1571442687,NL
1571442688,1571443199,UA
1571443200,1571443455,RU
1571443456,1571443711,UA
-1571443712,1571444735,CZ
-1571444736,1571446783,NL
+1571443712,1571444991,CZ
+1571444992,1571445247,UA
+1571445248,1571446271,NL
+1571446272,1571446783,CZ
1571446784,1571447039,GB
1571447040,1571447295,CZ
1571447296,1571447807,RU
@@ -26109,14 +28350,13 @@
1571449856,1571450879,RU
1571450880,1571451903,UA
1571451904,1571453951,CZ
-1571453952,1571454975,GB
-1571454976,1571455999,RU
+1571453952,1571455999,RU
1571456000,1571456511,UA
-1571456512,1571459071,CZ
+1571456512,1571457535,CZ
+1571457536,1571458047,RU
+1571458048,1571459071,CZ
1571459072,1571463167,UA
-1571463168,1571469311,CZ
-1571469312,1571470335,RU
-1571470336,1571471359,CZ
+1571463168,1571471359,CZ
1571471360,1571475455,RU
1571475456,1571476479,CZ
1571476480,1571477503,RU
@@ -26144,7 +28384,8 @@
1571535618,1571535618,RU
1571535619,1571535871,CZ
1571535872,1571538943,RU
-1571538944,1571541247,CZ
+1571538944,1571540991,CZ
+1571540992,1571541247,RU
1571541248,1571541503,UA
1571541504,1571543039,CZ
1571543040,1571543551,NL
@@ -26154,7 +28395,9 @@
1571545344,1571545599,UA
1571545600,1571545855,CZ
1571545856,1571546111,RU
-1571546112,1571549183,CZ
+1571546112,1571546879,CZ
+1571546880,1571547135,RU
+1571547136,1571549183,CZ
1571549184,1571553279,UA
1571553280,1571684351,IL
1571684352,1571686399,ES
@@ -26201,29 +28444,31 @@
1571799040,1571815423,UA
1571815424,1571815679,FR
1571815680,1571815935,RE
-1571815936,1571817215,FR
-1571817216,1571817471,RE
-1571817472,1571818495,FR
-1571818496,1571819263,RE
-1571819264,1571820287,FR
+1571815936,1571816959,FR
+1571816960,1571817727,RE
+1571817728,1571818495,FR
+1571818496,1571818751,RE
+1571818752,1571819007,FR
+1571819008,1571819263,RE
+1571819264,1571819519,FR
+1571819520,1571819775,RE
+1571819776,1571820287,FR
1571820288,1571820543,RE
1571820544,1571820799,FR
1571820800,1571821055,RE
-1571821056,1571823615,FR
-1571823616,1571823871,RE
-1571823872,1571824895,FR
+1571821056,1571822591,FR
+1571822592,1571823103,RE
+1571823104,1571823871,FR
+1571823872,1571824127,RE
+1571824128,1571824895,FR
1571824896,1571825151,RE
-1571825152,1571825407,FR
-1571825408,1571825663,RE
-1571825664,1571826687,FR
+1571825152,1571826687,FR
1571826688,1571827199,RE
1571827200,1571827711,FR
1571827712,1571827967,RE
1571827968,1571828991,FR
1571828992,1571829247,RE
-1571829248,1571829503,FR
-1571829504,1571829759,RE
-1571829760,1571831807,FR
+1571829248,1571831807,FR
1571831808,1571848191,DK
1571848192,1571864575,RU
1571864576,1571880959,PL
@@ -26239,9 +28484,7 @@
1572028416,1572028927,GB
1572028928,1572029183,UA
1572029184,1572030463,GB
-1572030464,1572035583,RU
-1572035584,1572036607,GB
-1572036608,1572042751,RU
+1572030464,1572042751,RU
1572042752,1572043263,GB
1572043264,1572044799,RU
1572044800,1572061183,IT
@@ -26328,7 +28571,8 @@
1572538368,1572540415,NL
1572540416,1572542463,GB
1572542464,1572544511,IT
-1572544512,1572546559,IQ
+1572544512,1572544767,FR
+1572544768,1572546559,IQ
1572546560,1572548607,FR
1572548608,1572550655,NL
1572550656,1572552703,DE
@@ -26341,8 +28585,7 @@
1572564992,1572567039,DE
1572567040,1572569087,RU
1572571136,1572573183,RO
-1572573184,1572573439,GB
-1572573440,1572574463,GG
+1572573184,1572574463,GG
1572574464,1572574719,GB
1572574720,1572574975,GG
1572574976,1572575231,GB
@@ -26411,16 +28654,14 @@
1572704256,1572706303,RU
1572706304,1572708351,DE
1572708352,1572708607,GB
-1572708608,1572708863,GG
-1572708864,1572709119,GB
-1572709120,1572709375,GG
+1572708608,1572709375,GG
1572709376,1572710143,GB
1572710144,1572710399,GG
1572710400,1572712447,DE
1572712448,1572714495,ES
-1572714496,1572715007,IT
-1572715008,1572715775,NG
-1572715776,1572716543,IT
+1572714496,1572714943,NG
+1572714944,1572714959,IT
+1572714960,1572716543,NG
1572716544,1572718591,SA
1572718592,1572720639,RU
1572720640,1572722687,IT
@@ -26504,25 +28745,41 @@
1578585088,1578586111,PT
1578586112,1578588159,ES
1578588160,1578590207,PL
-1578590208,1578592175,FR
+1578590208,1578590787,FR
+1578590788,1578590791,ES
+1578590792,1578590851,FR
+1578590852,1578590855,ES
+1578590856,1578590863,FR
+1578590864,1578590879,BE
+1578590880,1578591695,FR
+1578591696,1578591699,ES
+1578591700,1578592175,FR
1578592176,1578592183,CZ
1578592184,1578592191,PT
1578592192,1578592199,BE
1578592200,1578592207,CH
1578592208,1578593023,FR
1578593024,1578593279,DE
-1578593280,1578595419,FR
+1578593280,1578593439,FR
+1578593440,1578593443,ES
+1578593444,1578593955,FR
+1578593956,1578593959,ES
+1578593960,1578595419,FR
1578595420,1578595423,GB
-1578595424,1578602495,FR
+1578595424,1578595987,FR
+1578595988,1578595991,ES
+1578595992,1578602495,FR
1578602496,1578604543,NL
1578604544,1578606591,GB
1578606592,1578607725,DE
1578607726,1578607726,FR
1578607727,1578608639,DE
1578608640,1578610687,CZ
-1578610688,1578611023,FR
-1578611024,1578611039,NL
-1578611040,1578614271,FR
+1578610688,1578612907,FR
+1578612908,1578612911,ES
+1578612912,1578613735,FR
+1578613736,1578613739,ES
+1578613740,1578614271,FR
1578614272,1578614527,ES
1578614528,1578631167,FR
1578631168,1578663935,RO
@@ -26592,7 +28849,17 @@
1582252032,1582268415,TR
1582268416,1582284799,DE
1582284800,1582301183,BH
-1582301184,1583349759,IT
+1582301184,1582452223,IT
+1582452224,1582452231,SI
+1582452232,1582695151,IT
+1582695152,1582695159,SI
+1582695160,1582701383,IT
+1582701384,1582701391,SI
+1582701392,1582704639,IT
+1582704640,1582705663,SI
+1582705664,1582853903,IT
+1582853904,1582853919,SI
+1582853920,1583349759,IT
1583349760,1583611903,SA
1583611904,1583615999,LV
1583616000,1583620095,NL
@@ -26617,8 +28884,6 @@
1583693824,1583697919,RU
1583697920,1583702015,TR
1583702016,1583706111,RU
-1583706368,1583706623,GB
-1583708160,1583708415,GI
1583710208,1583714303,IR
1583714304,1583722495,GB
1583722496,1583726591,IR
@@ -26643,19 +28908,21 @@
1583780336,1583780343,IT
1583780344,1583780423,GB
1583780424,1583780431,IT
-1583780432,1583780767,GB
+1583780432,1583780607,GB
+1583780608,1583780615,IT
+1583780616,1583780767,GB
1583780768,1583780775,IT
1583780776,1583780791,GB
1583780792,1583780799,IT
1583780800,1583781031,GB
-1583781032,1583781047,IT
-1583781048,1583781279,GB
-1583781280,1583781287,IT
-1583781288,1583781359,GB
+1583781032,1583781039,IT
+1583781040,1583781359,GB
1583781360,1583781367,IT
1583781368,1583781863,GB
1583781864,1583781871,IT
-1583781872,1583782415,GB
+1583781872,1583781911,GB
+1583781912,1583781919,IT
+1583781920,1583782415,GB
1583782416,1583782423,IT
1583782424,1583782431,GB
1583782432,1583782439,IT
@@ -26663,18 +28930,20 @@
1583782704,1583782711,IT
1583782712,1583782975,GB
1583782976,1583782983,IT
-1583782984,1583783479,GB
+1583782984,1583783119,GB
+1583783120,1583783127,IT
+1583783128,1583783479,GB
1583783480,1583783487,IT
-1583783488,1583783935,GB
+1583783488,1583783495,GB
+1583783496,1583783503,IT
+1583783504,1583783935,GB
1583788032,1583792127,TM
1583792128,1583796223,IE
1583796224,1583800319,DE
1583800320,1583804415,ME
1583804416,1583808511,GB
1583808512,1583812607,MD
-1583812608,1583816351,NL
-1583816352,1583816383,GB
-1583816384,1583816703,NL
+1583812608,1583816703,NL
1583816704,1583820799,TR
1583820800,1583824895,LV
1583824896,1583828991,SI
@@ -26688,7 +28957,9 @@
1583861760,1583865855,LU
1583865856,1583869951,RU
1583869952,1583874047,KZ
-1583874048,1584398335,BE
+1583874048,1584119935,BE
+1584119936,1584120063,FR
+1584120064,1584398335,BE
1584398336,1584529407,CZ
1584529408,1584660479,DE
1584660480,1584857087,GB
@@ -26722,10 +28993,8 @@
1585233920,1585238015,RU
1585238016,1585240063,DE
1585240064,1585240575,FR
-1585240576,1585241087,MQ
-1585241088,1585241343,GP
-1585241344,1585241599,MQ
-1585241600,1585242111,GP
+1585240576,1585241855,MQ
+1585241856,1585242111,GP
1585242112,1585244159,RU
1585244160,1585246207,FR
1585246208,1585248255,RU
@@ -26804,7 +29073,6 @@
1585400320,1585400575,GB
1585400576,1585400831,FR
1585400832,1585401087,NL
-1585401088,1585401343,US
1585401344,1585401855,GB
1585401856,1585403903,IT
1585403904,1585405951,RU
@@ -26876,7 +29144,6 @@
1586388992,1586389503,ES
1586389504,1586389759,US
1586389760,1586397183,ES
-1586397184,1586399231,LV
1586399232,1586401279,RU
1586401280,1586403327,IT
1586403328,1586405375,IS
@@ -26895,7 +29162,7 @@
1586425856,1586427903,NL
1586427904,1586431999,CH
1586432000,1586434047,DK
-1586434048,1586436095,BE
+1586434048,1586436095,FR
1586436096,1586438143,ES
1586438144,1586446335,RU
1586446336,1586448383,NO
@@ -26955,13 +29222,15 @@
1588068352,1588592639,GB
1588592640,1588593663,RO
1588593664,1588593919,MD
-1588593920,1588609279,RO
-1588609280,1588613119,MD
+1588593920,1588609023,RO
+1588609024,1588613119,MD
1588613120,1588621311,RO
1588621312,1588625407,MD
1588625408,1588641791,RO
1588641792,1588643839,ES
-1588643840,1588673535,RO
+1588643840,1588653055,RO
+1588653056,1588654079,MD
+1588654080,1588673535,RO
1588673536,1588674559,MD
1588674560,1588723711,RO
1588723712,1588854783,UA
@@ -26973,9 +29242,7 @@
1589202944,1589204991,SE
1589204992,1589207039,DE
1589207040,1589215231,IT
-1589215232,1589223167,GB
-1589223168,1589223423,US
-1589223424,1589247999,GB
+1589215232,1589247999,GB
1589248000,1589256191,NO
1589256192,1589258239,SE
1589258240,1589264383,LV
@@ -26992,11 +29259,11 @@
1589575680,1589608447,RU
1589608448,1589608703,SE
1589608704,1589608959,DK
-1589608960,1589609087,SE
-1589609088,1589611647,DK
-1589611648,1589611775,SE
-1589611776,1589612543,DK
-1589612544,1589620735,SE
+1589608960,1589609215,SE
+1589609216,1589611519,DK
+1589611520,1589611775,SE
+1589611776,1589612287,DK
+1589612288,1589620735,SE
1589620736,1589641215,DK
1589641216,1590034431,GB
1590034432,1590036479,RU
@@ -27215,7 +29482,13 @@
1593311232,1593343999,UA
1593344000,1593376767,HU
1593376768,1593409535,JO
-1593409536,1593442303,DE
+1593409536,1593421055,DE
+1593421056,1593421311,GB
+1593421312,1593421567,FR
+1593421568,1593421823,GB
+1593421824,1593422591,DE
+1593422592,1593422847,GB
+1593422848,1593442303,DE
1593442304,1593475071,BA
1593475072,1593491455,HR
1593491456,1593499647,DE
@@ -27247,16 +29520,25 @@
1596850176,1596866559,CZ
1596866560,1596887039,RU
1596887040,1596889087,UA
-1596889088,1596890111,CZ
+1596889088,1596889599,KZ
+1596889600,1596889855,CZ
+1596889856,1596890111,UA
1596890112,1596890623,RU
1596890624,1596891135,CZ
1596891136,1596900351,RU
1596900352,1596907519,BY
1596907520,1596915711,RU
-1596915712,1596942335,CZ
+1596915712,1596925951,CZ
+1596925952,1596932095,RU
+1596932096,1596940543,CZ
+1596940544,1596940799,RU
+1596940800,1596941055,UA
+1596941056,1596941311,CZ
+1596941312,1596942335,RU
1596942336,1596945407,UA
1596945408,1596945919,CZ
-1596945920,1596946431,NL
+1596945920,1596946175,RU
+1596946176,1596946431,NL
1596946432,1596947455,RU
1596947456,1596948479,UA
1596948480,1596950527,BY
@@ -27280,12 +29562,8 @@
1596957696,1596958207,CZ
1596958208,1596958463,RU
1596958464,1596958719,UA
-1596958720,1596960767,RU
-1596960768,1596960768,CZ
-1596960769,1596960769,RU
-1596960770,1596960994,CZ
-1596960995,1596960995,RU
-1596960996,1596961279,CZ
+1596958720,1596961023,RU
+1596961024,1596961279,CZ
1596961280,1596961791,SK
1596961792,1596962815,RU
1596962816,1596963327,AM
@@ -27302,7 +29580,9 @@
1596973056,1596975103,BY
1596975104,1596975615,CZ
1596975616,1596978431,RU
-1596978432,1596981247,CZ
+1596978432,1596978944,CZ
+1596978945,1596978945,RU
+1596978946,1596981247,CZ
1596981248,1597243391,PL
1597243392,1597505535,RU
1597505536,1597767679,KZ
@@ -27396,7 +29676,7 @@
1602248704,1602250751,BE
1602250752,1602252799,NO
1602252800,1602254847,SE
-1602254848,1602256895,HU
+1602254848,1602256895,LU
1602256896,1602258943,GB
1602258944,1602260991,RU
1602260992,1602263039,FR
@@ -27508,61 +29788,23 @@
1602813952,1602846719,RU
1602846720,1602879487,GE
1602879488,1602879743,RE
-1602879744,1602879999,FR
-1602880000,1602880767,RE
-1602880768,1602881023,FR
-1602881024,1602881279,RE
-1602881280,1602881535,FR
-1602881536,1602881791,RE
-1602881792,1602882047,FR
-1602882048,1602882815,RE
-1602882816,1602883071,FR
-1602883072,1602883839,RE
-1602883840,1602884095,FR
-1602884096,1602884351,RE
-1602884352,1602884607,FR
-1602884608,1602884863,RE
-1602884864,1602885119,FR
-1602885120,1602886399,RE
-1602886400,1602886655,FR
-1602886656,1602887935,RE
-1602887936,1602888191,FR
-1602888192,1602888959,RE
-1602888960,1602889983,FR
-1602889984,1602890751,RE
-1602890752,1602891263,FR
-1602891264,1602891519,RE
-1602891520,1602891775,FR
-1602891776,1602892287,RE
-1602892288,1602892543,FR
-1602892544,1602892799,RE
-1602892800,1602893311,FR
-1602893312,1602895359,RE
-1602895360,1602895615,FR
-1602895616,1602896127,RE
-1602896128,1602896383,FR
+1602879744,1602882303,MQ
+1602882304,1602882559,RE
+1602882560,1602885631,MQ
+1602885632,1602885887,RE
+1602885888,1602891775,MQ
+1602891776,1602892031,RE
+1602892032,1602894847,MQ
+1602894848,1602895103,RE
+1602895104,1602896383,MQ
1602896384,1602896639,RE
-1602896640,1602896924,FR
+1602896640,1602896924,MQ
1602896925,1602896925,RE
-1602896926,1602897407,FR
+1602896926,1602897407,MQ
1602897408,1602897663,RE
-1602897664,1602900223,FR
-1602900224,1602900735,MQ
-1602900736,1602900991,FR
-1602900992,1602901503,MQ
-1602901504,1602901759,FR
-1602901760,1602902015,MQ
-1602902016,1602903551,FR
-1602903552,1602903807,MQ
-1602903808,1602907135,FR
+1602897664,1602907135,MQ
1602907136,1602907391,RE
-1602907392,1602908415,FR
-1602908416,1602908671,RE
-1602908672,1602910463,FR
-1602910464,1602910719,RE
-1602910720,1602911487,FR
-1602911488,1602911743,RE
-1602911744,1602912255,FR
+1602907392,1602912255,MQ
1602912256,1602928639,GB
1602928640,1602930687,HU
1602930688,1602932735,GB
@@ -27595,7 +29837,8 @@
1603081256,1603081263,FI
1603081264,1603081279,GB
1603081280,1603081295,US
-1603081296,1603081471,ES
+1603081296,1603081407,GB
+1603081408,1603081471,ES
1603081472,1603082239,GB
1603082240,1603082495,DE
1603082496,1603082751,GT
@@ -27675,16 +29918,14 @@
1604075520,1604091903,RU
1604091904,1604108287,BA
1604108288,1604141055,DE
-1604141056,1604157439,RO
+1604141056,1604157439,IT
1604157440,1604190207,FR
1604190208,1604206591,UA
1604206592,1604222975,PL
1604222976,1604239359,BG
1604239360,1604255743,RU
1604255744,1604272127,SY
-1604272128,1604282367,IQ
-1604282368,1604282623,SE
-1604282624,1604288511,IQ
+1604272128,1604288511,IQ
1604288512,1604304895,RU
1604304896,1604321279,SI
1604321280,1604386815,PL
@@ -27738,43 +29979,53 @@
1605109496,1605109503,IT
1605109504,1605110111,GB
1605110112,1605110119,IT
-1605110120,1605110263,GB
+1605110120,1605110167,GB
+1605110168,1605110175,IT
+1605110176,1605110263,GB
1605110264,1605110271,IT
-1605110272,1605110279,GB
-1605110280,1605110287,IT
-1605110288,1605111023,GB
+1605110272,1605110559,GB
+1605110560,1605110567,IT
+1605110568,1605111023,GB
1605111024,1605111031,IT
1605111032,1605111199,GB
1605111200,1605111207,IT
-1605111208,1605111919,GB
+1605111208,1605111799,GB
+1605111800,1605111807,IT
+1605111808,1605111919,GB
1605111920,1605111927,IT
1605111928,1605111935,GB
1605111936,1605111943,IT
-1605111944,1605112367,GB
-1605112368,1605112375,IT
-1605112376,1605112847,GB
+1605111944,1605112647,GB
+1605112648,1605112655,IT
+1605112656,1605112847,GB
1605112848,1605112855,IT
1605112856,1605113087,GB
1605113088,1605113095,IT
1605113096,1605113383,GB
1605113384,1605113391,IT
-1605113392,1605113503,GB
+1605113392,1605113407,GB
+1605113408,1605113415,IT
+1605113416,1605113503,GB
1605113504,1605113511,IT
-1605113512,1605113839,GB
-1605113840,1605113847,IT
-1605113848,1605114199,GB
+1605113512,1605114199,GB
1605114200,1605114207,IT
1605114208,1605114263,GB
1605114264,1605114271,IT
1605114272,1605114295,GB
1605114296,1605114303,IT
-1605114304,1605114871,GB
+1605114304,1605114327,GB
+1605114328,1605114335,IT
+1605114336,1605114535,GB
+1605114536,1605114543,IT
+1605114544,1605114871,GB
1605114872,1605114879,IT
1605114880,1605114959,GB
1605114960,1605114967,IT
1605114968,1605115007,GB
1605115008,1605115015,IT
-1605115016,1605115863,GB
+1605115016,1605115599,GB
+1605115600,1605115607,IT
+1605115608,1605115863,GB
1605115864,1605115871,IT
1605115872,1605115903,GB
1605115904,1605124095,RU
@@ -27831,16 +30082,21 @@
1605632000,1605664767,RS
1605664768,1605697535,MK
1605697536,1605734399,RU
-1605734400,1605736447,GB
-1605736448,1605742591,RU
+1605734400,1605735423,GB
+1605735424,1605742591,RU
1605742592,1605744639,GB
1605744640,1605750783,RU
1605750784,1605751807,GB
-1605751808,1605756927,RU
-1605756928,1605763071,GB
-1605763072,1605795839,RU
+1605751808,1605763071,RU
+1605763072,1605765119,KZ
+1605765120,1605795839,RU
1605795840,1605828607,BE
-1605828608,1605861375,RU
+1605828608,1605828863,GB
+1605828864,1605830399,IL
+1605830400,1605830655,US
+1605830656,1605840895,RU
+1605840896,1605844991,CH
+1605844992,1605861375,RU
1605861376,1605894143,TR
1605894144,1606156287,RO
1606156288,1606418431,RU
@@ -27856,9 +30112,15 @@
1607575552,1607577599,GB
1607577600,1607581695,SE
1607581696,1607584511,DK
-1607584512,1607585791,SE
-1607585792,1607598079,DK
-1607598080,1607606015,IT
+1607584512,1607584767,SE
+1607584768,1607585023,DK
+1607585024,1607585279,SE
+1607585280,1607595263,DK
+1607595264,1607595519,SE
+1607595520,1607598079,DK
+1607598080,1607601919,IT
+1607601920,1607602175,GB
+1607602176,1607606015,IT
1607606016,1607606271,FR
1607606272,1607608319,IT
1607608320,1607609343,ES
@@ -27875,12 +30137,12 @@
1607625728,1607625983,ES
1607625984,1607626239,IT
1607626240,1607626751,ES
-1607626752,1607628799,IT
-1607628800,1607629055,FR
-1607629056,1607647231,IT
+1607626752,1607647231,IT
1607647232,1607651327,DE
1607651328,1607655423,FR
-1607655424,1607663615,IT
+1607655424,1607660287,IT
+1607660288,1607660543,PT
+1607660544,1607663615,IT
1607663616,1607729151,NL
1607729152,1607737343,SY
1607737344,1607761919,EG
@@ -27906,7 +30168,7 @@
1607930880,1607933951,PL
1607933952,1607934975,DE
1607934976,1607937023,UA
-1607937024,1607938047,LV
+1607937024,1607938047,SE
1607938048,1607939071,UA
1607939072,1607940095,PL
1607940096,1607941119,RU
@@ -27967,9 +30229,12 @@
1611923456,1612185599,CA
1612185600,1612611327,US
1612611328,1612636159,CA
-1612636160,1613471743,US
+1612636160,1613405695,US
+1613405696,1613405951,CA
+1613405952,1613471743,US
1613471744,1613479935,JM
-1613479936,1613488127,US
+1613479936,1613480191,CA
+1613480192,1613488127,US
1613488128,1613492223,CA
1613492224,1613504511,US
1613504512,1613529087,CA
@@ -27998,9 +30263,15 @@
1614757888,1614774271,US
1614774272,1614786559,CA
1614786560,1618837503,US
-1618837504,1618841599,CA
+1618837504,1618840319,CA
+1618840320,1618840575,US
+1618840576,1618841599,CA
1618841600,1618849791,US
-1618849792,1618862079,CA
+1618849792,1618850303,CA
+1618850304,1618850559,US
+1618850560,1618852863,CA
+1618852864,1618853631,US
+1618853632,1618862079,CA
1618862080,1618866175,US
1618866176,1618870271,CA
1618870272,1618984959,US
@@ -28009,7 +30280,11 @@
1632305152,1632321535,CA
1632321536,1632354303,US
1632354304,1632362495,CA
-1632362496,1634414591,US
+1632362496,1632978303,US
+1632978304,1632978431,CA
+1632978432,1632979583,US
+1632979584,1632979711,CA
+1632979712,1634414591,US
1634414592,1634418687,CA
1634418688,1634447359,US
1634447360,1634451455,CA
@@ -28019,7 +30294,11 @@
1634467840,1634729983,CA
1634729984,1652293631,US
1652293632,1652310015,CA
-1652310016,1653500927,US
+1652310016,1652447849,US
+1652447850,1652447850,CN
+1652447851,1652481279,US
+1652481280,1652481791,CN
+1652481792,1653500927,US
1653500928,1653501439,IL
1653501440,1653501695,HK
1653501696,1653534719,US
@@ -28039,13 +30318,19 @@
1654554624,1654558719,CA
1654558720,1654648831,US
1654648832,1654652927,CA
-1654652928,1673527295,US
+1654652928,1656731007,US
+1656731008,1656731135,VI
+1656731136,1673527295,US
1673527296,1673560063,CA
-1673560064,1673986047,US
+1673560064,1673580287,US
+1673580288,1673580543,CA
+1673580544,1673986047,US
1673986048,1674051583,CA
1674051584,1674575871,US
1674575872,1677721599,CA
-1677721600,1680535551,US
+1677721600,1680534015,US
+1680534016,1680534527,CN
+1680534528,1680535551,US
1680535552,1680539647,CA
1680539648,1680564223,US
1680564224,1680572415,CA
@@ -28075,7 +30360,7 @@
1695023104,1695547391,TW
1695547392,1697775615,CN
1697775616,1697776639,ID
-1697776640,1697779711,JP
+1697776640,1697777663,JP
1697779712,1697783807,ID
1697783808,1697789951,JP
1697789952,1697790975,CN
@@ -28203,7 +30488,8 @@
1728152576,1728153599,MY
1728153600,1728154623,SG
1728154624,1728155647,JP
-1728155648,1728158719,MY
+1728155648,1728158463,MY
+1728158464,1728158719,NL
1728158720,1728159743,HK
1728159744,1728161791,TH
1728161792,1728162815,CN
@@ -28421,7 +30707,7 @@
1728444416,1728445439,JP
1728445440,1728446463,CN
1728446464,1728446975,ID
-1728446976,1728447487,IN
+1728446976,1728447231,IN
1728447488,1728448511,HK
1728448512,1728449535,KH
1728449536,1728450559,AU
@@ -28451,7 +30737,6 @@
1728472064,1728473087,KR
1728473344,1728473599,AU
1728473600,1728474111,SG
-1728474112,1728475135,IN
1728475136,1728476159,JP
1728476160,1728476415,AU
1728476416,1728476927,ID
@@ -28485,7 +30770,7 @@
1728501248,1728501503,ID
1728501504,1728502783,AU
1728502784,1728503807,CN
-1728503808,1728505855,JP
+1728503808,1728504831,JP
1728505856,1728506879,NZ
1728506880,1728507903,MY
1728507904,1728508927,JP
@@ -28528,7 +30813,6 @@
1728544768,1728545791,IN
1728545792,1728546815,JP
1728546816,1728547839,AU
-1728547840,1728548863,MY
1728548864,1728549119,KH
1728549120,1728549375,IN
1728549376,1728549631,PH
@@ -28819,6 +31103,7 @@
1728826368,1728827391,AU
1728827392,1728828415,JP
1728828416,1728829439,AU
+1728829440,1728830463,KH
1728830464,1728830719,SG
1728830720,1728830975,JP
1728830976,1728831487,ID
@@ -28887,7 +31172,7 @@
1728887808,1728888831,AU
1728888832,1728889855,IN
1728889856,1728890879,JP
-1728890880,1728891903,SG
+1728890880,1728891903,AU
1728891904,1728892927,BD
1728892928,1728893439,BN
1728893440,1728893695,SG
@@ -28990,7 +31275,8 @@
1728988192,1728988199,US
1728988200,1728989183,NZ
1728989184,1728990207,BD
-1728990208,1728990463,SG
+1728990208,1728990335,MY
+1728990336,1728990463,ID
1728990464,1728990975,KR
1728990976,1728991231,SG
1728991232,1728992255,BD
@@ -29041,7 +31327,8 @@
1729033216,1729033727,SG
1729033728,1729034239,GB
1729034240,1729035263,KH
-1729035264,1729036287,AU
+1729035264,1729035519,SG
+1729035520,1729036287,AU
1729036288,1729037311,JP
1729037312,1729039359,CN
1729039360,1729040383,JP
@@ -29105,6 +31392,7 @@
1729091584,1729092607,HK
1729092608,1729094143,BD
1729094144,1729094655,IN
+1729094656,1729095167,AU
1729095680,1729096703,SG
1729096704,1729097215,AU
1729097216,1729097727,AF
@@ -29120,9 +31408,10 @@
1729105920,1729106943,SG
1729106944,1729107967,NZ
1729107968,1729108479,IN
-1729108480,1729108647,HK
-1729108648,1729108655,KR
-1729108656,1729108991,HK
+1729108480,1729108616,KR
+1729108617,1729108617,HK
+1729108618,1729108735,KR
+1729108736,1729108991,HK
1729108992,1729111039,IN
1729111040,1729112063,JP
1729112064,1729113087,MY
@@ -29185,12 +31474,13 @@
1729165312,1729166335,JP
1729166336,1729166671,SG
1729166672,1729166687,PH
-1729166688,1729166847,SG
+1729166688,1729166799,SG
+1729166800,1729166815,PH
+1729166816,1729166847,SG
1729166848,1729167359,HK
1729167360,1729168383,IN
1729168384,1729169407,JP
1729169408,1729170431,TW
-1729170432,1729171455,BD
1729171456,1729171967,AU
1729171968,1729172223,IN
1729172224,1729172479,MY
@@ -29225,7 +31515,6 @@
1729199872,1729200127,TH
1729200128,1729201151,IN
1729201152,1729202175,AU
-1729202176,1729203199,JP
1729203200,1729205247,SG
1729205248,1729206271,JP
1729206272,1729207295,AU
@@ -29275,10 +31564,8 @@
1729247744,1729248255,NZ
1729248256,1729249279,JP
1729249280,1729252351,IN
-1729252352,1729253375,JP
-1729253376,1729254399,TW
1729254400,1729255423,AU
-1729255424,1729257471,MY
+1729255424,1729256447,MY
1729257472,1729258495,ID
1729258496,1729259519,JP
1729259520,1729260543,IN
@@ -29321,9 +31608,7 @@
1729294848,1729295103,IN
1729295104,1729295359,PK
1729295360,1729296383,MY
-1729296384,1729297407,JP
1729297408,1729298431,AU
-1729298432,1729299455,JP
1729299456,1729300479,NZ
1729300480,1729300991,SG
1729300992,1729301503,NZ
@@ -29393,7 +31678,6 @@
1729372160,1729373183,CN
1729373184,1729374207,JP
1729374208,1729375231,TW
-1729375232,1729376255,JP
1729376256,1729376767,AU
1729376768,1729377023,SG
1729377024,1729377279,ID
@@ -29563,7 +31847,7 @@
1729569792,1729570815,AF
1729570816,1729571839,AU
1729571840,1729572863,MY
-1729572864,1729573887,MN
+1729573632,1729573887,MN
1729573888,1729574911,NC
1729574912,1729575935,CN
1729575936,1729576959,BD
@@ -29605,7 +31889,6 @@
1729609728,1729610751,HK
1729610752,1729611775,JP
1729611776,1729612799,ID
-1729612800,1729613823,JP
1729613824,1729614847,SG
1729614848,1729615103,NZ
1729615104,1729615359,KH
@@ -29776,7 +32059,6 @@
1729786880,1729787903,JP
1729787904,1729789951,HK
1729789952,1729790975,ID
-1729790976,1729791999,HK
1729792000,1729793023,BD
1729793024,1729794047,IN
1729794048,1729795071,HK
@@ -30068,14 +32350,15 @@
1730074368,1730074623,SG
1730074624,1730075647,CN
1730075648,1730076671,ID
-1730076672,1730077695,AU
-1730077696,1730080767,CN
+1730076672,1730080767,CN
1730080768,1730081791,HK
1730081792,1730082815,ID
1730082816,1730083839,PW
1730083840,1730084863,JP
1730084864,1730085887,CN
-1730085888,1730086911,AU
+1730085888,1730086143,AU
+1730086144,1730086399,ID
+1730086400,1730086911,AU
1730086912,1730087935,HK
1730087936,1730088959,JP
1730088960,1730091007,HK
@@ -30128,7 +32411,6 @@
1730142208,1730143231,ID
1730143232,1730144255,SG
1730144256,1730145279,ID
-1730145280,1730146303,BD
1730146304,1730147327,HK
1730147328,1730148351,JP
1730148352,1730149375,ID
@@ -30213,7 +32495,482 @@
1742815232,1742815743,SG
1742815744,1742815999,ID
1742816000,1742817279,AU
-1742817280,1742819327,IN
+1742817280,1742818815,IN
+1742818816,1742819327,KH
+1742819328,1742820351,JP
+1742820352,1742821375,CN
+1742821376,1742822399,ID
+1742822400,1742823423,BD
+1742823424,1742823679,AU
+1742823680,1742823935,IN
+1742823936,1742824191,ID
+1742824192,1742826495,IN
+1742826496,1742827519,JP
+1742827520,1742828543,IN
+1742828544,1742830591,JP
+1742830592,1742833663,IN
+1742833664,1742834687,PH
+1742834688,1742835711,AU
+1742835712,1742836735,JP
+1742836736,1742837759,ID
+1742837760,1742838783,JP
+1742838784,1742841855,AU
+1742841856,1742842367,TH
+1742842368,1742843391,ID
+1742843392,1742843647,IN
+1742843648,1742843903,ID
+1742843904,1742845951,IN
+1742845952,1742846463,ID
+1742846464,1742846975,AU
+1742846976,1742847999,IN
+1742848000,1742849023,JP
+1742849024,1742851071,HK
+1742851072,1742852095,IN
+1742852096,1742852607,ID
+1742852608,1742853119,NZ
+1742853120,1742854143,HK
+1742854144,1742855167,AF
+1742855168,1742856191,PK
+1742856192,1742857215,IN
+1742857216,1742858239,BD
+1742858240,1742859263,AU
+1742859264,1742860287,VN
+1742860288,1742860799,AU
+1742860800,1742861055,ID
+1742861056,1742861311,AU
+1742861312,1742862335,NP
+1742862336,1742863359,HK
+1742863360,1742864383,JP
+1742864384,1742866431,IN
+1742866432,1742867199,AU
+1742867200,1742867455,IN
+1742867456,1742868479,PH
+1742868480,1742869503,CN
+1742869504,1742870015,IN
+1742870016,1742870527,VU
+1742870528,1742872575,IN
+1742872576,1742873599,NZ
+1742873600,1742874623,PH
+1742874624,1742875647,CN
+1742875648,1742876671,JP
+1742876672,1742877695,ID
+1742877696,1742877951,IN
+1742877952,1742878207,AU
+1742878208,1742878463,JP
+1742878464,1742878719,ID
+1742878720,1742880767,CN
+1742880768,1742881791,NZ
+1742881792,1742882815,AU
+1742882816,1742884863,KR
+1742884864,1742885887,CN
+1742885888,1742887935,IN
+1742887936,1742888959,HK
+1742888960,1742889983,KR
+1742889984,1742891007,TW
+1742891008,1742892031,AU
+1742892032,1742893055,VN
+1742893056,1742894079,NZ
+1742894080,1742895103,CN
+1742895104,1742895615,SG
+1742895616,1742895871,BD
+1742895872,1742896127,AU
+1742896128,1742897151,HK
+1742897152,1742898175,AU
+1742898176,1742899199,CN
+1742899200,1742900223,ID
+1742900224,1742903295,IN
+1742903296,1742904319,HK
+1742904320,1742905343,CN
+1742905344,1742907391,AU
+1742907392,1742908415,IN
+1742908416,1742908927,SG
+1742908928,1742909183,ID
+1742909184,1742909439,IN
+1742909440,1742910463,AU
+1742910464,1742911487,CN
+1742911488,1742914559,IN
+1742914560,1742915583,CN
+1742915584,1742918655,IN
+1742918656,1742919679,TW
+1742919680,1742920191,PK
+1742920192,1742920447,ID
+1742920448,1742921727,AU
+1742921728,1742923775,IN
+1742923776,1742924799,ID
+1742924800,1742926847,IN
+1742926848,1742927359,AU
+1742927360,1742927615,SG
+1742927616,1742927871,AU
+1742927872,1742928895,VN
+1742928896,1742929919,NZ
+1742929920,1742930175,IN
+1742930176,1742930431,MY
+1742930432,1742930943,PH
+1742930944,1742931967,KH
+1742931968,1742932991,JP
+1742932992,1742933503,SG
+1742933504,1742933759,ID
+1742933760,1742934015,NZ
+1742934016,1742935039,AF
+1742935040,1742938111,AU
+1742938112,1742939135,TW
+1742939136,1742940159,IN
+1742940160,1742941183,JP
+1742941184,1742942207,PH
+1742942208,1742943231,CN
+1742943232,1742945279,IN
+1742945280,1742945791,AU
+1742945792,1742946047,IN
+1742946048,1742947327,AU
+1742947328,1742948351,IN
+1742948352,1742951423,CN
+1742951424,1742953471,HK
+1742953472,1742954495,BD
+1742954496,1742955519,IN
+1742955520,1742956543,CN
+1742956544,1742957567,HK
+1742957568,1742958591,AU
+1742958592,1742959615,VN
+1742959616,1742960639,IN
+1742960640,1742961663,CN
+1742961664,1742962687,IN
+1742962688,1742963711,HK
+1742963712,1742965759,CN
+1742965760,1742966015,MY
+1742966016,1742968319,ID
+1742968320,1742970879,IN
+1742970880,1742971903,JP
+1742971904,1742972927,SG
+1742972928,1742973439,AU
+1742973440,1742973951,NZ
+1742973952,1742975999,SG
+1742976000,1742977023,JP
+1742977024,1742978047,HK
+1742978048,1742979071,JP
+1742979072,1742980095,HK
+1742980096,1742981119,CN
+1742981120,1742982143,NZ
+1742982144,1742983167,CN
+1742983168,1742984191,IN
+1742984192,1742985215,CN
+1742985216,1742986239,VN
+1742986240,1742987263,ID
+1742987264,1742988287,TW
+1742988288,1742989311,CN
+1742989312,1742989567,AU
+1742989568,1742989823,PH
+1742989824,1742990335,AU
+1742990336,1742991359,IN
+1742991360,1742992383,ID
+1742992384,1742993407,LK
+1742993408,1742994431,JP
+1742994432,1742995455,ID
+1742995456,1742996479,BD
+1742996480,1742997503,TH
+1742997504,1742998527,JP
+1742998528,1742999551,CN
+1742999552,1742999807,AU
+1742999808,1743000063,ID
+1743000064,1743000575,IN
+1743000576,1743001599,VN
+1743001600,1743002623,ID
+1743002624,1743003647,CN
+1743003648,1743007999,IN
+1743008000,1743008255,BD
+1743008256,1743008767,IN
+1743008768,1743010815,MY
+1743010816,1743011839,JP
+1743011840,1743012863,HK
+1743012864,1743013887,CN
+1743013888,1743015935,IN
+1743015936,1743016447,ID
+1743016448,1743016703,HK
+1743016704,1743016959,IN
+1743016960,1743017983,KH
+1743017984,1743019007,CN
+1743019008,1743021055,HK
+1743021056,1743021311,SG
+1743021312,1743021567,NZ
+1743021568,1743021823,PH
+1743021824,1743022079,IN
+1743022080,1743023103,AU
+1743023104,1743024127,HK
+1743024128,1743025151,IN
+1743025152,1743026175,ID
+1743026176,1743027199,BD
+1743027200,1743028223,AU
+1743028224,1743029247,CN
+1743029248,1743030271,AU
+1743030272,1743031295,HK
+1743031296,1743035391,IN
+1743035392,1743036415,PK
+1743036416,1743037439,CN
+1743037440,1743038463,AU
+1743038464,1743039487,JP
+1743039488,1743040511,IN
+1743040512,1743041535,CN
+1743041536,1743042559,HK
+1743042560,1743043583,IN
+1743043584,1743044607,AU
+1743044608,1743045119,IN
+1743045120,1743045631,AU
+1743045632,1743046655,JP
+1743046656,1743047679,BD
+1743047680,1743049727,CN
+1743049728,1743050751,AU
+1743050752,1743051775,TW
+1743051776,1743052799,IN
+1743052800,1743053823,JP
+1743053824,1743055871,CN
+1743055872,1743059199,ID
+1743059200,1743059967,IN
+1743059968,1743060991,LA
+1743060992,1743061503,AU
+1743061504,1743062015,IN
+1743062016,1743062271,AU
+1743062272,1743062527,IN
+1743062528,1743063039,AU
+1743063040,1743064063,SG
+1743064064,1743064575,ID
+1743064576,1743065087,IN
+1743065088,1743066111,TW
+1743066112,1743067135,CN
+1743067136,1743068159,IN
+1743068160,1743069183,HK
+1743069184,1743070207,MY
+1743070208,1743071231,IN
+1743071232,1743072255,VN
+1743072256,1743073279,BD
+1743073280,1743074047,AU
+1743074048,1743074303,IN
+1743074304,1743075327,HK
+1743075328,1743076351,MY
+1743076352,1743077375,JP
+1743077376,1743078399,IN
+1743078400,1743079423,JP
+1743079424,1743080959,ID
+1743080960,1743081471,IN
+1743081472,1743083519,BD
+1743083520,1743084543,SG
+1743084544,1743085567,TH
+1743085568,1743085823,SG
+1743085824,1743086079,AU
+1743086080,1743086591,NZ
+1743086592,1743087615,TW
+1743087616,1743088639,PH
+1743088640,1743089663,TH
+1743089664,1743090687,MY
+1743090688,1743091711,HK
+1743091712,1743092735,MN
+1743092736,1743093759,TW
+1743093760,1743094015,SG
+1743094016,1743094271,IN
+1743094272,1743094527,NZ
+1743094528,1743094783,IN
+1743094784,1743095807,TW
+1743095808,1743096831,CN
+1743096832,1743098879,HK
+1743098880,1743099903,CN
+1743099904,1743100927,KH
+1743100928,1743101951,KR
+1743101952,1743103999,ID
+1743104000,1743105023,IN
+1743105024,1743106047,CN
+1743106048,1743107071,MN
+1743107072,1743108095,HK
+1743108096,1743108607,IN
+1743108608,1743108863,SG
+1743108864,1743109119,AU
+1743109120,1743110143,HK
+1743110144,1743111167,VN
+1743111168,1743112191,HK
+1743112192,1743113215,ID
+1743113216,1743114239,SG
+1743114240,1743115263,IN
+1743115264,1743118335,CN
+1743118336,1743119359,IN
+1743119360,1743120383,CN
+1743120384,1743121407,IN
+1743121408,1743123455,CN
+1743123456,1743124479,IN
+1743124480,1743124991,NZ
+1743124992,1743125503,IN
+1743125504,1743126527,JP
+1743126528,1743127551,CN
+1743127552,1743128575,BD
+1743128576,1743129599,JP
+1743129600,1743131647,HK
+1743131648,1743132671,IN
+1743132672,1743133695,JP
+1743133696,1743134719,CN
+1743134720,1743134975,HK
+1743134976,1743135231,IN
+1743135232,1743135743,HK
+1743135744,1743136767,SG
+1743136768,1743138815,CN
+1743138816,1743139327,ID
+1743139328,1743139839,SG
+1743139840,1743140863,IN
+1743140864,1743141887,MY
+1743141888,1743142911,BD
+1743142912,1743143935,BN
+1743143936,1743144959,HK
+1743144960,1743145983,AU
+1743145984,1743147007,NZ
+1743147008,1743147263,AU
+1743147264,1743147519,NZ
+1743147520,1743147775,MN
+1743147776,1743148031,ID
+1743148032,1743149055,IN
+1743149056,1743150079,KR
+1743150080,1743151103,JP
+1743151104,1743152127,CN
+1743152128,1743153151,IN
+1743153152,1743154175,BD
+1743154176,1743155199,HK
+1743155200,1743156223,KR
+1743156224,1743157247,KH
+1743157248,1743158271,HK
+1743158272,1743160319,JP
+1743160320,1743161343,TH
+1743161344,1743163391,HK
+1743163392,1743166463,IN
+1743166464,1743167487,AU
+1743167488,1743168511,HK
+1743168512,1743169535,IN
+1743169536,1743170559,JP
+1743170560,1743171583,KR
+1743171584,1743172607,AU
+1743172608,1743173631,BD
+1743173632,1743174655,AU
+1743174656,1743175679,ID
+1743175680,1743176703,HK
+1743176704,1743179775,CN
+1743179776,1743180799,JP
+1743180800,1743181823,CN
+1743181824,1743182847,HK
+1743182848,1743184895,IN
+1743184896,1743185919,HK
+1743185920,1743186943,SG
+1743186944,1743187967,CN
+1743187968,1743188991,HK
+1743188992,1743190015,JP
+1743190016,1743191039,SG
+1743191040,1743192063,AF
+1743192064,1743195135,IN
+1743195136,1743196159,HK
+1743196160,1743198207,CN
+1743198208,1743198719,JP
+1743198720,1743198975,AU
+1743198976,1743199231,SG
+1743199232,1743200255,HK
+1743200256,1743201279,IN
+1743201280,1743202303,PH
+1743202304,1743204351,IN
+1743204352,1743205375,TW
+1743205376,1743206399,JP
+1743206400,1743207423,HK
+1743207424,1743208447,KH
+1743208448,1743210495,CN
+1743210496,1743211519,JP
+1743211520,1743212543,IN
+1743212544,1743213567,ID
+1743213568,1743214591,HK
+1743214592,1743215615,AU
+1743215616,1743216639,MM
+1743216640,1743217151,SG
+1743217152,1743217663,JP
+1743217664,1743218687,IN
+1743218688,1743219711,HK
+1743219712,1743221759,ID
+1743221760,1743222783,IN
+1743222784,1743223807,ID
+1743223808,1743224831,IN
+1743224832,1743225855,KR
+1743225856,1743226367,IN
+1743226368,1743226623,PH
+1743226624,1743226879,BD
+1743226880,1743227903,AF
+1743227904,1743228927,HK
+1743228928,1743229951,CN
+1743229952,1743230975,VN
+1743230976,1743231999,HK
+1743232000,1743232511,NZ
+1743232512,1743233023,AU
+1743233024,1743234047,BD
+1743234048,1743235071,HK
+1743235072,1743235583,AU
+1743235584,1743236095,ID
+1743236096,1743237119,US
+1743237120,1743238143,BD
+1743238144,1743240191,CN
+1743240192,1743241215,VN
+1743241216,1743242239,JP
+1743242240,1743244287,ID
+1743244288,1743245311,AU
+1743245312,1743248383,IN
+1743248384,1743248895,SG
+1743248896,1743249407,IN
+1743249408,1743250431,MY
+1743250432,1743251455,BD
+1743251456,1743252479,IN
+1743252480,1743253503,JP
+1743253504,1743254527,PH
+1743254528,1743255551,CN
+1743255552,1743256319,SG
+1743256320,1743256575,MY
+1743256576,1743258623,HK
+1743258624,1743259647,CN
+1743259648,1743260671,IN
+1743260672,1743261695,JP
+1743261696,1743262719,HK
+1743262720,1743264767,IN
+1743264768,1743265279,MY
+1743265280,1743265535,ID
+1743265536,1743265791,AU
+1743265792,1743266303,ID
+1743266304,1743267839,HK
+1743267840,1743268863,TH
+1743268864,1743269887,SG
+1743269888,1743270911,MY
+1743270912,1743273983,VN
+1743273984,1743275007,ID
+1743275008,1743276031,HK
+1743276032,1743277055,JP
+1743277056,1743278079,PH
+1743278080,1743279103,LA
+1743279104,1743281151,HK
+1743281152,1743283199,AU
+1743283200,1743284223,BD
+1743284224,1743285247,JP
+1743285248,1743286271,NZ
+1743286272,1743287295,IN
+1743287296,1743288319,AU
+1743288320,1743289343,VN
+1743289344,1743291391,IN
+1743291392,1743292415,AU
+1743292416,1743293439,IN
+1743293440,1743293951,AU
+1743293952,1743294463,PG
+1743294464,1743295487,CN
+1743295488,1743296511,IN
+1743296512,1743297535,NP
+1743297536,1743298303,NZ
+1743298304,1743299583,AU
+1743299584,1743300607,KH
+1743300608,1743301631,AU
+1743301632,1743303679,IN
+1743303680,1743304703,NZ
+1743304704,1743305727,IN
+1743305728,1743306751,JP
+1743306752,1743307775,KH
+1743307776,1743308799,AU
+1743308800,1743309823,JP
+1743309824,1743310335,NZ
+1743310336,1743311871,AU
+1743311872,1743312895,CN
+1743312896,1743313919,AU
+1743313920,1743314943,HK
1743781888,1743783935,JP
1743783936,1743784959,IN
1743784960,1743785983,JP
@@ -30302,7 +33059,8 @@
1743879168,1743881215,JP
1743881216,1743885311,IN
1743885312,1743885823,AU
-1743885824,1743886335,MY
+1743885824,1743886207,MY
+1743886208,1743886335,SG
1743886336,1743887359,JP
1743887360,1743888383,AF
1743888384,1743889407,CN
@@ -30331,7 +33089,7 @@
1743916032,1743917055,KH
1743917056,1743918079,MY
1743918080,1743919103,BD
-1743919104,1743920127,AU
+1743919104,1743920127,NZ
1743920128,1743921151,JP
1743921152,1743922175,AU
1743922176,1743923199,NZ
@@ -30392,8 +33150,7 @@
1743979520,1743980543,JP
1743980544,1743981567,IN
1743981568,1743982591,SG
-1743982592,1743983103,AU
-1743983104,1743983359,HK
+1743982592,1743983359,AU
1743983360,1743983615,IN
1743983616,1743984639,KR
1743984640,1743985663,CN
@@ -30500,7 +33257,6 @@
1744101376,1744102399,HK
1744102400,1744103423,FJ
1744103424,1744104447,CN
-1744104448,1744105471,AU
1744105472,1744106751,IN
1744106752,1744107007,ID
1744107008,1744107519,SG
@@ -30509,7 +33265,6 @@
1744109568,1744110591,IN
1744110592,1744111615,JP
1744111616,1744113663,IN
-1744113664,1744114687,JP
1744114688,1744115455,IN
1744115456,1744115711,CN
1744115712,1744116735,MY
@@ -30588,7 +33343,7 @@
1744192512,1744194559,JP
1744194560,1744194815,ID
1744194816,1744195071,HK
-1744195072,1744195327,SG
+1744195072,1744195327,AU
1744195328,1744195583,HK
1744195584,1744196607,JP
1744196608,1744197631,IN
@@ -30626,7 +33381,6 @@
1744222208,1744222719,ID
1744222720,1744223231,AU
1744223232,1744224255,TH
-1744224256,1744225279,JP
1744225280,1744226303,IN
1744226304,1744227327,SG
1744227328,1744228351,MY
@@ -30646,7 +33400,6 @@
1744238848,1744239615,NZ
1744239616,1744240639,JP
1744240640,1744241663,AU
-1744241664,1744242687,JP
1744242688,1744245503,ID
1744245504,1744245759,AU
1744245760,1744247807,ID
@@ -30656,7 +33409,6 @@
1744250880,1744251903,ID
1744251904,1744252927,BD
1744252928,1744253951,LK
-1744253952,1744254975,JP
1744254976,1744255999,NZ
1744256000,1744257023,TH
1744257024,1744257535,AU
@@ -30764,7 +33516,6 @@
1744359424,1744360447,IN
1744360448,1744361471,CN
1744361472,1744362495,ID
-1744362496,1744363519,JP
1744363520,1744365567,CN
1744365568,1744366591,IN
1744366592,1744367615,BD
@@ -30804,7 +33555,6 @@
1744402432,1744403455,IN
1744403456,1744404479,AU
1744404480,1744405503,CN
-1744405504,1744406527,HK
1744406528,1744407551,CN
1744407552,1744408575,AU
1744408576,1744409599,CN
@@ -30974,7 +33724,6 @@
1744584704,1744585727,CN
1744585728,1744586751,TW
1744586752,1744588799,HK
-1744588800,1744589823,PK
1744589824,1744590079,BT
1744590080,1744590335,ID
1744590336,1744590591,IN
@@ -31205,7 +33954,18 @@
1744828928,1744829183,SG
1744829184,1744829439,AU
1744829440,1744830463,HK
-1744830464,1745879039,US
+1744830464,1747191807,US
+1747191808,1747193855,CA
+1747193856,1747198975,US
+1747200000,1747214335,US
+1747215360,1747216383,CA
+1747216384,1747218431,US
+1747219456,1747220479,CA
+1747320832,1753227263,US
+1753231360,1753243647,US
+1753350144,1753415679,US
+1762656256,1763704831,MU
+1763704832,1764753407,EG
1764753408,1765801983,KE
1765801984,1766850559,MA
1766850560,1767899135,EG
@@ -31215,8 +33975,10 @@
1772093440,1772617727,KE
1772617728,1773142015,AO
1773142016,1773273087,ZA
+1773273088,1773404159,RW
1773404160,1773666303,EG
1773666304,1773928447,ZA
+1773928448,1774190591,MA
1774190592,1775239167,EG
1775239168,1776680959,ZA
1776680960,1776812031,KE
@@ -31263,22 +34025,32 @@
1793064960,1794113535,CN
1794113536,1795162111,KR
1795162112,1795387903,US
-1795387904,1795388415,CA
-1795388416,1795555839,US
+1795387904,1795388159,CA
+1795388160,1795555839,US
1795555840,1795555855,CA
1795555856,1795556351,US
1795556352,1795556607,CA
1795556608,1795557375,US
1795557376,1795557631,IN
-1795557632,1795560447,US
+1795557632,1795559423,US
+1795559424,1795559679,AR
+1795559680,1795560447,US
1795560448,1795560959,CA
-1795560960,1795561983,US
-1795561984,1795562239,CA
+1795560960,1795561471,US
+1795561472,1795562239,CA
1795562240,1795563263,US
1795563264,1795563519,CA
-1795563520,1795565823,US
+1795563520,1795564031,US
+1795564032,1795564543,CA
+1795564544,1795565823,US
1795565824,1795566079,CA
-1795566080,1795583999,US
+1795566080,1795566335,US
+1795566336,1795566591,CA
+1795566592,1795568127,US
+1795568128,1795568639,CA
+1795568640,1795569663,US
+1795569664,1795570175,CA
+1795570176,1795583999,US
1795584000,1795588095,SG
1795588096,1795591167,US
1795591168,1795592191,NL
@@ -31290,11 +34062,17 @@
1805049856,1805058047,CA
1805058048,1805144063,US
1805144064,1805148159,CA
-1805148160,1805171231,US
+1805148160,1805167103,US
+1805167104,1805167359,FR
+1805167360,1805171231,US
1805171232,1805171239,CA
1805171240,1805171607,US
1805171608,1805171615,CA
-1805171616,1805582335,US
+1805171616,1805190399,US
+1805190400,1805190655,ES
+1805190656,1805210623,US
+1805210624,1805210879,EG
+1805210880,1805582335,US
1805582336,1805647871,CA
1805647872,1805713407,US
1805713408,1805717503,CA
@@ -31304,15 +34082,29 @@
1805729792,1805733887,CA
1805733888,1805737983,US
1805737984,1805742079,CA
-1805742080,1806163967,US
-1806172160,1806401535,US
+1805742080,1805752575,US
+1805752576,1805753087,CA
+1805753088,1805754111,US
+1805754112,1805754367,CA
+1805754368,1806174207,US
+1806174208,1806174463,BR
+1806174464,1806205183,US
+1806205184,1806205439,CA
+1806205440,1806263551,US
+1806263552,1806263807,KR
+1806263808,1806401535,US
1806401536,1806434303,CA
-1806434304,1806843903,US
-1806893056,1806925823,US
+1806434304,1806925823,US
1806925824,1806958591,CA
-1807745024,1807917823,US
-1807917824,1807918079,VI
-1807918080,1815822335,US
+1806958592,1807056895,US
+1807056896,1807057151,AU
+1807057152,1807057663,US
+1807057664,1807057919,GB
+1807057920,1807597567,US
+1807597568,1807646719,CA
+1807646720,1807695871,US
+1807695872,1807699967,VI
+1807699968,1815822335,US
1815822336,1815826431,CA
1815826432,1815871487,US
1815871488,1815879679,CA
@@ -31320,15 +34112,51 @@
1815912448,1815920639,CA
1815920640,1815928831,US
1815928832,1815937023,BS
-1815937024,1816001791,US
-1816001792,1816002047,NL
-1816002048,1816068095,US
+1815937024,1815961599,US
+1815961600,1815961855,AU
+1815961856,1815962111,ES
+1815962112,1815962623,NL
+1815962624,1815963391,US
+1815963392,1815963647,NL
+1815963648,1815964159,US
+1815964160,1815964415,DK
+1815964416,1815964671,PL
+1815964672,1815965951,US
+1815965952,1815966207,DE
+1815966208,1815966719,US
+1815966720,1815966975,GB
+1815966976,1815967231,US
+1815967232,1815967487,CA
+1815967488,1815968255,US
+1815968256,1815968511,FR
+1815968512,1815968639,US
+1815968640,1815968767,FR
+1815968768,1815969279,US
+1815969280,1815969791,JP
+1815969792,1815987199,US
+1815987200,1815987711,GB
+1815987712,1815988223,NL
+1815988224,1815988735,JP
+1815988736,1815990271,US
+1815990272,1815990783,FR
+1815990784,1815991295,US
+1815991296,1815991807,AU
+1815991808,1815995135,US
+1815995136,1815995391,AU
+1815995392,1815995903,US
+1815995904,1815996159,GB
+1815996160,1815996415,CA
+1815996416,1815997695,US
+1815997696,1815997951,FR
+1815997952,1816001791,US
+1816001792,1816002559,NL
+1816002560,1816068095,US
1816068096,1816133631,CA
1816133632,1822429183,US
1822429184,1822433279,CA
1822433280,1822445567,US
-1822445568,1822451711,CA
-1822451712,1822486527,US
+1822445568,1822451199,CA
+1822451200,1822486527,US
1822486528,1822490623,CA
1822490624,1822498815,US
1822498816,1822502911,CA
@@ -31345,8 +34173,20 @@
1822554112,1822572543,US
1822572544,1822605311,CA
1822605312,1822609407,US
-1822609408,1822609663,SG
-1822609664,1822619903,US
+1822609408,1822609535,SG
+1822609536,1822611487,US
+1822611488,1822611551,CA
+1822611552,1822611967,US
+1822611968,1822612479,CA
+1822612480,1822614015,US
+1822614016,1822614271,JP
+1822614272,1822614783,US
+1822614784,1822615039,FR
+1822615040,1822617855,US
+1822617856,1822618367,CA
+1822618368,1822618879,US
+1822618880,1822619391,CA
+1822619392,1822619903,US
1822619904,1822620415,AU
1822620416,1822654463,US
1822654464,1822662143,CA
@@ -31367,7 +34207,9 @@
1823211520,1823342591,CA
1823342592,1823346687,US
1823346688,1823350783,CA
-1823350784,1823375359,US
+1823350784,1823361791,US
+1823361792,1823362303,CA
+1823362304,1823375359,US
1823375360,1823379455,CA
1823379456,1823383551,US
1823383552,1823387647,CA
@@ -31392,50 +34234,53 @@
1831862272,1832124415,PT
1832124416,1832386559,IT
1832386560,1832517631,DK
-1832517632,1832583167,SE
+1832517632,1832582655,SE
+1832582656,1832582911,DK
+1832582912,1832583167,SE
1832583168,1832648703,DK
1832648704,1832681471,HR
1832681472,1832714239,RU
1832714240,1832747007,HU
1832747008,1832779775,RU
-1832779776,1832780287,MQ
-1832780288,1832781311,FR
-1832781312,1832781823,MQ
-1832781824,1832782335,FR
-1832782336,1832783615,MQ
+1832779776,1832780031,FR
+1832780032,1832780287,MQ
+1832780288,1832780799,FR
+1832780800,1832781567,MQ
+1832781568,1832782335,FR
+1832782336,1832783103,MQ
+1832783104,1832783359,FR
+1832783360,1832783615,MQ
1832783616,1832783871,FR
-1832783872,1832784127,GP
-1832784128,1832784895,FR
-1832784896,1832785407,GP
+1832783872,1832784639,GP
+1832784640,1832785151,FR
+1832785152,1832785407,GP
1832785408,1832785663,FR
-1832785664,1832786175,GP
-1832786176,1832787199,FR
+1832785664,1832785919,GP
+1832785920,1832787199,FR
1832787200,1832787455,GF
-1832787456,1832789503,FR
-1832789504,1832789759,RE
-1832789760,1832792319,FR
-1832792320,1832792575,RE
-1832792576,1832793343,FR
-1832793344,1832793599,YT
-1832793600,1832794367,FR
-1832794368,1832794623,GP
-1832794624,1832796415,FR
+1832787456,1832788735,FR
+1832788736,1832788991,RE
+1832788992,1832789503,FR
+1832789504,1832790015,RE
+1832790016,1832791039,FR
+1832791040,1832791295,YT
+1832791296,1832791551,FR
+1832791552,1832791807,YT
+1832791808,1832794879,FR
+1832794880,1832795135,GP
+1832795136,1832796415,FR
1832796416,1832796671,RE
1832796672,1832796927,FR
-1832796928,1832797183,MQ
-1832797184,1832798207,FR
-1832798208,1832798719,GP
-1832798720,1832798975,FR
-1832798976,1832799231,GP
-1832799232,1832799487,FR
-1832799488,1832799743,GP
+1832796928,1832797183,GP
+1832797184,1832798975,FR
+1832798976,1832799743,GP
1832799744,1832801535,FR
1832801536,1832802047,MQ
-1832802048,1832802815,FR
-1832802816,1832803327,MQ
-1832803328,1832803839,FR
-1832803840,1832804095,MQ
-1832804096,1832812543,FR
+1832802048,1832802559,FR
+1832802560,1832802815,MQ
+1832802816,1832803839,FR
+1832803840,1832804351,MQ
+1832804352,1832812543,FR
1832812544,1832845311,RU
1832845312,1832878079,BH
1832878080,1832878412,RU
@@ -31573,11 +34418,8 @@
1833459712,1833463807,ME
1833463808,1833467903,UA
1833467904,1833471999,CH
-1833472000,1833473247,NL
-1833473280,1833473311,NL
-1833473344,1833474047,NL
+1833472000,1833473023,NL
1833474048,1833475071,UA
-1833475072,1833476095,DE
1833476096,1833484287,NL
1833484288,1833488383,IR
1833488384,1833492479,GB
@@ -31598,7 +34440,8 @@
1833542912,1833543167,GB
1833543168,1833543423,IN
1833543424,1833544959,GB
-1833544960,1833545215,IN
+1833544960,1833545087,IN
+1833545088,1833545215,GB
1833545216,1833545471,NL
1833545472,1833545727,GB
1833545728,1833549823,IT
@@ -31716,7 +34559,7 @@
1835810816,1835819007,UA
1835819008,1835827199,CZ
1835827200,1835835391,GB
-1835835392,1835843583,ES
+1835835392,1835843583,IR
1835843584,1835851775,NO
1835851776,1835859967,UA
1835859968,1835868159,DE
@@ -31735,9 +34578,9 @@
1835918440,1835918447,IT
1835918448,1835918519,GB
1835918520,1835918527,IT
-1835918528,1835918695,GB
-1835918696,1835918703,IT
-1835918704,1835918711,GB
+1835918528,1835918599,GB
+1835918600,1835918607,IT
+1835918608,1835918711,GB
1835918712,1835918719,IT
1835918720,1835918735,GB
1835918736,1835918743,IT
@@ -31747,7 +34590,9 @@
1835918848,1835918855,IT
1835918856,1835919095,GB
1835919096,1835919103,IT
-1835919104,1835919151,GB
+1835919104,1835919127,GB
+1835919128,1835919135,IT
+1835919136,1835919151,GB
1835919152,1835919159,IT
1835919160,1835919751,GB
1835919752,1835919759,IT
@@ -31755,9 +34600,9 @@
1835920480,1835920487,IT
1835920488,1835920727,GB
1835920728,1835920735,IT
-1835920736,1835920863,GB
-1835920864,1835920871,IT
-1835920872,1835921047,GB
+1835920736,1835920943,GB
+1835920944,1835920951,IT
+1835920952,1835921047,GB
1835921048,1835921055,IT
1835921056,1835921119,GB
1835921120,1835921127,IT
@@ -31771,22 +34616,23 @@
1835922456,1835922463,IT
1835922464,1835922559,GB
1835922560,1835922567,IT
-1835922568,1835922815,GB
-1835922816,1835922831,IT
-1835922832,1835923351,GB
+1835922568,1835923351,GB
1835923352,1835923359,IT
-1835923360,1835923519,GB
-1835923520,1835923527,IT
-1835923528,1835923863,GB
+1835923360,1835923487,GB
+1835923488,1835923495,IT
+1835923496,1835923863,GB
1835923864,1835923871,IT
-1835923872,1835924151,GB
-1835924152,1835924159,IT
-1835924160,1835924375,GB
+1835923872,1835924375,GB
1835924376,1835924383,IT
1835924384,1835925503,GB
1835925504,1835933695,LV
-1835933696,1835941887,RU
-1835941888,1835950079,UA
+1835933696,1835942399,RU
+1835942400,1835942655,UA
+1835942656,1835947775,RU
+1835947776,1835948031,UA
+1835948032,1835949055,RU
+1835949056,1835949311,UA
+1835949312,1835950079,RU
1835950080,1835958271,LB
1835958272,1835966463,HU
1835966464,1835974655,IR
@@ -31805,40 +34651,44 @@
1836598272,1836605439,FR
1836605440,1836612607,LU
1836612608,1836613631,DE
-1836613632,1836630015,RU
+1836613632,1836626943,RU
+1836626944,1836627967,NL
+1836627968,1836630015,RU
1836630016,1836646399,BG
1836646400,1836679167,RS
-1836679168,1836683263,BG
-1836683264,1836685311,RO
-1836685312,1836686335,BG
+1836679168,1836686335,BG
1836686336,1836687359,GR
1836687360,1836711935,BG
1836711936,1836728319,UA
1836728320,1836744703,RS
-1836744704,1836745983,FR
-1836745984,1836746239,RE
-1836746240,1836747775,FR
-1836747776,1836748031,RE
+1836744704,1836746495,FR
+1836746496,1836747007,RE
+1836747008,1836747263,FR
+1836747264,1836748031,RE
1836748032,1836748543,FR
1836748544,1836748799,RE
1836748800,1836749055,FR
1836749056,1836749567,RE
-1836749568,1836749823,FR
-1836749824,1836750591,RE
-1836750592,1836750847,FR
-1836750848,1836752383,RE
-1836752384,1836753151,FR
+1836749568,1836750079,FR
+1836750080,1836750591,RE
+1836750592,1836751103,FR
+1836751104,1836751615,RE
+1836751616,1836753151,FR
1836753152,1836753407,RE
1836753408,1836753919,FR
-1836753920,1836754943,RE
-1836754944,1836755455,FR
+1836753920,1836754687,RE
+1836754688,1836755455,FR
1836755456,1836755711,RE
-1836755712,1836756223,FR
-1836756224,1836756735,RE
-1836756736,1836758271,FR
-1836758272,1836759295,RE
-1836759296,1836759807,FR
-1836759808,1836760575,RE
+1836755712,1836755967,FR
+1836755968,1836756223,RE
+1836756224,1836756479,FR
+1836756480,1836756991,RE
+1836756992,1836758015,FR
+1836758016,1836758527,RE
+1836758528,1836758783,FR
+1836758784,1836759039,RE
+1836759040,1836759551,FR
+1836759552,1836760575,RE
1836760576,1836760831,FR
1836760832,1836761087,RE
1836761088,1836777471,IR
@@ -31946,7 +34796,8 @@
1841669120,1841669375,PL
1841669376,1841669631,BE
1841669632,1841670143,UA
-1841670144,1841672191,PL
+1841670144,1841671935,PL
+1841671936,1841672191,GB
1841672192,1841674239,FR
1841674240,1841676287,PL
1841676288,1841680383,RU
@@ -31989,9 +34840,7 @@
1841924352,1841924607,DE
1841924608,1841925887,NL
1841925888,1841926143,DE
-1841926144,1841927167,NL
-1841927168,1841927423,DE
-1841927424,1841930239,NL
+1841926144,1841930239,NL
1841930240,1841938431,KG
1841938432,1841946623,RU
1841946624,1841954815,UA
@@ -32003,27 +34852,32 @@
1841987584,1841995775,DK
1841995776,1842003967,RU
1842003968,1842012159,CH
-1842012160,1842020351,GB
+1842012160,1842017023,GB
+1842017024,1842017279,BE
+1842017280,1842020351,GB
1842020352,1842028543,NO
1842028544,1842036735,CH
-1842036736,1842038783,FR
-1842038784,1842044927,LU
+1842036736,1842042879,FR
+1842042880,1842044927,LU
1842044928,1842053119,GB
-1842053120,1842061311,ES
-1842061312,1842069503,IR
+1842053120,1842069503,IR
1842069504,1842077695,RU
1842077696,1842077951,FR
-1842077952,1842078463,MQ
-1842078464,1842078719,FR
+1842077952,1842078207,MQ
+1842078208,1842078719,FR
1842078720,1842078975,MQ
-1842078976,1842079231,FR
-1842079232,1842079743,MQ
-1842079744,1842080255,GP
-1842080256,1842080767,MQ
-1842080768,1842081535,GP
-1842081536,1842083327,MQ
-1842083328,1842083839,GP
-1842083840,1842084607,MQ
+1842078976,1842079487,FR
+1842079488,1842080767,MQ
+1842080768,1842081023,GP
+1842081024,1842081279,MQ
+1842081280,1842081535,GP
+1842081536,1842081791,MQ
+1842081792,1842082047,GP
+1842082048,1842082559,MQ
+1842082560,1842082815,GP
+1842082816,1842083071,MQ
+1842083072,1842083583,GP
+1842083584,1842084607,MQ
1842084608,1842084863,GP
1842084864,1842085887,MQ
1842085888,1842118655,GB
@@ -32239,7 +35093,9 @@
1844174848,1844178943,DE
1844178944,1844180991,EE
1844180992,1844183039,TR
-1844183040,1844191231,IT
+1844183040,1844185087,IT
+1844185088,1844187135,CH
+1844187136,1844191231,IT
1844191232,1844195327,AL
1844199424,1844203519,RU
1844203520,1844207615,NL
@@ -32477,7 +35333,6 @@
1860743465,1860744191,AU
1860744192,1860745215,IN
1860745216,1860746239,AU
-1860746240,1860747263,PK
1860747264,1860759551,JP
1860759552,1860761599,AU
1860761600,1860763647,IN
@@ -32493,7 +35348,9 @@
1866588160,1866592255,NZ
1866592256,1866596351,VN
1866596352,1866661887,CN
-1866661888,1866670079,AU
+1866661888,1866666656,AU
+1866666657,1866666657,NZ
+1866666658,1866670079,AU
1866670080,1866674175,MY
1866674176,1866678271,TW
1866678272,1866686463,ID
@@ -32753,13 +35610,16 @@
1897250816,1897259007,HK
1897259008,1897260031,NZ
1897260032,1897261055,BD
-1897261056,1897263103,JP
1897263104,1897265151,TH
1897265152,1897267199,JP
1897267200,1897365503,VN
1897365504,1897398271,MY
1897398272,1897660415,CN
-1897660416,1897725951,HK
+1897660416,1897663487,HK
+1897663488,1897663743,GB
+1897663744,1897697279,HK
+1897697280,1897697535,AU
+1897697536,1897725951,HK
1897725952,1897730047,JP
1897730048,1897734143,AU
1897734144,1897738239,HK
@@ -32769,7 +35629,8 @@
1897758720,1897779199,KR
1897779200,1897781247,AU
1897781248,1897783295,JP
-1897783296,1897784831,SG
+1897783296,1897784319,SG
+1897784320,1897784831,HK
1897784832,1897785343,KR
1897785344,1897787391,SG
1897787392,1897789439,AU
@@ -32937,7 +35798,9 @@
1919909888,1919918079,AU
1919918080,1919926271,CN
1919926272,1919942655,KR
-1919942656,1920069631,CN
+1919942656,1920006847,CN
+1920006848,1920006911,HK
+1920006912,1920069631,CN
1920069632,1920073727,HK
1920073728,1920466943,CN
1920466944,1920991231,ID
@@ -33296,7 +36159,8 @@
1958850560,1958852607,CN
1958852608,1958853631,AU
1958853632,1958854655,ID
-1958854656,1958860799,AU
+1958854656,1958858751,AU
+1958858752,1958860799,NZ
1958860800,1958862847,BD
1958862848,1958871039,JP
1958871040,1959067647,CN
@@ -33308,7 +36172,9 @@
1959110656,1959112703,JP
1959112704,1959113215,HK
1959113216,1959113471,IN
-1959113472,1959116799,HK
+1959113472,1959114751,HK
+1959114752,1959115007,IN
+1959115008,1959116799,HK
1959116800,1959133183,SG
1959133184,1959239679,CN
1959239680,1959241727,KR
@@ -33360,7 +36226,6 @@
1962672128,1962803199,CN
1962803200,1962827775,JP
1962827776,1962829823,ID
-1962829824,1962831871,JP
1962831872,1962835967,ID
1962835968,1962868735,CN
1962868736,1962885119,AU
@@ -33508,8 +36373,8 @@
1971060736,1975517183,CN
1975517184,1979711487,IN
1979711488,1981284351,JP
-1981284352,1981546494,CN
-1981546495,1981546495,JP
+1981284352,1981480959,CN
+1981480960,1981546495,JP
1981546496,1981808639,CN
1981808640,1983905791,KR
1983905792,1984102399,CN
@@ -33668,7 +36533,9 @@
1997723648,1997725695,JP
1997725696,1998061567,CN
1998061568,1998258175,JP
-1998258176,1998274559,SG
+1998258176,1998271231,SG
+1998271232,1998271487,AU
+1998271488,1998274559,SG
1998274560,1998454783,CN
1998454784,1998456831,AU
1998456832,1998458879,JP
@@ -33776,9 +36643,7 @@
2003828736,2006188031,CN
2006188032,2006204415,BD
2006204416,2006212607,AU
-2006212608,2006213119,TH
-2006213120,2006213375,JP
-2006213376,2006214655,TH
+2006212608,2006214655,TH
2006214656,2006216703,JP
2006216704,2006228991,KR
2006228992,2006237183,CN
@@ -33908,7 +36773,9 @@
2022180864,2022182911,JP
2022184960,2022187007,KH
2022187008,2022191103,HK
-2022191104,2022195199,NZ
+2022191104,2022194175,NZ
+2022194176,2022194687,AU
+2022194688,2022195199,NZ
2022195200,2022211583,KR
2022211584,2022227967,CN
2022227968,2022244351,JP
@@ -33986,9 +36853,7 @@
2033713152,2033876991,CN
2033876992,2033879039,JP
2033879040,2033887231,CN
-2033887232,2033887743,IN
-2033887744,2033887999,PH
-2033888000,2033889279,IN
+2033887232,2033889279,IN
2033889280,2033891327,JP
2033891328,2033893375,ID
2033893376,2033909759,PH
@@ -34069,8 +36934,8 @@
2046836736,2046885887,CN
2046885888,2046951423,JP
2046951424,2047082495,PH
-2047082496,2047475711,CN
-2047475712,2047492095,HK
+2047082496,2047442943,CN
+2047442944,2047492095,HK
2047492096,2047496191,KR
2047496192,2047508479,HK
2047508480,2047526911,CN
@@ -34175,13 +37040,15 @@
2056816864,2056816895,MY
2056816896,2056817663,JP
2056817664,2056817919,AU
-2056817920,2056818175,JP
-2056818176,2056818431,SG
-2056818432,2056818943,JP
+2056817920,2056818431,JP
+2056818432,2056818687,SG
+2056818688,2056818943,JP
2056818944,2056818993,MY
2056818994,2056818994,JP
2056818995,2056819199,MY
-2056819200,2056830975,JP
+2056819200,2056823849,JP
+2056823850,2056823850,SG
+2056823851,2056830975,JP
2056830976,2056847359,CN
2056847360,2056912895,KR
2056912896,2057043967,TH
@@ -34227,15 +37094,15 @@
2063077376,2063077377,PH
2063077378,2063077378,HK
2063077379,2063077631,PH
-2063077632,2063077887,HK
-2063077888,2063078143,SG
-2063078144,2063079423,HK
+2063077632,2063079423,HK
2063079424,2063081471,CN
2063081472,2063085567,ID
2063085568,2063089663,CN
2063089664,2063097855,JP
2063097856,2063106047,MM
-2063106048,2063107623,JP
+2063106048,2063106559,JP
+2063106560,2063106815,AU
+2063106816,2063107623,JP
2063107624,2063107631,AU
2063107632,2063111167,JP
2063111168,2063112191,AU
@@ -34303,7 +37170,9 @@
2066923520,2066939903,JP
2066939904,2066972671,AU
2066972672,2067005439,TW
-2067005440,2067726335,CN
+2067005440,2067529727,CN
+2067529728,2067595263,HK
+2067595264,2067726335,CN
2067726336,2067791871,IN
2067791872,2070052863,CN
2070052864,2070056959,AU
@@ -34320,7 +37189,9 @@
2070200320,2070208511,JP
2070208512,2070210047,SG
2070210048,2070210303,AU
-2070210304,2070216703,SG
+2070210304,2070210815,SG
+2070210816,2070211071,AU
+2070211072,2070216703,SG
2070216704,2070282239,CN
2070282240,2070347775,AU
2070347776,2070380543,CN
@@ -34433,8 +37304,12 @@
2080636928,2080702463,IN
2080702464,2080767999,KR
2080768000,2080776191,TW
-2080776192,2080782335,ID
-2080782336,2080784383,SG
+2080776192,2080777215,HK
+2080777216,2080778239,GB
+2080778240,2080779263,US
+2080779264,2080780287,SG
+2080780288,2080781311,ID
+2080781312,2080784383,SG
2080784384,2080800767,CN
2080800768,2080817151,PH
2080817152,2080825343,NZ
@@ -34628,9 +37503,7 @@
2099216384,2099232767,KR
2099232768,2100297727,CN
2100297728,2100854783,JP
-2100854784,2100874495,US
-2100874496,2100874751,AU
-2100874752,2100887551,US
+2100854784,2100887551,US
2100887552,2100953087,KR
2100953088,2100969471,VN
2100969472,2100985855,JP
@@ -34662,9 +37535,7 @@
2108358656,2108424191,CN
2108424192,2108686335,JP
2108686336,2109734911,KR
-2109734912,2110714623,JP
-2110714624,2110714879,NC
-2110714880,2110783487,JP
+2109734912,2110783487,JP
2110783488,2110799871,CN
2110799872,2110816255,KR
2110816256,2110832639,ID
@@ -34700,7 +37571,9 @@
2113687808,2113688063,AU
2113688064,2113688319,JP
2113688320,2113688575,SG
-2113688576,2113716223,JP
+2113688576,2113693599,JP
+2113693600,2113693615,HK
+2113693616,2113716223,JP
2113716224,2113732607,SG
2113732608,2113761279,AU
2113761280,2113765375,VN
@@ -34716,7 +37589,9 @@
2147485696,2147487743,DK
2147487744,2147489791,NO
2147489792,2147491839,RU
-2147491840,2147498239,DE
+2147491840,2147494911,DE
+2147494912,2147495167,RO
+2147495168,2147498239,DE
2147498240,2147498495,RO
2147498496,2147500031,DE
2147500032,2147501055,FR
@@ -34734,7 +37609,9 @@
2147526656,2147528703,UA
2147528704,2147532799,CZ
2147532800,2147534847,DE
-2147534848,2147549183,CY
+2147534848,2147536895,CY
+2147536896,2147540991,GR
+2147540992,2147549183,CY
2147549184,2147942399,US
2147942400,2148007935,DE
2148007936,2148532223,US
@@ -34771,16 +37648,41 @@
2152726528,2153119743,US
2153119744,2153185279,GB
2153185280,2153250815,SE
-2153250816,2153406463,US
+2153250816,2153384447,US
+2153384448,2153385471,GB
+2153385472,2153385599,AT
+2153385600,2153385663,CZ
+2153385664,2153385727,FI
+2153385728,2153385791,PL
+2153385792,2153385855,PT
+2153385856,2153385919,TR
+2153385920,2153385983,US
+2153385984,2153387007,GB
+2153387008,2153387263,CH
+2153387264,2153387775,US
+2153387776,2153388031,CH
+2153388032,2153406463,US
2153406464,2153407487,JP
2153407488,2153407743,HK
2153407744,2153407999,US
2153408000,2153408511,BR
-2153408512,2153409791,US
+2153408512,2153408767,AU
+2153408768,2153409023,PA
+2153409024,2153409279,AR
+2153409280,2153409535,CR
+2153409536,2153409791,CO
2153409792,2153410047,MX
-2153410048,2153411583,US
+2153410048,2153410303,US
+2153410304,2153410559,TW
+2153410560,2153410815,PA
+2153410816,2153411071,AR
+2153411072,2153411327,CR
+2153411328,2153411583,CO
2153411584,2153411839,MX
-2153411840,2153578495,US
+2153411840,2153412095,US
+2153412096,2153412351,TW
+2153412352,2153413119,AU
+2153413120,2153578495,US
2153578496,2153644031,FR
2153644032,2153906175,US
2153906176,2153971711,GB
@@ -34790,7 +37692,6 @@
2155610112,2155675647,UA
2155675648,2155806719,US
2155806720,2155808767,IT
-2155808768,2155810815,RU
2155810816,2155812863,FR
2155812864,2155814911,GB
2155814912,2155819007,NL
@@ -34800,7 +37701,14 @@
2155825152,2155827199,AE
2155827200,2155831295,PL
2155831296,2155833343,RU
-2155833344,2155835391,SE
+2155833344,2155833855,SE
+2155833856,2155834367,NL
+2155834368,2155834464,SE
+2155834465,2155834512,NL
+2155834513,2155834532,SE
+2155834533,2155834623,NL
+2155834624,2155834879,LU
+2155834880,2155835391,NL
2155835392,2155839487,RO
2155839488,2155843583,FR
2155843584,2155845631,RU
@@ -34836,7 +37744,8 @@
2159149056,2159280127,CH
2159280128,2159542271,US
2159542272,2159607807,AU
-2159607808,2159869951,US
+2159607808,2159673343,IN
+2159673344,2159869951,US
2159869952,2159935487,CA
2159935488,2160525311,US
2160525312,2160590847,SG
@@ -34890,11 +37799,10 @@
2166571008,2166575103,GB
2166575104,2166575359,US
2166575360,2166575615,GB
-2166575616,2166606847,US
-2166606848,2166607009,GB
+2166575616,2166607009,US
2166607010,2166607010,DE
-2166607011,2166607103,GB
-2166607104,2166613759,US
+2166607011,2166607011,GB
+2166607012,2166613759,US
2166613760,2166614015,DE
2166614016,2167209983,US
2167275520,2167930879,US
@@ -34966,11 +37874,11 @@
2178351104,2178416639,GB
2178416640,2178482175,US
2178482176,2178547711,DE
-2178547712,2179379199,US
-2179379200,2179396607,GB
-2179396608,2179396863,US
-2179396864,2179399679,GB
-2179399680,2179465215,US
+2178547712,2179391487,US
+2179391488,2179391999,GB
+2179392000,2179397632,US
+2179397633,2179397633,GB
+2179397634,2179465215,US
2179530752,2179596287,DE
2179596288,2179661823,GB
2179661824,2179989503,US
@@ -35042,9 +37950,7 @@
2184577024,2184642559,JP
2184642560,2184708095,US
2184708096,2184773631,AU
-2184773632,2184781311,US
-2184781312,2184781567,AU
-2184781568,2184803839,US
+2184773632,2184803839,US
2184803840,2184804351,GB
2184804352,2184904703,US
2184904704,2185035775,CH
@@ -35100,15 +38006,13 @@
2188708608,2188708863,FR
2188708864,2188711800,US
2188711801,2188711801,DE
-2188711802,2188717567,US
-2188717568,2188717823,FR
-2188717824,2188718581,US
+2188711802,2188716031,US
+2188716032,2188716287,FR
+2188716288,2188718581,US
2188718582,2188718582,DE
2188718583,2188724463,US
2188724464,2188724464,NL
-2188724465,2188724991,US
-2188724992,2188725247,RS
-2188725248,2188726783,US
+2188724465,2188726783,US
2188726784,2188727039,GB
2188727040,2188728319,US
2188728320,2188728575,GB
@@ -35116,9 +38020,7 @@
2188734464,2188734719,FR
2188734720,2188738306,US
2188738307,2188738307,GB
-2188738308,2188749055,US
-2188749056,2188749311,SL
-2188749312,2188768767,US
+2188738308,2188768767,US
2188768768,2188769279,YT
2188769280,2188902399,US
2188902400,2188967935,FR
@@ -35192,15 +38094,25 @@
2193698816,2193701887,US
2193701888,2193704959,RU
2193704960,2193707007,IT
-2193707008,2193707151,GB
-2193707152,2193707159,IT
-2193707160,2193707303,GB
-2193707304,2193707311,IT
-2193707312,2193707407,GB
+2193707008,2193707239,GB
+2193707240,2193707247,IT
+2193707248,2193707407,GB
2193707408,2193707415,IT
2193707416,2193707751,GB
2193707752,2193707759,IT
-2193707760,2193711103,GB
+2193707760,2193707831,GB
+2193707832,2193707839,IT
+2193707840,2193707975,GB
+2193707976,2193707983,IT
+2193707984,2193708511,GB
+2193708512,2193708519,IT
+2193708520,2193708663,GB
+2193708664,2193708671,IT
+2193708672,2193708735,GB
+2193708736,2193708743,IT
+2193708744,2193708815,GB
+2193708816,2193708823,IT
+2193708824,2193711103,GB
2193711104,2193713151,DE
2193713152,2193715199,ES
2193715200,2193717247,DE
@@ -35211,16 +38123,13 @@
2193883136,2194014207,US
2194014208,2194079743,CH
2194079744,2194407423,US
-2194407424,2194469631,BG
-2194469632,2194469887,ES
-2194469888,2194472959,BG
+2194407424,2194472959,BG
2194472960,2194538495,US
2194538496,2194604031,ES
2194604032,2194669567,US
2194669568,2194735103,IS
2194735104,2194800639,GB
-2194800640,2194866175,US
-2194931712,2195193855,US
+2194800640,2195193855,US
2195193856,2195324927,NZ
2195324928,2195455999,US
2195456000,2195521535,AU
@@ -35251,7 +38160,11 @@
2197776384,2197778431,DE
2197778432,2197780479,IT
2197780480,2197782527,DE
-2197782528,2197786623,UA
+2197782528,2197782685,RU
+2197782686,2197782686,UA
+2197782687,2197782783,RU
+2197782784,2197783039,UA
+2197783040,2197786623,RU
2197786624,2197788671,IT
2197788672,2197790719,PL
2197790720,2197792767,SE
@@ -35364,12 +38277,14 @@
2212757504,2212761599,FI
2212761600,2212762623,GB
2212762624,2212764927,FI
-2212764928,2212765183,IN
+2212764928,2212765183,BG
2212765184,2212766719,FI
2212766720,2212767743,GB
2212767744,2212796415,FI
2212796416,2212797951,NL
-2212797952,2212807679,FI
+2212797952,2212804095,FI
+2212804096,2212804351,NL
+2212804352,2212807679,FI
2212807680,2212808703,US
2212808704,2212823039,FI
2212823040,2212954111,US
@@ -35465,7 +38380,8 @@
2248151040,2248153087,GB
2248153088,2248155135,DE
2248155136,2248163327,AL
-2248163328,2248165375,GB
+2248163328,2248163839,US
+2248163840,2248165375,GB
2248165376,2248167423,US
2248167424,2248169471,IE
2248169472,2248171519,NL
@@ -35492,7 +38408,9 @@
2249457664,2249523199,US
2249523200,2249588735,CH
2249588736,2249654271,CA
-2249654272,2249785343,US
+2249654272,2249724671,US
+2249724672,2249724927,CA
+2249724928,2249785343,US
2249785344,2249850879,SE
2249850880,2249916415,US
2249916416,2249981951,NL
@@ -35518,9 +38436,7 @@
2251948032,2252013567,BE
2252013568,2252079103,FR
2252079104,2252210175,DE
-2252210176,2252417023,US
-2252417024,2252417279,GB
-2252417280,2252931071,US
+2252210176,2252931071,US
2252996608,2253062143,US
2253062144,2253127679,KR
2253127680,2253193215,DE
@@ -35596,7 +38512,7 @@
2258594048,2258594111,HK
2258594112,2258594303,AU
2258594304,2258594319,HK
-2258594320,2258594559,AU
+2258594320,2258594559,PG
2258594560,2258594815,HK
2258594816,2258595103,AU
2258595104,2258595167,TW
@@ -35689,9 +38605,10 @@
2258603091,2258603103,HK
2258603104,2258603135,PG
2258603136,2258603139,HK
-2258603140,2258603199,AU
+2258603140,2258603199,PG
2258603200,2258603207,HK
-2258603208,2258603775,AU
+2258603208,2258603263,PG
+2258603264,2258603775,AU
2258603776,2258603839,HK
2258603840,2258603903,AU
2258603904,2258603943,HK
@@ -35755,9 +38672,7 @@
2258611120,2258611167,JP
2258611168,2258611215,AU
2258611216,2258611223,NZ
-2258611224,2258611711,AU
-2258611712,2258611967,NZ
-2258611968,2258614783,AU
+2258611224,2258614783,AU
2258614784,2258614815,IN
2258614816,2258615039,AU
2258615040,2258615055,IN
@@ -35797,9 +38712,7 @@
2261450752,2261516287,NL
2261516288,2261569535,US
2261569536,2261569791,TH
-2261569792,2261573631,US
-2261573632,2261573887,GB
-2261573888,2261647359,US
+2261569792,2261647359,US
2261647360,2261712895,FR
2261712896,2261778431,US
2261778432,2261843967,TW
@@ -35852,11 +38765,13 @@
2281007104,2281007359,IN
2281007360,2281023487,US
2281023488,2281023743,IN
-2281023744,2281037823,US
+2281023744,2281029631,US
+2281029632,2281029887,FR
+2281029888,2281037823,US
2281037824,2281038079,FR
-2281038080,2281705471,US
-2281705472,2281705727,CN
-2281705728,2282226175,US
+2281038080,2281701887,US
+2281701888,2281703423,CH
+2281703424,2282226175,US
2282226176,2282226243,AU
2282226244,2282226245,US
2282226246,2282226431,AU
@@ -36079,7 +38994,8 @@
2319974400,2320039935,US
2320039936,2320105471,CA
2320105472,2320171007,US
-2320171008,2320236543,NZ
+2320171008,2320203775,NZ
+2320203776,2320236543,SG
2320236544,2320302079,US
2320302080,2320367615,AU
2320367616,2320433151,US
@@ -36101,10 +39017,10 @@
2322333696,2322923519,US
2323054592,2323120127,CA
2323316736,2323382271,US
-2323382272,2323447807,NO
-2323447808,2323644415,US
-2323677184,2323677695,US
-2323709952,2323775487,US
+2323382272,2323406847,NO
+2323406848,2323407103,DK
+2323407104,2323447807,NO
+2323447808,2323775487,US
2323775488,2323841023,AU
2323841024,2323906559,CH
2323906560,2323972095,IT
@@ -36143,7 +39059,8 @@
2330132480,2330198015,SE
2330198016,2330263551,CH
2330263552,2330267647,US
-2330329088,2330394623,US
+2330267648,2330271743,CA
+2330271744,2330394623,US
2330394624,2330460159,FR
2330460160,2330525695,AT
2330525696,2330591231,SE
@@ -36198,6 +39115,7 @@
2337865728,2337931263,DE
2337931264,2337996799,BE
2337996800,2338062335,GR
+2338083840,2338084095,TR
2338086912,2338087423,DE
2338092288,2338092543,SE
2338113536,2338113791,FR
@@ -36220,9 +39138,7 @@
2338848768,2338914303,US
2338914304,2339962879,NO
2339962880,2340028415,US
-2340028416,2340081663,SE
-2340081664,2340081919,BR
-2340081920,2340093951,SE
+2340028416,2340093951,SE
2340093952,2340159487,FI
2340159488,2340225023,FR
2340225024,2340421631,US
@@ -36365,7 +39281,17 @@
2364342272,2364407807,CN
2364407808,2364538879,US
2364538880,2364604415,CN
-2364604416,2364735487,US
+2364604416,2364671487,US
+2364671488,2364671743,MO
+2364671744,2364675839,US
+2364675840,2364676095,CA
+2364676096,2364676867,US
+2364676868,2364677119,GB
+2364677120,2364725503,US
+2364725504,2364725759,IL
+2364725760,2364727807,US
+2364727808,2364728063,DE
+2364728064,2364735487,US
2364735488,2364801023,CN
2364801024,2364932095,US
2364932096,2364997631,CN
@@ -36420,9 +39346,7 @@
2366171136,2366308351,DE
2366308352,2366368255,GB
2366368256,2366368511,FR
-2366368512,2366373375,GB
-2366373376,2366373631,FR
-2366373632,2366373887,GB
+2366368512,2366373887,GB
2366373888,2367487999,DE
2367488000,2367553535,SI
2367553536,2370895871,DE
@@ -36436,15 +39360,21 @@
2371747840,2371878911,GB
2371878912,2371944447,BE
2371944448,2372009983,GB
-2372009984,2372075519,PL
+2372009984,2372075519,CH
2372075520,2372206591,DE
2372206592,2372214783,UA
2372214784,2372218879,DE
2372218880,2372222975,FR
-2372227072,2372227583,SE
-2372231936,2372232191,GB
+2372224512,2372224767,GB
+2372227072,2372227583,NO
+2372230400,2372230655,AT
+2372231424,2372231679,HU
+2372231680,2372232191,GB
2372238730,2372238730,US
-2372239360,2372241407,NL
+2372239360,2372240383,SK
+2372240384,2372240895,NL
+2372240896,2372241151,AE
+2372241152,2372241407,NL
2372241408,2372264447,RU
2372264448,2372266495,UA
2372266496,2372272127,RU
@@ -36465,7 +39395,9 @@
2372505600,2372507647,NL
2372507648,2372509695,IT
2372509696,2372510207,AE
-2372510208,2372510463,AO
+2372510208,2372510335,AO
+2372510336,2372510336,ES
+2372510337,2372510463,AO
2372510464,2372511743,AE
2372511744,2372513791,SI
2372513792,2372534271,GB
@@ -36492,7 +39424,11 @@
2373911042,2373911042,US
2373911043,2373976063,FI
2373976064,2374107135,US
-2374107136,2374172671,DE
+2374107136,2374171135,DE
+2374171136,2374171206,CH
+2374171207,2374171207,DE
+2374171208,2374171391,CH
+2374171392,2374172671,DE
2374172672,2374238207,US
2374238208,2374303743,AU
2374303744,2374369279,US
@@ -36557,9 +39493,7 @@
2377449472,2377515007,FR
2377515008,2377842687,US
2377842688,2377908223,GB
-2377908224,2378010111,US
-2378010112,2378010367,AU
-2378010368,2378025983,US
+2377908224,2378025983,US
2378025984,2378026239,NL
2378026240,2378026495,US
2378026496,2378027007,FR
@@ -36589,7 +39523,9 @@
2380465152,2380529663,FR
2380529664,2380558847,GB
2380558848,2380559103,ZA
-2380559104,2380579327,GB
+2380559104,2380578815,GB
+2380578816,2380579071,JP
+2380579072,2380579327,GB
2380579328,2380579583,HK
2380579584,2380595199,GB
2380660736,2380726271,US
@@ -36619,16 +39555,28 @@
2382348288,2382364671,SI
2382364672,2382368767,US
2382368768,2382372863,CA
-2382372864,2382383209,US
+2382372864,2382382847,US
+2382382848,2382383103,LU
+2382383104,2382383209,US
2382383210,2382383210,AE
2382383211,2382401535,US
-2382401536,2382409727,CA
-2382409728,2382422015,US
+2382401536,2382405631,CA
+2382405632,2382422015,US
2382422016,2382426111,JM
2382426112,2382430207,US
2382430208,2382626815,CA
-2382626816,2382675967,US
-2382675968,2382684159,CA
+2382626816,2382654207,US
+2382654208,2382654463,CN
+2382654464,2382657023,US
+2382657024,2382657535,CN
+2382657536,2382657791,US
+2382657792,2382658559,CN
+2382658560,2382658815,CA
+2382658816,2382659071,CN
+2382659072,2382678527,US
+2382678528,2382679039,CA
+2382679040,2382680063,US
+2382680064,2382684159,CA
2382684160,2382692351,US
2382692352,2383085567,CA
2383085568,2383151103,US
@@ -36640,11 +39588,17 @@
2385920000,2385952767,US
2385954816,2385955327,US
2385956864,2385969151,US
-2385969152,2386067455,CA
-2386067456,2386083839,US
-2386083840,2386624511,CA
+2385969152,2386624511,CA
2386624512,2386690047,US
-2386690048,2387344127,CA
+2386690048,2386988287,CA
+2386988288,2386988543,CH
+2386988544,2386989055,CA
+2386989056,2386989311,GB
+2386989312,2387003391,CA
+2387003392,2387003647,GB
+2387003648,2387003903,CA
+2387003904,2387004159,GB
+2387004160,2387344127,CA
2387344128,2387344895,US
2387344896,2387345151,CA
2387345152,2387345407,US
@@ -36653,7 +39607,11 @@
2387476480,2387542015,CA
2387542016,2387607551,US
2387607552,2388328447,CA
-2388328448,2388393983,US
+2388328448,2388345343,US
+2388345344,2388345599,LK
+2388345600,2388350207,US
+2388350208,2388350463,LK
+2388350464,2388393983,US
2388393984,2389245951,CA
2389245952,2389311487,US
2389311488,2389639167,CA
@@ -36664,9 +39622,9 @@
2390995456,2391015423,US
2391015424,2391277567,CA
2391277568,2391343103,US
-2391343104,2393245951,CA
-2393245952,2393246079,US
-2393246080,2394947583,CA
+2391343104,2393044095,CA
+2393044096,2393044223,US
+2393044224,2394947583,CA
2394947584,2395013119,US
2395013120,2395209727,CA
2395209728,2395340799,US
@@ -36792,7 +39750,7 @@
2417229824,2417295359,ES
2417295360,2417360895,PT
2417360896,2417491967,CR
-2417491968,2417557503,GR
+2417491968,2417557503,GB
2417557504,2417688575,US
2417688576,2417754111,SE
2417754112,2418016255,US
@@ -36866,7 +39824,8 @@
2426667008,2426732543,NO
2426732544,2426798079,FR
2426798080,2426929151,US
-2426994688,2427207679,US
+2426994688,2427224063,US
+2427224064,2427256831,CA
2427256832,2427322367,GB
2427322368,2427453439,US
2427453440,2427536895,NO
@@ -36876,9 +39835,7 @@
2427650048,2427846655,NO
2427846656,2428174335,US
2428174336,2428178431,GB
-2428178432,2428185087,US
-2428185088,2428185343,GB
-2428185344,2428567551,US
+2428178432,2428567551,US
2428567552,2428633087,NO
2428633088,2428698623,CA
2428698624,2428960767,US
@@ -36928,7 +39885,9 @@
2441150464,2441215999,BE
2441216000,2446983167,NL
2447048704,2447376383,NL
-2447376384,2447441919,GB
+2447376384,2447384575,GB
+2447384576,2447384831,BE
+2447384832,2447441919,GB
2447441920,2447446271,DE
2447446272,2447446527,GB
2447446528,2447507455,DE
@@ -36942,7 +39901,9 @@
2447966208,2448031743,GB
2448031744,2448097279,CH
2448097280,2448162815,SE
-2448162816,2448228351,HU
+2448162816,2448183295,HU
+2448183296,2448183551,BG
+2448183552,2448228351,HU
2448228352,2448293887,PL
2448293888,2448359423,FR
2448359424,2448424959,GB
@@ -36955,9 +39916,7 @@
2448818176,2448850943,GB
2448850944,2448851967,US
2448851968,2448883711,GB
-2448883712,2448887039,FI
-2448887040,2448887295,SE
-2448887296,2448949247,FI
+2448883712,2448949247,FI
2448949248,2449014783,FR
2449014784,2449080319,RU
2449080320,2449145855,CH
@@ -36981,7 +39940,8 @@
2449473536,2449477631,DE
2449477632,2449479679,AL
2449479680,2449481727,FR
-2449481728,2449489919,RO
+2449481728,2449485823,DE
+2449485824,2449489919,RO
2449489920,2449490943,FR
2449490944,2449491199,DE
2449491200,2449491967,FR
@@ -37002,9 +39962,7 @@
2450849792,2450915327,SE
2450915328,2451026431,US
2451026432,2451026687,AU
-2451026688,2451031807,US
-2451031808,2451032063,AU
-2451032064,2451042815,US
+2451026688,2451042815,US
2451042816,2451043071,ZA
2451043072,2451986959,US
2451986960,2451986960,GB
@@ -37049,23 +40007,33 @@
2454585344,2454716415,US
2454716416,2454781951,GB
2454781952,2454847487,FI
-2454847488,2454885503,US
+2454847488,2454851583,US
+2454851584,2454851839,DK
+2454851840,2454853119,US
+2454853120,2454853375,DK
+2454853376,2454885503,US
2454885504,2454885631,GB
-2454885632,2454890495,US
-2454890496,2454890751,DK
-2454890752,2454904999,US
+2454885632,2454887423,US
+2454887424,2454887679,DK
+2454887680,2454904999,US
2454905000,2454905007,BR
2454905008,2454905919,US
2454905920,2454905951,AR
2454905952,2454906943,US
2454906944,2454906951,CL
-2454906952,2454907903,US
+2454906952,2454907265,US
+2454907266,2454907266,CL
+2454907267,2454907903,US
2454907904,2454908159,VE
2454908160,2454913023,US
2454913024,2454978559,CL
2454978560,2455175167,US
2455175168,2455240703,GB
-2455240704,2455371775,US
+2455240704,2455244799,US
+2455244800,2455245567,AU
+2455245568,2455245823,US
+2455245824,2455246847,AU
+2455246848,2455371775,US
2455371776,2455437311,GB
2455437312,2455830527,US
2455830528,2455896063,GB
@@ -37086,7 +40054,9 @@
2457075712,2457141247,AU
2457206784,2457272319,AU
2457272320,2457337855,FI
-2457337856,2457343999,RU
+2457337856,2457339903,RU
+2457339904,2457340927,BA
+2457340928,2457343999,RU
2457344000,2457346047,UA
2457346048,2457360383,RU
2457360384,2457360895,CZ
@@ -37114,9 +40084,7 @@
2458648576,2458714111,DE
2458714112,2458779647,ZA
2458779648,2458910719,US
-2458976256,2459172863,US
-2459191296,2459191551,US
-2459238400,2459631615,US
+2458976256,2459631615,US
2459631616,2459697151,CL
2459697152,2459828223,US
2459828224,2459860991,RU
@@ -37157,7 +40125,9 @@
2461630464,2461646847,NL
2461646848,2461659391,RU
2461659392,2461659647,UA
-2461659648,2461663231,RU
+2461659648,2461662463,RU
+2461662464,2461662719,NL
+2461662720,2461663231,RU
2461663232,2461794303,US
2461794304,2461859839,GB
2461859840,2461990911,US
@@ -37241,9 +40211,7 @@
2466326016,2466326271,SG
2466326272,2466336767,US
2466336768,2466337023,SG
-2466337024,2466373887,US
-2466373888,2466374143,GB
-2466374144,2466643967,US
+2466337024,2466643967,US
2466643968,2466709503,KR
2466709504,2466775039,HU
2466775040,2466840575,HK
@@ -37352,7 +40320,8 @@
2478112768,2478178303,NL
2478178304,2478309375,US
2478309376,2478374911,GB
-2478374912,2478440447,US
+2478374912,2478404095,US
+2478407680,2478440447,US
2478440448,2478505983,SE
2478505984,2478571519,US
2478571520,2478702591,GB
@@ -37391,6 +40360,7 @@
2482700288,2482765823,CZ
2482765824,2482831359,IE
2482831360,2483027967,US
+2483027968,2483093503,DO
2483093504,2483159039,US
2483159040,2483224575,SE
2483224576,2483290111,GB
@@ -37410,9 +40380,11 @@
2488532992,2488795135,US
2488795136,2488860671,GB
2488860672,2489647103,US
-2489843712,2489992447,US
-2489992448,2489992703,HK
-2489992704,2489995519,US
+2489647104,2489712639,DO
+2489712640,2489745407,PE
+2489745408,2489778175,HT
+2489778176,2489843711,DO
+2489843712,2489995519,US
2489995520,2489995544,SG
2489995545,2489995545,US
2489995546,2489995775,SG
@@ -37443,6 +40415,7 @@
2493513728,2493579263,SE
2493579264,2493644799,JP
2493644800,2493710335,US
+2493751296,2493755391,US
2493755904,2493756415,US
2493775872,2494103551,US
2494103552,2494169087,FR
@@ -37450,9 +40423,7 @@
2494562304,2494627839,GB
2494627840,2494650623,US
2494650624,2494650879,BR
-2494650880,2494655487,US
-2494655488,2494655743,MX
-2494655744,2494657535,US
+2494650880,2494657535,US
2494657536,2494657791,CO
2494657792,2494677247,US
2494677248,2494677503,AU
@@ -37468,16 +40439,18 @@
2495021056,2495152127,US
2495217664,2495283199,US
2495283200,2495348735,CH
-2495348736,2495807487,US
+2495348736,2495410943,US
+2495410944,2495411199,AU
+2495411200,2495807487,US
2495807488,2495873023,AU
2495873024,2495938559,CH
2495938560,2496004095,GB
-2496004096,2496015103,AT
-2496015104,2496015359,PL
-2496015360,2496069631,AT
+2496004096,2496069631,AT
2496069632,2496135167,US
2496135168,2496200703,NL
-2496200704,2498475007,MX
+2496200704,2497682431,MX
+2497682432,2497683455,EC
+2497683456,2498475007,MX
2498475008,2498476031,EC
2498476032,2499110519,MX
2499110520,2499110527,NI
@@ -37487,6 +40460,7 @@
2499477504,2499543039,DE
2499543040,2499674111,GB
2499674112,2499739647,US
+2499739648,2499805183,DO
2499805184,2499870719,TR
2499870720,2500001791,US
2500001792,2500034559,GE
@@ -37497,7 +40471,9 @@
2500046848,2500048895,IT
2500048896,2500050943,MD
2500050944,2500067327,KZ
-2500067328,2500141055,US
+2500067328,2500132991,US
+2500132992,2500133023,NL
+2500133024,2500141055,US
2500141056,2500141311,IE
2500141312,2500141471,US
2500141472,2500141503,IE
@@ -37505,53 +40481,55 @@
2500141824,2500144127,IE
2500144128,2500144895,US
2500144896,2500145151,IE
-2500145152,2500149247,US
-2500149248,2500149759,GB
-2500149760,2500150655,US
-2500150656,2500150719,GB
-2500150720,2500158463,US
-2500158464,2500158975,GB
-2500158976,2500161023,US
-2500161024,2500161791,GB
-2500161792,2500162175,US
+2500145152,2500149503,US
+2500149504,2500149759,GB
+2500149760,2500150527,US
+2500150528,2500150783,GB
+2500150784,2500158463,US
+2500158464,2500158719,GB
+2500158720,2500161023,US
+2500161024,2500161535,GB
+2500161536,2500162175,US
2500162176,2500162815,GB
-2500162816,2500175871,US
+2500162816,2500166207,US
+2500166208,2500166223,GB
+2500166224,2500175871,US
2500175872,2500175879,RO
2500175880,2500188159,US
2500188160,2500188415,CH
2500188416,2500198911,US
2500198912,2500199167,GB
2500199168,2500199423,US
-2500199424,2500199935,IE
-2500199936,2500219135,US
+2500199424,2500199679,IE
+2500199680,2500201535,US
+2500201536,2500201543,GB
+2500201544,2500219135,US
2500219136,2500219391,DE
2500219392,2500225551,US
2500225552,2500225559,ES
-2500225560,2500227583,US
-2500227584,2500227839,FR
-2500227840,2500228607,US
+2500225560,2500228607,US
2500228608,2500228863,FR
2500228864,2500235775,US
-2500235776,2500236287,GB
-2500236288,2500236837,US
+2500235776,2500236543,GB
+2500236544,2500236837,US
2500236838,2500236838,ES
2500236839,2500238047,US
2500238048,2500238055,FR
-2500238056,2500238383,US
+2500238056,2500238079,US
+2500238080,2500238335,YT
+2500238336,2500238383,US
2500238384,2500238399,DE
2500238400,2500238463,US
2500238464,2500238527,DE
-2500238528,2500240383,US
-2500240384,2500240639,FR
-2500240640,2500240895,US
-2500240896,2500241151,FR
-2500241152,2500245503,US
+2500238528,2500245503,US
2500245504,2500245759,GB
2500245760,2500246015,US
2500246016,2500246527,GB
2500246528,2500272127,US
2500272128,2500272639,GB
-2500272640,2500275199,US
+2500272640,2500274431,US
+2500274432,2500274687,GB
+2500274688,2500275199,US
2500275200,2500275711,GB
2500275712,2500276223,US
2500276224,2500276735,GB
@@ -37564,8 +40542,8 @@
2500292864,2500293375,US
2500293376,2500293631,DE
2500293632,2500319231,US
-2500319232,2500319487,ES
-2500319488,2500392959,US
+2500319232,2500319743,ES
+2500319744,2500392959,US
2500392960,2500393215,IN
2500393216,2500393983,US
2500393984,2500394239,GB
@@ -37573,21 +40551,31 @@
2500532750,2500532750,GR
2500532751,2500535295,US
2500535296,2500535551,IE
-2500535552,2500551679,US
+2500535552,2500537687,US
+2500537688,2500537695,GB
+2500537696,2500551679,US
2500551680,2500551935,FR
2500551936,2500553759,US
2500553760,2500553767,GB
2500553768,2500555263,US
2500555264,2500555519,FR
-2500555520,2500591615,US
+2500555520,2500558847,US
+2500558848,2500559103,FR
+2500559104,2500591615,US
2500591616,2500595711,GB
-2500595712,2500609023,US
-2500609024,2500609279,ES
-2500609280,2500616319,US
-2500616320,2500616703,IT
+2500595712,2500608511,US
+2500608512,2500608767,ES
+2500608768,2500609023,US
+2500609024,2500609535,ES
+2500609536,2500616191,US
+2500616192,2500616703,IT
2500616704,2500636735,US
2500636736,2500636799,GB
-2500636800,2500646911,US
+2500636800,2500638719,US
+2500638720,2500639743,GB
+2500639744,2500644863,US
+2500644864,2500645119,FR
+2500645120,2500646911,US
2500646912,2500647935,ES
2500647936,2500687871,US
2500687872,2500689919,FR
@@ -37595,9 +40583,7 @@
2500694272,2500694527,IT
2500694528,2500719103,US
2500719104,2500720639,IE
-2500720640,2500723711,US
-2500723712,2500723967,ES
-2500723968,2501574655,US
+2500720640,2501574655,US
2501574656,2501640191,KZ
2501640192,2503016447,US
2503016448,2503081983,IL
@@ -37616,11 +40602,19 @@
2503911424,2503915519,ES
2503915520,2503917567,IT
2503917568,2503933951,BG
-2503933952,2504916991,US
-2504916992,2504949759,IL
-2504949760,2506293247,US
+2503933952,2504470527,US
+2504470528,2504470783,ES
+2504470784,2504474623,US
+2504474624,2504482815,HR
+2504482816,2504491007,US
+2504491008,2504499199,IT
+2504499200,2504916991,US
+2504916992,2504982527,IL
+2504982528,2506293247,US
2506293248,2506358783,CA
-2506358784,2507124735,US
+2506358784,2506360831,US
+2506360832,2506361087,ES
+2506361088,2507124735,US
2507124736,2507124991,IN
2507124992,2507145215,US
2507210752,2508062719,US
@@ -37675,7 +40669,8 @@
2509937920,2509938175,IT
2509938176,2509938431,US
2509938432,2509938687,DE
-2509938688,2509946879,UA
+2509938688,2509942783,GB
+2509942784,2509946879,UA
2509946880,2509963263,BE
2509963264,2510028799,GB
2510028800,2510094335,PL
@@ -37873,8 +40868,8 @@
2545811456,2547187711,US
2547187712,2547318783,GB
2547318784,2547515391,US
-2547515392,2547531775,BE
2547531776,2547539967,UA
+2547542016,2547542271,ES
2547553024,2547553279,RU
2548039680,2548563967,GB
2548563968,2548826111,IR
@@ -37918,16 +40913,14 @@
2549612544,2549614591,SE
2549614592,2549616639,IT
2549616640,2549618687,BE
-2549618688,2549619711,DE
-2549619712,2549619967,GB
-2549619968,2549620735,DE
+2549618688,2549620735,DE
2549620736,2549624831,PL
2549624832,2549626879,BE
2549626880,2549628927,PL
2549628928,2549637119,RO
2549637120,2549641215,KW
2549641216,2549645311,RU
-2549645312,2549678079,RO
+2549645312,2549678079,CH
2549678080,2549698559,GB
2549698560,2549700607,PL
2549700608,2549701375,DE
@@ -37935,6 +40928,7 @@
2549701632,2549701887,PL
2549701888,2549702143,FR
2549702144,2549702399,GB
+2549702400,2549702655,FR
2549702656,2549704703,UA
2549704704,2549706751,CZ
2549706752,2549710847,NO
@@ -37951,13 +40945,14 @@
2549899264,2549901311,PS
2549901312,2549903359,RU
2549903360,2549905407,ES
-2549905408,2549907455,JP
+2549905408,2549907455,GB
2549907456,2549923839,DE
2549923840,2549927935,BG
2549927936,2549929983,HR
2549929984,2549932031,DE
2549932032,2549940223,HR
2549940224,2550136831,RO
+2550136832,2550202367,DO
2550202368,2553544703,US
2553544704,2553610239,IN
2553610240,2554462207,US
@@ -38024,13 +41019,27 @@
2560032768,2560098303,US
2560098304,2560163839,BE
2560229376,2560360447,US
+2560360448,2560425983,UY
2560425984,2560628479,US
2560628480,2560628735,CA
-2560628736,2561015807,US
+2560628736,2560644607,US
+2560644608,2560644863,CA
+2560644864,2561015807,US
+2561015808,2561146879,DO
+2561146880,2561409023,AR
+2561409024,2561671167,CL
2561671168,2563244031,US
+2563244032,2563768319,CO
2563768320,2564947967,US
2564947968,2565013503,SG
2565013504,2565210111,US
+2565210112,2565275647,CL
+2565275648,2565279743,HN
+2565279744,2565281791,AR
+2565281792,2565283839,CO
+2565283840,2565287935,NI
+2565287936,2565292031,AR
+2565341184,2566914047,BR
2566914048,2566979583,CN
2566979584,2567045119,FI
2567045120,2567110655,US
@@ -38056,7 +41065,9 @@
2570190848,2572681215,US
2572681216,2572746751,SE
2572746752,2572943359,US
-2572943360,2573402111,DE
+2572943360,2573353983,DE
+2573353984,2573354239,BE
+2573354240,2573402111,DE
2573402112,2573467647,CN
2573467648,2573533183,DE
2573533184,2573598719,CN
@@ -38098,49 +41109,67 @@
2585853952,2585985023,JP
2585985024,2586480639,US
2586480640,2586484735,IL
-2586484736,2586610175,US
-2586610176,2586610431,GB
+2586484736,2586510335,US
+2586510336,2586511359,ES
+2586511360,2586566655,US
+2586566656,2586566687,FR
+2586566688,2586610175,US
+2586610176,2586610431,ES
2586610432,2586611711,US
2586611712,2586611967,GB
2586611968,2586619903,US
2586619904,2586620415,FR
2586620416,2586622463,US
2586622464,2586622975,ES
-2586622976,2586804991,US
-2586804992,2586805247,ES
-2586805248,2586828799,US
+2586622976,2586733567,US
+2586733568,2586733823,LT
+2586733824,2586804223,US
+2586804224,2586804479,ES
+2586804480,2586828799,US
2586828800,2586829055,CH
2586829056,2586870783,US
-2586870784,2586871807,ES
-2586871808,2586872063,US
-2586872064,2586872319,ES
-2586872320,2586875135,US
-2586875136,2586875391,ES
-2586875392,2587017215,US
+2586870784,2586874879,ES
+2586874880,2586875135,US
+2586875136,2586875903,ES
+2586875904,2586876927,US
+2586876928,2586877951,ES
+2586877952,2586952191,US
+2586952192,2586952447,FR
+2586952448,2587017215,US
2587017216,2587017471,IE
2587017472,2587018239,US
2587018240,2587018495,IE
2587018496,2587021823,US
2587021824,2587022335,IE
-2587022336,2587067647,US
+2587022336,2587066879,US
+2587066880,2587067135,GB
+2587067136,2587067647,US
2587067648,2587067903,GB
2587067904,2587068415,US
2587068416,2587068479,GB
-2587068480,2587240389,US
+2587068480,2587071759,US
+2587071760,2587071775,GB
+2587071776,2587131903,US
+2587131904,2587132159,FR
+2587132160,2587197439,US
+2587197440,2587197695,ES
+2587197696,2587240389,US
2587240390,2587240390,FR
2587240391,2587249417,US
2587249418,2587249418,FR
-2587249419,2587380479,US
-2587380480,2587380735,IT
-2587380736,2587394047,US
+2587249419,2587394047,US
2587394048,2587394559,ES
-2587394560,2587443199,US
+2587394560,2587398143,US
+2587398144,2587399167,ES
+2587399168,2587443199,US
2587443200,2587447295,CH
-2587447296,2587492351,US
+2587447296,2587476760,US
+2587476761,2587476761,LB
+2587476762,2587492351,US
2587492352,2587493375,ES
2587493376,2587508735,US
-2587508736,2587516927,GB
-2587516928,2587926527,US
+2587508736,2587525119,GB
+2587525120,2587926527,US
2587926528,2587930623,BG
2587930624,2587951103,US
2587951104,2587952127,ZA
@@ -38150,7 +41179,8 @@
2587955200,2587959295,KE
2587959296,2587961343,SN
2587961344,2587962367,ZA
-2587962368,2587964415,SD
+2587962368,2587963391,SS
+2587963392,2587964415,SD
2587964416,2587965439,ZA
2587965440,2587966463,KE
2587966464,2587967487,BF
@@ -38180,7 +41210,7 @@
2588076032,2588078079,GA
2588078080,2588080127,MU
2588080128,2588082175,ZA
-2588082176,2588114943,RE
+2588082176,2588147711,RE
2588147712,2588164095,CI
2588164096,2588180479,RW
2588196864,2588213247,NG
@@ -38190,23 +41220,96 @@
2588303360,2588311551,CM
2588311552,2588315647,ZA
2588315648,2588317695,BW
-2588317696,2588318719,MU
+2588317696,2588318207,MU
+2588318208,2588318719,ZA
2588318720,2588319743,UG
2588319744,2588327935,SC
2588327936,2588328959,ML
2588328960,2588329983,BI
2588329984,2588332031,MA
-2588332032,2588336127,ZA
+2588332032,2588344319,ZA
2588344320,2588409855,MU
2588409856,2588410879,KE
2588410880,2588412927,ZA
2588412928,2588413951,ST
+2588413952,2588414975,UG
+2588414976,2588415999,TZ
+2588416000,2588417023,SO
+2588417024,2588418047,KE
2588418048,2588420095,NG
2588420096,2588422143,ZA
+2588422144,2588423167,SO
+2588423168,2588424191,CD
+2588424192,2588426239,ZA
+2588426240,2588434431,TZ
+2588434432,2588438527,ZA
+2588438528,2588442623,BJ
+2588442624,2588459007,CM
2588459008,2588467199,UG
2588467200,2588471295,TN
+2588471296,2588476415,ZA
+2588477440,2588478463,NG
+2588478464,2588479487,UG
+2588479488,2588480511,ZA
+2588480512,2588481535,CD
+2588482560,2588483583,LY
+2588484608,2588485631,BW
+2588485632,2588486655,BI
+2588487680,2588487711,SC
+2588487712,2588487743,FR
+2588487744,2588487807,BF
+2588487808,2588487839,NE
+2588487840,2588487871,SC
+2588487872,2588487935,MW
+2588487936,2588488703,SC
+2588488704,2588489727,LY
+2588490752,2588491775,GW
+2588493824,2588494847,ZA
+2588495872,2588496895,ZW
+2588500992,2588502015,CI
+2588503040,2588504063,LY
+2588504064,2588505087,TD
+2588505088,2588506111,CG
+2588506112,2588507135,ZA
+2588507136,2588508159,SO
+2588508160,2588510207,LY
+2588526592,2588528639,CM
+2588528640,2588530687,ZA
+2588532736,2588534783,ZA
+2588536832,2588538879,ZA
+2588672000,2588934143,KE
2588934144,2589982719,SC
2589982720,2590507007,SD
+2591547392,2591555583,ZA
+2591571968,2591588351,NG
+2591588352,2591604735,MG
+2591604736,2591612927,MU
+2591612928,2591621119,ZW
+2591621120,2591686655,DZ
+2591686656,2591817727,KE
+2591948800,2591981567,MG
+2591981568,2591997951,CM
+2591997952,2592006143,ZA
+2592006144,2592022527,TZ
+2592026624,2592026879,US
+2592026880,2592027391,MU
+2592027392,2592027647,GB
+2592027648,2592028159,MU
+2592028160,2592028415,CA
+2592028416,2592028671,MU
+2592028672,2592028799,NG
+2592028800,2592028927,KE
+2592028928,2592029183,MU
+2592029184,2592029311,CI
+2592029312,2592029695,MU
+2592029696,2592030207,ZA
+2592030208,2592030335,GH
+2592030336,2592030463,CM
+2592030464,2592030591,UG
+2592030592,2592030719,MU
+2592034816,2592038911,NE
+2592043008,2592047103,ZA
+2592047104,2592079871,AO
2600534016,2600665087,US
2600665088,2600730623,CA
2600730624,2600796159,NO
@@ -38229,7 +41332,9 @@
2604204032,2604335103,US
2604335104,2604400639,NZ
2604400640,2604466175,AU
-2604466176,2604793855,US
+2604466176,2604648447,US
+2604648448,2604648959,NZ
+2604648960,2604793855,US
2604793856,2604859391,CH
2604859392,2604990463,US
2604990464,2605055999,SG
@@ -38249,7 +41354,9 @@
2609119232,2609184767,FR
2609184768,2609250303,PL
2609250304,2609381375,US
-2609381376,2609446911,GB
+2609381376,2609428479,GB
+2609428480,2609428735,IN
+2609428736,2609446911,GB
2609446912,2609512447,DK
2609512448,2609643519,US
2609643520,2609709055,GB
@@ -38301,13 +41408,14 @@
2616524800,2616590335,GB
2616590336,2616786943,US
2616786944,2616852479,GB
-2616852480,2616885247,DE
-2616885248,2616885503,FR
-2616885504,2616918015,DE
+2616852480,2616917759,DE
+2616917760,2616918015,FR
2616983552,2617049087,US
2617049088,2617114623,IT
2617114880,2617115135,US
+2617118720,2617131007,US
2617147392,2617148159,US
+2617151488,2617155583,CA
2617311232,2617769983,US
2617769984,2617835519,ZA
2617835520,2617901055,US
@@ -38315,7 +41423,7 @@
2617966592,2618032127,CA
2618032128,2618097663,US
2618097664,2618163199,NZ
-2618163200,2618228735,IT
+2618163200,2618228735,SI
2618228736,2618294271,US
2618359808,2618425343,PL
2618425344,2618490879,FR
@@ -38328,11 +41436,7 @@
2619146240,2619277311,US
2619277312,2619342847,BN
2619342848,2619473919,US
-2619473920,2619498495,CA
-2619498496,2619498751,US
-2619498752,2619524223,CA
-2619524224,2619524351,US
-2619524352,2619539455,CA
+2619473920,2619539455,CA
2619539456,2619604991,ES
2619604992,2619736063,US
2619801600,2620063743,US
@@ -38377,7 +41481,7 @@
2626093056,2626158591,CH
2626158592,2626879487,US
2626879488,2626945023,KR
-2626945024,2627010559,IT
+2626945024,2627010559,SI
2627010560,2627076095,NZ
2627076096,2627141631,NL
2627141632,2627403775,US
@@ -38392,9 +41496,7 @@
2635726848,2635792383,CH
2635792384,2635988991,IT
2635988992,2636120063,US
-2636120064,2637312511,ID
-2637312512,2637312767,US
-2637312768,2637561855,ID
+2636120064,2637561855,ID
2637561856,2638020607,US
2638020608,2638086143,CN
2638086144,2638151679,US
@@ -38590,7 +41692,9 @@
2661416960,2661482495,PT
2661482496,2661548031,CA
2661548032,2661679103,US
-2661679104,2661909247,LU
+2661679104,2661885951,LU
+2661885952,2661886207,BE
+2661886208,2661909247,LU
2661909248,2661909503,BE
2661909504,2661914111,LU
2661914112,2661914367,BE
@@ -38621,7 +41725,7 @@
2665218048,2665283583,CH
2665283584,2665349119,US
2665359360,2665361407,US
-2665374720,2665375231,US
+2665365504,2665381887,US
2665414656,2665480191,GB
2665480192,2665545727,US
2665545728,2665611263,DE
@@ -38684,9 +41788,7 @@
2667970560,2668036095,CA
2668036096,2668101631,SE
2668101632,2668167167,CH
-2668167168,2668286463,US
-2668286464,2668286719,GB
-2668286720,2668363775,US
+2668167168,2668363775,US
2668363776,2668429311,CH
2668429312,2668494847,AU
2668494848,2668560383,US
@@ -38753,9 +41855,12 @@
2673737728,2673803263,US
2673803264,2673868799,FR
2673868800,2674130943,US
-2674130944,2674180095,GB
-2674180096,2674188287,US
-2674188288,2674249727,GB
+2674130944,2674163711,GB
+2674163712,2674171903,CA
+2674171904,2674175999,GB
+2674176000,2674192383,US
+2674192384,2674196479,CH
+2674196480,2674249727,GB
2674249728,2674251775,US
2674251776,2674262015,GB
2674262016,2674327551,US
@@ -38794,7 +41899,11 @@
2677622784,2677623039,IE
2677623040,2677639679,US
2677639680,2677639935,CA
-2677639936,2677669887,US
+2677639936,2677642239,US
+2677642240,2677642495,ES
+2677642496,2677650431,US
+2677650432,2677650943,RO
+2677650944,2677669887,US
2677669888,2677735423,DE
2677735424,2677800959,US
2677800960,2677866495,CH
@@ -38826,7 +41935,10 @@
2678886656,2678886911,IT
2678886912,2678893567,US
2678893568,2678893823,CL
-2678893824,2678911231,US
+2678893824,2678901759,US
+2678901760,2678902015,NZ
+2678902016,2678902271,SG
+2678902272,2678911231,US
2678911232,2678911487,NL
2678911488,2678911743,AU
2678911744,2678915071,US
@@ -38840,7 +41952,11 @@
2679373824,2679406591,GB
2679406592,2679431167,US
2679431168,2679439359,FR
-2679439360,2680029183,US
+2679439360,2679523327,US
+2679523328,2679525375,GB
+2679525376,2679535615,US
+2679535616,2679537663,GB
+2679537664,2680029183,US
2680029184,2680094719,SE
2680094720,2680225791,US
2680225792,2680356863,SE
@@ -38866,7 +41982,9 @@
2681929728,2681995263,GB
2681995264,2682015231,US
2682015232,2682015487,IN
-2682015488,2682257407,US
+2682015488,2682123263,US
+2682123264,2682123519,AU
+2682123520,2682257407,US
2682257408,2682322943,UA
2682322944,2682388479,US
2682388480,2682454015,CN
@@ -38925,7 +42043,9 @@
2684191988,2684191999,US
2684192000,2684192103,NL
2684192104,2684192107,US
-2684192108,2684192387,NL
+2684192108,2684192303,NL
+2684192304,2684192311,US
+2684192312,2684192387,NL
2684192388,2684192391,US
2684192392,2684192459,NL
2684192460,2684192463,US
@@ -38947,15 +42067,18 @@
2684193148,2684193151,US
2684193152,2684193275,NL
2684193276,2684193279,US
-2684193280,2684193735,NL
+2684193280,2684193447,NL
+2684193448,2684193455,AZ
+2684193456,2684193583,NL
+2684193584,2684193591,IE
+2684193592,2684193735,NL
2684193736,2684193743,US
-2684193744,2684193847,NL
-2684193848,2684193855,US
-2684193856,2684193887,NL
+2684193744,2684193887,NL
2684193888,2684193911,US
2684193912,2684193931,NL
2684193932,2684193935,US
-2684193936,2684194003,NL
+2684193936,2684194002,NL
+2684194003,2684194003,BH
2684194004,2684194007,US
2684194008,2684194071,NL
2684194072,2684194079,US
@@ -39094,24 +42217,34 @@
2689269760,2689335295,TR
2689335296,2689400831,US
2689466368,2689531903,IT
-2689531904,2689536255,US
-2689536256,2689536511,GB
-2689536512,2689566207,US
-2689566208,2689566463,GB
-2689566464,2689586687,US
-2689586688,2689586943,GB
-2689586944,2689593343,US
-2689593344,2689593599,GB
-2689593600,2689597439,US
+2689531904,2689535999,US
+2689536000,2689536511,GB
+2689536512,2689541631,US
+2689541632,2689541887,GB
+2689541888,2689545727,US
+2689545728,2689546239,GB
+2689546240,2689559807,US
+2689559808,2689560063,GB
+2689560064,2689566207,US
+2689566208,2689566719,GB
+2689566720,2689568255,US
+2689568256,2689568767,GB
+2689568768,2689586687,US
+2689586688,2689587199,GB
+2689587200,2689593343,US
+2689593344,2689593855,GB
+2689593856,2689594111,US
+2689594112,2689594879,GB
+2689594880,2689597439,US
2689597440,2689662975,IT
2689662976,2689794047,US
2689794048,2689802239,DE
-2689802240,2689810431,GB
+2689802240,2689802751,GB
+2689802752,2689803263,TR
+2689803264,2689810431,GB
2689810432,2689818623,US
2689818624,2689819135,IN
-2689819136,2689820671,US
-2689820672,2689820927,HK
-2689820928,2689826815,US
+2689819136,2689826815,US
2689826816,2689835007,JP
2689835008,2689843199,AU
2689843200,2689925119,US
@@ -39164,6 +42297,21 @@
2699755520,2699821055,JP
2699886592,2700935167,JP
2700935168,2701066239,US
+2701131776,2701139967,HN
+2701139968,2701148159,NI
+2701148160,2701149183,AR
+2701149184,2701150207,HN
+2701150208,2701152255,AR
+2701152256,2701156351,BQ
+2701156352,2701160447,CW
+2701160448,2701162495,TT
+2701162496,2701164543,UY
+2701164544,2701172735,HT
+2701172736,2701176831,CL
+2701176832,2701178879,AR
+2701178880,2701180927,CL
+2701180928,2701189119,HN
+2701189120,2701197311,TT
2701197312,2701262847,US
2701262848,2701328383,GB
2701328384,2701393919,FR
@@ -39172,13 +42320,19 @@
2701524992,2701656063,US
2701656064,2701721599,RU
2701721600,2701787135,TR
+2701787136,2701852671,CO
2701852672,2701918207,US
2701918208,2701983743,GB
2701983744,2702245887,US
2702245888,2702311423,GB
+2702311424,2702376959,CO
2702376960,2702442495,CA
2702442496,2702508031,CH
2702508032,2702573567,US
+2702573568,2702581759,AR
+2702581760,2702585855,VE
+2702589952,2702606335,GF
+2702606336,2702639103,BO
2702639104,2702704639,GB
2702704640,2702770175,BR
2702770176,2702835711,CL
@@ -39197,13 +42351,18 @@
2704277504,2704343039,FR
2704343040,2704408575,US
2704408576,2704474111,AU
-2704474112,2704485119,US
+2704474112,2704476927,US
+2704476928,2704476929,GB
+2704476930,2704476930,US
+2704476931,2704477183,GB
+2704477184,2704485119,US
2704485120,2704485375,AU
2704485376,2704539647,US
2704539648,2704605183,SE
2704605184,2704670719,HR
2704670720,2704736255,SE
2704736256,2704801791,US
+2704801792,2704867327,BO
2704867328,2704998399,US
2704998400,2705063935,BE
2705063936,2705195007,US
@@ -39256,7 +42415,9 @@
2709716992,2709782527,CL
2709782528,2709848063,PE
2709848064,2710175743,US
+2710175744,2710241279,BO
2710241280,2710306815,MY
+2710306816,2710372351,VE
2710372352,2710437887,CA
2710437888,2710503423,MY
2710503424,2710568959,AU
@@ -39285,11 +42446,13 @@
2714435584,2714697727,US
2714697728,2714763263,CN
2714763264,2715025407,US
+2715025408,2715090943,VE
2715090944,2715287551,US
2715287552,2715353087,CA
2715353088,2716139519,US
2716139520,2716205055,SG
2716205056,2716467199,US
+2716467200,2716532735,VE
2716532736,2716729343,US
2716729344,2716794879,CL
2716794880,2717253631,US
@@ -39298,6 +42461,7 @@
2717450240,2717646847,US
2717646848,2717712383,KW
2717712384,2717843455,US
+2717843456,2717908991,VE
2717908992,2717974527,CA
2717974528,2718171135,US
2718236672,2718629887,US
@@ -39432,7 +42596,9 @@
2732203008,2732204031,US
2732204032,2732206079,CA
2732206080,2732220159,US
-2732220160,2732220415,CA
+2732220160,2732220400,CA
+2732220401,2732220401,US
+2732220402,2732220415,CA
2732220416,2732227583,US
2732227584,2732228607,CA
2732228608,2732261375,US
@@ -39450,7 +42616,11 @@
2732307456,2732308479,US
2732308480,2732310527,CA
2732310528,2732320767,US
-2732320768,2732322815,CA
+2732320768,2732321023,AU
+2732321024,2732321279,BM
+2732321280,2732321535,CA
+2732321536,2732321791,GB
+2732321792,2732322815,CA
2732322816,2732336127,US
2732336128,2732337151,CA
2732337152,2732351487,US
@@ -39492,7 +42662,9 @@
2732494848,2732495871,CA
2732495872,2732497919,US
2732497920,2732499967,CA
-2732499968,2732515327,US
+2732499968,2732500223,US
+2732500224,2732500479,TW
+2732500480,2732515327,US
2732515328,2732516351,VG
2732516352,2732523519,US
2732523520,2732525567,CA
@@ -39502,8 +42674,67 @@
2732549120,2732550143,CA
2732550144,2732580863,US
2732580864,2732582911,CA
-2732582912,2733899775,US
-2734161920,2734163967,US
+2732582912,2733903871,US
+2733903872,2733904895,PR
+2733904896,2733907967,CA
+2733907968,2733911039,US
+2733911040,2733912063,CA
+2733912064,2733922303,US
+2733922304,2733923327,CA
+2733923328,2733930495,US
+2733930496,2733931519,CA
+2733931520,2733942783,US
+2733942784,2733943807,PR
+2733943808,2733953023,US
+2733953024,2733954047,CA
+2733954048,2733958143,US
+2733958144,2733959167,CA
+2733959168,2733963263,US
+2733963264,2733964287,CA
+2733964288,2733977599,US
+2733978624,2733979647,US
+2733979648,2733980671,CA
+2733980672,2733984767,US
+2733984768,2733985791,VC
+2733985792,2734002175,US
+2734002176,2734003199,CA
+2734003200,2734004223,US
+2734004224,2734005247,GD
+2734005248,2734018559,US
+2734018560,2734020607,CA
+2734020608,2734026751,US
+2734026752,2734030847,CA
+2734030848,2734031871,JM
+2734031872,2734032895,US
+2734032896,2734034943,CA
+2734034944,2734044159,US
+2734044160,2734045183,CA
+2734045184,2734057471,US
+2734057472,2734059519,BB
+2734059520,2734063615,US
+2734063616,2734064639,CA
+2734064640,2734070783,US
+2734070784,2734071807,CA
+2734071808,2734074879,US
+2734074880,2734075903,PR
+2734075904,2734077951,US
+2734077952,2734078207,GB
+2734078208,2734099455,US
+2734099456,2734102527,CA
+2734102528,2734104575,VI
+2734104576,2734105599,US
+2734105600,2734106623,CA
+2734106624,2734119935,US
+2734119936,2734120959,CA
+2734120960,2734123007,VG
+2734123008,2734125055,US
+2734125056,2734129151,CA
+2734129152,2734139391,US
+2734139392,2734140415,CA
+2734140416,2734152703,US
+2734152704,2734153727,KY
+2734153728,2734155775,CA
+2734155776,2734163967,US
2734163968,2734164991,CA
2734164992,2734170111,US
2734170112,2734172159,CA
@@ -39547,9 +42778,7 @@
2734374912,2734376959,US
2734376960,2734379007,CA
2734379008,2734381055,VG
-2734381056,2734386175,US
-2734386176,2734387199,AI
-2734387200,2734389247,US
+2734381056,2734389247,US
2734389248,2734390271,CA
2734390272,2734398463,US
2734398464,2734399487,PR
@@ -39563,7 +42792,49 @@
2734452736,2734454783,CA
2734454784,2734457855,US
2734457856,2734458879,CA
-2734458880,2734460927,US
+2734458880,2734471167,US
+2734471168,2734472191,CA
+2734472192,2734473215,AG
+2734473216,2734479359,US
+2734479360,2734481407,CA
+2734481408,2734485503,US
+2734485504,2734486527,CA
+2734486528,2734488575,US
+2734488576,2734489599,CA
+2734489600,2734491647,US
+2734491648,2734492671,CA
+2734492672,2734502911,US
+2734502912,2734503935,CA
+2734503936,2734515199,US
+2734515200,2734516223,DM
+2734516224,2734522367,US
+2734522368,2734523391,CA
+2734523392,2734524415,US
+2734524416,2734526463,CA
+2734526464,2734532607,US
+2734532608,2734533631,VI
+2734533632,2734542847,US
+2734542848,2734544895,CA
+2734544896,2734553087,US
+2734553088,2734555135,CA
+2734555136,2734565375,US
+2734565376,2734566399,CA
+2734566400,2734588927,US
+2734588928,2734589951,CA
+2734589952,2734599167,US
+2734599168,2734600191,CA
+2734600192,2734603263,US
+2734603264,2734604287,AI
+2734604288,2734633983,US
+2734633984,2734635007,CA
+2734635008,2734649343,US
+2734649344,2734650367,CA
+2734650368,2734657535,US
+2734657536,2734658559,VG
+2734658560,2734659583,CA
+2734659584,2734665727,US
+2734665728,2734666751,CA
+2734666752,2734673919,US
2734686208,2734751743,CN
2734751744,2734817279,GB
2734817280,2734882815,US
@@ -39580,7 +42851,9 @@
2736848896,2736914431,US
2736914432,2736979967,NO
2736979968,2737438719,US
-2737438720,2738094079,JP
+2737438720,2737799167,JP
+2737799168,2737800191,NZ
+2737800192,2738094079,JP
2738225152,2738749439,JP
2738749440,2742353919,FR
2742353920,2742419455,ES
@@ -39623,9 +42896,9 @@
2746351616,2746417151,CR
2746417152,2746482687,CN
2746482688,2746548223,KR
-2746548224,2746786303,US
-2746786304,2746786559,MY
-2746786560,2747072511,US
+2746548224,2746824703,US
+2746824704,2746824959,CA
+2746824960,2747072511,US
2747072512,2747138047,AU
2747138048,2747465727,US
2747465728,2748055551,ZA
@@ -39649,9 +42922,7 @@
2750873600,2750939135,CL
2750939136,2751070207,US
2751070208,2751135743,CL
-2751135744,2751176703,US
-2751176704,2751176959,GU
-2751176960,2751397887,US
+2751135744,2751397887,US
2751397888,2751463423,KR
2751463424,2751528959,KZ
2751528960,2751660031,FR
@@ -39793,7 +43064,9 @@
2765568000,2765570047,IR
2765570048,2765578239,RU
2765578240,2765580287,AZ
-2765580288,2765582335,GB
+2765580288,2765581567,GB
+2765581568,2765581823,ZA
+2765581824,2765582335,GB
2765582336,2765586431,CZ
2765586432,2765619199,IR
2765619200,2768240639,US
@@ -39870,9 +43143,26 @@
2780495872,2780561407,AU
2780561408,2780758015,US
2780758016,2780823551,AU
-2780823552,2780931071,US
+2780823552,2780925951,US
+2780925952,2780926207,GB
+2780926208,2780926975,US
+2780926976,2780927487,GB
+2780927488,2780927743,US
+2780927744,2780927999,GB
+2780928000,2780929023,US
+2780929024,2780929279,GB
+2780929280,2780929791,FR
+2780929792,2780930047,US
+2780930048,2780930559,GB
+2780930560,2780931071,US
2780931072,2780932351,GB
-2780932352,2780954623,US
+2780932352,2780932607,US
+2780932608,2780933119,GB
+2780933120,2780933375,US
+2780933376,2780933631,GB
+2780933632,2780933887,US
+2780933888,2780934143,GB
+2780934144,2780954623,US
2780954624,2781020159,KR
2781020160,2781478911,US
2781478912,2781544447,HK
@@ -39914,7 +43204,9 @@
2788261888,2788294655,GB
2788294656,2789113855,US
2789113856,2789146623,CA
-2789146624,2789212159,US
+2789146624,2789200895,US
+2789200896,2789201151,GB
+2789201152,2789212159,US
2789212160,2789277695,AU
2789277696,2789343231,NZ
2789343232,2789933055,US
@@ -39948,11 +43240,12 @@
2793209856,2793275391,KR
2793275392,2796748799,US
2796748800,2796814335,NZ
-2796814336,2798838015,US
+2796814336,2797646591,US
+2797646592,2797646847,VI
+2797646848,2798838015,US
2798838016,2798838271,CO
-2798838272,2799106303,US
-2799106304,2799106559,PR
-2799106560,2801795071,US
+2798838272,2801795071,US
+2801795072,2801860607,CO
2801860608,2802515967,US
2802515968,2802581503,CA
2802581504,2802909183,US
@@ -39963,22 +43256,44 @@
2803761152,2803826687,AU
2803826688,2803892223,US
2803892224,2805465087,CA
+2805465088,2805989375,UY
2805989376,2806012927,US
2806012928,2806013183,HK
2806013184,2806644735,US
2806644736,2806710271,CA
2806710272,2807103487,US
2807103488,2807169023,NL
-2807169024,2807271679,US
-2807271680,2807271935,AU
-2807271936,2807824383,US
+2807169024,2807566335,US
+2807566336,2807574527,CA
+2807574528,2807587071,US
+2807587072,2807587327,IT
+2807587328,2807587583,QA
+2807587584,2807587839,IN
+2807587840,2807588095,AE
+2807588096,2807588351,ES
+2807588352,2807588863,CN
+2807588864,2807589119,JP
+2807589120,2807589375,RO
+2807589376,2807589631,FR
+2807589632,2807589887,PT
+2807589888,2807590143,AT
+2807590144,2807590399,MT
+2807590400,2807590655,GR
+2807590656,2807590911,SA
+2807590912,2807595007,US
+2807595008,2807599103,CA
+2807599104,2807607295,US
+2807607296,2807611391,CA
+2807611392,2807824383,US
2807824384,2807889919,CA
2807889920,2808545279,US
2808545280,2808610815,AU
2808610816,2808872959,US
+2808872960,2808938495,UY
2808938496,2809069567,US
2809069568,2809135103,SA
2809135104,2809397247,US
+2809397248,2809462783,UY
2809462784,2809855999,US
2809856000,2809921535,AU
2809921536,2809987071,US
@@ -39990,12 +43305,13 @@
2810576896,2810642431,VE
2810642432,2810904575,US
2810904576,2810970111,CN
-2810970112,2811559935,US
+2810970112,2811428863,US
+2811428864,2811494399,CA
+2811494400,2811559935,US
2811559936,2811625471,CH
2811625472,2812084223,US
2812084224,2812149759,BO
-2812149760,2812280831,US
-2812346368,2812411903,US
+2812149760,2812411903,US
2812411904,2812477439,AU
2812477440,2812753919,US
2812753920,2812755967,BR
@@ -40022,7 +43338,9 @@
2813263872,2813329407,JP
2813329408,2813526015,US
2813526016,2813591551,NZ
-2813591552,2814181375,US
+2813591552,2813908479,US
+2813908480,2813908735,AU
+2813908736,2814181375,US
2814181376,2814246911,AU
2814246912,2815033343,US
2815033344,2815098879,NL
@@ -40033,7 +43351,9 @@
2815139584,2815164415,GB
2815164416,2815229951,US
2815229952,2815295487,ID
-2815295488,2816159743,US
+2815295488,2815986943,US
+2815986944,2815987199,GB
+2815987200,2816159743,US
2816159744,2816159999,IN
2816160000,2816262143,US
2816262144,2816263167,IE
@@ -40147,9 +43467,7 @@
2829844480,2829910015,ZA
2829910016,2830066431,US
2830066432,2830066687,HK
-2830066688,2830085887,US
-2830085888,2830086143,GB
-2830086144,2830106623,US
+2830066688,2830106623,US
2830106624,2830172159,CO
2830172160,2830434303,US
2830499840,2830761983,US
@@ -40177,9 +43495,7 @@
2833842176,2833907711,US
2833907712,2833973247,GT
2833973248,2833989631,US
-2834038784,2834186239,US
-2834186240,2834186495,GB
-2834186496,2834497535,US
+2834038784,2834497535,US
2834497536,2834563071,SV
2834563072,2834825215,US
2834825216,2834956287,KR
@@ -40198,13 +43514,19 @@
2844783616,2844784639,DE
2844784640,2844862975,US
2844862976,2844863231,CA
-2844863232,2844902655,US
+2844863232,2844884991,US
+2844884992,2844885247,FR
+2844885248,2844902655,US
2844902656,2844902911,SG
2844902912,2844912639,US
2844912640,2844912895,JP
2844912896,2845704191,US
2845704192,2845769727,CU
-2845835264,2848276479,US
+2845835264,2848212991,US
+2848212992,2848215039,GB
+2848215040,2848244735,US
+2848244736,2848245759,GB
+2848245760,2848276479,US
2848325632,2848522239,US
2848522240,2848587775,AU
2848587776,2848653311,ZA
@@ -40215,15 +43537,13 @@
2851078144,2851995647,US
2852192256,2852716653,US
2852716654,2852716654,AU
-2852716655,2852765695,US
-2852765696,2852765951,GB
-2852765952,2853306367,US
+2852716655,2853306367,US
2853306368,2853371903,CL
2853371904,2853765119,US
2853765120,2853830655,MX
-2853830656,2854603775,US
-2854603776,2854604031,GB
-2854604032,2854617087,US
+2853830656,2854289407,US
+2854289408,2854354943,MY
+2854354944,2854617087,US
2854617088,2854682623,MY
2854748160,2855469055,US
2855469056,2855484671,PY
@@ -40231,14 +43551,14 @@
2855485440,2855501823,UY
2855501824,2855534591,AR
2855534592,2855811583,US
-2855811584,2855811839,DE
+2855811584,2855811730,DE
+2855811731,2855811731,US
+2855811732,2855811839,DE
2855811840,2856058879,US
2856058880,2856124415,CH
2856124416,2856184831,US
2856184832,2856185855,GB
-2856185856,2856189439,US
-2856189440,2856189695,AU
-2856189696,2856452095,US
+2856185856,2856452095,US
2856452096,2856517631,BR
2856517632,2856714239,US
2856714240,2856779775,MX
@@ -40247,8 +43567,7 @@
2857697280,2858352639,US
2858418176,2859007999,US
2859008000,2859073535,JP
-2859073536,2860646399,US
-2860711936,2861069055,US
+2859073536,2861069055,US
2861069056,2861069311,GB
2861069312,2861850879,US
2861850880,2861851391,HK
@@ -40270,6 +43589,7 @@
2863267840,2863595519,US
2863595520,2863661055,CA
2863661056,2863825919,US
+2863828992,2863857663,US
2863857664,2863923199,SG
2863923200,2864844799,US
2864844800,2864845055,NL
@@ -40286,19 +43606,15 @@
2867462144,2867593215,US
2867593216,2867724287,CH
2867855360,2868117503,US
-2868379648,2868605376,US
-2868605377,2868605377,NO
-2868605378,2868658175,US
+2868379648,2868605183,US
+2868605184,2868605439,NO
+2868605440,2868658175,US
2868658176,2868658431,GB
-2868658432,2868673023,US
-2868673024,2868673279,FR
-2868673280,2868676607,US
+2868658432,2868676607,US
2868676608,2868676863,AU
2868676864,2868689407,US
2868689408,2868689663,AU
-2868689664,2868689919,US
-2868689920,2868690175,SG
-2868690176,2868772863,US
+2868689664,2868772863,US
2868838400,2868903935,BE
2868903936,2869035007,SG
2869035008,2869166079,JP
@@ -40379,7 +43695,9 @@
2875719680,2877292543,CN
2877292544,2879336447,US
2879336448,2879336959,GB
-2879336960,2881486847,US
+2879336960,2879469567,US
+2879469568,2879470079,IN
+2879470080,2881486847,US
2881486848,2881487103,GB
2881487104,2882469887,US
2882469888,2882535423,SG
@@ -40389,6 +43707,7 @@
2886667008,2886667263,DE
2886667264,2886729727,US
2887778304,2889875455,US
+2890414080,2890415103,ZA
2894069760,2894921727,US
2894921728,2895118335,GB
2895118336,2895301887,US
@@ -40404,7 +43723,9 @@
2897215488,2897739775,DE
2897739776,2898001919,FR
2898001920,2898132991,GB
-2898132992,2898788351,US
+2898132992,2898264063,US
+2898264064,2898264064,AU
+2898264065,2898788351,US
2898788352,2899050495,GB
2899050496,2899116031,FR
2899116032,2899148799,VN
@@ -40416,7 +43737,9 @@
2899574784,2899902463,GB
2899902464,2899967999,US
2899968000,2900099071,CA
-2900099072,2902507519,US
+2900099072,2902476543,US
+2902476544,2902476799,CW
+2902476800,2902507519,US
2902507520,2902515711,CA
2902515712,2902564399,US
2902564400,2902564415,CN
@@ -40428,13 +43751,39 @@
2905001984,2905002152,GB
2905002153,2905002153,US
2905002154,2905002495,GB
-2905002496,2905045247,US
-2905045248,2905045503,SG
-2905045504,2905405679,US
+2905002496,2905044991,US
+2905044992,2905045503,SG
+2905045504,2905378559,US
+2905378560,2905378815,CA
+2905378816,2905379071,US
+2905379072,2905379327,CA
+2905379328,2905380607,US
+2905380608,2905380863,CA
+2905380864,2905387519,US
+2905387520,2905388031,CA
+2905388032,2905394175,US
+2905394176,2905394687,CA
+2905394688,2905401855,US
+2905401856,2905402111,CA
+2905402112,2905405679,US
2905405680,2905405687,CN
-2905405688,2905473023,US
+2905405688,2905407743,US
+2905407744,2905407999,TW
+2905408000,2905415679,US
+2905415680,2905415935,GB
+2905415936,2905446655,US
+2905446656,2905446911,DE
+2905446912,2905473023,US
2905473024,2905481215,CA
-2905481216,2913992703,US
+2905481216,2913086719,US
+2913086720,2913086812,CA
+2913086813,2913086813,US
+2913086814,2913086816,CA
+2913086817,2913086817,US
+2913086818,2913086819,CA
+2913086820,2913086820,US
+2913086821,2913086975,CA
+2913086976,2913992703,US
2913992704,2914516991,CA
2914516992,2915092135,US
2915092136,2915092143,SA
@@ -40446,9 +43795,7 @@
2915516928,2915517183,US
2915517184,2915517439,RU
2915517440,2915518463,DK
-2915518464,2915519487,GB
-2915519488,2915519743,US
-2915519744,2915520511,GB
+2915518464,2915520511,GB
2915520512,2915521023,AU
2915521024,2915521279,JP
2915521280,2915521535,PL
@@ -40458,7 +43805,9 @@
2915527680,2915528711,NL
2915528712,2915528735,US
2915528736,2915528751,NL
-2915528752,2915795013,US
+2915528752,2915528767,US
+2915528768,2915528783,NL
+2915528784,2915795013,US
2915795014,2915795014,MX
2915795015,2915958783,US
2915958784,2916024319,CA
@@ -40472,14 +43821,19 @@
2916319232,2916335615,PR
2916335616,2916368383,US
2916368384,2916401151,CA
-2916401152,2916417535,US
-2916433920,2916515839,US
+2916401152,2916515839,US
2916515840,2916519935,CA
2916519936,2916581375,US
2916581376,2916614143,PR
2916614144,2917117951,US
2917117952,2917122047,NL
-2917122048,2917179391,US
+2917122048,2917170822,US
+2917170823,2917170823,UA
+2917170824,2917170854,US
+2917170855,2917170856,UA
+2917170857,2917171086,US
+2917171087,2917171087,UA
+2917171088,2917179391,US
2917181440,2917181951,US
2917183488,2917195775,US
2917195776,2917203967,CA
@@ -40488,20 +43842,58 @@
2917261312,2917265407,US
2917265408,2917267711,JM
2917267712,2917267967,AG
-2917267968,2917269503,JM
+2917267968,2917268223,JM
+2917268224,2917268479,BB
+2917268480,2917269503,JM
2917269504,2917449727,US
2917449728,2917466111,PR
2917466112,2917572607,US
2917572608,2917580799,CA
-2917580800,2917621759,US
+2917580800,2917597439,US
+2917597440,2917597695,GB
+2917597696,2917621759,US
2917621760,2917629951,CA
-2917629952,2917653503,US
+2917629952,2917646847,US
+2917646848,2917647103,CN
+2917647104,2917647359,US
+2917647360,2917648383,CN
+2917648384,2917648639,US
+2917648640,2917648895,CN
+2917648896,2917652223,US
+2917652224,2917652479,AU
+2917652480,2917653503,US
2917653504,2917654015,GB
-2917654016,2917700959,US
+2917654016,2917654271,US
+2917654272,2917654527,CN
+2917654528,2917654783,US
+2917654784,2917655039,DE
+2917655040,2917655551,US
+2917655552,2917655807,CN
+2917655808,2917656063,US
+2917656064,2917656319,CN
+2917656320,2917656831,US
+2917656832,2917657087,CN
+2917657088,2917660671,US
+2917660672,2917661183,GB
+2917661184,2917676031,US
+2917676032,2917676287,CA
+2917676288,2917699839,US
+2917699840,2917700351,CA
+2917700352,2917700959,US
2917700960,2917700967,CN
2917700968,2917704191,US
2917704192,2917704447,CA
-2917704448,2917842175,US
+2917704448,2917707519,US
+2917707520,2917707775,CA
+2917707776,2917709823,US
+2917709824,2917710847,CA
+2917710848,2917713919,US
+2917713920,2917714431,CA
+2917714432,2917715967,US
+2917715968,2917716223,CA
+2917716224,2917720575,US
+2917720576,2917720831,CA
+2917720832,2917842175,US
2917842176,2917842431,CA
2917842432,2918014975,US
2918014976,2918023167,CA
@@ -40519,7 +43911,10 @@
2918260736,2918264831,CA
2918264832,2918277119,US
2918277120,2918281215,CA
-2918281216,2918287359,US
+2918281216,2918286335,US
+2918286336,2918286591,CA
+2918286592,2918287103,US
+2918287104,2918287359,CR
2918287360,2918289407,GB
2918289408,2918314216,US
2918314217,2918314217,GB
@@ -40528,51 +43923,79 @@
2918375424,2918391807,US
2918391808,2918395903,CA
2918395904,2918404095,US
-2918404096,2918408191,PR
+2918404096,2918406911,PR
+2918406912,2918407167,US
+2918407168,2918407295,PR
+2918407296,2918407423,US
+2918407424,2918408191,PR
2918408192,2918432767,US
2918432768,2918436863,CA
2918436864,2918469631,US
-2918469632,2918473727,CA
+2918469632,2918471423,CA
+2918471424,2918471679,US
+2918471680,2918472703,CA
+2918472704,2918473215,US
+2918473216,2918473727,CA
2918473728,2918477823,US
2918477824,2918481919,CA
-2918481920,2918536719,US
+2918481920,2918528255,US
+2918528256,2918528511,NO
+2918528512,2918528767,US
+2918528768,2918528863,CA
+2918528864,2918528883,US
+2918528884,2918528885,CA
+2918528886,2918530559,US
+2918530560,2918530815,PH
+2918530816,2918536719,US
2918536720,2918536727,CA
2918536728,2918570239,US
2918570240,2918570495,JP
2918570496,2918580223,US
2918580224,2918588415,CA
2918588416,2918596607,US
-2918596608,2918604799,CA
+2918596608,2918604287,CA
+2918604288,2918604543,US
+2918604544,2918604799,CA
2918604800,2918612991,US
2918612992,2918621183,CA
2918621184,2918699007,US
2918699008,2918703103,CA
2918703104,2918760447,US
2918760448,2918776831,CA
-2918776832,2918830079,US
+2918776832,2918815999,US
+2918816000,2918817023,GB
+2918817024,2918828031,US
+2918828032,2918828543,UA
+2918828544,2918829055,ES
+2918829056,2918829823,US
+2918829824,2918830079,CN
2918830080,2918834175,CA
2918834176,2918842367,US
2918842368,2918875135,CA
2918875136,2918973439,US
2918973440,2918989823,CA
-2918989824,2919020543,US
+2918989824,2919010303,US
+2919010304,2919010559,CA
+2919010560,2919020543,US
2919020544,2919020559,CA
2919020560,2919020607,US
-2919020608,2919020623,CA
-2919020624,2919021359,US
+2919020608,2919020615,CA
+2919020616,2919021359,US
2919021360,2919021375,CA
2919021376,2919021487,US
-2919021488,2919021503,CA
-2919021504,2919022207,US
+2919021488,2919021535,CA
+2919021536,2919022207,US
2919022208,2919022239,CA
2919022240,2919022455,US
2919022456,2919022463,CA
-2919022464,2919055359,US
+2919022464,2919022495,US
+2919022496,2919022527,CA
+2919022528,2919055359,US
2919055360,2919057407,CN
2919057408,2919059455,IN
2919059456,2919063551,CN
-2919063552,2919064575,US
-2919064576,2919067647,CN
+2919063552,2919064063,MX
+2919064064,2919067647,CN
2919067648,2919068247,US
2919068248,2919068255,AU
2919068256,2919070983,US
@@ -40581,11 +44004,17 @@
2919174144,2919178239,CA
2919178240,2919186431,US
2919186432,2919190527,CA
-2919190528,2919206911,US
+2919190528,2919204747,US
+2919204748,2919204755,NL
+2919204756,2919205027,US
+2919205028,2919205031,NL
+2919205032,2919206911,US
2919206912,2919211007,CA
2919211008,2919235583,US
2919235584,2919759871,CA
-2919759872,2921530367,US
+2919759872,2921512703,US
+2921512704,2921512959,CA
+2921512960,2921530367,US
2921530368,2921531391,DE
2921531392,2921541119,US
2921541120,2921541375,DE
@@ -40611,25 +44040,26 @@
2921594880,2925002751,US
2925002752,2925527039,CA
2925527040,2926575615,US
-2926575616,2926778111,CA
-2926778112,2926778367,US
-2926778368,2927084799,CA
-2927084800,2927085055,US
-2927085056,2927085567,CA
-2927085568,2927085823,US
+2926575616,2926777343,CA
+2926777344,2926777855,US
+2926777856,2927084799,CA
+2927084800,2927085823,US
2927085824,2927099903,CA
-2927099904,2927581183,US
+2927099904,2927242751,US
+2927242752,2927243263,AE
+2927243264,2927254783,US
+2927254784,2927255039,AE
+2927255040,2927581183,US
2927581184,2927581439,SG
2927581440,2928175551,US
2928175552,2928175559,VN
2928175560,2928177151,US
-2928177152,2928178431,CA
-2928178432,2928178687,US
-2928178688,2928181247,CA
-2928181248,2928197631,US
-2928214016,2928226303,US
+2928177152,2928181247,CA
+2928181248,2928226303,US
2928226304,2928230399,CA
-2928230400,2928263167,US
+2928230400,2928261375,US
+2928261376,2928261887,CA
+2928261888,2928263167,US
2928263168,2928279551,CA
2928279552,2928312319,US
2928312320,2928316415,CA
@@ -40755,9 +44185,7 @@
2947603456,2947604479,TH
2947604480,2947609599,HK
2947609600,2947609855,GB
-2947609856,2947611199,HK
-2947611200,2947611263,AU
-2947611264,2947612671,HK
+2947609856,2947612671,HK
2947612672,2947678207,JP
2947678208,2947743743,CN
2947743744,2947809279,JP
@@ -40796,7 +44224,9 @@
2953596928,2953598975,ES
2953598976,2953601023,IT
2953601024,2953603071,RU
-2953603072,2953605119,GB
+2953603072,2953603977,GB
+2953603978,2953603979,IE
+2953603980,2953605119,GB
2953605120,2953609215,CZ
2953609216,2953707519,IL
2953707520,2953838591,RU
@@ -40810,9 +44240,29 @@
2954647552,2954657791,ES
2954657792,2954756095,JO
2954756096,2954821631,TR
-2954821632,2954823395,FR
+2954821632,2954822927,FR
+2954822928,2954822931,DE
+2954822932,2954823395,FR
2954823396,2954823399,GB
-2954823400,2954827799,FR
+2954823400,2954824255,FR
+2954824256,2954824259,ES
+2954824260,2954825063,FR
+2954825064,2954825067,ES
+2954825068,2954825315,FR
+2954825316,2954825319,ES
+2954825320,2954825403,FR
+2954825404,2954825407,ES
+2954825408,2954825535,FR
+2954825536,2954825539,ES
+2954825540,2954826031,FR
+2954826032,2954826035,ES
+2954826036,2954826159,FR
+2954826160,2954826163,ES
+2954826164,2954826759,FR
+2954826760,2954826763,ES
+2954826764,2954826775,FR
+2954826776,2954826779,ES
+2954826780,2954827799,FR
2954827800,2954827807,DE
2954827808,2954829751,FR
2954829752,2954829752,ES
@@ -40820,21 +44270,43 @@
2954829760,2954829823,ES
2954829824,2954829843,FR
2954829844,2954829847,DE
-2954829848,2954832343,FR
+2954829848,2954830395,FR
+2954830396,2954830399,ES
+2954830400,2954831247,FR
+2954831248,2954831251,ES
+2954831252,2954832343,FR
2954832344,2954832347,CH
-2954832348,2954833419,FR
+2954832348,2954832891,FR
+2954832892,2954832895,ES
+2954832896,2954833419,FR
2954833420,2954833423,PL
-2954833424,2954835451,FR
+2954833424,2954833555,FR
+2954833556,2954833559,NL
+2954833560,2954833567,FR
+2954833568,2954833571,ES
+2954833572,2954834519,FR
+2954834520,2954834523,ES
+2954834524,2954834671,FR
+2954834672,2954834675,ES
+2954834676,2954835295,FR
+2954835296,2954835299,ES
+2954835300,2954835443,FR
+2954835444,2954835447,ES
+2954835448,2954835451,FR
2954835452,2954835455,ES
-2954835456,2954836943,FR
-2954836944,2954836951,NL
-2954836952,2954837071,FR
+2954835456,2954837071,FR
2954837072,2954837075,ES
-2954837076,2954837827,FR
+2954837076,2954837667,FR
+2954837668,2954837671,ES
+2954837672,2954837827,FR
2954837828,2954837831,DE
-2954837832,2954838599,FR
+2954837832,2954837867,FR
+2954837868,2954837871,ES
+2954837872,2954838599,FR
2954838600,2954838607,GB
-2954838608,2954839471,FR
+2954838608,2954839267,FR
+2954839268,2954839271,ES
+2954839272,2954839471,FR
2954839472,2954839479,BE
2954839480,2954840255,FR
2954840256,2954840447,GB
@@ -40844,19 +44316,59 @@
2954840928,2954840931,DE
2954840932,2954841567,FR
2954841568,2954841583,ES
-2954841584,2954844147,FR
+2954841584,2954843503,FR
+2954843504,2954843507,ES
+2954843508,2954843767,FR
+2954843768,2954843771,ES
+2954843772,2954844147,FR
2954844148,2954844151,DE
-2954844152,2954855507,FR
+2954844152,2954844999,FR
+2954845000,2954845003,ES
+2954845004,2954846107,FR
+2954846108,2954846111,ES
+2954846112,2954846139,FR
+2954846140,2954846143,ES
+2954846144,2954855075,FR
+2954855076,2954855079,ES
+2954855080,2954855507,FR
2954855508,2954855511,DE
-2954855512,2954861875,FR
+2954855512,2954855515,FR
+2954855516,2954855519,ES
+2954855520,2954855527,FR
+2954855528,2954855531,ES
+2954855532,2954856179,FR
+2954856180,2954856183,ES
+2954856184,2954859323,FR
+2954859324,2954859327,ES
+2954859328,2954861875,FR
2954861876,2954861879,CH
-2954861880,2954863615,FR
+2954861880,2954862415,FR
+2954862416,2954862419,ES
+2954862420,2954863615,FR
2954863616,2954864639,DE
2954864640,2954865663,IT
2954865664,2954866687,ES
-2954866688,2954877103,FR
+2954866688,2954870799,FR
+2954870800,2954870803,ES
+2954870804,2954870843,FR
+2954870844,2954870847,ES
+2954870848,2954870903,FR
+2954870904,2954870907,ES
+2954870908,2954875879,FR
+2954875880,2954875883,ES
+2954875884,2954876871,FR
+2954876872,2954876875,ES
+2954876876,2954876887,FR
+2954876888,2954876891,ES
+2954876892,2954877103,FR
2954877104,2954877107,PL
-2954877108,2954887167,FR
+2954877108,2954877163,FR
+2954877164,2954877167,ES
+2954877168,2954877819,FR
+2954877820,2954877823,ES
+2954877824,2954878907,FR
+2954878908,2954878911,ES
+2954878912,2954887167,FR
2954887168,2954891263,UA
2954891264,2954895359,IT
2954895360,2954897407,RU
@@ -40935,7 +44447,7 @@
2956537856,2956541951,UA
2956544000,2956546047,RU
2956546048,2956548095,FR
-2956548096,2956550143,ME
+2956548096,2956550143,HR
2956550144,2956554239,ES
2956554240,2956558335,IT
2956558336,2956574527,DE
@@ -40998,7 +44510,9 @@
2957068288,2957070335,LU
2957070336,2957074431,IT
2957074432,2957082623,RU
-2957082624,2957099007,DE
+2957082624,2957090815,DE
+2957090816,2957094911,AT
+2957094912,2957099007,DE
2957099008,2957100031,CH
2957100032,2957104639,DE
2957104640,2957105663,US
@@ -41123,8 +44637,7 @@
2959394816,2959398911,ES
2959398912,2959400959,RU
2959400960,2959405055,ES
-2959405056,2959409151,RU
-2959409152,2959413247,UA
+2959405056,2959413247,RU
2959413248,2959417343,ES
2959417344,2959423487,IR
2959423488,2959427583,RU
@@ -41187,12 +44700,8 @@
2959765504,2959767551,RU
2959767552,2959769599,RS
2959769600,2959777791,RU
-2959777792,2959781887,LV
-2959781888,2959782399,SK
-2959782400,2959782655,LV
-2959782656,2959783083,SK
-2959783084,2959783084,LV
-2959783085,2959785983,SK
+2959777792,2959783935,LV
+2959783936,2959785983,SK
2959785984,2959794175,UA
2959794176,2959796223,IL
2959796224,2959806463,RU
@@ -41287,9 +44796,7 @@
2960240640,2960244735,RO
2960244736,2960248831,PL
2960248832,2960265215,UA
-2960265216,2960269311,RU
-2960269312,2960273407,UA
-2960273408,2960275455,RU
+2960265216,2960275455,RU
2960275456,2960277503,RO
2960277504,2960285695,RU
2960285696,2960289791,RO
@@ -41340,8 +44847,7 @@
2960560128,2960562175,UA
2960562176,2960564223,BY
2960574464,2960576511,RO
-2960576512,2960580607,CZ
-2960580608,2960588799,RU
+2960576512,2960588799,RU
2960588800,2960592895,UA
2960592896,2960594943,RU
2960594944,2960596991,UA
@@ -41416,7 +44922,7 @@
2960907776,2960908031,GB
2960908032,2960908287,PL
2960908288,2960916479,KG
-2960916480,2960932863,UA
+2960916480,2960924671,UA
2960932864,2960933887,IR
2960933888,2960934399,GB
2960934400,2960934655,LI
@@ -41454,7 +44960,6 @@
2960982016,2960990207,RO
2960990208,2960998399,UA
2960998400,2961039359,RU
-2961039360,2961047551,UA
2961047552,2961057023,RU
2961057024,2961057279,IE
2961057280,2961057535,GR
@@ -41495,7 +45000,8 @@
2967345152,2967347199,ES
2967347200,2967351295,HR
2967351296,2967355391,FR
-2967355392,2967371775,RO
+2967355392,2967363583,RO
+2967363584,2967371775,SE
2967371776,2967388159,KZ
2967388160,2967392255,RU
2967392256,2967394303,FR
@@ -41550,40 +45056,13 @@
2968648576,2968649727,FR
2968649728,2969042943,IT
2969042944,2969567231,GB
-2969567232,2971073535,BR
-2971074560,2972507135,BR
-2972508160,2974243839,BR
-2974244864,2974433279,BR
-2974449664,2975112191,BR
-2975113216,2975149055,BR
-2975150080,2975157247,BR
-2975158272,2975210495,BR
-2975211520,2975243263,BR
-2975244288,2975263743,BR
-2975264768,2975271935,BR
-2975272960,2975300607,BR
-2975301632,2975308799,BR
-2975309824,2975321087,BR
-2975322112,2975329279,BR
-2975330304,2975333375,BR
-2975334400,2975596543,BR
-2975858688,2977770495,BR
-2977771520,2977790975,BR
-2977792000,2977823743,BR
-2977824768,2977991679,BR
-2977992704,2978008063,BR
-2978009088,2978012159,BR
-2978013184,2978028543,BR
-2978029568,2978559999,BR
-2978562048,2978568191,BR
-2978570240,2978584575,BR
-2978586624,2978609151,BR
-2978611200,2979576831,BR
-2979577856,2981723135,BR
-2981724160,2984148991,BR
-2984181760,2984243199,BR
+2969567232,2984247295,BR
2984247296,2984935423,MX
-2985033728,2985295871,MX
+2984935424,2984951807,BR
+2984968192,2985033727,BR
+2985033728,2985951231,MX
+2985951232,2986082303,PY
+2986082304,2986344447,CO
2986344448,2987393023,DE
2987393024,2987397119,IM
2987397120,2987401215,LV
@@ -41593,9 +45072,7 @@
2987413504,2987417599,UA
2987417600,2987425791,PL
2987425792,2987429887,BG
-2987429888,2987433215,RU
-2987433216,2987433471,KZ
-2987433472,2987433983,RU
+2987429888,2987433983,RU
2987433984,2987438079,FR
2987438080,2987442175,FI
2987442176,2987446271,IE
@@ -41780,7 +45257,11 @@
2988179456,2988411647,SE
2988411648,2988411775,DE
2988411776,2988441599,SE
-2988441600,2988444208,FR
+2988441600,2988442075,FR
+2988442076,2988442079,ES
+2988442080,2988442847,FR
+2988442848,2988442863,IT
+2988442864,2988444208,FR
2988444209,2988444209,FI
2988444210,2988444671,FR
2988444672,2988444679,ES
@@ -41792,7 +45273,9 @@
2988457984,2988459119,FR
2988459120,2988459127,IT
2988459128,2988459135,PL
-2988459136,2988459679,FR
+2988459136,2988459535,FR
+2988459536,2988459539,ES
+2988459540,2988459679,FR
2988459680,2988459683,ES
2988459684,2988459687,FR
2988459688,2988459691,PL
@@ -41800,16 +45283,26 @@
2988459864,2988459867,ES
2988459868,2988460575,FR
2988460576,2988460591,PT
-2988460592,2988461703,FR
+2988460592,2988460651,FR
+2988460652,2988460655,ES
+2988460656,2988461703,FR
2988461704,2988461707,NL
2988461708,2988462603,FR
2988462604,2988462607,ES
-2988462608,2988463999,FR
+2988462608,2988463915,FR
+2988463916,2988463919,ES
+2988463920,2988463999,FR
2988464000,2988464007,IE
2988464008,2988464015,LT
-2988464016,2988465279,FR
+2988464016,2988464623,FR
+2988464624,2988464627,ES
+2988464628,2988465215,FR
+2988465216,2988465219,ES
+2988465220,2988465279,FR
2988465280,2988465295,DE
-2988465296,2988476415,FR
+2988465296,2988465559,FR
+2988465560,2988465563,ES
+2988465564,2988476415,FR
2988476416,2988478463,IT
2988478464,2988478579,FR
2988478580,2988478583,DE
@@ -41823,15 +45316,23 @@
2988482320,2988482335,IT
2988482336,2988482575,FR
2988482576,2988482579,CZ
-2988482580,2988484831,FR
+2988482580,2988483027,FR
+2988483028,2988483031,ES
+2988483032,2988484831,FR
2988484832,2988484847,GB
2988484848,2988485683,FR
2988485684,2988485687,PL
2988485688,2988487071,FR
2988487072,2988487075,ES
-2988487076,2988489479,FR
+2988487076,2988487095,FR
+2988487096,2988487099,ES
+2988487100,2988489479,FR
2988489480,2988489483,DE
-2988489484,2988490686,FR
+2988489484,2988489675,FR
+2988489676,2988489679,ES
+2988489680,2988490179,FR
+2988490180,2988490183,ES
+2988490184,2988490686,FR
2988490687,2988490687,BE
2988490688,2988492799,FR
2988492800,2988494847,PL
@@ -41841,58 +45342,107 @@
2988499737,2988499737,NL
2988499738,2988500415,FR
2988500416,2988500447,CZ
-2988500448,2988502051,FR
+2988500448,2988500855,FR
+2988500856,2988500859,ES
+2988500860,2988502051,FR
2988502052,2988502055,PL
-2988502056,2988502655,FR
+2988502056,2988502479,FR
+2988502480,2988502483,ES
+2988502484,2988502655,FR
2988502656,2988502719,DE
2988502720,2988502881,FR
2988502882,2988502882,IT
2988502883,2988504371,FR
2988504372,2988504375,PL
-2988504376,2988509511,FR
+2988504376,2988505391,FR
+2988505392,2988505395,ES
+2988505396,2988507163,FR
+2988507164,2988507167,ES
+2988507168,2988507975,FR
+2988507976,2988507979,IT
+2988507980,2988509511,FR
2988509512,2988509515,PL
2988509516,2988509747,FR
2988509748,2988509751,LT
2988509752,2988512903,FR
2988512904,2988512907,GB
-2988512908,2988515327,FR
+2988512908,2988513003,FR
+2988513004,2988513007,ES
+2988513008,2988515327,FR
2988515328,2988517375,DE
2988517376,2988519423,FR
2988519424,2988521471,PL
-2988521472,2988524271,FR
+2988521472,2988524075,FR
+2988524076,2988524079,ES
+2988524080,2988524271,FR
2988524272,2988524287,DE
2988524288,2988525887,FR
2988525888,2988525951,GB
2988525952,2988526415,FR
2988526416,2988526423,ES
-2988526424,2988527831,FR
+2988526424,2988527527,FR
+2988527528,2988527531,NL
+2988527532,2988527831,FR
2988527832,2988527839,ES
-2988527840,2988529351,FR
+2988527840,2988527887,FR
+2988527888,2988527891,ES
+2988527892,2988529351,FR
2988529352,2988529359,GB
2988529360,2988529375,FR
2988529376,2988529383,GB
-2988529384,2988535807,FR
+2988529384,2988529387,ES
+2988529388,2988535807,FR
2988535808,2988537855,ES
-2988537856,2988544671,FR
+2988537856,2988539971,FR
+2988539972,2988539975,ES
+2988539976,2988540503,FR
+2988540504,2988540507,NL
+2988540508,2988544671,FR
2988544672,2988544687,GB
2988544688,2988544691,NL
-2988544692,2988547655,FR
+2988544692,2988546727,FR
+2988546728,2988546731,ES
+2988546732,2988547067,FR
+2988547068,2988547071,ES
+2988547072,2988547095,FR
+2988547096,2988547099,ES
+2988547100,2988547655,FR
2988547656,2988547663,PL
2988547664,2988547871,FR
2988547872,2988547903,GB
-2988547904,2988548095,FR
+2988547904,2988548015,FR
+2988548016,2988548019,ES
+2988548020,2988548095,FR
2988548096,2988550143,ES
-2988550144,2988550438,FR
+2988550144,2988550359,FR
+2988550360,2988550363,ES
+2988550364,2988550438,FR
2988550439,2988550439,GB
2988550440,2988550463,FR
2988550464,2988550527,DE
-2988550528,2988555527,FR
+2988550528,2988551443,FR
+2988551444,2988551447,ES
+2988551448,2988551535,FR
+2988551536,2988551551,DE
+2988551552,2988553531,FR
+2988553532,2988553535,ES
+2988553536,2988554035,FR
+2988554036,2988554039,ES
+2988554040,2988555527,FR
2988555528,2988555531,ES
2988555532,2988556207,FR
2988556208,2988556211,DE
-2988556212,2988558203,FR
+2988556212,2988556359,FR
+2988556360,2988556363,ES
+2988556364,2988557507,FR
+2988557508,2988557511,ES
+2988557512,2988557539,FR
+2988557540,2988557543,ES
+2988557544,2988558203,FR
2988558204,2988558207,DE
-2988558208,2988561583,FR
+2988558208,2988558803,FR
+2988558804,2988558807,ES
+2988558808,2988561583,FR
2988561584,2988561591,GB
2988561592,2988561763,FR
2988561764,2988561767,IT
@@ -41915,14 +45465,17 @@
2989883392,2989948927,UA
2989948928,2990014463,FI
2990014464,2990079999,PL
-2990080000,2990135295,RU
-2990135296,2990137343,GB
-2990137344,2990145535,RU
+2990080000,2990081023,UA
+2990081024,2990096383,GB
+2990096384,2990104575,RU
+2990104576,2990112767,GB
+2990112768,2990145535,RU
2990145536,2990211071,SI
2990211072,2990276607,GR
2990276608,2990342143,ES
2990342144,2990407679,KW
-2990407680,2990473215,NL
+2990407680,2990440447,GB
+2990440448,2990473215,NL
2990473216,2990475674,DE
2990475675,2990475675,HR
2990475676,2990500113,DE
@@ -41949,9 +45502,7 @@
2991308800,2991325183,BG
2991325184,2991341567,AZ
2991341568,2991357951,MD
-2991357952,2991362559,DE
-2991362560,2991362623,US
-2991362624,2991374335,DE
+2991357952,2991374335,DE
2991374336,2991390719,RU
2991390720,2991407103,BA
2991407104,2991423487,DE
@@ -42094,7 +45645,7 @@
2997649408,2997682175,BY
2997682176,2997714943,RU
2997714944,2997747711,IR
-2997747712,2997780479,DE
+2997747712,2997780479,CH
2997780480,2997813247,SE
2997813248,2997817343,AL
2997817344,2997819391,RS
@@ -42109,8 +45660,10 @@
2998665216,2998927359,AT
2998927360,2998991615,CH
2998991616,2998991871,DE
-2998991872,2999380351,CH
-2999380352,2999380479,DE
+2998991872,2999026943,CH
+2999026944,2999027071,DE
+2999027072,2999380223,CH
+2999380224,2999380479,DE
2999380480,2999451647,CH
2999451648,2999713791,DE
2999713792,2999975935,RU
@@ -42439,7 +45992,9 @@
3002763264,3002765311,RS
3002765312,3002767359,NL
3002767360,3002769407,RU
-3002769408,3002773503,DE
+3002769408,3002769919,DE
+3002769920,3002770175,ES
+3002770176,3002773503,DE
3002773504,3002775551,GB
3002775552,3002777599,RO
3002777600,3002779647,NL
@@ -42492,9 +46047,7 @@
3003023360,3003039743,RS
3003039744,3003056127,BG
3003056128,3003058175,DE
-3003058176,3003058943,EE
-3003058944,3003059199,IL
-3003059200,3003060223,EE
+3003058176,3003060223,EE
3003060224,3003062271,DE
3003062272,3003064319,NL
3003064320,3003066367,RO
@@ -42514,10 +46067,8 @@
3003092992,3003095039,NO
3003095040,3003095295,AT
3003095296,3003095551,CH
-3003095552,3003095559,AT
-3003095560,3003095807,CZ
-3003095808,3003095815,AT
-3003095816,3003096063,IT
+3003095552,3003095807,CZ
+3003095808,3003096063,IT
3003096064,3003097087,AT
3003097088,3003099135,FR
3003099136,3003101183,CZ
@@ -42546,43 +46097,64 @@
3003128320,3003128575,PY
3003128576,3003128831,CO
3003128832,3003129087,TT
+3003129088,3003129343,CO
3003129344,3003129599,BO
3003129600,3003129855,HN
-3003129856,3003138815,CR
-3003138816,3003139071,PA
+3003129856,3003138559,CR
+3003138560,3003139071,PA
3003139072,3003139583,CR
3003139584,3003140351,PA
-3003140352,3003140863,CR
-3003140864,3003141119,PA
-3003141120,3003143935,CR
-3003143936,3003144447,PA
+3003140352,3003140607,CR
+3003140608,3003141375,PA
+3003141376,3003141631,CR
+3003141632,3003141887,PA
+3003141888,3003143679,CR
+3003143680,3003144447,PA
3003144448,3003146239,CR
3003146240,3003146495,PA
3003146496,3003147007,CR
3003147008,3003147263,PA
3003147264,3003148031,CR
3003148032,3003148543,PA
-3003148544,3003149055,CR
-3003149056,3003149311,PA
-3003149312,3003152127,CR
-3003152128,3003152383,PA
-3003152384,3003154431,CR
+3003148544,3003148799,CR
+3003148800,3003149311,PA
+3003149312,3003151871,CR
+3003151872,3003152383,PA
+3003152384,3003152639,CR
+3003152640,3003152895,PA
+3003152896,3003154431,CR
3003154432,3003154687,CL
3003154688,3003154943,EC
3003154944,3003159039,AR
3003159040,3003159295,CO
3003159296,3003160575,AR
3003160576,3003161599,CL
+3003161600,3003162623,UY
3003162624,3003170815,CR
+3003170816,3003171071,GT
+3003171072,3003171327,AR
+3003171328,3003171839,PA
+3003171840,3003172863,TT
+3003172864,3003173375,PA
+3003173376,3003173631,CR
+3003173632,3003173887,AR
+3003173888,3003174143,EC
+3003174144,3003174399,CO
+3003174912,3003179007,CR
+3003179008,3003187199,AR
3003187200,3003252735,CO
3003252736,3003449343,CL
3003449344,3003514879,SV
3003514880,3003645951,PE
3003645952,3003777023,CL
+3003777024,3003908095,BR
3003908096,3004170239,CO
+3004170240,3004301311,BR
+3004301312,3004432383,CO
3004432384,3004694527,VE
3004694528,3005218815,UY
3005218816,3005349887,CO
+3005349888,3005480959,BR
3005480960,3005874175,AR
3005874176,3005875455,PA
3005875456,3005875711,CO
@@ -42601,26 +46173,34 @@
3005890304,3005891071,PA
3005891072,3005891327,CO
3005891328,3005893119,PA
-3005893120,3005893375,CO
-3005893376,3005893887,PA
+3005893120,3005893631,CO
+3005893632,3005893887,PA
3005893888,3005894143,CO
3005894144,3005894655,PA
3005894656,3005894911,CO
3005894912,3005896703,PA
3005896704,3005896959,CO
-3005896960,3005902591,PA
+3005896960,3005899263,PA
+3005899264,3005899519,CO
+3005899520,3005900031,PA
+3005900032,3005900287,CO
+3005900288,3005902591,PA
3005902592,3005902847,CO
-3005902848,3005903615,PA
-3005903616,3005903871,CO
-3005903872,3005905919,PA
-3005905920,3005906431,CO
-3005906432,3005906687,PA
-3005906688,3005906943,CO
+3005902848,3005903359,PA
+3005903360,3005903871,CO
+3005903872,3005905151,PA
+3005905152,3005905407,CO
+3005905408,3005905919,PA
+3005905920,3005906943,CO
3005906944,3005911039,PA
3005911040,3005911295,CO
-3005911296,3005913855,PA
-3005913856,3005914111,CO
-3005914112,3005915135,PA
+3005911296,3005911551,PA
+3005911552,3005911807,CO
+3005911808,3005913343,PA
+3005913344,3005913599,CO
+3005913600,3005913855,PA
+3005913856,3005914623,CO
+3005914624,3005915135,PA
3005915136,3005918207,AR
3005918208,3005919231,CO
3005919232,3005923327,AR
@@ -42652,8 +46232,7 @@
3006279168,3006279423,NI
3006279424,3006283519,PA
3006283520,3006283775,NI
-3006283776,3006284031,PA
-3006284032,3006284287,CR
+3006283776,3006284287,CR
3006284288,3006284799,PA
3006284800,3006285055,CR
3006285056,3006285311,PA
@@ -42663,8 +46242,10 @@
3006286080,3006287103,PA
3006287104,3006287359,CR
3006287360,3006288639,PA
-3006288640,3006288895,CR
-3006288896,3006291455,PA
+3006288640,3006289151,CR
+3006289152,3006289663,PA
+3006289664,3006289919,CR
+3006289920,3006291455,PA
3006291456,3006291711,CR
3006291712,3006292991,PA
3006292992,3006293247,CR
@@ -42674,15 +46255,23 @@
3006308352,3006308863,CR
3006308864,3006310143,PA
3006310144,3006310399,CR
-3006310400,3006311679,PA
+3006310400,3006311167,PA
+3006311168,3006311423,CR
+3006311424,3006311679,PA
3006311680,3006312191,CR
3006312192,3006312703,PA
3006312704,3006312959,CR
-3006312960,3006315519,PA
-3006315520,3006315775,CR
-3006315776,3006321663,PA
-3006321664,3006321919,CR
-3006321920,3006322431,PA
+3006312960,3006313727,PA
+3006313728,3006313983,CR
+3006313984,3006314239,PA
+3006314240,3006314495,CR
+3006314496,3006315263,PA
+3006315264,3006315775,CR
+3006315776,3006320895,PA
+3006320896,3006321151,CR
+3006321152,3006321663,PA
+3006321664,3006322175,CR
+3006322176,3006322431,PA
3006322432,3006323199,CR
3006323200,3006323455,PA
3006323456,3006323711,CR
@@ -42716,18 +46305,18 @@
3006507520,3006507775,MX
3006507776,3006512895,CR
3006512896,3006513151,MX
-3006513152,3006513407,CR
-3006513408,3006513663,PA
+3006513152,3006513663,PA
3006513664,3006514431,CR
3006514432,3006514687,PA
3006514688,3006517503,CR
3006517504,3006517759,NI
-3006517760,3006518783,CR
-3006518784,3006519039,NI
+3006517760,3006518527,CR
+3006518528,3006519039,NI
3006519040,3006521343,CR
3006521344,3006528511,AR
3006528512,3006529535,BZ
3006529536,3006660607,DO
+3006660608,3006791679,BR
3006791680,3006922751,CL
3006922752,3007053823,BO
3007053824,3007062015,AR
@@ -42743,10 +46332,13 @@
3007092736,3007094783,AR
3007094784,3007096831,CR
3007096832,3007098879,AR
-3007098880,3007100927,HN
+3007098880,3007100887,HN
+3007100888,3007100895,PH
+3007100896,3007100927,HN
3007100928,3007102975,AR
3007102976,3007103999,US
3007104000,3007106047,AR
+3007106048,3007107071,PE
3007107072,3007108095,AR
3007108096,3007109119,TT
3007109120,3007111167,AR
@@ -42759,47 +46351,73 @@
3007123456,3007143935,AR
3007143936,3007148031,CL
3007148032,3007152127,CO
-3007152128,3007184895,CL
+3007152128,3007152383,CL
+3007152384,3007152639,US
+3007152640,3007152895,CL
+3007152896,3007153151,US
+3007153152,3007153407,CL
+3007153408,3007153663,US
+3007153664,3007153919,CL
+3007153920,3007154175,US
+3007154176,3007154431,CL
+3007154432,3007154687,US
+3007154688,3007154943,CL
+3007154944,3007155199,US
+3007155200,3007155455,CL
+3007155456,3007155711,GB
+3007155712,3007155967,CL
+3007155968,3007156223,DE
+3007156224,3007175679,CL
+3007175680,3007175935,GB
+3007175936,3007184895,CL
3007184896,3007250431,AR
3007250432,3007268095,CR
-3007268096,3007268351,PA
-3007268352,3007269631,CR
-3007269632,3007269887,PA
-3007269888,3007270911,CR
+3007268096,3007268607,PA
+3007268608,3007269631,CR
+3007269632,3007270143,PA
+3007270144,3007270911,CR
3007270912,3007271167,PA
3007271168,3007272191,CR
3007272192,3007272447,PA
3007272448,3007272959,CR
3007272960,3007273215,PA
-3007273216,3007274751,CR
+3007273216,3007273727,CR
+3007273728,3007274239,PA
+3007274240,3007274751,CR
3007274752,3007275007,PA
3007275008,3007279359,CR
3007279360,3007279871,PA
3007279872,3007280639,CR
3007280640,3007280895,PA
3007280896,3007281151,CR
-3007281152,3007281407,PA
-3007281408,3007281663,CR
-3007281664,3007281919,PA
-3007281920,3007283967,CR
+3007281152,3007281919,PA
+3007281920,3007283455,CR
+3007283456,3007283711,PA
+3007283712,3007283967,CR
3007283968,3007284223,PA
3007284224,3007286015,CR
3007286016,3007286271,PA
3007286272,3007286783,CR
3007286784,3007287295,PA
3007287296,3007287551,CR
-3007287552,3007287807,MX
-3007287808,3007289087,CR
+3007287552,3007288063,MX
+3007288064,3007289087,CR
3007289088,3007289343,MX
-3007289344,3007292415,CR
+3007289344,3007290367,CR
+3007290368,3007290623,PA
+3007290624,3007291135,CR
+3007291136,3007291391,PA
+3007291392,3007292415,CR
3007292416,3007292671,MX
3007292672,3007293439,CR
-3007293440,3007293695,MX
-3007293696,3007294207,CR
+3007293440,3007293951,MX
+3007293952,3007294207,CR
3007294208,3007294463,MX
3007294464,3007294719,CR
3007294720,3007294975,MX
-3007294976,3007296767,CR
+3007294976,3007296255,CR
+3007296256,3007296511,MX
+3007296512,3007296767,CR
3007296768,3007297023,MX
3007297024,3007299583,CR
3007299584,3007301631,PA
@@ -42810,21 +46428,7 @@
3007312896,3007313919,CL
3007313920,3007314943,AR
3007314944,3007315967,HN
-3007315968,3009472511,BR
-3009474560,3009527807,BR
-3009544192,3010002943,BR
-3010068480,3010111487,BR
-3010113536,3010166783,BR
-3010174976,3010246655,BR
-3010248704,3012427775,BR
-3012558848,3015526399,BR
-3015528448,3015536639,BR
-3015540736,3015544831,BR
-3015548928,3015589887,BR
-3015606272,3015641087,BR
-3015643136,3015653375,BR
-3015655424,3015696383,BR
-3015704576,3019898879,BR
+3007315968,3019898879,BR
3019898880,3024093183,JP
3024093184,3024617471,KR
3024617472,3024879615,MY
@@ -42845,22 +46449,31 @@
3025608204,3025616895,IN
3025616896,3025617407,SG
3025617408,3025618943,IN
-3025618944,3025619455,SG
-3025619456,3025620991,IN
+3025618944,3025619471,SG
+3025619472,3025620991,IN
3025620992,3025621247,PH
-3025621248,3025625391,IN
+3025621248,3025625343,IN
+3025625344,3025625375,SG
+3025625376,3025625391,IN
3025625392,3025625395,SG
3025625396,3025625407,IN
3025625408,3025625471,SG
3025625472,3025625599,IN
3025625600,3025625855,SG
3025625856,3025629439,IN
-3025629440,3025629467,HK
-3025629468,3025631239,IN
+3025629440,3025629503,HK
+3025629504,3025629695,IN
+3025629696,3025629951,HK
+3025629952,3025630207,IN
+3025630208,3025630719,AU
+3025630720,3025631239,IN
3025631240,3025631247,AU
-3025631248,3025633535,IN
+3025631248,3025632255,IN
+3025632256,3025632271,SG
+3025632272,3025633535,IN
3025633536,3025633791,HK
-3025633792,3025637375,IN
+3025633792,3025633807,AU
+3025633808,3025637375,IN
3025637376,3025637631,HK
3025637632,3025637887,MY
3025637888,3025638279,IN
@@ -42868,22 +46481,26 @@
3025638288,3025638399,IN
3025638400,3025638655,SG
3025638656,3025638783,IN
-3025638784,3025638787,HK
-3025638788,3025639167,IN
+3025638784,3025638791,HK
+3025638792,3025639167,IN
3025639168,3025639175,SG
3025639176,3025639423,IN
3025639424,3025639679,SG
3025639680,3025639935,HK
3025639936,3025640447,IN
-3025640448,3025640703,MY
-3025640704,3025641727,IN
+3025640448,3025640799,MY
+3025640800,3025641727,IN
3025641728,3025641743,HK
3025641744,3025641759,IN
3025641760,3025641775,HK
3025641776,3025647103,IN
3025647104,3025647359,SG
3025647360,3025647615,AU
-3025647616,3025649151,IN
+3025647616,3025647775,IN
+3025647776,3025647791,SG
+3025647792,3025648079,IN
+3025648080,3025648087,SG
+3025648088,3025649151,IN
3025649152,3025649663,HK
3025649664,3025666047,IN
3025666048,3025928191,CN
@@ -42997,7 +46614,9 @@
3031695360,3031760895,TH
3031760896,3031826431,AU
3031826432,3031891967,KR
-3031891968,3031957503,TH
+3031891968,3031913983,TH
+3031913984,3031914239,SG
+3031914240,3031957503,TH
3031957504,3032252415,CN
3032252416,3032271871,HK
3032271872,3032272895,AU
@@ -43118,16 +46737,25 @@
3038904320,3039035391,VE
3039035392,3039166463,DO
3039166464,3039231999,PA
+3039232000,3039297535,EC
3039297536,3039363071,PY
3039363072,3039412223,BZ
3039412224,3039412991,CL
3039412992,3039413247,BR
-3039413248,3039415295,CL
+3039413248,3039413503,CL
+3039413504,3039414015,BR
+3039414016,3039414271,CL
+3039414272,3039414527,BR
+3039414528,3039415295,CL
3039415296,3039415807,BR
-3039415808,3039417087,CL
-3039417088,3039417343,BR
-3039417344,3039419647,CL
-3039419648,3039420159,BR
+3039415808,3039416831,CL
+3039416832,3039417343,BR
+3039417344,3039417855,CL
+3039417856,3039418111,BR
+3039418112,3039418367,CL
+3039418368,3039418623,BR
+3039418624,3039419391,CL
+3039419392,3039420159,BR
3039420160,3039420415,CL
3039420416,3039428607,AR
3039428608,3039559679,CL
@@ -43136,7 +46764,8 @@
3040870400,3041132543,PE
3041132544,3041394687,CO
3041394688,3041656831,CL
-3041918976,3044016127,AR
+3041656832,3041787903,BR
+3041787904,3044016127,AR
3044016128,3044147199,EC
3044147200,3044155391,GT
3044155392,3044161535,AR
@@ -43225,9 +46854,14 @@
3050405888,3050438655,GT
3050438656,3050504191,HN
3050504192,3050569727,EC
+3050635264,3050700799,BR
+3050700800,3050831871,CL
+3050831872,3051356159,BR
3051356160,3051373055,CR
3051373056,3051373311,PA
-3051373312,3051374847,CR
+3051373312,3051374335,CR
+3051374336,3051374591,PA
+3051374592,3051374847,CR
3051374848,3051375615,PA
3051375616,3051376895,CR
3051376896,3051377151,PA
@@ -43236,7 +46870,8 @@
3051379712,3051380735,CR
3051380736,3051388927,AR
3051388928,3051395071,US
-3051395072,3051397119,PA
+3051395072,3051395583,NL
+3051395584,3051397119,PA
3051397120,3051398143,CO
3051398144,3051399167,AR
3051399168,3051400191,DO
@@ -43286,6 +46921,7 @@
3051974656,3051976191,CR
3051976192,3051976447,PA
3051976448,3051983871,CR
+3051983872,3051984895,BR
3051984896,3051995135,CR
3051995136,3052011519,PE
3052011520,3052273663,CO
@@ -43420,7 +47056,7 @@
3068986368,3068987391,AU
3068987392,3068990463,IN
3068990464,3068991487,VN
-3068991488,3068992511,IN
+3068991488,3068991743,IN
3068993536,3069018111,KR
3069018112,3069034495,IN
3069034496,3069050879,KR
@@ -43508,6 +47144,7 @@
3082158080,3082166271,CN
3082166272,3082174463,JP
3082174464,3082178559,PH
+3082178560,3082179583,HK
3082179584,3082181631,IN
3082181632,3082182655,ID
3082182656,3082190847,LA
@@ -43515,9 +47152,9 @@
3082289152,3087007743,CN
3087007744,3088629759,US
3088629760,3088633855,NL
-3088633856,3088711167,US
-3088711168,3088711423,AU
-3088711424,3090325503,US
+3088633856,3088998399,US
+3088998400,3089002495,NL
+3089002496,3090325503,US
3090325504,3090329599,NL
3090329600,3090389503,US
3090389504,3090389631,CA
@@ -43529,15 +47166,21 @@
3091976192,3091980287,CA
3091980288,3092569343,US
3092569344,3092569599,AU
-3092569600,3092615167,US
+3092569600,3092578303,US
+3092578304,3092582399,NL
+3092582400,3092615167,US
3092615168,3092619263,NL
3092619264,3092623359,US
3092623360,3092631551,NL
3092631552,3092643839,US
3092643840,3092647935,NL
-3092647936,3092688895,US
+3092647936,3092656127,US
+3092656128,3092660223,NL
+3092660224,3092688895,US
3092688896,3092692991,NL
-3092692992,3093168127,US
+3092692992,3092754431,US
+3092754432,3092758527,NL
+3092758528,3093168127,US
3093168128,3093200895,CA
3093200896,3093213183,US
3093213184,3093217279,CA
@@ -43551,7 +47194,9 @@
3093839872,3093843455,NL
3093843456,3093850111,US
3093850112,3093855487,DE
-3093855488,3094020095,US
+3093855488,3093908991,US
+3093908992,3093909247,PR
+3093909248,3094020095,US
3094020096,3094032759,CA
3094032760,3094032767,GI
3094032768,3094085631,CA
@@ -43601,11 +47246,18 @@
3098278848,3098278911,CA
3098278912,3098476543,US
3098476544,3098492927,CA
-3098492928,3098525695,US
-3098542080,3103784959,US
+3098492928,3098494719,US
+3098494720,3098495743,CA
+3098495744,3098495999,US
+3098496000,3098496255,CA
+3098496256,3098503423,US
+3098503424,3098503679,CA
+3098503680,3098507263,US
+3098507264,3098507519,CA
+3098507520,3103784959,US
3103850496,3103850751,RU
3103850752,3103851007,PS
-3103851008,3103851263,FR
+3103851008,3103851519,FR
3103851520,3103852543,PL
3103852544,3103852799,AE
3103852800,3103853567,PL
@@ -43618,7 +47270,13 @@
3103855104,3103855359,DE
3103855360,3103855615,RU
3103855616,3103855871,ES
-3103855872,3103856127,PL
+3103855872,3103856383,PL
+3103856384,3103856639,RU
+3103856640,3103856895,HU
+3103856896,3103857151,CZ
+3103857152,3103857407,FR
+3103857408,3103857663,RS
+3103857664,3103857919,FR
3103916032,3103917055,CH
3103917056,3103918079,IT
3103918080,3103919103,DE
@@ -43626,9 +47284,10 @@
3103920128,3103921151,DE
3103921152,3103922175,CH
3103922176,3103923199,NL
-3103923200,3103923711,SE
-3103923712,3103924223,NL
-3103924224,3103925247,RU
+3103923200,3103923455,SE
+3103923456,3103924223,NL
+3103924224,3103924479,DE
+3103924480,3103925247,RU
3103925248,3103926271,PL
3103926272,3103927295,CZ
3103927296,3103929343,NL
@@ -43662,7 +47321,10 @@
3103956992,3103958015,DE
3103958016,3103960063,GB
3103960064,3103961087,NL
-3103961088,3103962111,AT
+3103961088,3103961343,TR
+3103961344,3103961599,AE
+3103961600,3103961855,AR
+3103961856,3103962111,AT
3103962112,3103963135,DE
3103963136,3103964159,RU
3103964160,3103965183,MK
@@ -43673,7 +47335,9 @@
3103970304,3103971327,UA
3103971328,3103973375,GB
3103973376,3103974399,KZ
-3103974400,3103975423,SE
+3103974400,3103974911,SE
+3103974912,3103974919,LT
+3103974920,3103975423,SE
3103975424,3103976447,SA
3103976448,3103977471,GB
3103977472,3103978495,NL
@@ -43767,10 +47431,7 @@
3104075776,3104076799,NL
3104076800,3104077823,GB
3104077824,3104078847,AT
-3104078848,3104079103,LU
-3104079104,3104079359,FR
-3104079360,3104079615,LU
-3104079616,3104079871,FR
+3104078848,3104079871,LU
3104079872,3104080895,GB
3104080896,3104081919,GR
3104081920,3104082943,DK
@@ -43944,7 +47605,7 @@
3104261120,3104262143,NL
3104262144,3104263167,FR
3104263168,3104264191,NL
-3104264192,3104265215,TR
+3104264192,3104265215,GB
3104265216,3104266239,RU
3104266240,3104267263,GB
3104267264,3104268287,RU
@@ -44012,7 +47673,11 @@
3104334848,3104335871,SE
3104335872,3104336239,LT
3104336240,3104336255,DE
-3104336256,3104336895,LT
+3104336256,3104336359,LT
+3104336360,3104336367,BE
+3104336368,3104336407,LT
+3104336408,3104336415,CH
+3104336416,3104336895,LT
3104336896,3104337919,GB
3104337920,3104338943,IE
3104338944,3104339967,DE
@@ -44350,7 +48015,7 @@
3104706560,3104707583,UA
3104707584,3104708607,TR
3104708608,3104709631,ES
-3104709632,3104710655,UA
+3104709632,3104710655,NL
3104710656,3104711679,RU
3104711680,3104712703,ES
3104712704,3104714751,RU
@@ -44479,7 +48144,8 @@
3104847872,3104848895,RU
3104848896,3104849919,DE
3104849920,3104850943,RU
-3104850944,3104851967,GB
+3104850944,3104851199,JE
+3104851200,3104851967,GB
3104851968,3104852991,DE
3104852992,3104854015,AT
3104854016,3104855039,GI
@@ -44574,6 +48240,7 @@
3104948224,3104949247,DK
3104949248,3104950271,GB
3104950272,3104951295,RU
+3104951296,3104952319,DE
3104952320,3104953343,CH
3104953344,3104954367,CZ
3104954368,3104955391,DK
@@ -44686,7 +48353,7 @@
3105072128,3105073151,IT
3105073152,3105074175,RU
3105074176,3105075199,DE
-3105075200,3105076223,DK
+3105075200,3105076223,SE
3105076224,3105077247,BE
3105077248,3105078271,IT
3105078272,3105079295,ES
@@ -44923,7 +48590,6 @@
3105331200,3105332223,IQ
3105332224,3105333247,DE
3105333248,3105334271,LV
-3105334272,3105335295,RU
3105335296,3105336319,GR
3105336320,3105337343,IL
3105337344,3105339391,GB
@@ -44966,7 +48632,9 @@
3105380352,3105381375,PL
3105381376,3105382399,RU
3105382400,3105383423,GB
-3105383424,3105384447,AT
+3105383424,3105383679,BY
+3105383680,3105383935,SK
+3105383936,3105384447,AT
3105384448,3105385471,IT
3105385472,3105386495,DE
3105386496,3105387519,RU
@@ -44977,8 +48645,7 @@
3105390592,3105391615,JO
3105391616,3105392639,NL
3105392640,3105393663,IR
-3105393664,3105394687,FR
-3105394688,3105395711,MD
+3105393664,3105395711,FR
3105395712,3105396735,IR
3105396736,3105398783,FR
3105398784,3105399807,GB
@@ -45062,7 +48729,9 @@
3105483776,3105486847,GB
3105486848,3105487871,SK
3105487872,3105488895,IS
-3105488896,3105489919,BG
+3105488896,3105489407,BG
+3105489408,3105489663,FR
+3105489664,3105489919,BG
3105489920,3105490943,ES
3105490944,3105491967,SE
3105491968,3105494015,GB
@@ -45088,7 +48757,7 @@
3105515520,3105516543,FR
3105516544,3105517567,NL
3105517568,3105518591,RU
-3105518592,3105519615,US
+3105518592,3105519615,GB
3105519616,3105520639,RU
3105520640,3105521663,FR
3105521664,3105522687,NO
@@ -45104,7 +48773,10 @@
3105531904,3105532927,RU
3105532928,3105533951,RS
3105533952,3105534975,BA
-3105534976,3105535999,NO
+3105534976,3105535231,GB
+3105535232,3105535773,NO
+3105535774,3105535774,RU
+3105535775,3105535999,NO
3105536000,3105537023,AZ
3105537024,3105538047,AT
3105538048,3105539071,RU
@@ -45118,7 +48790,8 @@
3105546240,3105547263,ES
3105547264,3105548287,GB
3105548288,3105549311,IR
-3105549312,3105550079,AT
+3105549312,3105549823,AT
+3105549824,3105550079,NL
3105550080,3105550335,FR
3105551360,3105552383,US
3105552384,3105553407,FR
@@ -45190,13 +48863,14 @@
3105624064,3105625087,PL
3105625088,3105626111,US
3105626112,3105629183,GB
-3105629184,3105630207,BE
+3105629184,3105629695,BE
+3105629696,3105629951,NL
+3105629952,3105630207,BE
3105630208,3105631231,FR
3105631232,3105632255,GB
3105632256,3105633279,ES
3105633280,3105634303,IT
3105634304,3105635327,NL
-3105635328,3105636351,GB
3105636352,3105637375,IT
3105637376,3105637631,NL
3105637632,3105637887,DE
@@ -45207,12 +48881,15 @@
3105641472,3105642495,NL
3105642496,3105644543,GB
3105644544,3105645567,DE
-3105645568,3105646591,SK
+3105645568,3105646335,CZ
+3105646336,3105646591,SK
3105646592,3105647615,MD
3105647616,3105648639,UA
3105648640,3105649663,GB
3105649664,3105650687,PL
-3105650688,3105651711,EE
+3105650688,3105651199,EE
+3105651200,3105651455,PL
+3105651456,3105651711,EE
3105651712,3105652735,SK
3105652736,3105653759,NO
3105653760,3105654783,TR
@@ -45245,8 +48922,8 @@
3105683456,3105684479,PL
3105684480,3105686527,GB
3105686528,3105687551,BE
-3105687552,3105687807,SE
-3105687808,3105688575,LV
+3105687552,3105688063,SE
+3105688064,3105688575,LV
3105688576,3105689599,PL
3105689600,3105690623,SI
3105690624,3105691647,SE
@@ -45323,7 +49000,8 @@
3105763328,3105764351,FR
3105764352,3105765375,BE
3105765376,3105766399,NL
-3105766400,3105770495,IT
+3105766400,3105769471,IT
+3105769472,3105770495,IE
3105770496,3105771519,IR
3105771520,3105772543,IT
3105772544,3105773567,UA
@@ -45418,8 +49096,6 @@
3105869824,3105870847,DE
3105870848,3105871871,AT
3105871872,3105872895,PL
-3105872896,3105873919,GB
-3105873920,3105874943,AT
3105874944,3105875967,NL
3105875968,3105876991,GB
3105876992,3105878015,ES
@@ -45444,9 +49120,7 @@
3105896448,3105897471,RU
3105897472,3105898495,UA
3105898496,3105899007,CZ
-3105899008,3105899263,RU
-3105899264,3105899519,CZ
-3105899520,3105900543,RU
+3105899008,3105900543,RU
3105900544,3105902591,GB
3105902592,3105903615,DE
3105903616,3105904639,RU
@@ -45479,9 +49153,13 @@
3105933344,3105933359,IT
3105933360,3105933463,GB
3105933464,3105933471,IT
-3105933472,3105933591,GB
-3105933592,3105933599,IT
-3105933600,3105934231,GB
+3105933472,3105933631,GB
+3105933632,3105933639,IT
+3105933640,3105934007,GB
+3105934008,3105934015,IT
+3105934016,3105934215,GB
+3105934216,3105934223,IT
+3105934224,3105934231,GB
3105934232,3105934239,IT
3105934240,3105934335,GB
3105934336,3105935359,SE
@@ -45533,13 +49211,14 @@
3105981440,3105982463,ES
3105982464,3105983487,CZ
3105983488,3105984511,UA
-3105984512,3105985535,HU
+3105984512,3105985279,CZ
+3105985280,3105985535,HU
3105985536,3105986559,GB
3105986560,3105987583,NL
3105987584,3105988607,CZ
3105988608,3105989631,RU
3105989632,3105990655,NL
-3105990656,3105991679,PS
+3105990656,3105991679,US
3105991680,3105992703,SA
3105992704,3105993727,BH
3105993728,3105994751,DE
@@ -45570,7 +49249,9 @@
3106020352,3106021375,PL
3106021376,3106022399,FR
3106022400,3106023423,IT
-3106023424,3106024447,NL
+3106023424,3106023679,NL
+3106023680,3106024319,US
+3106024320,3106024447,RU
3106024448,3106025471,GB
3106025472,3106026495,PL
3106026496,3106027519,NL
@@ -45638,9 +49319,13 @@
3106092032,3106093055,BE
3106093056,3106094079,GB
3106094080,3106095103,CH
-3106095104,3106096127,DE
+3106095104,3106096127,FR
3106096128,3106097151,LV
-3106097152,3106099199,GB
+3106097152,3106098175,GB
+3106098176,3106098431,NL
+3106098432,3106098687,GB
+3106098688,3106098943,US
+3106098944,3106099199,GB
3106099200,3106100223,NO
3106100224,3106101247,SE
3106101248,3106102271,GB
@@ -45742,7 +49427,7 @@
3106204672,3106205695,MT
3106205696,3106206719,NO
3106206720,3106207743,GE
-3106207744,3106208767,SE
+3106207744,3106208767,GB
3106208768,3106209791,RO
3106209792,3106210815,CH
3106210816,3106211839,NL
@@ -45906,7 +49591,7 @@
3106380800,3106381823,FR
3106381824,3106382847,PL
3106382848,3106383871,IE
-3106383872,3106384895,ES
+3106383872,3106384895,FR
3106384896,3106385919,AT
3106385920,3106386943,DE
3106386944,3106387967,IR
@@ -45961,7 +49646,8 @@
3106442240,3106443263,GB
3106443264,3106445311,ES
3106445312,3106446335,RU
-3106446336,3106448383,DE
+3106446336,3106447359,US
+3106447360,3106448383,DE
3106448384,3106449407,BG
3106449408,3106450431,AT
3106450432,3106451455,DE
@@ -45970,7 +49656,7 @@
3106453504,3106454527,SE
3106454528,3106455551,ME
3106455552,3106456575,PS
-3106456576,3106457599,RU
+3106456576,3106457599,PL
3106457600,3106458623,FI
3106458624,3106459647,GB
3106459648,3106460671,LB
@@ -46018,7 +49704,7 @@
3106505728,3106506751,CH
3106506752,3106509823,NL
3106509824,3106510847,SE
-3106510848,3106511871,ES
+3106510848,3106511871,FR
3106511872,3106512895,GE
3106512896,3106513919,RU
3106513920,3106514943,IT
@@ -46090,7 +49776,7 @@
3106592768,3106593791,LU
3106593792,3106594815,GB
3106594816,3106595839,IR
-3106595840,3106596863,CZ
+3106595840,3106596863,RU
3106596864,3106597887,FR
3106597888,3106598911,GB
3106598912,3106599935,ES
@@ -46121,7 +49807,8 @@
3106627584,3106628607,GB
3106628608,3106629631,RU
3106629632,3106630655,EE
-3106630656,3106631679,GB
+3106630656,3106630911,US
+3106630912,3106631679,GB
3106631680,3106632703,SK
3106632704,3106633727,DE
3106633728,3106634751,FI
@@ -46261,7 +49948,8 @@
3106780160,3106781183,FR
3106781184,3106782207,DK
3106782208,3106783231,IR
-3106783232,3106784255,SC
+3106783232,3106783743,NL
+3106783744,3106784255,AE
3106784256,3106785279,HU
3106785280,3106786303,CZ
3106786304,3106787327,DE
@@ -46308,12 +49996,815 @@
3106835456,3106836479,IT
3106836480,3106837503,KW
3106837504,3106838527,UA
-3106838528,3106839551,RU
+3106838528,3106838783,KZ
+3106838784,3106839551,RU
3106839552,3106840575,NL
3106840576,3106841599,BG
3106841600,3106842623,FR
3106842624,3106843647,PL
3106843648,3106844671,GB
+3106844672,3106845695,GE
+3106845696,3106846719,NL
+3106846720,3106847743,RU
+3106847744,3106848767,UA
+3106848768,3106849791,NL
+3106849792,3106850815,RU
+3106850816,3106851839,GB
+3106851840,3106852863,PL
+3106852864,3106853887,GB
+3106853888,3106854911,CH
+3106854912,3106855935,IR
+3106855936,3106856959,UA
+3106856960,3106857983,NO
+3106857984,3106859007,FR
+3106859008,3106860031,NL
+3106860032,3106861055,UA
+3106861056,3106863103,PL
+3106863104,3106864127,UA
+3106864128,3106865151,IE
+3106865152,3106866175,NL
+3106866176,3106867199,AZ
+3106867200,3106868223,LV
+3106868224,3106869247,NL
+3106869248,3106870271,ES
+3106870272,3106871295,NL
+3106871296,3106872319,CH
+3106872320,3106873343,BE
+3106873344,3106874367,ES
+3106874368,3106875391,RU
+3106875392,3106876415,SE
+3106876416,3106877439,CZ
+3106877440,3106878463,IR
+3106878464,3106879487,RU
+3106879488,3106880511,MK
+3106880512,3106881535,GB
+3106881536,3106882559,PL
+3106882560,3106883583,BE
+3106883584,3106884607,GB
+3106884608,3106885631,FI
+3106885632,3106886655,FR
+3106886656,3106887679,US
+3106887680,3106888703,RS
+3106888704,3106889727,LV
+3106889728,3106890751,IT
+3106890752,3106891775,NL
+3106891776,3106892799,GB
+3106892800,3106893823,IT
+3106893824,3106894847,NL
+3106894848,3106895871,GB
+3106895872,3106896895,NL
+3106896896,3106897919,DE
+3106897920,3106898943,ES
+3106898944,3106899967,NL
+3106899968,3106900991,IT
+3106900992,3106902015,DE
+3106902016,3106903039,IE
+3106903040,3106904063,BE
+3106904064,3106906111,RU
+3106906112,3106907135,HU
+3106907136,3106908159,SE
+3106908160,3106909183,NL
+3106909184,3106910207,IL
+3106910208,3106911231,CZ
+3106911232,3106912255,IQ
+3106912256,3106913279,HU
+3106913280,3106914303,ME
+3106914304,3106915327,SE
+3106915328,3106917375,NL
+3106917376,3106918399,RU
+3106918400,3106919423,RS
+3106919424,3106920447,ES
+3106920448,3106921471,GB
+3106921472,3106922495,CZ
+3106922496,3106923519,NL
+3106923520,3106924543,IT
+3106924544,3106925567,DE
+3106925568,3106926591,NL
+3106926592,3106927615,FR
+3106927616,3106928639,ES
+3106928640,3106929663,NO
+3106929664,3106930687,FR
+3106930688,3106931711,DE
+3106931712,3106932735,AT
+3106932736,3106933759,PL
+3106933760,3106934783,BE
+3106934784,3106935807,RU
+3106935808,3106936831,CZ
+3106936832,3106937855,TR
+3106937856,3106938879,PL
+3106938880,3106939903,IT
+3106939904,3106940927,RU
+3106940928,3106941951,HU
+3106941952,3106943999,FR
+3106944000,3106945023,IT
+3106945024,3106946047,DE
+3106946048,3106947071,GB
+3106947072,3106948095,AE
+3106948096,3106949119,NL
+3106949120,3106950143,RU
+3106950144,3106951167,GB
+3106951168,3106952191,SE
+3106952192,3106954239,ES
+3106954240,3106955263,DE
+3106955264,3106956287,IT
+3106956288,3106957311,NL
+3106957312,3106958335,DE
+3106958336,3106959359,GB
+3106959360,3106960383,RU
+3106960384,3106961407,DE
+3106961408,3106962431,IE
+3106962432,3106963455,KZ
+3106963456,3106964479,PL
+3106964480,3106965503,FR
+3106965504,3106966527,KG
+3106966528,3106967551,IT
+3106967552,3106968575,CH
+3106968576,3106969599,KZ
+3106969600,3106970623,DK
+3106970624,3106971647,DE
+3106971648,3106973695,GB
+3106973696,3106974719,PL
+3106974720,3106975743,BA
+3106975744,3106976767,PL
+3106976768,3106977791,TR
+3106977792,3106978815,RU
+3106978816,3106979839,KW
+3106979840,3106980863,ES
+3106980864,3106981887,UA
+3106981888,3106982911,FR
+3106982912,3106984959,DE
+3106984960,3106985983,TR
+3106985984,3106989055,DE
+3106989056,3106990079,CH
+3106990080,3106991103,PL
+3106991104,3106992127,RU
+3106992128,3106993151,AM
+3106993152,3106994175,DE
+3106994176,3106995199,SK
+3106995200,3106996223,FR
+3106996224,3106997247,SI
+3106997248,3106998271,NO
+3106998272,3106999295,IT
+3106999296,3107000319,PL
+3107000320,3107001343,DE
+3107001344,3107002367,FR
+3107002368,3107003391,AL
+3107003392,3107004415,PL
+3107004416,3107007487,GB
+3107007488,3107008511,TR
+3107008512,3107009535,NL
+3107009536,3107010559,AT
+3107010560,3107011583,IT
+3107011584,3107012607,IE
+3107012608,3107013631,RU
+3107013632,3107014655,DE
+3107014656,3107015679,GB
+3107015680,3107016703,DE
+3107016704,3107017727,NL
+3107017728,3107018751,IR
+3107018752,3107019775,BG
+3107019776,3107020799,GB
+3107020800,3107021823,IR
+3107021824,3107022847,DE
+3107022848,3107023871,IR
+3107023872,3107024895,RU
+3107024896,3107025919,GB
+3107025920,3107026943,SI
+3107026944,3107027967,NL
+3107027968,3107028991,GB
+3107028992,3107030015,TR
+3107030016,3107031039,SE
+3107031040,3107032063,DE
+3107032064,3107034111,NL
+3107034112,3107035135,PL
+3107035136,3107036159,CH
+3107036160,3107037183,ES
+3107037184,3107038207,BH
+3107038208,3107039231,GE
+3107039232,3107040255,ES
+3107040256,3107041279,GB
+3107041280,3107042303,AT
+3107042304,3107043327,BE
+3107043328,3107044351,ES
+3107044352,3107045375,CZ
+3107045376,3107046399,ES
+3107046400,3107047423,NO
+3107047424,3107048447,PL
+3107048448,3107049471,IT
+3107049472,3107050495,FR
+3107050496,3107051519,IT
+3107051520,3107052543,GB
+3107052544,3107053567,CH
+3107053568,3107054591,ES
+3107054592,3107057663,GB
+3107057664,3107058687,RU
+3107058688,3107059711,LU
+3107059712,3107060735,IT
+3107060736,3107061759,DK
+3107061760,3107062783,BY
+3107062784,3107063807,MD
+3107063808,3107064831,RU
+3107064832,3107065855,HR
+3107065856,3107067903,GB
+3107067904,3107068927,RU
+3107068928,3107069951,HU
+3107069952,3107070975,FR
+3107070976,3107073023,SE
+3107073024,3107074047,ES
+3107074048,3107075071,PL
+3107075072,3107076095,FR
+3107076096,3107077119,BA
+3107077120,3107078143,NL
+3107078144,3107079167,FR
+3107079168,3107080191,TR
+3107080192,3107082239,FR
+3107082240,3107083263,RU
+3107083264,3107084287,BE
+3107084288,3107085311,FI
+3107085312,3107086335,NL
+3107086336,3107087359,EE
+3107087360,3107088383,IE
+3107088384,3107089407,NL
+3107089408,3107090431,IT
+3107090432,3107091455,FR
+3107091456,3107092479,ES
+3107092480,3107093503,DE
+3107093504,3107094527,CZ
+3107094528,3107095551,FR
+3107095552,3107096575,CY
+3107096576,3107097599,RU
+3107097600,3107098623,DE
+3107098624,3107099647,ES
+3107099648,3107101695,CZ
+3107101696,3107102719,RU
+3107102720,3107103743,GB
+3107103744,3107104767,PL
+3107104768,3107105791,ES
+3107105792,3107106815,NL
+3107106816,3107107839,ES
+3107107840,3107108863,AL
+3107108864,3107109887,RS
+3107109888,3107110911,CH
+3107110912,3107111935,DE
+3107111936,3107112959,ES
+3107112960,3107113983,RU
+3107113984,3107115007,ES
+3107115008,3107116031,NL
+3107116032,3107117055,SK
+3107117056,3107118079,RU
+3107118080,3107120127,CH
+3107120128,3107121151,CZ
+3107121152,3107122175,AT
+3107122176,3107123199,CH
+3107123200,3107124223,GB
+3107124224,3107125247,FI
+3107125248,3107126271,UA
+3107126272,3107127295,FR
+3107127296,3107128319,SA
+3107128320,3107129343,US
+3107129344,3107130367,AT
+3107130368,3107131391,IT
+3107131392,3107132415,GE
+3107132416,3107133439,RU
+3107133440,3107134463,CY
+3107134464,3107135487,CZ
+3107135488,3107136511,SA
+3107136512,3107137535,TR
+3107137536,3107138559,IR
+3107138560,3107139583,ES
+3107139584,3107142655,NL
+3107142656,3107143679,RU
+3107143680,3107144703,HU
+3107144704,3107145727,CH
+3107145728,3107146751,IE
+3107146752,3107147775,DK
+3107147776,3107148799,GB
+3107148800,3107149823,DE
+3107149824,3107150847,PL
+3107150848,3107151871,PT
+3107151872,3107152895,PL
+3107152896,3107153919,GE
+3107153920,3107154943,IE
+3107154944,3107155967,ES
+3107155968,3107156991,TR
+3107156992,3107158015,PL
+3107158016,3107159039,IT
+3107159040,3107160063,RU
+3107160064,3107161087,AT
+3107161088,3107162111,GR
+3107162112,3107163135,IT
+3107163136,3107164159,RU
+3107164160,3107165183,SA
+3107165184,3107166207,NL
+3107166208,3107167231,AE
+3107167232,3107168255,RU
+3107168256,3107169279,ES
+3107169280,3107170303,TR
+3107170304,3107171327,IT
+3107171328,3107172351,GB
+3107172352,3107173375,FR
+3107173376,3107174399,PL
+3107174400,3107175423,DE
+3107175424,3107176447,HU
+3107176448,3107177471,NL
+3107177472,3107178495,AT
+3107178496,3107179519,IR
+3107179520,3107180543,SA
+3107180544,3107181567,RU
+3107181568,3107182591,JO
+3107182592,3107183615,FR
+3107183616,3107184639,IQ
+3107184640,3107185663,SE
+3107185664,3107186687,CZ
+3107186688,3107187711,GB
+3107187712,3107188735,MT
+3107188736,3107189759,CZ
+3107189760,3107190783,NL
+3107190784,3107191807,CZ
+3107191808,3107192831,GB
+3107192832,3107194879,NL
+3107194880,3107195903,IT
+3107195904,3107196927,NL
+3107196928,3107197951,ES
+3107197952,3107198975,AT
+3107198976,3107199999,GB
+3107200000,3107201023,RU
+3107201024,3107202047,FR
+3107202048,3107203071,GB
+3107203072,3107204095,NO
+3107204096,3107205119,FR
+3107205120,3107206143,BG
+3107206144,3107207167,NL
+3107207168,3107208191,DE
+3107208192,3107209215,NL
+3107209216,3107210239,IT
+3107210240,3107213311,RU
+3107213312,3107214335,GE
+3107214336,3107215359,FR
+3107215360,3107216383,CY
+3107216384,3107217407,IE
+3107217408,3107218431,CZ
+3107218432,3107219455,IQ
+3107219456,3107220479,NL
+3107220480,3107221503,GB
+3107221504,3107222527,IT
+3107222528,3107223551,IQ
+3107223552,3107224575,AT
+3107224576,3107225599,FR
+3107225600,3107226623,AZ
+3107226624,3107227647,RU
+3107227648,3107228671,US
+3107228672,3107229695,RU
+3107229696,3107231743,GB
+3107231744,3107232767,RU
+3107232768,3107233791,SE
+3107233792,3107234815,DE
+3107234816,3107235839,FI
+3107235840,3107236863,PL
+3107236864,3107237887,CZ
+3107237888,3107238911,NL
+3107238912,3107239935,SE
+3107239936,3107241983,AT
+3107241984,3107243007,PL
+3107243008,3107245055,GB
+3107245056,3107246079,BG
+3107246080,3107248127,NL
+3107248128,3107249151,IT
+3107249152,3107250175,GB
+3107250176,3107251199,NL
+3107251200,3107252223,TR
+3107252224,3107253247,SY
+3107253248,3107254271,NL
+3107254272,3107255295,IT
+3107255296,3107256319,DE
+3107256320,3107257343,CZ
+3107257344,3107258367,GB
+3107258368,3107259391,IT
+3107259392,3107260415,CZ
+3107260416,3107261439,NL
+3107261440,3107262463,SI
+3107262464,3107263487,GB
+3107263488,3107264511,RU
+3107264512,3107265535,FR
+3107265536,3107266559,GB
+3107266560,3107267583,IE
+3107267584,3107268607,IT
+3107268608,3107270655,DE
+3107270656,3107271679,NL
+3107271680,3107272703,AE
+3107272704,3107273727,GB
+3107273728,3107274751,TR
+3107274752,3107275775,SE
+3107275776,3107276799,IT
+3107276800,3107277823,BY
+3107277824,3107278847,UA
+3107278848,3107279871,FR
+3107279872,3107280895,FI
+3107280896,3107281919,NL
+3107281920,3107282943,GB
+3107282944,3107283967,PL
+3107283968,3107284991,AL
+3107284992,3107286015,KG
+3107286016,3107287039,AT
+3107287040,3107288063,RS
+3107288064,3107289087,NO
+3107289088,3107290111,IT
+3107290112,3107291135,PL
+3107291136,3107292159,NL
+3107292160,3107293183,PL
+3107293184,3107294207,FR
+3107294208,3107295231,DE
+3107295232,3107296255,PL
+3107296256,3107297279,IT
+3107297280,3107298303,PL
+3107298304,3107299327,DE
+3107299328,3107300351,NL
+3107300352,3107301375,SE
+3107301376,3107303423,GB
+3107303424,3107304447,DE
+3107304448,3107305471,AT
+3107305472,3107306495,FR
+3107306496,3107307519,NO
+3107307520,3107308543,IT
+3107308544,3107310591,RO
+3107310592,3107311615,DE
+3107311616,3107312639,IL
+3107312640,3107313663,SE
+3107313664,3107315711,DE
+3107315712,3107316735,GB
+3107316736,3107317759,KG
+3107317760,3107318783,RU
+3107318784,3107319807,NL
+3107319808,3107320831,OM
+3107320832,3107321855,SA
+3107321856,3107322879,NL
+3107322880,3107323903,IT
+3107323904,3107324927,ES
+3107324928,3107325951,CH
+3107325952,3107326975,FR
+3107326976,3107327999,LT
+3107328000,3107329023,AE
+3107329024,3107330047,RU
+3107330048,3107331071,GE
+3107331072,3107332095,NO
+3107332096,3107333119,IT
+3107333120,3107334143,FR
+3107334144,3107335167,RU
+3107335168,3107336191,NL
+3107336192,3107337215,RU
+3107337216,3107339263,PL
+3107339264,3107340287,LB
+3107340288,3107341311,GB
+3107341312,3107342335,DE
+3107342336,3107343359,GB
+3107343360,3107344383,DE
+3107344384,3107345407,CH
+3107345408,3107346431,GB
+3107346432,3107347455,TR
+3107347456,3107348479,NL
+3107348480,3107349503,LB
+3107349504,3107350527,PL
+3107350528,3107351551,IE
+3107351552,3107352575,DE
+3107352576,3107353599,NL
+3107353600,3107355647,DE
+3107355648,3107356671,GB
+3107356672,3107357695,SI
+3107357696,3107358719,SY
+3107358720,3107359743,RU
+3107359744,3107360767,GB
+3107360768,3107361791,AT
+3107361792,3107362815,DE
+3107362816,3107363839,IT
+3107363840,3107364863,IQ
+3107364864,3107365887,CY
+3107365888,3107366911,IQ
+3107366912,3107367935,GB
+3107367936,3107368959,CH
+3107368960,3107369983,RU
+3107369984,3107371007,NL
+3107371008,3107372031,PL
+3107372032,3107373055,DE
+3107373056,3107374079,ES
+3107374081,3107374100,MT
+3107374101,3107374120,CR
+3107374121,3107374140,IT
+3107374141,3107374160,ES
+3107374161,3107374180,AU
+3107374181,3107374200,SI
+3107374201,3107374220,BR
+3107374221,3107374240,CA
+3107374241,3107374260,BO
+3107374261,3107374280,US
+3107374321,3107374332,MX
+3107374334,3107374335,MX
+3107375104,3107376127,GB
+3107376128,3107377151,NL
+3107377152,3107378175,AT
+3107378176,3107379199,IT
+3107379200,3107380223,NL
+3107380224,3107381247,RU
+3107381248,3107382271,IE
+3107382272,3107383295,FR
+3107383296,3107384319,DE
+3107384320,3107385343,RU
+3107385344,3107386367,DE
+3107386368,3107387391,RU
+3107387392,3107388415,BE
+3107388416,3107389439,KG
+3107389440,3107390463,RU
+3107390464,3107391487,RO
+3107391488,3107392511,SE
+3107392512,3107393535,HU
+3107393536,3107394559,GB
+3107394560,3107395583,NL
+3107395584,3107396607,AT
+3107396608,3107397631,GR
+3107397632,3107398655,FI
+3107398656,3107399679,AZ
+3107399680,3107400703,RU
+3107400704,3107401727,AL
+3107401728,3107402751,EE
+3107402752,3107403775,NL
+3107403776,3107404799,ES
+3107404800,3107405823,GB
+3107405824,3107406847,PL
+3107406848,3107408895,DE
+3107408896,3107409919,GB
+3107409920,3107410943,IT
+3107410944,3107411967,FI
+3107411968,3107412991,IT
+3107412992,3107414015,BE
+3107414016,3107415039,FR
+3107415040,3107416063,DE
+3107416064,3107417087,NO
+3107417088,3107419135,NL
+3107419136,3107422207,DE
+3107422208,3107423231,NL
+3107423232,3107424255,GB
+3107424256,3107425279,NL
+3107425280,3107426303,RO
+3107426304,3107427327,FR
+3107427328,3107428351,AL
+3107428352,3107429375,DE
+3107429376,3107430399,CH
+3107430400,3107431423,GB
+3107431424,3107432447,FR
+3107432448,3107433471,IT
+3107433472,3107434495,RU
+3107434496,3107435519,FI
+3107435520,3107436543,DE
+3107436544,3107437567,IQ
+3107437568,3107438591,GB
+3107438592,3107439615,DE
+3107439616,3107440639,DK
+3107440640,3107442687,IE
+3107443712,3107444735,IT
+3107444736,3107445759,ES
+3107445760,3107446783,DE
+3107446784,3107447807,IR
+3107447808,3107448831,BG
+3107448832,3107449855,DE
+3107449856,3107450879,AT
+3107450880,3107451903,DE
+3107451904,3107452927,FR
+3107452928,3107453951,ES
+3107453952,3107454975,GB
+3107454976,3107455999,IT
+3107456000,3107457023,GB
+3107457024,3107458047,IT
+3107458048,3107459071,IS
+3107459072,3107460095,UA
+3107460096,3107461119,GB
+3107461120,3107462143,CH
+3107462144,3107464191,NL
+3107464192,3107465215,PL
+3107465216,3107467263,GB
+3107467264,3107468287,FR
+3107468288,3107469311,NL
+3107469312,3107470335,DK
+3107470336,3107471359,NL
+3107471360,3107473407,GB
+3107473408,3107474431,IL
+3107474432,3107475455,RO
+3107475456,3107476479,NL
+3107476480,3107477503,BG
+3107477504,3107478527,AE
+3107478528,3107480575,IR
+3107480576,3107481599,DK
+3107481600,3107482623,DE
+3107482624,3107483647,ES
+3107483648,3107484671,DE
+3107484672,3107485695,RU
+3107485696,3107486719,IT
+3107486720,3107487743,AT
+3107487744,3107489791,DE
+3107489792,3107490815,MT
+3107490816,3107491839,DK
+3107491840,3107492863,NL
+3107492864,3107493887,DE
+3107493888,3107494911,FR
+3107494912,3107495935,IT
+3107495936,3107495999,FR
+3107496000,3107496031,BS
+3107496032,3107496063,VG
+3107496064,3107496319,FR
+3107496320,3107496703,NL
+3107496704,3107496719,PE
+3107496720,3107496735,KP
+3107496736,3107496751,FJ
+3107496752,3107496767,AR
+3107496768,3107496783,FR
+3107496784,3107496799,AQ
+3107496800,3107496815,MX
+3107496816,3107496831,CN
+3107496832,3107496847,BR
+3107496848,3107496863,KP
+3107496864,3107496895,FR
+3107496896,3107496911,IS
+3107496912,3107496959,FR
+3107496960,3107497983,DK
+3107497984,3107499007,IT
+3107499008,3107500031,PL
+3107500032,3107501055,FR
+3107501056,3107502079,ES
+3107502080,3107503103,NO
+3107503104,3107504127,PL
+3107504128,3107505151,IQ
+3107505152,3107506175,SA
+3107506176,3107507199,GB
+3107507200,3107508223,FR
+3107508224,3107509247,PL
+3107509248,3107510271,SE
+3107510272,3107511295,IT
+3107511296,3107512319,SI
+3107512320,3107513343,NL
+3107513344,3107514367,DE
+3107514368,3107515391,US
+3107515392,3107516415,TR
+3107516416,3107517439,FR
+3107517440,3107518463,PL
+3107518464,3107519487,MK
+3107519488,3107520511,MT
+3107520512,3107521535,DE
+3107521536,3107522559,SE
+3107522560,3107523583,NL
+3107523584,3107524607,FR
+3107524608,3107525631,SI
+3107525632,3107526655,IT
+3107526656,3107527679,DE
+3107527680,3107528703,RU
+3107528704,3107531775,GB
+3107531776,3107532799,MD
+3107532800,3107533823,AT
+3107533824,3107534847,FR
+3107534848,3107536895,NL
+3107536896,3107537919,TR
+3107537920,3107538943,AM
+3107538944,3107539967,KZ
+3107539968,3107540991,GB
+3107540992,3107542015,RO
+3107542016,3107543039,SE
+3107543040,3107544063,DE
+3107544064,3107545087,IR
+3107545088,3107546111,NL
+3107546112,3107547135,GB
+3107547136,3107548159,SE
+3107548160,3107549183,IT
+3107549184,3107551231,IE
+3107551232,3107552255,JO
+3107552256,3107553279,FR
+3107553280,3107554303,BE
+3107554304,3107555327,IR
+3107555328,3107556351,SE
+3107556352,3107557375,NL
+3107557376,3107558399,SI
+3107558400,3107559423,FR
+3107559424,3107561471,GB
+3107561472,3107562495,GL
+3107562496,3107563519,IR
+3107563520,3107564543,SE
+3107564544,3107565567,ES
+3107565568,3107566591,AT
+3107566592,3107567615,FI
+3107567616,3107568639,DE
+3107568640,3107569663,GB
+3107569664,3107571711,ES
+3107571712,3107572735,IR
+3107572736,3107573759,ES
+3107573760,3107574783,IT
+3107574784,3107575807,JE
+3107575808,3107576831,DE
+3107576832,3107577855,FR
+3107577856,3107578879,SI
+3107578880,3107579903,CZ
+3107579904,3107580927,IT
+3107580928,3107581951,RU
+3107581952,3107582975,DE
+3107582976,3107583999,TR
+3107584000,3107585023,RU
+3107585024,3107586047,NO
+3107586048,3107587071,DE
+3107587072,3107588095,IT
+3107588096,3107589119,FR
+3107589120,3107590143,IQ
+3107590144,3107591167,IE
+3107591168,3107592191,BG
+3107592192,3107593215,NL
+3107593216,3107594239,DE
+3107594240,3107595263,FI
+3107595264,3107596287,DE
+3107596288,3107597311,CZ
+3107597312,3107598335,IT
+3107598336,3107599359,PL
+3107599360,3107600383,AT
+3107600384,3107601407,NL
+3107601408,3107602431,DK
+3107602432,3107603455,LT
+3107603456,3107604479,NO
+3107604480,3107605503,HR
+3107605504,3107606527,SE
+3107606528,3107607551,PT
+3107607552,3107609599,GB
+3107609600,3107610623,BA
+3107610624,3107611647,BE
+3107611648,3107612671,SK
+3107612672,3107613695,IT
+3107613696,3107614719,DE
+3107614720,3107615743,RU
+3107615744,3107617791,IT
+3107617792,3107618815,RU
+3107618816,3107619839,CH
+3107619840,3107620863,IT
+3107620864,3107621887,NO
+3107621888,3107622911,SA
+3107622912,3107623935,SE
+3107623936,3107624959,NL
+3107624960,3107625983,RU
+3107625984,3107627007,DE
+3107627008,3107628031,PL
+3107628032,3107629055,GB
+3107629056,3107630079,DE
+3107630080,3107631103,ES
+3107631104,3107632127,GB
+3107632128,3107633151,SI
+3107633152,3107634175,FR
+3107634176,3107635199,RU
+3107635200,3107636223,IT
+3107636224,3107637247,ES
+3107637248,3107638271,LB
+3107638272,3107639295,RU
+3107639296,3107640319,ES
+3107640320,3107641343,DK
+3107641344,3107643391,RU
+3107643392,3107644415,IT
+3107644416,3107645439,FR
+3107645440,3107646463,IE
+3107646464,3107647487,NL
+3107647488,3107648511,IR
+3107648512,3107649535,TR
+3107649536,3107651583,RU
+3107651584,3107652607,CZ
+3107652608,3107653631,PL
+3107653632,3107654655,FR
+3107654656,3107655679,DE
+3107655680,3107656703,BE
+3107656704,3107657727,IT
+3107657728,3107658751,SI
+3107658752,3107659775,TR
+3107659776,3107660799,EE
+3107660800,3107661823,NL
+3107661824,3107662847,FR
+3107662848,3107663871,TR
+3107663872,3107664895,ES
+3107664896,3107665919,CH
+3107665920,3107666943,RU
+3107666944,3107667967,GB
+3107667968,3107668991,ES
+3107668992,3107670015,AM
+3107670016,3107671039,TR
+3107671040,3107672063,NL
+3107672064,3107673087,IT
+3107673088,3107674111,AE
+3107674112,3107675135,PL
+3107675136,3107676159,GB
+3107676160,3107678207,DE
+3107678208,3107679231,DK
+3107679232,3107680255,PL
+3107680256,3107681279,IR
+3107681280,3107682303,FI
+3107682304,3107683327,CZ
+3107683328,3107684351,GB
+3107684352,3107685375,DE
+3107685376,3107686399,IT
+3107686400,3107688447,RU
+3107688448,3107689471,CZ
+3107689472,3107690495,US
+3107690496,3107691519,IT
+3107691520,3107692543,UA
+3107692544,3107693567,PL
+3107693568,3107694591,IT
+3107694592,3107695615,BE
3120562176,3120594943,CO
3120594944,3120599039,AR
3120599040,3120601087,EC
@@ -46321,7 +50812,9 @@
3120602112,3120603135,BO
3120603136,3120610303,AR
3120610304,3120611327,PY
-3120611328,3120627711,AR
+3120611328,3120617471,AR
+3120617472,3120617727,CL
+3120617728,3120627711,AR
3120627712,3120644095,NI
3120644096,3120660479,DO
3120660480,3120668671,PA
@@ -46343,7 +50836,9 @@
3120824320,3120840703,CR
3120840704,3120857087,AR
3120857088,3120922623,EC
-3120922624,3120930815,PA
+3120922624,3120922879,PA
+3120922880,3120922943,CR
+3120922944,3120930815,PA
3120930816,3120934911,CR
3120934912,3120949247,AR
3120949248,3120951295,CL
@@ -46410,9 +50905,7 @@
3123707904,3124232191,UY
3124232192,3124760751,AR
3124760752,3124760759,MX
-3124760760,3124765183,AR
-3124765184,3124765439,MX
-3124765440,3124783103,AR
+3124760760,3124783103,AR
3124783104,3124785151,GT
3124785152,3124788223,CL
3124788224,3124789247,PE
@@ -46426,7 +50919,9 @@
3124846592,3124848639,AR
3124848640,3124849663,PA
3124849664,3124850687,AR
-3124850688,3124854783,HN
+3124850688,3124853887,HN
+3124853888,3124853903,FR
+3124853904,3124854783,HN
3124854784,3124887551,CL
3124887552,3124953087,EC
3124953088,3125018623,CL
@@ -46462,9 +50957,7 @@
3128492032,3128524799,CO
3128524800,3128541183,AR
3128541184,3128557567,BO
-3128557568,3128574207,AR
-3128574208,3128574463,UY
-3128574464,3129999359,AR
+3128557568,3129999359,AR
3129999360,3130261503,CO
3130261504,3130277887,CL
3130277888,3130284031,AR
@@ -46505,7 +50998,8 @@
3132321792,3132325887,PA
3132325888,3132358655,SR
3132358656,3132489727,CO
-3132489728,3132555263,AR
+3132489728,3132588031,AR
+3132588032,3132620799,CO
3132620800,3132915711,VE
3132915712,3132948479,PA
3132948480,3133014015,AR
@@ -46516,15 +51010,13 @@
3133074432,3133075455,CL
3133075456,3133079551,CW
3133079552,3133145087,AR
-3133145088,3135429631,BR
-3135430656,3135978495,BR
-3135979520,3136011263,BR
-3136012288,3136109567,BR
-3136110592,3138387967,BR
-3138392064,3145727999,BR
+3133145088,3145727999,BR
3145728000,3149135871,MX
+3149135872,3149398015,BR
3149398016,3149881343,MX
+3149881344,3149889535,BR
3149922304,3154051071,MX
+3154051072,3154116607,BR
3154116608,3154124799,RU
3154124800,3154126847,PL
3154126848,3154128895,RU
@@ -46558,7 +51050,7 @@
3156803584,3156869119,TR
3156869120,3156930559,LU
3156930560,3156933631,US
-3156933632,3156934655,LU
+3156933632,3156934655,SG
3156934656,3157000191,RU
3157000192,3157008383,MK
3157008384,3157016575,RU
@@ -46570,7 +51062,9 @@
3157196800,3157262335,PL
3157262336,3157786623,SA
3157786624,3158048767,TR
-3158048768,3158310911,CH
+3158048768,3158214911,CH
+3158214912,3158215167,DE
+3158215168,3158310911,CH
3158310912,3158312959,FI
3158312960,3158315007,AZ
3158315008,3158317055,DE
@@ -46642,11 +51136,15 @@
3158458368,3158474751,GB
3158474752,3158507519,OM
3158507520,3158573055,FI
-3158573056,3158638591,RU
+3158573056,3158630399,RU
+3158630400,3158638591,PL
3158638592,3158704127,LT
3158704128,3158835199,KW
3158835200,3158851583,IQ
-3158851584,3158867967,RU
+3158851584,3158859775,RU
+3158859776,3158864383,NL
+3158864384,3158864639,RU
+3158864640,3158867967,NL
3158867968,3158884351,AZ
3158884352,3158884863,DE
3158884864,3158885119,GB
@@ -46820,39 +51318,33 @@
3161669888,3161670143,RE
3161670144,3161670399,FR
3161670400,3161670655,RE
-3161670656,3161671935,FR
-3161671936,3161672191,RE
-3161672192,3161672447,FR
-3161672448,3161672959,RE
-3161672960,3161674751,FR
-3161674752,3161675007,RE
-3161675008,3161675775,FR
+3161670656,3161671167,FR
+3161671168,3161671423,RE
+3161671424,3161672063,FR
+3161672064,3161672191,RE
+3161672192,3161672703,FR
+3161672704,3161672959,RE
+3161672960,3161673471,FR
+3161673472,3161673983,RE
+3161673984,3161675775,FR
3161675776,3161676031,RE
-3161676032,3161677055,FR
-3161677056,3161677311,RE
-3161677312,3161677823,FR
+3161676032,3161677823,FR
3161677824,3161678079,MQ
3161678080,3161678335,FR
-3161678336,3161678591,MQ
-3161678592,3161678847,FR
-3161678848,3161679871,MQ
-3161679872,3161680127,FR
-3161680128,3161680383,GP
-3161680384,3161680895,FR
-3161680896,3161681407,GP
-3161681408,3161681663,FR
-3161681664,3161681919,GP
-3161681920,3161682431,GF
-3161682432,3161682687,FR
-3161682688,3161682943,GF
-3161682944,3161683199,FR
-3161683200,3161683455,MQ
-3161683456,3161683711,FR
-3161683712,3161683967,MQ
+3161678336,3161679359,MQ
+3161679360,3161679615,FR
+3161679616,3161679871,MQ
+3161679872,3161680639,GP
+3161680640,3161681151,FR
+3161681152,3161681919,GP
+3161681920,3161682175,GF
+3161682176,3161682431,FR
+3161682432,3161682943,GF
+3161682944,3161683967,MQ
3161683968,3161684223,FR
3161684224,3161684479,MQ
-3161684480,3161684991,FR
-3161684992,3161685759,MQ
+3161684480,3161685503,FR
+3161685504,3161685759,MQ
3161685760,3161686015,FR
3161686016,3161702399,UA
3161702400,3161718783,AM
@@ -46890,8 +51382,18 @@
3162071040,3162087423,IR
3162087424,3162095615,SK
3162095616,3162103807,GE
-3162103808,3162104831,FR
-3162104832,3162111103,NL
+3162103808,3162105087,FR
+3162105088,3162105855,NL
+3162105856,3162106111,FR
+3162106112,3162106367,NL
+3162106368,3162106623,FR
+3162106624,3162107391,NL
+3162107392,3162107647,FR
+3162107648,3162108415,NL
+3162108416,3162108671,FR
+3162108672,3162108927,NL
+3162108928,3162109183,FR
+3162109184,3162111103,NL
3162111104,3162111167,FR
3162111168,3162111999,NL
3162112000,3162120191,PL
@@ -46899,7 +51401,7 @@
3162128384,3162129407,NL
3162129408,3162129919,DE
3162129920,3162136575,NL
-3162136576,3162144767,ES
+3162136576,3162144767,IR
3162144768,3162152959,SE
3162152960,3162161151,RU
3162161152,3162169343,CZ
@@ -46996,16 +51498,16 @@
3163684864,3163815935,PL
3163815936,3164078079,NO
3164078080,3164209151,IT
-3164209152,3164238847,CH
-3164238848,3164239103,DE
-3164239104,3164340223,CH
+3164209152,3164340223,CH
3164340224,3164471295,HU
3164471296,3164602367,IR
3164602368,3164667903,SY
3164667904,3164733439,PS
3164733440,3164798975,RU
3164798976,3164864511,UA
-3164864512,3164897279,GB
+3164864512,3164864703,GB
+3164864704,3164864735,ZA
+3164864736,3164897279,GB
3164897280,3164899327,IT
3164899328,3164901375,RU
3164901376,3164903423,PL
@@ -47025,7 +51527,9 @@
3164936192,3164937749,LT
3164937750,3164937750,FR
3164937751,3164938239,LT
-3164938240,3164951663,FR
+3164938240,3164949135,FR
+3164949136,3164949151,NL
+3164949152,3164951663,FR
3164951664,3164951671,PL
3164951672,3164952224,FR
3164952225,3164952231,GB
@@ -47037,26 +51541,44 @@
3164953256,3164953263,CZ
3164953264,3164953583,FR
3164953584,3164953599,ES
-3164953600,3164961511,FR
+3164953600,3164960439,FR
+3164960440,3164960443,DE
+3164960444,3164960715,FR
+3164960716,3164960719,NL
+3164960720,3164961391,FR
+3164961392,3164961395,ES
+3164961396,3164961511,FR
3164961512,3164961519,GB
-3164961520,3164962815,FR
+3164961520,3164961551,FR
+3164961552,3164961555,ES
+3164961556,3164962471,FR
+3164962472,3164962475,ES
+3164962476,3164962815,FR
3164962816,3164964863,ES
3164964864,3164966911,FI
3164966912,3164968319,FR
3164968320,3164968447,GB
-3164968448,3164969019,FR
+3164968448,3164968455,FR
+3164968456,3164968459,NL
+3164968460,3164968835,FR
+3164968836,3164968839,ES
+3164968840,3164969019,FR
3164969020,3164969023,BE
3164969024,3164970413,FR
3164970414,3164970415,IT
3164970416,3164970923,FR
3164970924,3164970927,LT
-3164970928,3164973663,FR
+3164970928,3164973419,FR
+3164973420,3164973423,ES
+3164973424,3164973663,FR
3164973664,3164973695,GB
3164973696,3164974335,FR
3164974336,3164974463,GB
3164974464,3164974527,FR
3164974528,3164974559,ES
-3164974560,3164976295,FR
+3164974560,3164976143,FR
+3164976144,3164976159,BE
+3164976160,3164976295,FR
3164976296,3164976303,IT
3164976304,3164995583,FR
3164995584,3165061119,RU
@@ -47065,7 +51587,11 @@
3165192192,3165257727,GE
3165257728,3165323263,RO
3165323264,3165388799,ES
-3165388800,3165519871,RO
+3165388800,3165417471,RO
+3165417472,3165421567,DE
+3165421568,3165437951,RO
+3165437952,3165454335,AT
+3165454336,3165519871,RO
3165519872,3165585407,DE
3165585408,3165650943,CZ
3165650944,3166175231,DK
@@ -47101,17 +51627,68 @@
3166699520,3166961663,DE
3166961664,3167223807,SI
3167223808,3167748095,NL
-3167748096,3167870975,RO
-3167870976,3167879167,MD
-3167879168,3167987711,RO
+3167748096,3167772671,RO
+3167772672,3167773695,MD
+3167773696,3167774719,RO
+3167774720,3167775743,MD
+3167775744,3167776767,RO
+3167776768,3167777791,MD
+3167777792,3167778815,RO
+3167778816,3167780863,MD
+3167780864,3167797247,RO
+3167797248,3167798271,MD
+3167798272,3167799295,RO
+3167799296,3167801343,MD
+3167801344,3167868927,RO
+3167868928,3167879167,MD
+3167879168,3167938559,RO
+3167938560,3167939583,MD
+3167939584,3167940607,RO
+3167940608,3167943679,MD
+3167943680,3167987711,RO
3167987712,3167989759,MD
3167989760,3168005887,RO
3168005888,3168006143,NL
-3168006144,3168050431,RO
+3168006144,3168010239,RO
+3168010240,3168011263,MD
+3168011264,3168012287,RO
+3168012288,3168014335,MD
+3168014336,3168016383,RO
+3168016384,3168018431,MD
+3168018432,3168020479,RO
+3168020480,3168022527,MD
+3168022528,3168050431,RO
3168050432,3168050687,MD
-3168050688,3168096255,RO
+3168050688,3168084991,RO
+3168084992,3168086015,MD
+3168086016,3168088063,IT
+3168088064,3168089087,RO
+3168089088,3168090111,MD
+3168090112,3168092159,FR
+3168092160,3168096255,RO
3168096256,3168100351,MD
-3168100352,3168272383,RO
+3168100352,3168129023,RO
+3168129024,3168130047,MD
+3168130048,3168132095,RO
+3168132096,3168133119,MD
+3168133120,3168136191,RO
+3168136192,3168137215,MD
+3168137216,3168138239,RO
+3168138240,3168139263,MD
+3168139264,3168156671,RO
+3168156672,3168157695,MD
+3168157696,3168176127,RO
+3168176128,3168177151,MD
+3168177152,3168178175,RO
+3168178176,3168179199,MD
+3168179200,3168192511,RO
+3168192512,3168194559,MD
+3168194560,3168199679,RO
+3168199680,3168200703,MD
+3168200704,3168267263,RO
+3168267264,3168269311,MD
+3168269312,3168271359,RO
+3168271360,3168272383,MD
3168272384,3168534527,IT
3168534528,3168796671,GB
3168796672,3168829439,FR
@@ -47153,7 +51730,11 @@
3169863680,3169864703,MD
3169864704,3169869823,RO
3169869824,3169878015,MD
-3169878016,3169896447,RO
+3169878016,3169882111,RO
+3169882112,3169886207,MD
+3169886208,3169894399,RO
+3169894400,3169895423,MD
+3169895424,3169896447,RO
3169896448,3169898495,ES
3169898496,3169927423,RO
3169927424,3169927679,NL
@@ -47193,15 +51774,12 @@
3170861056,3170893823,RS
3170893824,3173887999,BR
3173892096,3174223871,BR
-3174227968,3176828927,BR
-3176833024,3178311679,BR
-3178312192,3178312703,BR
-3178312960,3179282431,BR
+3174227968,3179282431,BR
3179282432,3184116735,MX
-3184123904,3184124927,MX
-3184128000,3184131071,MX
-3184132096,3184295935,MX
-3184328704,3184459775,MX
+3184116736,3184123903,BR
+3184123904,3184125951,MX
+3184125952,3184127999,BR
+3184128000,3184459775,MX
3184525312,3184885759,MX
3184918528,3187671039,MX
3187671040,3187687423,CO
@@ -47221,10 +51799,13 @@
3187761152,3187769343,AR
3187769344,3187802111,CO
3187802112,3187818495,AR
+3187820544,3187822591,BR
3187822592,3187824639,AR
3187824640,3187826687,CL
3187826688,3187834879,AR
-3187834880,3187851263,CW
+3187834880,3187843071,CW
+3187843072,3187845119,AW
+3187845120,3187851263,CW
3187851264,3187855359,PY
3187855360,3187857407,PA
3187857408,3187859455,CR
@@ -47234,17 +51815,21 @@
3187910656,3187914751,CL
3187914752,3187916799,BO
3187916800,3187933183,CO
-3187933184,3187935607,GT
+3187933184,3187935519,GT
+3187935520,3187935527,HN
+3187935528,3187935607,GT
3187935608,3187935615,HN
3187935616,3187936047,GT
3187936048,3187936063,HN
3187936064,3187936711,GT
3187936712,3187936719,HN
-3187936720,3187937279,GT
-3187937280,3187937535,HN
-3187937536,3187940963,GT
+3187936720,3187940351,GT
+3187940352,3187940607,HN
+3187940608,3187940963,GT
3187940964,3187940967,HN
-3187940968,3187943127,GT
+3187940968,3187943055,GT
+3187943056,3187943063,HN
+3187943064,3187943127,GT
3187943128,3187943135,HN
3187943136,3187945971,GT
3187945972,3187945975,HN
@@ -47270,6 +51855,7 @@
3188006912,3188015103,CL
3188015104,3188031487,HN
3188031488,3188039679,SV
+3188039680,3188047871,AR
3188047872,3188051967,CO
3188051968,3188054015,CR
3188054016,3188056063,AR
@@ -47283,7 +51869,9 @@
3188113408,3188117503,HN
3188117504,3188121599,AR
3188121600,3188125695,TT
-3188125696,3188146175,AR
+3188125696,3188137175,AR
+3188137176,3188137183,DE
+3188137184,3188146175,AR
3188146176,3188170751,CO
3188170752,3188174847,CR
3188174848,3188178943,AR
@@ -47301,9 +51889,14 @@
3188242432,3188244479,AR
3188244480,3188260863,CO
3188260864,3188269055,AR
-3188269056,3188269439,VE
+3188269056,3188269183,VE
+3188269184,3188269311,MX
+3188269312,3188269439,VE
3188269440,3188269567,CO
-3188269568,3188270847,VE
+3188269568,3188269823,MX
+3188269824,3188270079,VE
+3188270080,3188270335,MX
+3188270336,3188270847,VE
3188270848,3188271103,BR
3188271104,3188273151,VE
3188273152,3188275199,PA
@@ -47323,7 +51916,9 @@
3188473856,3188482047,PE
3188482048,3188490239,AR
3188490240,3188498431,CO
-3188498432,3188517119,AR
+3188498432,3188513407,AR
+3188513408,3188513535,US
+3188513536,3188517119,AR
3188517120,3188517247,US
3188517248,3188518271,AR
3188518272,3188518399,US
@@ -47342,14 +51937,17 @@
3188597760,3188598783,PA
3188598784,3188600831,AR
3188600832,3188604927,CL
+3188604928,3188621311,BO
3188621312,3188625407,GT
3188625408,3188627455,AR
3188627456,3188628479,CR
3188628480,3188637695,AR
3188637696,3188645887,PA
3188645888,3188662271,CO
+3188662272,3188670463,BR
3188670464,3188674559,HN
3188674560,3188678655,AR
+3188678656,3188682751,BR
3188682752,3188686847,AR
3188686848,3188690943,EC
3188690944,3188695039,CU
@@ -47370,6 +51968,7 @@
3191093248,3191095295,AR
3191095296,3191099391,EC
3191099392,3191103487,AR
+3191103488,3191107583,VE
3191107584,3191108607,PE
3191108608,3191108639,MX
3191108640,3191108959,PE
@@ -47389,8 +51988,8 @@
3191193600,3191209983,HN
3191209984,3191275519,CL
3191275520,3191341055,AR
-3191341056,3191406079,GT
-3191406080,3191406335,SV
+3191341056,3191405951,GT
+3191405952,3191406335,SV
3191406336,3191406591,GT
3191406592,3191439359,SV
3191439360,3191455743,EC
@@ -47402,7 +52001,14 @@
3191610624,3191610879,PE
3191610880,3191611391,CO
3191611392,3191619583,VE
-3191619584,3191647743,CO
+3191619584,3191624703,CL
+3191624704,3191624959,CO
+3191624960,3191626239,CL
+3191626240,3191626495,CO
+3191626496,3191633663,CL
+3191633664,3191633919,CO
+3191633920,3191635967,CL
+3191635968,3191647743,CO
3191647744,3191647807,AR
3191647808,3191648255,CO
3191648256,3191649791,US
@@ -47412,18 +52018,20 @@
3191651072,3191651839,US
3191651840,3191670015,CO
3191670016,3191670271,AR
-3191670272,3191676927,CO
-3191676928,3191677439,AR
-3191677440,3191677695,US
-3191677696,3191678463,AR
-3191678464,3191678719,US
-3191678720,3191679487,AR
-3191679488,3191679743,US
-3191679744,3191679999,AR
-3191680000,3191680255,US
+3191670272,3191670783,CO
+3191670784,3191672831,CL
+3191672832,3191674879,CO
+3191674880,3191676927,CL
+3191676928,3191677951,US
+3191677952,3191678207,AR
+3191678208,3191678719,US
+3191678720,3191678975,AR
+3191678976,3191680255,US
3191680256,3191680511,AR
3191680512,3191680767,US
-3191680768,3191683327,AR
+3191680768,3191681279,AR
+3191681280,3191681535,US
+3191681536,3191683327,AR
3191683328,3191684607,US
3191684608,3191684863,AR
3191684864,3191685119,US
@@ -47436,7 +52044,7 @@
3191695872,3191696127,US
3191696128,3191696383,CO
3191696384,3191701503,US
-3191701504,3191702527,CO
+3191701504,3191702527,CL
3191702528,3191703039,US
3191703040,3191704063,CO
3191704064,3191704575,US
@@ -47454,7 +52062,9 @@
3191725056,3191725311,AR
3191725312,3191726079,CO
3191726080,3191726335,AR
-3191726336,3191727103,CO
+3191726336,3191726591,CO
+3191726592,3191726847,AR
+3191726848,3191727103,CO
3191727104,3191727359,AR
3191727360,3191730431,CO
3191730432,3191730687,AR
@@ -47477,12 +52087,16 @@
3193143296,3193176063,TT
3193176064,3193307135,CO
3193307136,3193438207,SV
-3193438208,3193569279,CW
+3193438208,3193450495,CW
+3193450496,3193450751,SR
+3193450752,3193569279,CW
3193569280,3193579263,CO
3193579264,3193579519,EC
3193579520,3193582591,CO
3193582592,3193583103,EC
-3193583104,3193599999,CO
+3193583104,3193595391,CO
+3193595392,3193595647,EC
+3193595648,3193599999,CO
3193600000,3193600255,EC
3193600256,3193605375,CO
3193605376,3193605631,EC
@@ -47512,20 +52126,18 @@
3193735680,3193736191,AR
3193736192,3193736447,US
3193736448,3193737471,AR
-3193737472,3193738495,US
-3193738496,3193738751,AR
-3193738752,3193739007,US
+3193737472,3193739007,US
3193739008,3193739263,AR
3193739264,3193739519,US
-3193739520,3193740031,AR
-3193740032,3193740287,US
+3193739520,3193739775,AR
+3193739776,3193740287,US
3193740288,3193741311,AR
3193741312,3193741823,US
3193741824,3193742079,AR
3193742080,3193742335,US
3193742336,3193742591,AR
-3193742592,3193742719,US
-3193742720,3193743231,AR
+3193742592,3193742847,US
+3193742848,3193743231,AR
3193743232,3193743359,US
3193743360,3193743743,AR
3193743744,3193743871,US
@@ -47545,8 +52157,8 @@
3193747584,3193748223,US
3193748224,3193748863,AR
3193748864,3193748991,US
-3193748992,3193749503,AR
-3193749504,3193749759,US
+3193748992,3193749247,AR
+3193749248,3193749759,US
3193749760,3193750015,AR
3193750016,3193750271,US
3193750272,3193750527,AR
@@ -47561,7 +52173,11 @@
3193754624,3193754751,US
3193754752,3193755135,AR
3193755136,3193755263,US
-3193755264,3193765887,AR
+3193755264,3193756415,AR
+3193756416,3193756543,US
+3193756544,3193757055,AR
+3193757056,3193757183,US
+3193757184,3193765887,AR
3193765888,3193774079,TT
3193774080,3193775103,PA
3193775104,3193776127,GY
@@ -47628,11 +52244,7 @@
3194368000,3194370047,BO
3194370048,3194372095,PA
3194372096,3194380287,HT
-3194380288,3194381439,BZ
-3194381440,3194381567,US
-3194381568,3194383231,BZ
-3194383232,3194383359,US
-3194383360,3194388479,BZ
+3194380288,3194388479,US
3194388480,3194396671,PE
3194396672,3194413055,CO
3194413056,3194421247,CL
@@ -47643,6 +52255,7 @@
3194445824,3194454015,CO
3194454016,3194458111,AR
3194458112,3194462207,CL
+3194462208,3194466303,BR
3194466304,3194467327,AR
3194467328,3194468351,DO
3194468352,3194469375,US
@@ -47678,7 +52291,9 @@
3194640384,3194642431,BZ
3194642432,3194646527,AR
3194646528,3194648575,DO
-3194648576,3194652671,AR
+3194648576,3194652159,AR
+3194652160,3194652415,MX
+3194652416,3194652671,AR
3194652672,3194654719,MX
3194654720,3194659839,AR
3194659840,3194660351,US
@@ -47687,9 +52302,7 @@
3194661376,3194662143,AR
3194662144,3194662399,US
3194662400,3194663167,AR
-3194663168,3194663423,US
-3194663424,3194663679,AR
-3194663680,3194664447,US
+3194663168,3194664447,US
3194664448,3194664959,AR
3194664960,3194665215,US
3194665216,3194665471,AR
@@ -47712,6 +52325,7 @@
3194728448,3194729471,CL
3194729472,3194730495,PE
3194730496,3194732543,AR
+3194732544,3194736639,BR
3194736640,3194737663,NI
3194737664,3194740735,AR
3194740736,3194742783,CL
@@ -47724,12 +52338,14 @@
3194767360,3194768383,CR
3194768384,3194769407,AR
3194769408,3194773503,PE
+3194773504,3194781695,BR
3194781696,3194798079,CL
3194798080,3194799103,AR
3194799104,3194804223,GY
3194804224,3194805247,AR
3194805248,3194806271,CR
3194806272,3194814463,AR
+3194814464,3194818559,PA
3194818560,3194830847,AR
3194830848,3194839039,PA
3194839040,3194863615,CO
@@ -47762,22 +52378,25 @@
3194984960,3194985471,PA
3194985472,3194985599,US
3194985600,3194994687,PA
-3194994688,3195011071,AR
-3195019264,3195023359,AR
+3194994688,3195023359,AR
3195023360,3195024383,CL
3195024384,3195025407,UY
3195025408,3195043839,AR
3195043840,3195056127,CO
3195056128,3195060223,AR
3195060224,3195061247,US
+3195061248,3195062271,AR
3195062272,3195062783,US
3195062784,3195063039,UY
3195063040,3195063295,US
+3195063296,3195064319,BR
+3195064320,3195066367,PY
3195066368,3195067391,AR
3195067392,3195068415,CR
3195068416,3195076607,CW
3195076608,3195084799,CL
3195084800,3195092991,CR
+3195092992,3195097087,DO
3195097088,3195099135,CR
3195099136,3195100159,GT
3195100160,3195101183,PY
@@ -47842,6 +52461,7 @@
3195713536,3195714559,GT
3195714560,3195715583,PA
3195715584,3195721727,AR
+3195721728,3195723775,VE
3195723776,3195731967,AR
3195731968,3195736063,EC
3195736064,3195737087,BQ
@@ -47876,6 +52496,7 @@
3195830272,3195838463,AR
3195838464,3195840511,HN
3195840512,3195842559,AR
+3195842560,3195846655,BR
3195846656,3195852799,AR
3195852800,3195853823,CW
3195853824,3195854847,GY
@@ -47921,7 +52542,13 @@
3198910464,3198926847,CL
3198926848,3198943231,BO
3198943232,3199467519,AR
+3199467520,3199500287,BO
+3199500288,3199504383,BR
3199504384,3199505407,AR
+3199505408,3199506431,BR
+3199506432,3199508479,AR
+3199508480,3199516671,BR
+3199516672,3199533055,CL
3199533056,3199549439,BO
3199549440,3199565823,AR
3199565824,3199582207,NI
@@ -47983,13 +52610,13 @@
3201855488,3201859583,PE
3201859584,3201863679,CO
3201863680,3201865727,CL
-3201865728,3201867775,AR
+3201865728,3201867775,CO
3201867776,3201869823,PE
3201869824,3201869855,AR
3201869856,3201869871,PE
-3201869872,3201870847,AR
-3201870848,3201871103,PE
-3201871104,3201871871,AR
+3201869872,3201871743,AR
+3201871744,3201871807,PE
+3201871808,3201871871,AR
3201871872,3201875967,PE
3201875968,3201880063,CO
3201880064,3201884159,EC
@@ -48026,17 +52653,51 @@
3203545088,3203545599,GT
3203545600,3203547135,CO
3203547136,3203549183,PA
-3203549184,3203561471,CO
+3203549184,3203556863,CO
+3203556864,3203557119,DO
+3203557120,3203561471,CO
3203561472,3203562495,SV
3203562496,3203564031,CO
3203564032,3203564287,PA
-3203564288,3203661823,CO
+3203564288,3203566591,CO
+3203566592,3203566847,PA
+3203566848,3203661823,CO
3203661824,3203923967,AR
3203923968,3204448255,CO
-3204448256,3204875263,BR
-3205234688,3206545407,BR
-3208642560,3210739711,CO
-3210739712,3210805247,CL
+3204448256,3208642559,BR
+3208642560,3209691135,CO
+3209691136,3210084351,AR
+3210084352,3210215423,BR
+3210215424,3210739711,CO
+3210739712,3210739967,CL
+3210739968,3210740223,MX
+3210740224,3210740479,AR
+3210740480,3210740735,US
+3210740736,3210742271,BR
+3210742272,3210743295,CL
+3210743296,3210743551,US
+3210743552,3210747647,CL
+3210747648,3210747903,US
+3210747904,3210748415,BR
+3210748416,3210751999,CL
+3210752000,3210752255,US
+3210752256,3210757119,CL
+3210757120,3210757375,US
+3210757376,3210763519,CL
+3210763520,3210763775,US
+3210763776,3210769919,CL
+3210769920,3210770175,US
+3210770176,3210772991,CL
+3210772992,3210773247,US
+3210773248,3210776319,CL
+3210776320,3210776575,US
+3210776576,3210776831,CL
+3210776832,3210777087,US
+3210777088,3210778367,CL
+3210778368,3210778623,US
+3210778624,3210803327,CL
+3210803328,3210803455,BR
+3210803456,3210805247,CL
3210805248,3210809343,PA
3210809344,3210810367,VE
3210810368,3210811391,PA
@@ -48047,14 +52708,53 @@
3210825728,3210827775,BZ
3210827776,3210829823,DO
3210829824,3210830847,AR
+3210830848,3210831871,PE
+3210831872,3210832895,DO
+3210832896,3210835967,AR
+3210835968,3210838015,PY
3210838016,3210870783,AR
3210870784,3210903551,CO
3210903552,3210919935,PE
+3210919936,3210920959,GT
+3210920960,3210921983,PA
+3210921984,3210924031,CL
+3210924032,3210926079,DO
+3210926080,3210928127,AR
+3210928128,3210936319,NI
3210936320,3211067391,EC
-3211264000,3211788287,CO
-3211788288,3212836863,CL
-3214934016,3221225471,BR
+3211067392,3211069439,US
+3211069440,3211073023,CL
+3211073024,3211073279,CA
+3211073280,3211129599,CL
+3211129600,3211129855,BR
+3211129856,3211132927,CL
+3211132928,3211137023,CO
+3211137024,3211141119,AR
+3211141120,3211142143,CL
+3211142144,3211143167,CR
+3211143168,3211145215,AR
+3211145216,3211147263,NI
+3211147264,3211148287,CR
+3211148288,3211165695,CO
+3211165696,3211182079,HN
+3211182080,3211194367,CO
+3211194368,3211195391,DO
+3211195392,3211214847,AR
+3211214848,3211223039,HN
+3211223040,3211227135,AR
+3211227136,3211231231,NI
+3211231232,3211788287,CO
+3211788288,3212312575,CL
+3212312576,3212574719,BR
+3212574720,3212836863,CL
+3212836864,3213885439,BR
+3213885440,3214934015,CO
+3214934016,3219796375,BR
+3219796376,3219796376,US
+3219796377,3221225471,BR
3221225480,3221225727,GB
+3221225728,3221225983,US
+3221226240,3221226495,US
3221226496,3221227519,KY
3221227520,3221242879,US
3221242880,3221243391,GB
@@ -48062,49 +52762,48 @@
3221258240,3221291007,CA
3221291008,3221334269,US
3221334270,3221334270,DZ
-3221334271,3221553151,US
-3221553664,3221555967,US
-3221556224,3221560319,US
-3221560320,3221561343,GB
-3221561344,3221562367,US
+3221334271,3221560319,US
+3221560320,3221561087,GB
+3221561088,3221562367,US
3221562368,3221562623,SE
-3221562624,3221564927,US
-3221565184,3221565951,US
-3221565952,3221566207,SE
-3221566464,3221567743,US
-3221568256,3221568511,FR
+3221562624,3221565951,US
+3221565952,3221566207,NL
+3221566208,3221568255,US
+3221568256,3221568511,NL
+3221568512,3221568767,US
3221568768,3221569279,FR
-3221569280,3221570559,US
-3221571072,3221571327,US
-3221571584,3221576191,US
-3221576192,3221576447,KR
+3221569280,3221576191,US
+3221576192,3221576447,AU
3221576448,3221577727,US
3221577728,3221577983,CA
-3221577984,3221578239,IT
+3221577984,3221578239,NL
3221578240,3221589503,US
-3221589504,3221589759,FR
+3221589504,3221589759,NL
3221589760,3221590015,US
3221590016,3221590271,CA
-3221590272,3221590527,DE
-3221590528,3221591807,US
-3221592064,3221592575,US
-3221593088,3221594623,US
-3221594624,3221594879,AT
-3221594880,3221605119,US
+3221590272,3221590527,NL
+3221590528,3221594623,US
+3221594624,3221594879,NL
+3221594880,3221605375,US
3221605376,3221605887,CA
-3221605888,3221607167,US
-3221607424,3221608447,US
-3221608448,3221608703,JP
+3221605888,3221608447,US
+3221608448,3221608703,AU
3221608704,3221614335,US
3221614336,3221614591,GB
3221614592,3221614847,AU
-3221615104,3221618175,US
-3221618176,3221618431,GB
-3221618688,3221633791,US
+3221614848,3221618175,US
+3221618176,3221618431,NL
+3221618432,3221618687,US
+3221618688,3221618943,GB
+3221618944,3221633791,US
3221633792,3221634047,FR
3221634048,3221647103,US
3221647104,3221647359,FR
-3221647360,3221801983,US
+3221647360,3221656831,US
+3221656832,3221657087,AU
+3221657088,3221795583,US
+3221795584,3221795839,IN
+3221795840,3221801983,US
3221801984,3221802239,IN
3221802240,3221803775,US
3221803776,3221804031,IN
@@ -48113,62 +52812,53 @@
3221806336,3221806591,US
3221806592,3221806847,IN
3221806848,3222011903,US
-3222012160,3222012415,GB
-3222012672,3222016511,US
-3222016768,3222017023,US
-3222017536,3222017791,US
-3222018048,3222018559,US
-3222018816,3222019839,US
-3222020096,3222022399,US
-3222022656,3222023423,US
+3222011904,3222012159,CA
+3222012160,3222012415,NL
+3222012416,3222023935,US
3222023936,3222024191,IT
3222024192,3222025727,US
3222025728,3222025983,NL
-3222026240,3222027775,US
+3222025984,3222027775,US
3222027776,3222028031,CA
3222028032,3222030335,US
-3222030336,3222030847,GB
+3222030336,3222030591,GB
+3222030592,3222030847,NL
3222030848,3222031359,US
3222031360,3222031615,AU
3222031616,3222031871,IT
3222031872,3222032639,US
-3222032640,3222032895,DE
+3222032640,3222032895,NL
3222032896,3222036479,US
3222036480,3222036735,FR
3222036736,3222036991,US
3222036992,3222037247,CA
-3222037248,3222037503,GB
-3222037504,3222038271,US
-3222038528,3222039551,US
-3222042368,3222044671,US
+3222037248,3222037503,NL
+3222037504,3222039807,US
+3222042368,3222044927,US
3222044928,3222045183,CA
-3222045184,3222051327,US
-3222051584,3222055935,US
-3222056192,3222056447,US
+3222045184,3222049791,US
+3222050304,3222056447,US
3222056448,3222059007,CA
3222059008,3222061055,US
3222061056,3222061823,IT
3222061824,3222066943,US
3222066944,3222067199,CA
3222067200,3222067455,US
-3222067456,3222067967,CH
-3222068224,3222071039,US
-3222071040,3222071295,GB
-3222071296,3222071551,PT
+3222067456,3222067967,NL
+3222067968,3222071039,US
+3222071040,3222071551,NL
3222071552,3222072063,US
3222072064,3222072319,SE
-3222072576,3222075135,US
-3222075136,3222075391,CH
+3222072320,3222075135,US
+3222075136,3222075391,NL
3222075392,3222274559,US
3222274560,3222274815,AU
-3222274816,3222292735,US
-3222292992,3222305535,US
+3222274816,3222305535,US
3222305536,3222309119,SE
3222309120,3222309375,DE
3222309376,3222313727,SE
3222313728,3222316799,CH
-3222316800,3222318591,US
-3222318848,3222319615,US
+3222316800,3222319615,US
3222319616,3222320127,JP
3222320128,3222320383,AU
3222320384,3222320895,US
@@ -48178,134 +52868,133 @@
3222339584,3222405375,US
3222405376,3222405631,GB
3222405632,3222455039,US
-3222455040,3222455295,GB
+3222455040,3222455295,NL
3222455296,3222866431,US
3222866944,3222867199,US
-3222867712,3222874848,US
+3222867712,3222872319,US
+3222872320,3222872575,CA
+3222872576,3222874848,US
3222874849,3222874849,MY
-3222874850,3222893311,US
-3222893824,3222931711,US
-3222931968,3222936319,US
+3222874850,3222890751,US
+3222890752,3222891007,CA
+3222891008,3222936575,US
3222936576,3222940927,CH
3222940928,3222941183,GB
3222941184,3222941695,CH
3222941696,3222952703,US
-3222952704,3222952959,JP
+3222952704,3222952959,AU
3222952960,3222953215,US
-3222953216,3222953727,JP
+3222953216,3222953727,AU
3222953728,3222953983,US
-3222953984,3222954239,JP
-3222954240,3222954495,US
-3222955008,3222956031,US
-3222956288,3222962431,FI
+3222953984,3222954239,AU
+3222954240,3222956287,US
+3222956288,3222957567,FI
+3222957824,3222962431,FI
+3222962432,3222963455,US
3222963456,3222964223,FI
-3222964224,3222964479,US
-3222965248,3222966271,US
-3222967040,3222968831,US
+3222964224,3222968831,US
3222968832,3222973951,NL
3222973952,3222979071,DE
3222979072,3222983167,US
3222983168,3222983935,CA
3222983936,3222984447,US
3222984704,3222988543,AU
-3222988544,3222988799,PT
+3222988544,3222988799,NL
3222988800,3222989055,AU
3222989056,3222989311,US
-3222989312,3222989567,GB
+3222989312,3222989567,NL
3222989568,3222989823,CA
3222989824,3222990079,PT
3222990080,3222990335,NL
3222990336,3222990591,AT
3222990592,3222990847,PT
-3222990848,3223200767,US
-3223201024,3223201279,US
+3222990848,3223201279,US
3223201792,3223202815,PR
-3223202816,3223206911,US
-3223207168,3223207423,US
+3223202816,3223204863,US
+3223205120,3223205375,US
+3223205888,3223207423,US
3223207936,3223214079,US
-3223214848,3223215103,US
+3223214592,3223215103,US
3223215104,3223215359,AU
-3223215360,3223215871,US
-3223216128,3223216383,US
-3223217152,3223217407,US
-3223218176,3223219455,US
-3223220480,3223220735,US
-3223220992,3223227391,US
+3223215360,3223216383,US
+3223216384,3223216639,CA
+3223217152,3223217663,US
+3223218176,3223219711,US
+3223220224,3223222271,US
+3223222784,3223223295,US
+3223223296,3223223551,AI
+3223223552,3223223807,US
+3223224320,3223227391,US
3223227904,3223228159,CA
-3223229184,3223229695,US
+3223228160,3223228415,US
+3223228928,3223229695,US
3223229696,3223229951,CA
3223230464,3223236607,US
3223236608,3223237631,GB
3223237632,3223239679,US
-3223240448,3223243007,US
+3223240192,3223243263,US
3223243264,3223243519,CA
+3223243520,3223243775,US
3223244288,3223245311,US
3223245824,3223248895,US
3223249408,3223249663,CA
-3223249920,3223250943,US
+3223249664,3223250943,US
3223250944,3223252991,CA
3223252992,3223254015,US
-3223254784,3223255295,US
+3223254528,3223255551,US
3223256064,3223258623,US
3223258624,3223258879,CA
3223258880,3223260671,US
3223260672,3223260927,DE
-3223261184,3223262975,US
+3223260928,3223262975,US
3223262976,3223263231,BE
3223263232,3223263743,US
-3223263744,3223263999,GB
-3223264000,3223264255,FR
+3223263744,3223264255,NL
3223264256,3223264511,US
3223264512,3223264767,CA
3223264768,3223265023,US
-3223265024,3223265279,GB
+3223265024,3223265279,NL
3223265280,3223266559,US
3223266560,3223266815,AU
3223266816,3223267327,US
3223267328,3223267583,BE
3223267584,3223269119,US
-3223269376,3223269631,US
+3223269376,3223269887,US
3223270400,3223271423,CA
3223271424,3223272447,US
3223272960,3223273215,GB
-3223273216,3223280383,US
-3223280640,3223280895,US
-3223281408,3223283199,US
-3223283200,3223283455,DE
-3223283968,3223284991,US
-3223285504,3223286783,US
-3223286784,3223289855,JP
-3223289856,3223293951,US
-3223294208,3223297279,US
-3223297536,3223298815,US
-3223299072,3223299327,US
+3223273216,3223283199,US
+3223283200,3223283455,NL
+3223283456,3223286783,US
+3223286784,3223289087,JP
+3223289088,3223289343,US
+3223289856,3223299583,US
3223299584,3223301119,NL
3223301120,3223302399,US
+3223302400,3223302655,CA
3223303168,3223303423,CA
3223303424,3223303679,US
3223304192,3223305215,US
-3223305984,3223307263,US
-3223307264,3223310079,JP
+3223305728,3223307519,US
+3223307520,3223310079,JP
3223310080,3223310335,US
3223310848,3223311103,US
-3223311104,3223311359,FR
-3223311360,3223311871,US
-3223312128,3223314431,US
+3223311104,3223311359,NL
+3223311360,3223314431,US
3223314688,3223315455,US
+3223315456,3223315711,CA
3223315712,3223316223,US
3223316224,3223316479,NL
-3223316480,3223316991,US
-3223317248,3223317759,US
-3223318016,3223319039,US
-3223319808,3223321599,US
+3223316480,3223319039,US
+3223319552,3223321343,US
+3223321344,3223321599,CA
3223321600,3223321855,FR
-3223321856,3223322367,US
-3223322624,3223388159,US
+3223321856,3223388159,US
3223388672,3223390719,US
-3223390720,3223390975,ZA
-3223391232,3223391999,US
-3223392000,3223392255,FR
-3223392256,3223392511,GB
+3223390720,3223390975,MU
+3223390976,3223391999,US
+3223392000,3223392511,NL
+3223392512,3223392767,US
3223393024,3223393791,US
3223394304,3223397375,US
3223397376,3223397631,NL
@@ -48316,71 +53005,80 @@
3223417600,3223418367,US
3223418368,3223420927,CH
3223420928,3223421439,US
-3223421440,3223421695,GB
-3223421696,3223421951,NL
+3223421440,3223421951,NL
3223422464,3223422719,US
-3223422720,3223422975,JP
+3223422720,3223422975,AU
3223422976,3223424767,US
-3223424768,3223425535,FR
-3223425792,3223432191,FR
+3223424768,3223425535,NL
+3223425536,3223425791,US
+3223425792,3223430911,FR
+3223430912,3223431423,US
+3223431424,3223432191,FR
3223432192,3223433215,US
3223433216,3223435007,FR
3223435008,3223437311,US
3223437312,3223447551,CH
3223447552,3223447807,US
-3223447808,3223449599,NL
-3223449600,3223452671,US
-3223452928,3223453183,US
-3223453184,3223453439,DE
-3223453696,3223457791,US
-3223458560,3223458815,GB
-3223458816,3223459839,US
-3223460096,3223460351,US
+3223447808,3223448063,NL
+3223448064,3223449087,US
+3223449088,3223449343,NL
+3223449344,3223453183,US
+3223453184,3223453439,NL
+3223453440,3223457791,US
+3223458304,3223458559,US
+3223458560,3223458815,NL
+3223458816,3223460351,US
3223460864,3223461887,US
-3223462656,3223462911,US
+3223462400,3223462911,US
3223462912,3223463935,CA
3223463936,3223465983,US
-3223466496,3223466751,GB
+3223466496,3223466751,NL
+3223466752,3223467007,US
3223467008,3223468031,CA
3223468032,3223471103,US
3223471616,3223471871,CA
-3223471872,3223472383,US
-3223473152,3223474175,CA
+3223471872,3223472639,US
+3223473152,3223473215,CA
+3223473216,3223473231,US
+3223473232,3223474175,CA
3223474176,3223476223,US
3223476736,3223476991,US
3223477248,3223478271,CA
3223478272,3223480319,US
+3223480832,3223481087,US
3223481088,3223481343,SE
3223481344,3223483391,US
3223483392,3223483647,NL
+3223483648,3223483903,US
3223484416,3223490559,US
3223490816,3223491071,US
-3223491584,3223496703,US
-3223496960,3223497215,US
+3223491584,3223497215,US
3223497728,3223498751,US
+3223499264,3223499519,US
3223499520,3223499775,FI
-3223499776,3223503871,CA
+3223499776,3223500031,US
+3223500032,3223503871,CA
+3223504384,3223504639,US
3223504640,3223504895,CA
3223504896,3223508991,US
3223508992,3223513087,CA
3223513088,3223516415,US
-3223516928,3223519231,US
+3223516672,3223519231,US
3223519232,3223524351,DE
3223524352,3223528233,US
3223528234,3223528234,GB
3223528235,3223534335,US
3223534336,3223534591,AU
-3223534592,3223534847,US
-3223535104,3223535359,US
+3223534592,3223535359,US
3223535360,3223537919,DE
3223537920,3223540991,US
3223541248,3223542271,US
-3223542272,3223542527,DE
+3223542272,3223542527,NL
3223542528,3223543295,US
-3223543296,3223543551,GB
+3223543296,3223543551,NL
3223543552,3223545855,US
3223546112,3223546879,US
-3223546880,3223547135,GB
+3223546880,3223547135,NL
3223547136,3223552511,US
3223552512,3223553535,NL
3223553536,3223554559,US
@@ -48388,12 +53086,12 @@
3223555328,3223556095,US
3223556096,3223556351,CA
3223556352,3223556607,US
-3223556608,3223556863,IT
+3223556608,3223556863,NL
3223556864,3223557375,US
3223557376,3223558655,DE
3223558656,3223559423,US
3223559936,3223563263,US
-3223563264,3223563519,GB
+3223563264,3223563519,NL
3223563520,3223565567,US
3223565824,3223566079,US
3223566080,3223568639,NL
@@ -48407,8 +53105,7 @@
3223578112,3223580671,US
3223580672,3223581951,AT
3223581952,3223582207,US
-3223582208,3223582463,PT
-3223582464,3223582719,NL
+3223582208,3223582719,NL
3223582720,3223582975,AU
3223583488,3223584767,US
3223584768,3223585023,GB
@@ -48467,9 +53164,7 @@
3223650048,3223650303,GB
3223650304,3223715839,CH
3223715840,3223781375,DK
-3223781376,3223784191,US
-3223784192,3223784703,GB
-3223784704,3223847935,US
+3223781376,3223847935,US
3223848704,3223855103,US
3223855104,3223857151,CA
3223857152,3223859455,US
@@ -48508,7 +53203,7 @@
3223950336,3223950591,CA
3223950592,3223953663,CH
3223953664,3223955967,US
-3223955968,3223956223,TH
+3223955968,3223956223,AU
3223956224,3223957759,US
3223958016,3223963135,JP
3223963136,3223963647,US
@@ -48516,46 +53211,46 @@
3223964160,3223964415,US
3223964416,3223964671,AU
3223964672,3223965183,US
-3223965184,3223965439,ID
+3223965184,3223965439,AU
3223965440,3223966207,US
-3223966208,3223966463,GB
+3223966208,3223966463,NL
3223966464,3223967743,US
-3223967744,3223967999,FR
+3223967744,3223967999,NL
3223968000,3223968255,US
-3223968256,3223968511,IT
+3223968256,3223968511,NL
3223968512,3223970303,US
3223970560,3223970815,DE
3223971072,3223977983,US
-3223978240,3223978495,DE
+3223978240,3223978495,NL
3223978752,3223979263,US
3223979264,3223979775,CA
3223979776,3223988735,US
3223988736,3223990271,CH
3223990272,3223991295,US
-3223991552,3223991807,GB
+3223991296,3223991551,AU
+3223991552,3223991807,NL
3223991808,3223992063,CA
3223992064,3223993343,US
3223993344,3223994111,AU
3223994112,3223994623,DE
-3223994624,3223994879,NO
3223994880,3223995391,US
3223995392,3223995647,CA
3223995648,3223996159,US
3223996416,3223999487,US
-3224000256,3224000511,GB
+3224000256,3224000511,NL
3224000512,3224001023,US
3224001024,3224001279,CA
3224001280,3224002559,US
3224002816,3224003327,US
3224003328,3224003583,ZA
-3224003584,3224003839,GB
+3224003584,3224003839,NL
3224003840,3224004095,US
-3224004096,3224004351,FR
+3224004096,3224004351,NL
3224004352,3224005631,JP
3224005632,3224006655,US
3224006912,3224012031,NL
3224012032,3224014591,US
-3224014592,3224014847,DE
+3224014592,3224014847,NL
3224014848,3224015615,US
3224015872,3224016639,US
3224016640,3224016895,AU
@@ -48565,7 +53260,7 @@
3224029696,3224030463,CA
3224030720,3224030975,CA
3224030976,3224038655,US
-3224038656,3224038911,JP
+3224038656,3224038911,AU
3224038912,3224039679,US
3224039936,3224040959,US
3224041216,3224042751,US
@@ -48574,14 +53269,18 @@
3224043520,3224084991,US
3224084992,3224087551,SE
3224087552,3224088063,US
+3224088064,3224088319,AU
3224088320,3224090879,US
3224090880,3224091135,AU
3224091648,3224091903,US
+3224091904,3224092159,AU
3224092416,3224092671,US
3224092672,3224093951,CH
3224093952,3224094207,US
3224094208,3224094463,AU
-3224094464,3224096255,US
+3224094464,3224094975,US
+3224094976,3224095487,AU
+3224095488,3224096255,US
3224096512,3224097279,AU
3224097280,3224097535,NL
3224097536,3224097791,US
@@ -48592,13 +53291,14 @@
3224099840,3224100863,US
3224101120,3224101375,US
3224101376,3224102399,AU
-3224103424,3224103679,GB
+3224103424,3224103679,NL
3224103680,3224104447,US
3224104704,3224104959,AU
3224104960,3224105471,US
3224105728,3224106495,US
3224106752,3224108799,US
-3224109056,3224119551,DE
+3224109056,3224109311,NL
+3224109312,3224119551,DE
3224119552,3224129791,FR
3224129792,3224132351,DE
3224132352,3224170495,US
@@ -48606,14 +53306,16 @@
3224173568,3224174335,US
3224174592,3224288255,US
3224288256,3224289023,DE
-3224289024,3224305663,US
+3224289024,3224302335,US
+3224302336,3224302591,CA
+3224302592,3224305663,US
3224305664,3224367615,JP
3224367616,3224368127,US
3224368128,3224369663,CH
3224369664,3224373247,US
3224373248,3224373503,AU
3224373504,3224379135,US
-3224379136,3224379391,DE
+3224379136,3224379391,NL
3224379392,3224392191,US
3224392704,3224398079,US
3224398336,3224398591,US
@@ -48623,20 +53325,22 @@
3224399616,3224407039,US
3224407296,3224407551,CA
3224407808,3224408319,US
-3224408320,3224408575,DE
+3224408320,3224408575,NL
3224408576,3224424959,US
3224425216,3224427007,US
3224427520,3224428543,US
-3224428544,3224428799,DE
+3224428544,3224428799,NL
3224428800,3224430079,US
-3224430336,3224430591,DE
+3224430336,3224430591,NL
3224430592,3224430847,US
3224431104,3224431359,CA
3224431360,3224431615,US
3224432128,3224432383,US
3224433152,3224433407,US
-3224433664,3224435967,US
-3224435968,3224436223,ZA
+3224433664,3224434687,US
+3224434688,3224434943,AU
+3224434944,3224435967,US
+3224435968,3224436223,MU
3224436224,3224436479,US
3224436736,3224502271,FI
3224502272,3224567807,JP
@@ -48657,32 +53361,37 @@
3224675072,3224675839,US
3224676864,3224677119,US
3224677120,3224678655,AU
-3224678656,3224682495,US
-3224683008,3224683519,US
+3224678656,3224680703,US
+3224680704,3224680959,AU
+3224680960,3224683519,US
+3224683520,3224684031,AU
3224684032,3224689919,US
3224689920,3224690687,NL
3224690688,3224691455,US
3224691712,3224692735,US
-3224692736,3224692991,DZ
+3224692736,3224692991,NL
3224692992,3224694527,US
3224694528,3224694783,CA
3224694784,3224695039,US
3224695808,3224697343,US
3224697856,3224698111,US
-3224698112,3224698367,GB
-3224698368,3224698623,FR
-3224698880,3224725247,US
+3224698112,3224698623,NL
+3224698880,3224699135,US
+3224699136,3224699647,BE
+3224699648,3224725247,US
3224725248,3224725503,DE
-3224725504,3224725759,CH
-3224725760,3224772351,US
+3224725504,3224725759,NL
+3224725760,3224739071,US
+3224739072,3224739327,FI
+3224739328,3224772351,US
3224772352,3224778751,DE
3224779776,3224785151,DE
3224785152,3224787967,US
3224788480,3224791039,US
-3224791040,3224791295,DE
+3224791040,3224791295,NL
3224791296,3224791807,AU
3224791808,3224793343,US
-3224793344,3224793599,DE
+3224793344,3224793599,NL
3224793600,3224793855,US
3224793856,3224795391,DK
3224795392,3224795647,CA
@@ -48690,42 +53399,44 @@
3224796160,3224796415,US
3224796416,3224797439,DE
3224797440,3224797695,US
-3224797696,3224797951,NZ
+3224797696,3224797951,AU
3224797952,3224798207,US
-3224798208,3224798463,CH
+3224798208,3224798463,NL
3224798464,3224798975,US
3224798976,3224799231,AU
+3224799488,3224799743,AU
3224799744,3224799999,US
-3224800000,3224800255,DE
+3224800000,3224800255,NL
3224800512,3224816639,FR
3224816640,3224816895,IL
3224816896,3224820735,FR
3224820736,3224820991,PL
3224820992,3224821247,DE
3224821248,3224822015,US
-3224822016,3224822271,SE
+3224822016,3224822271,NL
3224822272,3224822527,US
3224822784,3224823039,US
3224823296,3224826367,US
3224826368,3224826623,CA
3224826624,3224826879,US
-3224827136,3224827391,GB
+3224826880,3224827391,NL
3224827392,3224827647,US
+3224827648,3224827903,AU
3224827904,3224828671,US
3224828672,3224828927,AU
3224829184,3224829439,US
-3224829440,3224829695,DE
-3224830208,3224834047,US
+3224829440,3224829695,NL
+3224829952,3224834047,US
3224834048,3224834303,SG
3224834304,3224834559,US
3224834560,3224834815,TH
-3224834816,3224841727,US
-3224841728,3224841983,CN
-3224841984,3224850943,US
+3224834816,3224850175,US
+3224850176,3224850431,IN
+3224850432,3224850943,US
3224851200,3224851455,US
-3224851456,3224851711,DE
+3224851456,3224851711,NL
3224851968,3224852735,US
-3224852736,3224852991,DE
+3224852736,3224852991,NL
3224852992,3224854527,US
3224854784,3224855039,US
3224855040,3224855551,AU
@@ -48735,47 +53446,58 @@
3224856832,3224857087,NL
3224857088,3224857855,US
3224857856,3224858111,PL
+3224858112,3224858367,AU
3224858368,3224858623,US
3224858624,3224858879,AU
3224858880,3224859391,US
3224859392,3224859647,NL
3224859648,3224860159,US
-3224860160,3224860415,JP
+3224860160,3224860415,AU
3224860928,3224862719,US
3224862976,3224863231,NL
3224863488,3224863743,US
-3224863744,3224863999,GB
+3224863744,3224863999,NL
3224864000,3224870655,US
3224870656,3224870911,IT
3224870912,3224878079,US
-3224878080,3224878335,DE
+3224878080,3224878335,NL
3224878336,3224878591,US
3224878592,3224878847,AU
-3224879360,3224879615,GB
+3224879360,3224879615,NL
3224879616,3224879871,CA
3224879872,3224880383,US
-3224880384,3224880639,DE
+3224880384,3224880639,NL
3224880640,3224880895,AU
3224880896,3224882431,US
3224882688,3224882943,CA
3224882944,3224883455,US
+3224883456,3224883711,AU
3224883712,3224884223,US
-3224884224,3224884479,GB
+3224884224,3224884479,NL
3224884480,3224884991,US
3224885248,3224885503,CA
3224885760,3224886015,US
-3224886016,3224886271,AU
-3224886272,3224886527,JP
+3224886016,3224886527,AU
3224886528,3224887295,US
3224887296,3224887551,CA
3224887808,3224889087,US
3224889344,3224889599,AU
3224889600,3224890879,US
+3224890880,3224891135,AU
3224891136,3224891647,US
-3224892416,3224892671,DE
+3224892160,3224892415,CA
+3224892416,3224892671,NL
3224892928,3224893183,US
3224893440,3224893951,US
-3224894464,3225028863,US
+3224894464,3224899071,US
+3224899072,3224899327,AT
+3224899328,3224908543,US
+3224908544,3224908799,CA
+3224908800,3224933887,US
+3224933888,3224934143,DE
+3224934144,3224957951,US
+3224957952,3224958207,CA
+3224958208,3225028863,US
3225028864,3225031423,JP
3225031424,3225033727,US
3225033728,3225033983,LU
@@ -48799,24 +53521,26 @@
3225077504,3225081087,US
3225081088,3225081343,CA
3225081600,3225082367,US
-3225082368,3225082623,IT
-3225082880,3225084415,US
-3225084416,3225085183,NL
+3225082368,3225082623,NL
+3225082880,3225084671,US
+3225084672,3225085183,NL
3225085184,3225085439,ES
3225085440,3225089279,US
3225089280,3225089535,CA
3225089536,3225091071,US
3225091584,3225091839,US
-3225092096,3225419775,US
+3225092096,3225314303,US
+3225314304,3225314559,GB
+3225314560,3225419775,US
3225420032,3225420287,US
3225420800,3225423871,CA
3225423872,3225424383,US
3225424896,3225426943,US
-3225426944,3225427199,AT
+3225426944,3225427199,NL
3225427968,3225428991,US
3225429504,3225429759,CA
3225430016,3225431039,CA
-3225431040,3225431551,CZ
+3225431040,3225431551,NL
3225431552,3225434111,US
3225434112,3225436159,CA
3225436160,3225437695,US
@@ -48826,7 +53550,7 @@
3225446400,3225450495,US
3225450496,3225451263,AG
3225451264,3225451519,MS
-3225451776,3225452031,SE
+3225451776,3225452031,NL
3225452544,3225456639,CA
3225456640,3225459711,US
3225459968,3225460479,US
@@ -48834,7 +53558,7 @@
3225462784,3225468927,US
3225468928,3225469951,CA
3225470464,3225470719,US
-3225471488,3225471743,DE
+3225471488,3225471743,NL
3225471744,3225472511,US
3225473024,3225498111,US
3225498368,3225503487,NL
@@ -48846,10 +53570,9 @@
3225509888,3225510143,NL
3225510144,3225518591,US
3225518592,3225518847,AU
-3225518848,3225519103,IT
-3225519104,3225519359,GB
+3225518848,3225519359,NL
3225519872,3225520639,US
-3225520896,3225521151,DE
+3225520896,3225521151,NL
3225521152,3225522175,US
3225522176,3225522943,GB
3225522944,3225524223,US
@@ -48870,10 +53593,13 @@
3225541376,3225544703,GB
3225544704,3225546751,CA
3225546752,3225548543,US
-3225548800,3225550591,US
+3225548800,3225549055,AU
+3225549056,3225549311,US
+3225549312,3225549567,AU
+3225549568,3225550591,US
3225550848,3225616383,DK
-3225617152,3225617407,IE
-3225617408,3225617663,GB
+3225616640,3225616895,AU
+3225617152,3225617663,NL
3225617920,3225618175,US
3225618432,3225618687,US
3225618688,3225618943,CA
@@ -48883,32 +53609,32 @@
3225624576,3225625599,CA
3225626368,3225626623,GB
3225626880,3225627391,US
-3225627392,3225627647,GB
+3225627392,3225627647,NL
3225627648,3225627903,US
3225627904,3225628159,CA
3225628160,3225628415,US
-3225628416,3225628671,GB
+3225628416,3225628671,NL
3225628672,3225629183,US
-3225629184,3225629439,GB
+3225629184,3225629439,NL
3225629440,3225629695,US
-3225629696,3225629951,GB
+3225629696,3225629951,NL
3225629952,3225630207,US
-3225630464,3225630719,DE
+3225630464,3225630719,NL
3225630720,3225631231,US
-3225631232,3225631487,SE
+3225631232,3225631487,NL
3225631488,3225632767,US
3225633536,3225633791,US
3225634048,3225634815,US
3225635072,3225635583,US
-3225635840,3225636095,PT
+3225635840,3225636095,NL
3225636096,3225636607,US
-3225636608,3225636863,ES
+3225636608,3225636863,NL
3225636864,3225637887,US
-3225637888,3225638143,AU
+3225637888,3225638399,AU
3225638400,3225638655,US
3225638656,3225638911,GB
3225639424,3225640447,US
-3225640448,3225640703,GB
+3225640448,3225640703,NL
3225640704,3225641983,US
3225641984,3225643263,GB
3225643264,3225643775,CA
@@ -48918,12 +53644,14 @@
3225651200,3225658367,US
3225658624,3225658879,US
3225659136,3225659391,DE
+3225659392,3225659647,AU
3225659904,3225660159,DE
3225660160,3225660415,AU
3225660416,3225664511,US
3225664512,3225669887,DE
3225669888,3225671935,US
-3225672192,3225672447,DE
+3225671936,3225672191,AU
+3225672192,3225672447,NL
3225672448,3225672703,US
3225672704,3225673215,NL
3225673472,3225673727,IE
@@ -48936,7 +53664,7 @@
3225682944,3225683199,AT
3225683200,3225687039,DE
3225687040,3225687807,US
-3225687808,3225688063,GB
+3225687808,3225688063,NL
3225688064,3225689343,US
3225689600,3225689855,US
3225689856,3225694975,NL
@@ -48946,13 +53674,15 @@
3225701120,3225701375,US
3225701376,3225709567,NO
3225709568,3225710079,US
+3225710080,3225710591,AU
3225710592,3225711615,US
3225712128,3225715455,US
3225715456,3225715711,CA
3225715712,3225715967,AU
3225715968,3225716991,US
3225716992,3225717247,CA
-3225717248,3225717503,TN
+3225717248,3225717503,MU
+3225717504,3225717759,AU
3225717760,3225720063,US
3225720576,3225721343,GB
3225721344,3225722111,US
@@ -48961,15 +53691,17 @@
3225725440,3225725695,GB
3225725696,3225726207,AU
3225726208,3225726463,US
-3225726464,3225726719,GB
+3225726464,3225726719,NL
3225726720,3225726975,US
-3225726976,3225727231,IT
+3225726976,3225727231,NL
3225727232,3225727487,US
+3225727744,3225727999,AU
3225728000,3225728511,US
3225728512,3225728767,NL
3225728768,3225729023,US
3225729024,3225729279,CA
-3225729536,3225729791,PT
+3225729280,3225729535,US
+3225729536,3225729791,NL
3225729792,3225733887,US
3225734144,3225735167,US
3225735424,3225735679,PT
@@ -48987,7 +53719,7 @@
3225742080,3225745919,JP
3225745920,3225746687,NL
3225746688,3225746943,US
-3225746944,3225747199,DE
+3225746944,3225747199,NL
3225747456,3225747711,US
3225748480,3225752575,US
3225752832,3225753087,US
@@ -49015,9 +53747,9 @@
3225810688,3225812991,US
3225812992,3225843711,FR
3225843712,3225847039,US
-3225847040,3225847551,TR
+3225847040,3225847551,NL
3225847552,3225847807,AU
-3225847808,3225848063,IT
+3225847808,3225848063,NL
3225848064,3225848831,US
3225848832,3225853951,DE
3225853952,3225854719,US
@@ -49030,7 +53762,7 @@
3225858560,3225858815,US
3225858816,3225859583,JP
3225860096,3225861887,US
-3225864704,3225868287,US
+3225862144,3225868287,US
3225868288,3225868543,AU
3225868544,3225869055,US
3225869056,3225869311,AU
@@ -49096,10 +53828,9 @@
3226011136,3226012671,US
3226012672,3226012927,AU
3226012928,3226014207,US
-3226014464,3226014975,GB
-3226014976,3226015231,NZ
-3226015232,3226015487,AU
-3226015744,3226016255,ID
+3226014464,3226014975,NL
+3226014976,3226015487,AU
+3226015744,3226016255,AU
3226016256,3226018303,US
3226018304,3226018559,DE
3226018560,3226021119,CH
@@ -49110,24 +53841,38 @@
3226064640,3226067455,US
3226067456,3226067711,BE
3226067712,3226068223,US
-3226068224,3226068479,GB
-3226068480,3226109951,US
+3226068224,3226068479,NL
+3226068480,3226074879,US
+3226074880,3226075135,AT
+3226075136,3226109951,US
3226110208,3226110719,US
3226110720,3226128639,AU
3226128640,3226140671,US
-3226140672,3226141695,CA
-3226141952,3226156543,CA
+3226140928,3226141695,CA
+3226141696,3226141951,US
+3226141952,3226143487,CA
+3226143744,3226156543,CA
3226156800,3226157567,CA
3226157568,3226157823,US
-3226157824,3226175487,CA
+3226157824,3226167807,CA
+3226168064,3226175487,CA
+3226175744,3226175999,US
3226176000,3226177535,CA
3226177536,3226178559,US
-3226178560,3226188799,CA
+3226178560,3226188543,CA
3226189056,3226189311,CA
3226189568,3226189823,CA
3226189824,3226190847,US
3226191360,3226191615,US
-3226191872,3226205951,CA
+3226191872,3226194175,CA
+3226194432,3226194687,CA
+3226194944,3226201087,CA
+3226201088,3226201343,US
+3226201344,3226201855,CA
+3226201856,3226202111,US
+3226202112,3226205439,CA
+3226205440,3226205695,AE
+3226205696,3226205951,CA
3226206208,3226207231,US
3226207744,3226215423,GB
3226215424,3226236159,US
@@ -49146,9 +53891,13 @@
3226268928,3226269951,DE
3226269952,3226270719,US
3226271744,3226273791,US
+3226273792,3226274047,AU
3226274048,3226274559,US
-3226274560,3226274815,CH
-3226274816,3226283519,US
+3226274560,3226274815,NL
+3226274816,3226276095,US
+3226276096,3226276351,AU
+3226276352,3226276863,US
+3226277632,3226283519,US
3226283520,3226291199,CA
3226291200,3226300159,US
3226300416,3226300927,US
@@ -49158,27 +53907,35 @@
3226303488,3226305535,US
3226305536,3226307327,GB
3226307328,3226307583,US
-3226307584,3226308095,ES
-3226308096,3226308863,US
-3226309120,3226317823,US
+3226307584,3226308095,NL
+3226308096,3226317823,US
3226318080,3226318335,US
3226319360,3226319615,US
-3226319872,3226374143,US
+3226319872,3226366975,US
+3226366976,3226367231,CA
+3226367232,3226374143,US
3226374144,3226375423,DE
-3226375424,3226397695,US
+3226375424,3226376703,US
+3226376704,3226376959,AT
+3226376960,3226384639,US
+3226384640,3226385407,BE
+3226385408,3226393599,US
+3226393600,3226393855,DE
+3226393856,3226397695,US
3226397696,3226400255,DE
3226400256,3226470399,US
3226470656,3226473471,US
-3226473472,3226473983,PT
+3226473472,3226473727,NL
+3226473728,3226473983,PT
3226473984,3226474495,US
3226474496,3226474751,CL
3226475264,3226475519,US
3226475776,3226476287,US
3226476288,3226479359,CH
3226479360,3226479871,US
-3226480128,3226480383,GB
+3226480128,3226480383,NL
3226480384,3226481407,US
-3226481408,3226481663,DE
+3226481408,3226481663,NL
3226481664,3226483199,US
3226483968,3226484479,US
3226484736,3226488831,US
@@ -49191,7 +53948,7 @@
3226542080,3226546431,US
3226547200,3226548223,CA
3226548992,3226549247,BE
-3226549248,3226550271,GB
+3226549248,3226550271,NL
3226551040,3226551807,US
3226552832,3226553087,US
3226553344,3226555391,US
@@ -49200,10 +53957,10 @@
3226557440,3226558463,US
3226558720,3226558975,US
3226559488,3226561535,US
-3226561792,3226562047,NO
+3226561792,3226562047,NL
3226563072,3226563327,US
3226563584,3226564607,US
-3226564864,3226565119,DE
+3226564864,3226565119,NL
3226565376,3226565631,FI
3226565632,3226569727,US
3226569984,3226570239,US
@@ -49214,11 +53971,13 @@
3226578944,3226579967,US
3226580480,3226581247,FI
3226581248,3226583295,US
-3226583552,3226583807,SE
-3226584064,3226591231,US
+3226583552,3226583807,NL
+3226584064,3226584415,US
+3226584416,3226584447,AU
+3226584448,3226591231,US
3226591232,3226592255,CA
-3226592768,3226593023,DE
-3226593792,3226594047,GB
+3226592768,3226593023,NL
+3226593792,3226594047,NL
3226594304,3226598911,US
3226599424,3226625535,US
3226625792,3226626047,US
@@ -49227,13 +53986,14 @@
3226627584,3226629375,US
3226629376,3226629631,CA
3226629632,3226630399,US
-3226630400,3226630655,GB
+3226630400,3226630655,NL
3226630912,3226631167,US
-3226631168,3226631423,CH
+3226631168,3226631423,NL
3226631424,3226631935,US
-3226631936,3226632191,PT
+3226631936,3226632191,NL
3226632192,3226633215,CA
-3226633216,3226635263,US
+3226633216,3226633471,AU
+3226633472,3226635263,US
3226635264,3226635519,AU
3226635520,3226635775,US
3226635776,3226636031,ZA
@@ -49241,33 +54001,37 @@
3226637056,3226637823,US
3226637824,3226638079,CA
3226638080,3226638335,US
-3226638592,3226638847,GB
+3226638592,3226638847,NL
3226638848,3226639615,US
3226639616,3226640127,AT
3226640128,3226640639,US
3226640640,3226640895,AU
3226640896,3226652927,US
3226653696,3226654207,US
-3226654208,3226654463,PT
+3226654208,3226654463,NL
3226654464,3226655743,US
-3226655744,3226656255,IT
+3226655744,3226656255,NL
3226656256,3226656511,AU
-3226656512,3226661119,US
-3226661120,3226661375,DE
+3226656512,3226658303,US
+3226658304,3226658559,AU
+3226658560,3226661119,US
+3226661120,3226661375,NL
3226661888,3226662143,US
3226662912,3226664959,US
3226664960,3226690815,FI
3226690816,3226691071,CA
-3226691072,3226691327,GB
-3226691584,3226693631,US
+3226691072,3226691327,NL
+3226691584,3226691839,AU
+3226691840,3226693631,US
3226694144,3226695167,US
3226695168,3226695679,AU
3226695680,3226695935,US
3226695936,3226696191,CA
-3226696448,3226696703,AU
+3226696192,3226696703,AU
3226696704,3226698495,US
3226698496,3226698751,CA
3226698752,3226704895,US
+3226705152,3226705407,AU
3226705408,3226705919,US
3226705920,3226706175,FR
3226706176,3226706943,US
@@ -49281,10 +54045,10 @@
3226716928,3226718207,US
3226720768,3226721279,JP
3226721280,3226721791,US
-3226722048,3226722303,CH
+3226722048,3226722303,NL
3226722304,3226722559,AU
3226722560,3226723583,US
-3226723584,3226723839,DE
+3226723584,3226723839,NL
3226723840,3226724095,US
3226724096,3226724351,AU
3226724352,3226725631,US
@@ -49297,24 +54061,24 @@
3226731776,3226732031,GB
3226732288,3226733567,US
3226733568,3226733823,MX
-3226733824,3226734079,PT
+3226733824,3226734079,NL
3226734080,3226734335,US
-3226734336,3226734591,PT
+3226734336,3226734591,NL
3226734592,3226736383,US
3226736896,3226737407,US
3226737408,3226737663,AT
3226737664,3226738175,US
3226738176,3226738431,NL
3226738432,3226738687,US
-3226738688,3226739199,NO
+3226738688,3226739199,NL
3226739712,3226743807,US
3226744576,3226746367,US
-3226746368,3226746623,PT
+3226746368,3226746623,NL
3226746624,3226748927,US
3226749440,3226749695,US
3226749696,3226752255,GB
3226752256,3226752767,US
-3226752768,3226753023,IT
+3226752768,3226753023,NL
3226753024,3226753279,US
3226753280,3226753535,AU
3226753536,3226753791,SI
@@ -49325,7 +54089,7 @@
3226758912,3226762751,US
3226763008,3226770687,IT
3226770688,3226772991,US
-3226772992,3226773247,CH
+3226772992,3226773247,NL
3226773248,3226774783,US
3226774784,3226775039,GB
3226775040,3226775295,US
@@ -49336,24 +54100,25 @@
3226784768,3226785023,GB
3226785024,3226786559,US
3226786560,3226786815,AU
-3226786816,3226787071,DE
-3226787072,3226787327,AT
+3226786816,3226787327,NL
3226787328,3226788095,US
3226788352,3226789375,HU
3226789376,3226789631,AU
3226789632,3226791167,US
3226791168,3226791679,AU
3226791680,3226792191,US
-3226792448,3226792703,AU
+3226792192,3226792703,AU
3226792704,3226792959,US
3226792960,3226793215,ZA
3226793216,3226793983,DE
3226793984,3226795263,US
-3226795264,3226795519,NZ
+3226795264,3226795519,AU
3226795520,3226795775,US
3226796032,3226800127,US
3226800128,3226800639,DE
-3226800640,3226824191,US
+3226800640,3226811391,US
+3226811392,3226811647,DE
+3226811648,3226824191,US
3226824192,3226824291,DE
3226824292,3226824293,US
3226824294,3226824447,DE
@@ -49361,65 +54126,70 @@
3226861824,3226862079,CA
3226862080,3226864383,US
3226864384,3226864639,RU
+3226864640,3226864895,AU
3226864896,3226865151,US
-3226865152,3226865407,PL
+3226865152,3226865407,NL
3226865408,3226866175,US
-3226866176,3226866431,GB
+3226866176,3226866431,NL
3226866432,3226867967,US
-3226867968,3226868223,IL
+3226867968,3226868223,NL
3226868224,3226868479,US
3226868480,3226868735,GB
3226868736,3226884351,US
-3226884352,3226884607,IL
+3226884352,3226884607,NL
3226884608,3226892799,US
3226893056,3226893567,US
3226893568,3226894079,NL
3226894080,3226894335,GB
-3226894336,3226895359,US
-3226895872,3226896127,GB
+3226894336,3226894591,US
+3226894592,3226894847,AU
+3226895104,3226895359,US
+3226895360,3226895871,AU
+3226895872,3226896127,NL
3226896128,3226896639,US
-3226896640,3226896895,GB
-3226896896,3226897151,PT
+3226896640,3226897151,NL
3226897152,3226902527,US
3226903040,3226903295,US
-3226903296,3226903551,DE
+3226903296,3226903551,NL
3226903552,3226903807,US
3226903808,3226904063,AU
-3226904064,3226904319,CH
-3226904320,3226904575,FR
+3226904064,3226904575,NL
3226904576,3226904831,US
-3226904832,3226905087,GB
+3226904832,3226905087,NL
3226905088,3226926591,US
-3226926592,3226926847,SE
+3226926592,3226926847,NL
3226927104,3226992639,NL
-3226992896,3226993151,CH
+3226992896,3226993151,NL
3226993152,3226993663,US
-3226993664,3226993919,DE
+3226993664,3226993919,NL
3226993920,3226994175,US
3226994176,3226994687,AU
3226994688,3226994943,US
-3226994944,3226995455,GB
+3226994944,3226995455,NL
3226995456,3226996479,US
-3226996992,3226997247,PT
+3226996992,3226997247,NL
3226998016,3226998527,US
-3226998528,3226999039,AT
+3226998528,3226999039,NL
3226999040,3227005439,US
3227005696,3227013119,US
+3227013120,3227013375,AU
3227013376,3227013887,US
-3227013888,3227014399,GB
+3227013888,3227014399,NL
3227014400,3227014655,NZ
-3227014656,3227014911,FI
+3227014656,3227014911,NL
3227014912,3227017215,US
-3227017472,3227017983,DE
+3227017472,3227017983,NL
+3227018496,3227019007,AU
3227019008,3227020287,US
-3227020288,3227020543,DE
+3227020288,3227020543,NL
3227020800,3227022847,US
-3227022848,3227023103,GB
+3227022848,3227023103,NL
+3227023104,3227023359,AU
3227023360,3227023615,US
3227023872,3227024127,US
-3227024128,3227024383,PT
+3227024128,3227024383,NL
3227024384,3227024895,US
-3227025408,3227025663,GB
+3227025408,3227025663,NL
3227025664,3227025919,US
3227025920,3227026175,GB
3227026176,3227026687,US
@@ -49428,28 +54198,27 @@
3227038720,3227040255,US
3227040512,3227040767,AU
3227040768,3227041279,US
-3227041280,3227041535,NZ
+3227041280,3227041535,AU
3227041536,3227042815,US
-3227042816,3227043071,IT
+3227042816,3227043071,NL
3227043072,3227043327,US
3227043584,3227044863,US
-3227044864,3227045119,PL
+3227044864,3227045119,NL
3227045120,3227053567,US
-3227053568,3227053823,GB
-3227053824,3227054079,DE
+3227053568,3227054079,NL
3227054080,3227056639,US
3227056640,3227058175,PT
3227058176,3227123711,FI
3227123712,3227224831,US
-3227225088,3227225599,LU
+3227225088,3227225599,NL
3227225600,3227226111,US
3227226368,3227234559,US
-3227234560,3227234815,PT
+3227234560,3227234815,NL
3227234816,3227235071,US
3227235072,3227235327,AU
3227235328,3227236607,US
3227236608,3227236863,AU
-3227236864,3227237119,RU
+3227236864,3227237119,NL
3227237120,3227237631,US
3227237632,3227237887,NO
3227237888,3227238143,US
@@ -49459,24 +54228,30 @@
3227240704,3227240959,GB
3227240960,3227243007,US
3227243008,3227243263,CA
-3227243264,3227243519,GB
+3227243264,3227243519,NL
3227243520,3227243775,US
+3227243776,3227244031,AU
3227244032,3227249151,SE
3227249408,3227249663,US
3227249664,3227252735,CH
3227252736,3227252991,US
3227253248,3227254271,US
+3227254272,3227254527,AU
3227254784,3227258623,US
+3227258624,3227258879,AU
3227258880,3227259135,US
-3227259392,3227276543,US
+3227259392,3227273983,US
+3227273984,3227274239,FI
+3227274240,3227274495,US
+3227274496,3227274751,NL
+3227274752,3227276543,US
3227276800,3227277055,FR
3227277312,3227278847,US
3227278848,3227279103,IE
3227279104,3227281407,US
3227281408,3227282175,IT
3227282176,3227282431,US
-3227282432,3227282687,NL
-3227282688,3227282943,GB
+3227282432,3227282943,NL
3227282944,3227284479,US
3227284480,3227284735,FI
3227284992,3227286783,US
@@ -49501,14 +54276,16 @@
3227301632,3227302399,US
3227302656,3227309055,US
3227309824,3227310079,US
-3227310080,3227310335,NO
-3227310336,3227320319,US
+3227310080,3227310335,NL
+3227310336,3227312127,US
+3227312128,3227312383,DK
+3227312384,3227320319,US
3227320320,3227362047,FR
3227362048,3227362303,US
3227362304,3227362559,GB
3227362560,3227385855,FR
3227385856,3227391999,US
-3227392000,3227392255,PT
+3227392000,3227392255,NL
3227392256,3227393023,US
3227393024,3227393279,AT
3227393280,3227396351,US
@@ -49517,17 +54294,17 @@
3227400448,3227400703,AT
3227400704,3227400959,GB
3227400960,3227401471,US
-3227401472,3227401727,ZA
+3227401472,3227401727,MU
3227401728,3227402495,AU
3227402496,3227402751,US
3227403008,3227403519,GR
3227403520,3227403775,US
3227404544,3227405311,US
-3227405312,3227405567,DE
-3227406080,3227414015,US
+3227405312,3227405567,NL
+3227405568,3227414015,US
3227414272,3227416063,GB
3227416064,3227417087,US
-3227417088,3227417343,BN
+3227417088,3227417343,AU
3227417344,3227417599,US
3227417856,3227418111,US
3227418112,3227418367,CA
@@ -49538,31 +54315,35 @@
3227427840,3227429119,US
3227429120,3227429375,NZ
3227429376,3227429887,US
-3227429888,3227430143,GB
+3227429888,3227430143,NL
3227430144,3227430399,US
-3227430400,3227430655,HK
+3227430400,3227430655,AU
3227430656,3227437055,FR
-3227437056,3227438079,US
+3227437056,3227437311,AU
+3227437312,3227437823,US
3227438848,3227439103,US
3227439104,3227439615,AU
-3227439616,3227439871,ZA
+3227439616,3227439871,MU
3227439872,3227440127,US
-3227440128,3227440383,IT
+3227440128,3227440383,NL
3227440384,3227442175,US
-3227442432,3227442687,RU
+3227442176,3227442431,AU
+3227442432,3227442687,NL
3227442688,3227443711,US
3227443712,3227443967,AT
3227443968,3227444223,AU
3227444224,3227445503,US
3227445504,3227445759,RU
3227445760,3227446015,US
-3227446016,3227446271,GB
+3227446016,3227446271,NL
3227446272,3227446783,US
-3227447040,3227447295,AT
-3227447296,3227448063,ZA
+3227446784,3227447039,AU
+3227447040,3227447295,NL
+3227447296,3227447807,MU
+3227447808,3227448063,ZA
3227448064,3227448575,AU
3227448576,3227448831,US
-3227448832,3227449087,ZA
+3227448832,3227449087,MU
3227449088,3227450111,US
3227450368,3227451455,US
3227451456,3227452375,CA
@@ -49571,7 +54352,9 @@
3227452736,3227452767,US
3227452768,3227453503,CA
3227453504,3227453507,US
-3227453508,3227454687,CA
+3227453508,3227454047,CA
+3227454048,3227454079,US
+3227454080,3227454687,CA
3227454688,3227454719,US
3227454720,3227455047,CA
3227455048,3227455051,US
@@ -49596,35 +54379,55 @@
3227466144,3227467775,CA
3227468032,3227468287,US
3227468800,3227484159,US
-3227484160,3227504639,CA
-3227504640,3227504895,US
-3227504896,3227516927,CA
-3227517184,3227522815,ZA
-3227523072,3227526143,ZA
-3227526400,3227533311,ZA
+3227484160,3227516927,CA
+3227517184,3227517695,ZA
+3227517696,3227519743,MU
+3227519744,3227520255,ZA
+3227520256,3227520767,MU
+3227520768,3227521023,ZA
+3227521024,3227522047,MU
+3227522048,3227522559,ZA
+3227522560,3227522815,MU
+3227523072,3227526143,MU
+3227526400,3227526655,MU
+3227526656,3227526911,ZA
+3227526912,3227533311,MU
3227533312,3227534335,US
-3227534336,3227557887,ZA
+3227534336,3227539455,MU
+3227539456,3227539711,ZA
+3227539712,3227541503,MU
+3227541504,3227541759,ZA
+3227541760,3227557887,MU
3227557888,3227558911,US
-3227558912,3227559935,ZA
+3227558912,3227559935,MU
3227559936,3227561983,US
-3227561984,3227568127,ZA
+3227561984,3227567103,MU
+3227567104,3227568127,ZA
3227568128,3227574271,US
-3227574272,3227579391,ZA
-3227579648,3227582463,ZA
-3227582464,3227647999,US
+3227574272,3227579391,MU
+3227579648,3227580159,MU
+3227580160,3227580927,ZA
+3227580928,3227582463,MU
+3227582464,3227638271,US
+3227638272,3227638527,CA
+3227638528,3227647999,US
3227648000,3227713535,FI
-3227713536,3227779071,CA
-3227779328,3227779583,ZA
-3227779584,3227779839,KR
+3227713536,3227722521,CA
+3227722522,3227722522,US
+3227722523,3227748035,CA
+3227748036,3227748039,US
+3227748040,3227779071,CA
+3227779328,3227779583,MU
+3227779584,3227779839,AU
3227779840,3227783679,US
-3227783680,3227783935,FR
+3227783680,3227783935,NL
3227783936,3227784703,US
3227784704,3227784959,AU
3227784960,3227785727,AT
3227785728,3227786495,US
3227786752,3227792383,US
-3227792384,3227792639,GB
-3227792640,3227792895,NZ
+3227792384,3227792639,NL
+3227792640,3227792895,AU
3227792896,3227794687,US
3227794688,3227794943,GB
3227794944,3227795199,US
@@ -49650,14 +54453,17 @@
3227813376,3227813631,US
3227813632,3227815167,GB
3227815168,3227815935,US
-3227815936,3227816191,GB
+3227815936,3227816191,NL
3227816192,3227818495,US
3227818496,3227818751,GB
3227818752,3227819263,MX
+3227819264,3227819519,AR
3227819520,3227822847,MX
+3227822848,3227823103,HN
3227823104,3227824383,MX
3227824640,3227825663,MX
3227825920,3227826687,MX
+3227826688,3227827199,AR
3227827200,3227829759,MX
3227830016,3227831807,MX
3227832064,3227833855,MX
@@ -49666,68 +54472,69 @@
3227842816,3227843327,MX
3227844864,3227845119,ES
3227845120,3227845631,US
-3227845632,3227845887,RU
+3227845632,3227845887,NL
3227846144,3227846655,US
-3227846656,3227846911,ES
-3227847424,3227847679,GB
+3227846656,3227847679,NL
3227847680,3227848703,US
-3227848704,3227848959,NZ
+3227848704,3227848959,AU
3227848960,3227851775,US
-3227851776,3227852031,DE
+3227851776,3227852031,NL
3227852032,3227852799,US
3227853312,3227853567,GB
3227853568,3227856127,US
3227856896,3227860991,US
-3227863808,3227864063,DE
+3227863808,3227864063,NL
3227864064,3227865343,US
-3227865344,3227867903,NL
-3227867904,3227868159,TH
-3227868160,3227873023,US
+3227865344,3227867647,NL
+3227867648,3227867903,BR
+3227867904,3227868159,AU
+3227868160,3227872767,US
+3227872768,3227873023,GB
3227873024,3227874047,NL
3227874048,3227874815,US
-3227874816,3227875071,PT
+3227874816,3227875071,NL
3227875072,3227878911,US
3227878912,3227879167,AU
3227879168,3227879679,US
-3227879680,3227879935,GB
+3227879680,3227879935,NL
3227880192,3227880959,US
-3227880960,3227881215,EG
+3227880960,3227881215,MU
3227881472,3227885567,US
3227885568,3227887871,ES
3227887872,3227888127,PR
-3227888128,3227888383,BE
+3227888128,3227888383,NL
3227888384,3227889151,US
3227889408,3227889663,US
-3227889664,3227889919,CH
+3227889664,3227889919,NL
3227890176,3227890431,US
-3227890432,3227890943,DE
+3227890432,3227890943,NL
3227890944,3227891455,US
3227891456,3227891711,AU
3227891712,3227893759,US
-3227893760,3227894015,FI
+3227893760,3227894015,NL
3227894016,3227895039,US
3227895040,3227895551,DE
3227895808,3227909119,US
3227909120,3227909375,BE
3227909376,3227909631,US
3227909632,3227909887,AU
-3227910400,3227910655,AT
+3227910400,3227910655,NL
3227910656,3227911679,US
3227911680,3227912191,UA
3227912192,3227912447,GB
-3227912448,3227912703,ZA
+3227912448,3227912703,MU
3227912704,3227912959,US
3227912960,3227913215,CA
3227913216,3227914495,US
3227914496,3227914751,AT
3227914752,3227931135,FI
3227931136,3227931391,US
-3227931392,3227931647,TH
+3227931392,3227931647,AU
3227931648,3227931903,PE
3227932672,3227932927,US
3227932928,3227933183,DE
3227933184,3227933695,US
-3227933696,3227933951,NZ
+3227933696,3227933951,AU
3227933952,3227934463,US
3227934464,3227934719,CH
3227934720,3227947519,US
@@ -49736,8 +54543,7 @@
3227964928,3227965183,GB
3227965184,3227966975,US
3227967232,3227967487,US
-3227967488,3227967743,FR
-3227967744,3227967999,PL
+3227967488,3227967999,NL
3227968000,3227968255,US
3227968256,3227968767,GB
3227968768,3227969023,RU
@@ -49749,56 +54555,61 @@
3227975936,3227976191,US
3227976192,3227976447,LU
3227976448,3227977471,US
-3227977472,3227977727,FR
+3227977472,3227977727,NL
3227977728,3227978751,US
3227979008,3227979263,US
-3227979264,3227979519,AE
+3227979264,3227979519,NL
3227979520,3227980799,US
-3227980800,3227981055,GR
+3227980800,3227981055,NL
3227981056,3227981567,US
-3227981568,3227981823,DE
+3227981568,3227981823,NL
3227981824,3227982335,US
3227982592,3227982847,DE
3227982848,3227985919,GB
3227985920,3227986175,DE
3227986176,3227986431,US
-3227986688,3227987455,US
+3227986432,3227986943,AU
+3227986944,3227987455,US
+3227987456,3227987711,AU
3227987712,3227997439,US
3227997440,3228005631,FI
3228005632,3228008959,US
3228008960,3228009215,AU
-3228009472,3228010751,US
+3228009472,3228009727,AU
+3228009728,3228010751,US
3228010752,3228011519,GB
3228011520,3228013311,US
-3228013312,3228013567,PT
+3228013312,3228013567,NL
3228013568,3228039423,US
3228040192,3228041215,US
3228041472,3228042239,US
3228042752,3228045055,US
-3228045056,3228045311,KR
+3228045056,3228045311,AU
3228045312,3228046335,US
3228046592,3228047103,US
-3228047104,3228047359,IT
+3228047104,3228047359,NL
3228047360,3228048383,US
-3228048384,3228048895,GB
+3228048384,3228048895,NL
3228048896,3228050175,US
3228050176,3228050943,PT
3228051200,3228051455,US
+3228051456,3228051711,AU
3228051712,3228051967,CH
3228051968,3228052223,US
3228052224,3228052991,AU
3228052992,3228053503,US
3228053504,3228053759,PT
3228054016,3228054783,US
-3228054784,3228055039,GB
+3228054784,3228055039,NL
3228055040,3228055295,US
3228055296,3228055807,NL
3228055808,3228056319,NO
3228056320,3228059647,US
3228059648,3228059903,CH
3228060160,3228060927,US
-3228060928,3228061183,DE
+3228060928,3228061183,NL
3228061184,3228061695,US
+3228061696,3228061951,AU
3228061952,3228062207,US
3228062208,3228062463,GB
3228062464,3228077055,US
@@ -49808,37 +54619,43 @@
3228077824,3228078847,US
3228078848,3228079103,GR
3228079104,3228080639,US
-3228080640,3228080895,IE
-3228080896,3228081151,FR
+3228080640,3228081151,NL
3228081152,3228081919,US
3228082944,3228083967,US
-3228083968,3228084479,BE
+3228083968,3228084479,NL
3228084480,3228085247,US
-3228085248,3228085503,JP
+3228085248,3228085503,AU
3228085504,3228100607,US
-3228100608,3228101119,JP
+3228100608,3228101119,AU
3228101120,3228102143,US
-3228102144,3228102399,GB
+3228102144,3228102399,NL
3228102400,3228103935,US
3228103936,3228104191,FR
-3228104192,3228104703,JP
-3228104704,3228104959,DK
+3228104192,3228104703,AU
+3228104704,3228104959,NL
3228104960,3228105471,US
-3228105472,3228105727,CH
+3228105472,3228105727,NL
+3228105728,3228105983,AU
3228105984,3228106495,US
3228106752,3228109311,US
-3228109312,3228109567,NZ
+3228109312,3228109567,AU
3228109568,3228125951,US
-3228125952,3228126207,RU
-3228126208,3228150271,US
+3228125952,3228126207,NL
+3228126208,3228133375,US
+3228133376,3228134655,CA
+3228134656,3228150271,US
3228150272,3228150527,FI
-3228150528,3228172287,US
+3228150528,3228156671,US
+3228156672,3228156927,BE
+3228156928,3228171775,US
+3228171776,3228172031,GB
+3228172032,3228172287,US
3228172288,3228237823,IT
-3228238336,3228238591,GB
+3228238080,3228238591,NL
3228238592,3228238847,US
3228238848,3228239359,GB
3228239616,3228240127,US
-3228240128,3228240383,AU
+3228240128,3228240639,AU
3228240640,3228241407,GB
3228241408,3228250367,US
3228250624,3228250879,US
@@ -49848,8 +54665,8 @@
3228264448,3228264703,NI
3228264704,3228265983,US
3228265984,3228266239,IE
-3228266752,3228267007,NZ
-3228267008,3228267263,NO
+3228266496,3228267007,AU
+3228267008,3228267263,NL
3228267264,3228268543,US
3228269056,3228269311,PT
3228269312,3228269567,DE
@@ -49860,11 +54677,11 @@
3228271616,3228271871,DE
3228272128,3228272383,US
3228272640,3228280831,US
-3228280832,3228281087,GB
+3228280832,3228281087,NL
3228281088,3228281599,US
-3228281600,3228282111,NZ
+3228281600,3228282111,AU
3228282112,3228282367,US
-3228282368,3228282623,GB
+3228282368,3228282623,NL
3228282624,3228283135,US
3228283136,3228283391,GR
3228283392,3228283647,GB
@@ -49874,7 +54691,7 @@
3228289024,3228297215,FI
3228297216,3228297727,AT
3228297728,3228297983,US
-3228297984,3228298495,DE
+3228297984,3228298495,NL
3228298496,3228303103,US
3228303360,3228309247,US
3228309248,3228310271,DE
@@ -49883,10 +54700,11 @@
3228316416,3228327167,DE
3228327168,3228328703,US
3228328704,3228328959,AU
-3228328960,3228329471,NO
+3228328960,3228329471,NL
3228329472,3228330751,US
3228330752,3228331263,SE
3228331264,3228332287,US
+3228332288,3228332543,AU
3228332544,3228332799,GR
3228332800,3228334079,FR
3228334080,3228334335,GB
@@ -49914,14 +54732,15 @@
3228353280,3228358399,SE
3228358400,3228361471,US
3228361728,3228362239,US
-3228362240,3228362495,TH
+3228362240,3228362495,AU
3228362496,3228362751,US
3228363008,3228363263,US
3228363264,3228363519,CH
3228363520,3228364287,US
-3228364288,3228364543,AT
+3228364288,3228364543,NL
3228364800,3228368895,US
-3228368896,3228380415,DE
+3228368896,3228373247,DE
+3228373504,3228380415,DE
3228380672,3228404735,DE
3228404736,3228405247,FR
3228405248,3228405503,KR
@@ -49929,37 +54748,47 @@
3228405760,3228406015,IN
3228406016,3228406271,US
3228406272,3228407039,FR
-3228407040,3228430847,DE
-3228430848,3228431103,ZA
+3228407040,3228420095,DE
+3228420608,3228426239,DE
+3228426752,3228430847,DE
+3228430848,3228431103,MU
3228431104,3228434431,DE
-3228434432,3228472831,US
+3228434432,3228456191,US
+3228456192,3228456447,CA
+3228456448,3228457471,US
+3228457472,3228457727,CA
+3228457728,3228461567,US
+3228461568,3228461823,CA
+3228461824,3228464127,US
+3228464128,3228464383,CA
+3228464384,3228472831,US
3228473344,3228477695,US
3228478464,3228479487,CA
3228479488,3228490751,US
-3228491520,3228508159,US
+3228491520,3228496127,US
+3228496128,3228496383,GB
+3228496384,3228508159,US
3228508160,3228508415,AU
-3228508416,3228508671,NO
+3228508416,3228508671,NL
3228508672,3228509439,US
-3228509952,3228510207,IE
+3228509952,3228510207,NL
3228510208,3228511231,US
-3228511232,3228511487,CZ
+3228511232,3228511487,NL
3228511488,3228511999,US
-3228512000,3228512255,DE
-3228512256,3228512511,CH
+3228512000,3228512511,NL
3228512512,3228513791,US
3228514304,3228521471,US
3228521984,3228522495,US
-3228522496,3228522751,GB
+3228522496,3228522751,NL
3228522752,3228525823,US
-3228525824,3228526079,PT
-3228526080,3228526335,NZ
-3228526336,3228526591,CH
-3228526592,3228526847,AT
+3228525824,3228526079,NL
+3228526080,3228526335,AU
+3228526336,3228526847,NL
3228526848,3228527103,AU
3228527104,3228531711,US
3228531712,3228532223,NO
3228532224,3228532479,US
-3228532480,3228532735,DE
+3228532480,3228532735,NL
3228532736,3228554751,US
3228555008,3228557311,US
3228557568,3228558591,US
@@ -49972,9 +54801,9 @@
3228573952,3228574463,US
3228574720,3228574975,US
3228575232,3228577023,US
-3228577024,3228577279,PT
+3228577024,3228577279,NL
3228577280,3228578047,US
-3228578048,3228578303,GB
+3228578048,3228578303,NL
3228578304,3228581119,US
3228581120,3228581375,AT
3228581376,3228583167,US
@@ -49988,17 +54817,16 @@
3228604160,3228617727,US
3228617728,3228617983,FI
3228617984,3228618239,US
-3228618240,3228618495,SE
+3228618240,3228618495,NL
3228618496,3228618751,US
3228618752,3228619007,DE
3228619008,3228620031,US
-3228620032,3228620287,DE
-3228620288,3228620543,CH
+3228620032,3228620543,NL
3228620544,3228620799,AU
3228620800,3228628735,US
3228628736,3228628991,ES
3228628992,3228630527,US
-3228630528,3228630783,CH
+3228630528,3228630783,NL
3228631040,3228696575,NL
3228696576,3228826371,IL
3228826372,3228826372,US
@@ -50013,11 +54841,15 @@
3229062451,3229064951,CA
3229064952,3229064955,US
3229064956,3229065215,CA
-3229065216,3229092607,US
-3229092608,3229092863,AU
-3229092864,3229093119,US
-3229093120,3229093631,AU
-3229093632,3229155327,US
+3229065216,3229092095,US
+3229092096,3229093887,AU
+3229093888,3229104895,US
+3229104896,3229105151,ES
+3229105152,3229120511,US
+3229120512,3229120767,SE
+3229120768,3229151487,US
+3229151488,3229151743,SE
+3229151744,3229155327,US
3229155328,3229155583,GB
3229155584,3229155839,SE
3229155840,3229156095,ES
@@ -50041,12 +54873,15 @@
3229195264,3229196287,DE
3229196288,3229196799,SE
3229196800,3229197311,AT
-3229197312,3229198847,SE
+3229197312,3229197823,SE
+3229197824,3229198335,GB
+3229198336,3229198847,SE
3229198848,3229199359,AT
3229199360,3229200383,SE
3229200384,3229200895,GB
3229200896,3229201151,DE
-3229201152,3229201663,SE
+3229201152,3229201407,SE
+3229201408,3229201663,IT
3229201664,3229201919,DK
3229201920,3229203199,SE
3229203200,3229203967,GB
@@ -50060,14 +54895,16 @@
3229256960,3229258495,GB
3229258496,3229259007,US
3229259520,3229264639,GB
-3229264640,3229264895,NZ
+3229264640,3229264895,AU
3229264896,3229265919,US
3229265920,3229266175,AU
3229266176,3229266943,US
3229266944,3229267199,NZ
3229267200,3229272319,US
-3229273856,3229275647,US
-3229275648,3229275903,GB
+3229273856,3229274623,US
+3229274624,3229274879,AU
+3229274880,3229275647,US
+3229275648,3229275903,NL
3229276160,3229281023,IE
3229281024,3229281791,US
3229281792,3229283071,PT
@@ -50076,34 +54913,35 @@
3229286400,3229354495,US
3229354496,3229355775,AU
3229355776,3229358079,US
-3229358080,3229359359,DE
+3229358080,3229358335,AU
+3229358336,3229359359,DE
3229359872,3229360127,US
3229360128,3229360383,AT
3229360384,3229361919,US
3229361920,3229362175,BE
3229362176,3229363199,US
3229363456,3229363711,US
-3229363712,3229363967,GB
+3229363712,3229363967,NL
3229363968,3229380607,US
-3229380608,3229380863,DE
+3229380608,3229380863,NL
3229380864,3229381375,US
-3229381376,3229381631,DE
-3229381632,3229381887,PL
+3229381376,3229381887,NL
3229381888,3229382143,AU
3229382144,3229382399,US
3229382656,3229390847,US
3229390848,3229391103,AU
3229391104,3229391359,US
-3229391360,3229391615,CN
-3229391616,3229391871,AT
+3229391360,3229391615,AU
+3229391616,3229391871,NL
3229391872,3229392895,US
3229392896,3229393151,NZ
3229393152,3229394175,US
3229394944,3229408255,RU
3229408256,3229412095,US
-3229412096,3229414911,DE
+3229412096,3229412351,NL
+3229412352,3229414911,DE
3229414912,3229415167,US
-3229415168,3229415679,DE
+3229415168,3229415679,NL
3229415936,3229417215,DE
3229417472,3229483007,DE
3229483008,3229499647,FI
@@ -50111,7 +54949,7 @@
3229501440,3229614847,US
3229614848,3229615103,GB
3229615104,3229679615,US
-3229679872,3229695487,DE
+3229679616,3229695487,DE
3229695488,3229697535,US
3229697792,3229700095,US
3229700096,3229700351,AT
@@ -50124,24 +54962,24 @@
3229810688,3229814015,US
3229814016,3229814271,AU
3229814272,3229815807,US
-3229815808,3229816063,DE
+3229815808,3229816063,NL
3229816320,3229817087,US
-3229817088,3229817599,SE
+3229817088,3229817599,NL
3229817600,3229818623,AU
3229818624,3229818879,US
3229818880,3229820927,JM
3229820928,3229830911,US
-3229830912,3229831167,GB
+3229830912,3229831167,NL
3229831168,3229833215,US
-3229833472,3229833727,GB
+3229833472,3229833727,NL
3229833728,3229834495,AU
3229834496,3229834751,US
3229834752,3229835007,CA
3229835008,3229835263,US
-3229835264,3229835519,FI
+3229835264,3229835519,NL
3229835520,3229835775,CA
3229835776,3229838335,US
-3229838336,3229838591,GB
+3229838336,3229838591,NL
3229838592,3229838847,US
3229839104,3229844479,US
3229844480,3229844735,BE
@@ -50158,34 +54996,35 @@
3229878784,3229879039,IT
3229879040,3229879295,NO
3229879296,3229880063,US
-3229880064,3229880319,KR
+3229880064,3229880319,AU
3229880320,3229881087,US
3229881088,3229881343,CA
-3229881344,3229883391,US
+3229881344,3229883135,US
3229883648,3229883903,US
-3229884160,3229884415,JP
-3229884928,3229885183,IT
+3229884160,3229884415,AU
+3229884928,3229885183,NL
3229885184,3229885439,BR
3229885440,3229886719,US
3229886720,3229886975,AU
3229886976,3229889791,US
-3229889792,3229890047,PT
+3229889792,3229890047,NL
3229890048,3229890303,US
-3229890304,3229890559,PT
+3229890304,3229890559,NL
3229890560,3229891583,US
3229891584,3229891839,CA
3229892608,3229900031,US
3229900032,3229900287,AU
3229900288,3229901567,US
3229901568,3229901823,GB
-3229901824,3229928703,US
+3229901824,3229902335,US
+3229902336,3229902591,AU
+3229902592,3229928703,US
3229928960,3229937407,US
3229937408,3229937663,GB
3229937664,3229937919,US
3229937920,3229938175,CA
3229938176,3229938431,US
-3229938688,3229938943,IL
-3229938944,3229939199,AT
+3229938688,3229939199,NL
3229939200,3229939455,US
3229939456,3229940735,KR
3229940736,3229940991,CH
@@ -50193,28 +55032,31 @@
3229941248,3229941503,US
3229942272,3229942783,US
3229943040,3229943295,US
-3229943552,3229945087,US
-3229945600,3229945855,PT
+3229943552,3229944319,US
+3229944320,3229944575,AU
+3229944576,3229945087,US
+3229945344,3229945599,AU
+3229945600,3229945855,NL
3229945856,3229947135,US
3229947136,3229947391,AU
3229947392,3229948927,US
3229948928,3229949183,IT
3229949184,3229949695,US
3229949696,3229949951,NZ
-3229949952,3229950207,NO
+3229949952,3229950207,NL
3229950208,3229950975,US
-3229950976,3229951231,IL
+3229950976,3229951231,NL
3229951232,3229952255,US
3229952256,3229952511,AU
3229952512,3229955327,US
3229955328,3229955583,NL
3229955584,3229956095,PT
3229956096,3229956607,US
-3229956608,3229956863,GB
+3229956608,3229956863,NL
3229956864,3229958143,US
-3229958144,3229958399,NO
+3229958144,3229958399,NL
3229958400,3229958655,US
-3229958912,3229959167,SG
+3229958656,3229959167,AU
3229959168,3229962239,US
3229963008,3229963519,US
3229963776,3229967615,US
@@ -50224,30 +55066,30 @@
3229969664,3229969919,AT
3229969920,3229970431,FI
3229970432,3229972735,US
-3229972736,3229972991,SE
+3229972736,3229972991,NL
3229972992,3229975295,US
3229975296,3229975551,GB
3229975552,3230004223,US
-3230004224,3230004479,GB
+3230004224,3230004479,NL
3230004480,3230004991,US
-3230005760,3230006015,ZA
-3230006016,3230007039,US
+3230005760,3230006015,MU
+3230006016,3230007295,US
3230007296,3230072831,FR
3230072832,3230074623,US
3230074624,3230074879,DE
3230074880,3230082559,IT
3230082560,3230082815,US
3230083072,3230084607,US
-3230084608,3230084863,NO
+3230084608,3230084863,NL
3230084864,3230085119,US
3230085120,3230085375,CA
3230085376,3230085631,US
3230085888,3230086143,DE
3230086144,3230086655,GB
3230087168,3230088191,US
-3230088960,3230089215,AT
+3230088960,3230089215,NL
3230089216,3230089727,US
-3230089728,3230089983,GB
+3230089728,3230089983,NL
3230089984,3230090239,US
3230090240,3230090495,GB
3230090496,3230092543,US
@@ -50260,43 +55102,43 @@
3230096384,3230101503,JP
3230101504,3230104319,US
3230104576,3230105855,US
-3230105856,3230106111,PT
+3230105856,3230106111,NL
3230106112,3230106879,US
-3230106880,3230107135,AT
+3230106880,3230107135,NL
3230107136,3230109439,US
-3230109440,3230109695,NO
+3230109440,3230109695,NL
3230109696,3230109951,US
3230109952,3230115071,CH
3230115072,3230115327,IT
3230115328,3230115583,GR
3230115584,3230116095,BE
3230116096,3230117631,US
-3230117632,3230117887,FR
+3230117632,3230117887,NL
3230117888,3230120191,US
+3230120192,3230120447,NL
3230120448,3230120703,US
3230120704,3230120959,PT
-3230121216,3230122495,US
+3230120960,3230122495,US
3230123008,3230125055,US
3230125312,3230125567,US
3230125824,3230126335,AU
3230126336,3230126591,US
+3230126592,3230126847,AU
3230126848,3230128639,US
-3230128896,3230129151,PT
+3230128896,3230129151,NL
3230129152,3230129663,US
-3230129664,3230129919,JP
-3230130432,3230130687,IE
+3230129664,3230129919,AU
+3230130432,3230130687,NL
3230130688,3230131711,US
3230131968,3230132991,GB
3230132992,3230137599,US
-3230137600,3230137855,NO
-3230137856,3230138111,PL
+3230137600,3230138111,NL
3230138368,3230140159,US
3230140160,3230140415,MT
3230140416,3230140671,US
3230140672,3230140927,FI
3230140928,3230142975,US
-3230142976,3230143231,GB
-3230143232,3230143487,BE
+3230142976,3230143487,NL
3230143488,3230144255,US
3230144256,3230144511,NL
3230144512,3230145279,US
@@ -50308,20 +55150,18 @@
3230146560,3230147583,US
3230147840,3230148351,US
3230148352,3230148607,AU
-3230148608,3230148863,GB
-3230148864,3230149119,CH
+3230148608,3230149119,NL
3230149120,3230150655,NI
3230150656,3230150911,US
-3230150912,3230151167,PT
+3230150912,3230151167,NL
3230151168,3230151423,US
-3230151424,3230151679,NL
-3230151680,3230151935,PT
+3230151424,3230151935,NL
3230152192,3230152447,FR
3230152448,3230153215,BF
3230153216,3230153471,FR
-3230153472,3230153727,PF
+3230153472,3230153727,AU
3230153728,3230153983,US
-3230153984,3230154239,RU
+3230153984,3230154239,NL
3230154240,3230156543,US
3230156544,3230164991,FI
3230165504,3230167295,US
@@ -50330,32 +55170,91 @@
3230175232,3230177791,US
3230177792,3230178303,GB
3230178304,3230178559,CH
-3230179328,3230223615,US
+3230179328,3230210047,US
+3230210048,3230210303,CA
+3230210304,3230211839,US
+3230211840,3230212095,CN
+3230212096,3230214911,US
+3230214912,3230215167,PR
+3230215168,3230219775,US
+3230219776,3230220031,NL
+3230220032,3230220287,US
+3230220288,3230222847,NL
+3230222848,3230223103,ES
+3230223104,3230223359,GB
+3230223360,3230223615,CH
3230223616,3230225919,LU
-3230225920,3230241023,US
+3230225920,3230226175,AU
+3230226176,3230226431,ES
+3230226432,3230226687,US
+3230226688,3230226943,NO
+3230226944,3230228223,GB
+3230228224,3230228479,ES
+3230228480,3230228735,AU
+3230228736,3230228991,US
+3230228992,3230229247,GB
+3230229248,3230229503,US
+3230229504,3230229759,ES
+3230229760,3230230015,DE
+3230230016,3230236159,US
+3230236160,3230236415,AU
+3230236416,3230236671,GB
+3230236672,3230236927,CA
+3230236928,3230240767,US
+3230240768,3230241023,DK
3230241024,3230241791,GB
-3230241792,3230269439,US
+3230241792,3230242303,CH
+3230242304,3230243839,US
+3230243840,3230244095,HK
+3230244096,3230244351,US
+3230244352,3230244607,CA
+3230244608,3230245119,FR
+3230245120,3230246143,SE
+3230246144,3230246911,US
+3230246912,3230247167,CH
+3230247168,3230247935,US
+3230247936,3230248191,AU
+3230248192,3230251007,US
+3230251008,3230251263,CH
+3230251264,3230251519,MX
+3230251520,3230252031,CH
+3230252032,3230254847,US
+3230254848,3230255359,SE
+3230255360,3230255615,ES
+3230255616,3230256127,US
+3230256128,3230256383,GB
+3230256384,3230257919,US
+3230257920,3230259199,CH
+3230259200,3230263807,US
+3230263808,3230264063,SE
+3230264064,3230264319,NL
+3230264320,3230266111,CH
+3230266112,3230267135,US
+3230267136,3230267903,CA
+3230267904,3230269439,US
3230269440,3230271743,GB
3230272512,3230291455,US
-3230291456,3230291711,PT
+3230291456,3230291711,NL
3230291712,3230295039,US
3230295040,3230295295,AU
3230295296,3230296319,US
3230296320,3230297343,NO
3230297344,3230299647,SE
3230301696,3230302207,US
+3230302464,3230302719,CA
3230302976,3230307327,US
3230307584,3230309119,US
3230309120,3230309375,NO
3230309376,3230310143,GB
3230310144,3230310655,US
3230310912,3230316287,US
-3230316288,3230316543,IT
+3230316288,3230316543,NL
3230316544,3230316799,US
3230316800,3230317311,CA
3230317312,3230317567,US
+3230317568,3230317823,AU
3230318080,3230318591,US
-3230318592,3230318847,GB
+3230318592,3230318847,NL
3230318848,3230321663,US
3230321664,3230321919,PT
3230321920,3230322175,US
@@ -50365,11 +55264,13 @@
3230328064,3230328319,GB
3230328320,3230329087,CH
3230329088,3230332927,US
-3230332928,3230333183,GB
+3230332928,3230333183,NL
3230333184,3230333695,US
-3230333696,3230333951,NZ
+3230333696,3230333951,AU
3230333952,3230334719,US
-3230334976,3230340095,CA
+3230334976,3230336255,CA
+3230336512,3230339583,CA
+3230339840,3230340095,CA
3230340352,3230350847,CA
3230351104,3230354943,CA
3230354944,3230355199,FR
@@ -50383,25 +55284,26 @@
3230372864,3230383359,CA
3230383616,3230384127,CA
3230384384,3230387455,CA
-3230387712,3230400511,CA
+3230387712,3230400255,CA
3230681088,3230683135,FR
-3230787584,3230793727,US
-3230793984,3230823679,US
-3230823680,3230823935,DK
-3230824192,3230824447,FR
+3230787584,3230797311,US
+3230797312,3230797567,SG
+3230797568,3230823679,US
+3230823680,3230823935,NL
+3230824192,3230824447,NL
3230824448,3230825215,US
3230825216,3230825471,GB
3230825472,3230826239,ES
3230826240,3230827007,US
-3230827520,3230827775,AT
-3230827776,3230828031,NZ
+3230827520,3230827775,NL
+3230827776,3230828031,AU
3230828032,3230828543,HU
3230828544,3230829055,GB
3230829568,3230830079,RU
3230830080,3230832127,US
-3230832128,3230832383,NZ
+3230832128,3230832383,AU
3230832384,3230832639,US
-3230832640,3230832895,FI
+3230832640,3230832895,NL
3230832896,3230833151,US
3230833664,3230833919,CA
3230833920,3230834175,BR
@@ -50412,39 +55314,40 @@
3230838016,3230840319,IT
3230840320,3230840575,FR
3230840576,3230840831,US
-3230840832,3230841087,JP
-3230841088,3230841343,DE
-3230841600,3230841855,ES
+3230840832,3230841087,AU
+3230841088,3230841343,NL
+3230841600,3230841855,NL
3230841856,3230842111,US
+3230842112,3230842367,AU
3230842624,3230843135,US
-3230843136,3230843391,NO
+3230843136,3230843391,NL
3230843392,3230844671,US
3230844928,3230845183,AU
3230845184,3230845951,US
3230845952,3230846207,CZ
3230846208,3230849535,US
-3230849536,3230850047,NZ
+3230849536,3230850047,AU
3230850048,3230851839,US
-3230851840,3230852095,NO
-3230852096,3230852351,GB
+3230851840,3230852351,NL
3230852352,3230852607,BR
+3230853120,3230853375,AU
3230853376,3230853887,FR
3230853888,3230854399,US
3230854400,3230854655,UY
3230854656,3230855167,NO
3230855168,3230855679,US
-3230855680,3230855935,IT
+3230855680,3230855935,NL
3230855936,3230857983,US
3230857984,3230858751,AU
3230858752,3230859007,US
3230859264,3230865151,US
-3230865152,3230865407,GB
+3230865152,3230865407,NL
3230865664,3230867967,US
-3230867968,3230868223,IS
+3230867968,3230868223,NL
3230868224,3230868479,US
-3230868480,3230868735,GB
+3230868480,3230868735,NL
3230868992,3230870015,US
-3230870016,3230870271,PL
+3230870016,3230870271,NL
3230870272,3230873343,US
3230873344,3230873599,HK
3230873600,3230877183,US
@@ -50454,14 +55357,14 @@
3230879744,3230888447,US
3230888448,3230888703,AU
3230888704,3230895359,US
-3230895360,3230895615,PL
+3230895360,3230895615,NL
3230895616,3230897151,US
3230897408,3230897663,US
-3230897664,3230897919,GB
+3230897664,3230897919,NL
3230898688,3230898943,US
-3230898944,3230899199,PT
+3230898944,3230899199,NL
3230899200,3230913535,US
-3230913536,3230913791,GB
+3230913536,3230913791,NL
3230913792,3230914047,CA
3230914048,3230914303,US
3230914304,3230914815,FI
@@ -50469,18 +55372,21 @@
3230915072,3230915327,BR
3230915328,3230915583,GB
3230915584,3230917631,US
-3230917632,3230917887,GB
+3230917632,3230917887,NL
3230917888,3230918399,US
3230918656,3230919423,US
3230919424,3230919679,AU
3230919680,3230922239,US
3230922240,3230922495,AU
-3230922496,3230922751,IT
+3230922496,3230922751,NL
3230922752,3230923519,US
-3230923776,3230933247,US
+3230923776,3230924031,US
+3230924032,3230924287,AU
+3230924288,3230924543,US
+3230924800,3230933247,US
3230933248,3230948607,SE
3230948608,3230951167,US
-3230951168,3230951423,PT
+3230951168,3230951423,NL
3230951680,3230951935,US
3230952192,3230953471,US
3230953472,3230954495,CA
@@ -50503,8 +55409,8 @@
3230980096,3230980351,GB
3230980352,3230980607,CA
3230980608,3230980863,US
-3230981120,3230981375,IT
-3230981376,3230981631,NZ
+3230981120,3230981375,NL
+3230981376,3230981631,AU
3230981632,3230981887,US
3230981888,3230983935,AU
3230983936,3230989823,US
@@ -50513,14 +55419,14 @@
3230991360,3230991615,US
3230991616,3230991871,FI
3230991872,3230994175,US
-3230994176,3230994431,GB
+3230994176,3230994431,NL
3230994432,3230994687,US
3230994944,3230995199,US
-3230995200,3230995455,ES
+3230995200,3230995455,NL
3230995456,3230995711,AU
3230995712,3230996223,US
3230996480,3230997247,US
-3230997248,3230997503,AT
+3230997248,3230997503,NL
3230997504,3230997759,US
3230997760,3230999039,SE
3230999040,3230999295,US
@@ -50553,7 +55459,7 @@
3231016448,3231016703,NO
3231016704,3231016959,US
3231017216,3231018495,US
-3231018496,3231018751,IT
+3231018496,3231018751,NL
3231018752,3231019007,GB
3231019008,3231019775,US
3231020032,3231020287,US
@@ -50563,12 +55469,13 @@
3231021568,3231021823,US
3231021824,3231022079,CA
3231022080,3231022591,US
-3231022592,3231022847,DE
+3231022592,3231022847,NL
3231022848,3231028479,US
+3231028480,3231028735,AU
3231028736,3231042047,US
3231042048,3231042303,GU
3231042304,3231043839,US
-3231043840,3231044095,JP
+3231043840,3231044095,AU
3231044352,3231048447,US
3231048448,3231048703,NL
3231048704,3231049727,US
@@ -50576,25 +55483,30 @@
3231049984,3231050239,US
3231050496,3231051263,US
3231051264,3231051519,GB
+3231051520,3231051775,AU
3231051776,3231053055,US
3231053824,3231055103,US
3231055872,3231057151,US
3231057152,3231057407,CA
3231057408,3231070463,US
3231070720,3231074559,SE
-3231075072,3231077119,SE
+3231075072,3231075583,NL
+3231075840,3231077119,SE
3231077120,3231077375,PL
3231077376,3231077631,SE
3231078144,3231078655,US
-3231078656,3231078911,GB
+3231078656,3231078911,NL
3231078912,3231079423,CA
-3231079424,3231079679,GB
+3231079424,3231079679,NL
3231079680,3231079935,US
3231079936,3231080191,NL
-3231080192,3231082495,US
-3231082496,3231082751,PL
+3231080192,3231080447,US
+3231080448,3231080703,AU
+3231080704,3231082495,US
+3231082496,3231082751,NL
3231082752,3231083007,US
3231083008,3231083263,GB
+3231083264,3231083519,AU
3231083520,3231087615,US
3231087616,3231087871,NO
3231087872,3231088127,US
@@ -50602,11 +55514,12 @@
3231088384,3231088895,US
3231088896,3231090687,AU
3231090944,3231091711,AU
-3231091712,3231091967,GB
+3231091712,3231091967,NL
3231091968,3231092223,US
3231092480,3231092735,US
+3231092736,3231092991,AU
3231092992,3231093247,US
-3231093248,3231093503,IT
+3231093248,3231093503,NL
3231093504,3231094527,US
3231094784,3231100415,US
3231100672,3231101183,US
@@ -50620,6 +55533,7 @@
3231106304,3231106559,NO
3231106560,3231106815,GB
3231106816,3231107071,US
+3231107072,3231107327,AU
3231107328,3231107583,US
3231107584,3231107839,AU
3231107840,3231108095,AT
@@ -50650,10 +55564,14 @@
3231121408,3231149311,US
3231149312,3231149567,CA
3231149568,3231154431,US
-3231155200,3231156223,CA
+3231154432,3231154687,AU
+3231155200,3231155711,US
+3231155712,3231156223,CA
3231156224,3231174655,US
3231174656,3231182847,CN
-3231182848,3231188479,US
+3231182848,3231186687,US
+3231186688,3231186943,CN
+3231186944,3231188479,US
3231188480,3231188735,NO
3231188736,3231190527,US
3231190528,3231190783,GB
@@ -50676,10 +55594,11 @@
3231203072,3231203327,AT
3231203328,3231204351,US
3231204352,3231204607,FI
-3231204608,3231204863,JP
+3231204608,3231204863,AU
3231204864,3231207935,US
3231207936,3231208191,DE
3231208192,3231208959,US
+3231208960,3231209471,AU
3231209472,3231211775,US
3231211776,3231212031,CA
3231212032,3231212287,CH
@@ -50696,7 +55615,11 @@
3231218688,3231218943,BE
3231218944,3231223039,US
3231223040,3231223295,IT
-3231223296,3231225599,US
+3231223296,3231223807,US
+3231223808,3231224063,AU
+3231224064,3231224319,US
+3231224320,3231224575,AU
+3231224576,3231225599,US
3231225600,3231225855,DE
3231226368,3231226879,US
3231226880,3231227135,GB
@@ -50713,12 +55636,14 @@
3231235072,3231236095,US
3231236608,3231236863,US
3231236864,3231237119,CA
-3231237120,3231238911,US
+3231237120,3231237375,US
+3231237376,3231237631,AU
+3231237632,3231238911,US
3231239168,3231241215,US
-3231241216,3231241471,JP
+3231241216,3231241471,AU
3231241984,3231244287,US
3231244544,3231248639,US
-3231248640,3231248895,GB
+3231248640,3231248895,NL
3231248896,3231249407,US
3231249408,3231249663,GB
3231249664,3231250431,US
@@ -50727,17 +55652,18 @@
3231251712,3231251967,GB
3231251968,3231252223,AT
3231252736,3231252991,US
-3231252992,3231253503,GB
+3231252992,3231253503,NL
3231253504,3231254015,US
-3231254272,3231255551,US
-3231255552,3231255807,GB
+3231254272,3231254783,US
+3231254784,3231255039,AU
+3231255040,3231255551,US
3231255808,3231256063,PT
3231256320,3231257087,US
3231257088,3231257599,HU
3231257600,3231258879,US
3231259136,3231275007,US
3231275008,3231275263,BR
-3231275264,3231275519,CH
+3231275264,3231275519,NL
3231275520,3231276287,US
3231276288,3231276543,AU
3231276544,3231276799,US
@@ -50748,36 +55674,35 @@
3231282944,3231283199,CL
3231283200,3231283455,BR
3231283456,3231284991,US
-3231284992,3231285247,PL
+3231284992,3231285247,NL
3231285248,3231291647,US
-3231291648,3231291903,GB
+3231291648,3231291903,NL
3231291904,3231292159,US
3231292416,3231292927,US
3231292928,3231293183,AU
3231293184,3231294975,US
-3231294976,3231295231,GB
+3231294976,3231295231,NL
3231295232,3231295487,CR
-3231295488,3231295743,BE
+3231295488,3231295743,NL
3231295744,3231296255,US
-3231296256,3231296511,RU
+3231296256,3231296511,NL
3231296512,3231296767,US
3231296768,3231299327,AT
3231299328,3231299583,US
3231300352,3231300607,US
-3231300608,3231300863,SE
-3231300864,3231301119,GB
+3231300608,3231301119,NL
3231301120,3231302143,US
3231302144,3231302399,NO
3231302400,3231302655,US
3231302656,3231303167,AU
3231303168,3231307007,US
-3231307008,3231307263,GB
+3231307008,3231307263,NL
3231307264,3231308031,US
3231308032,3231308287,CA
3231308288,3231308799,US
3231308800,3231309055,CA
3231310848,3231316735,US
-3231316736,3231316991,NZ
+3231316736,3231316991,AU
3231316992,3231317759,US
3231318272,3231318783,US
3231319040,3231322111,US
@@ -50792,34 +55717,41 @@
3231478016,3231482879,US
3231482880,3231483135,BE
3231483136,3231484927,US
-3231484928,3231490047,JP
+3231484928,3231487999,JP
+3231488512,3231488767,JP
+3231489536,3231490047,AU
3231490048,3231490559,US
-3231490560,3231490815,GB
+3231490560,3231490815,NL
3231490816,3231491071,US
-3231491328,3231491583,NZ
+3231491328,3231491583,AU
3231491584,3231491839,US
3231491840,3231492095,GB
-3231492096,3231497727,US
+3231492096,3231493631,US
+3231493632,3231493887,CH
+3231493888,3231497727,US
3231497984,3231499263,US
3231499520,3231500031,US
3231500032,3231500287,BM
3231500288,3231502079,US
-3231502080,3231502335,AU
+3231502080,3231502591,AU
3231502592,3231502847,US
-3231502848,3231503103,PT
+3231502848,3231503103,NL
3231503104,3231503615,US
3231503616,3231503871,IT
3231503872,3231504383,US
-3231504640,3231504895,RU
-3231505152,3231506687,US
-3231506688,3231506943,NZ
+3231504640,3231504895,NL
+3231505152,3231505407,US
+3231505408,3231505663,AU
+3231505664,3231506687,US
+3231506688,3231506943,AU
3231506944,3231507199,US
3231507200,3231507455,BE
3231507456,3231508479,US
3231508992,3231509247,US
-3231510272,3231510527,GB
+3231510272,3231510527,NL
3231510528,3231512575,US
3231512576,3231512831,LU
+3231512832,3231513087,AU
3231513088,3231513343,US
3231513600,3231514367,US
3231514624,3231515647,NO
@@ -50831,20 +55763,25 @@
3231522560,3231528959,US
3231528960,3231528999,CA
3231529000,3231529015,US
-3231529016,3231531007,CA
-3231531008,3231533567,US
+3231529016,3231530751,CA
+3231530752,3231533567,US
3231534080,3231539199,US
3231539200,3231547391,CA
3231547392,3231547647,US
-3231547648,3231547903,NO
-3231547904,3231551231,US
+3231547648,3231547903,NL
+3231547904,3231549951,US
+3231549952,3231550207,JP
+3231550208,3231550719,DE
+3231550720,3231550975,GB
+3231550976,3231551231,US
3231551232,3231551999,CA
3231552000,3231553023,US
3231553024,3231553791,JP
-3231553792,3231554047,US
+3231553792,3231554047,CH
3231554048,3231555327,DE
3231555328,3231555583,CA
3231555584,3231556095,US
+3231556096,3231556351,AU
3231556352,3231556607,US
3231556608,3231556863,CA
3231556864,3231557887,AT
@@ -50852,16 +55789,17 @@
3231558400,3231558655,DE
3231558656,3231558911,GB
3231558912,3231559167,CA
-3231559168,3231559423,GB
+3231559168,3231559423,NL
3231559424,3231559679,US
-3231559680,3231559935,GB
+3231559680,3231559935,NL
3231559936,3231561983,US
-3231561984,3231562239,IT
+3231561984,3231562239,NL
3231562240,3231562495,US
-3231562496,3231562751,GB
+3231562496,3231562751,NL
3231562752,3231563007,US
-3231563008,3231563263,CH
-3231563264,3231563519,ZA
+3231563008,3231563263,NL
+3231563264,3231563519,MU
+3231563520,3231563775,AU
3231563776,3231583231,US
3231583232,3231584255,CA
3231584256,3231586559,US
@@ -50871,39 +55809,36 @@
3231591680,3231591935,AU
3231591936,3231593983,US
3231593984,3231594495,GB
-3231594496,3231596031,US
-3231596544,3231644927,US
+3231594496,3231644927,US
3231645184,3231645439,US
3231645696,3231649791,US
3231649792,3231653887,SG
3231653888,3231663103,US
-3231663616,3231663871,FI
+3231663616,3231663871,NL
3231663872,3231664127,CA
3231664128,3231664383,US
-3231664384,3231664639,GB
+3231664384,3231664639,NL
3231664640,3231665407,US
-3231665408,3231665663,IT
+3231665408,3231665663,NL
3231665664,3231667199,US
-3231667200,3231667711,ES
+3231667200,3231667711,NL
3231667712,3231668735,US
3231668736,3231668991,BE
3231669248,3231669503,US
3231669760,3231670015,CA
-3231670016,3231670271,DE
+3231670016,3231670271,NL
3231670272,3231671039,US
3231671040,3231672319,GB
3231672320,3231672575,US
3231672576,3231672831,NL
3231672832,3231673343,US
-3231673344,3231673599,NO
-3231673600,3231673855,IE
+3231673344,3231673855,NL
3231673856,3231674111,US
3231674112,3231674367,CA
3231674368,3231675391,US
3231675392,3231675647,BR
-3231675904,3231676159,IE
-3231676672,3231676927,FR
-3231676928,3231677183,FI
+3231675904,3231676159,NL
+3231676416,3231677439,NL
3231677440,3231694847,US
3231694848,3231711231,CA
3231711232,3231713023,US
@@ -50911,7 +55846,7 @@
3231713280,3231713791,US
3231713792,3231714047,GB
3231714048,3231715071,US
-3231715072,3231715327,SI
+3231715072,3231715327,NL
3231715328,3231715583,AU
3231715584,3231716095,US
3231716096,3231716351,AU
@@ -50921,10 +55856,12 @@
3231717120,3231717375,NO
3231717632,3231718143,US
3231718144,3231718399,IT
-3231718400,3231719679,US
-3231719680,3231719935,ES
+3231718400,3231718655,US
+3231718656,3231718911,AU
+3231718912,3231719679,US
+3231719680,3231719935,NL
3231720192,3231720703,US
-3231720704,3231720959,IT
+3231720704,3231720959,NL
3231720960,3231722751,US
3231722752,3231723007,BR
3231723008,3231723519,US
@@ -50932,8 +55869,8 @@
3231724032,3231724287,BR
3231724288,3231725055,US
3231725312,3231727871,US
-3231727872,3231728127,DE
-3231728384,3231728639,AT
+3231727872,3231728127,NL
+3231728384,3231728639,NL
3231728640,3231729407,US
3231729408,3231729663,AU
3231729664,3231735551,US
@@ -50942,56 +55879,56 @@
3231737600,3231738367,US
3231738368,3231738623,NL
3231738624,3231739135,US
-3231739136,3231739391,GB
-3231739392,3231739647,PL
+3231739136,3231739647,NL
3231739648,3231739903,BR
3231739904,3231742719,US
-3231742720,3231742975,FR
+3231742720,3231742975,NL
3231742976,3231743487,US
-3231743488,3231743743,NO
+3231743488,3231743743,NL
3231743744,3231743999,US
3231744000,3231744255,BR
3231744256,3231747583,US
-3231747584,3231747839,DE
-3231747840,3231748095,GB
+3231747584,3231748095,NL
3231748096,3231750143,US
3231750144,3231750399,NL
3231750400,3231750911,US
+3231750912,3231751167,AU
3231751168,3231751423,IT
3231751424,3231752191,US
-3231752192,3231752447,IT
-3231752448,3231752703,JP
+3231752192,3231752447,NL
+3231752448,3231752703,AU
3231752704,3231753983,US
3231753984,3231754239,CA
3231754240,3231754495,US
3231754496,3231755263,AU
-3231755264,3231755519,HU
+3231755264,3231755519,NL
3231755520,3231755775,US
3231755776,3231756543,PR
3231756544,3231757311,GB
3231757312,3231759359,US
3231759616,3231760895,US
-3231760896,3231761407,GB
+3231760896,3231761151,GB
+3231761152,3231761407,NL
3231761408,3231763711,US
3231763712,3231763967,AU
3231763968,3231768575,US
-3231768576,3231768831,RU
-3231768832,3231769087,NO
+3231768576,3231769087,NL
+3231769088,3231769343,AU
3231769344,3231769855,US
3231769856,3231770111,AU
3231770112,3231770367,US
3231770368,3231770879,AT
3231770880,3231771135,RU
3231771136,3231773951,US
-3231773952,3231775743,PT
-3231775744,3231775999,IL
+3231773952,3231775231,PT
+3231775488,3231775999,NL
3231776000,3231776511,US
3231776768,3231793151,US
-3231793152,3231793663,BE
+3231793152,3231793663,NL
3231794176,3231800319,US
3231800320,3231801343,CN
3231801344,3231809535,CA
-3231809536,3231810047,NZ
+3231809536,3231810047,AU
3231810560,3231825919,US
3231825920,3231842303,CA
3231842304,3231843327,RU
@@ -51123,7 +56060,9 @@
3232167936,3232168959,DE
3232169216,3232169727,DE
3232169728,3232169983,PL
-3232169984,3232235519,IT
+3232169984,3232183295,IT
+3232183296,3232184319,SI
+3232184320,3232235519,IT
3232301056,3232302335,US
3232303104,3232303615,US
3232304128,3232309247,US
@@ -51143,12 +56082,13 @@
3232464896,3232483327,GB
3232483328,3232555007,US
3232555264,3232555775,US
-3232555776,3232560127,JP
-3232560640,3232560895,JP
+3232555776,3232557055,JP
+3232557056,3232557311,AU
+3232557568,3232560127,JP
3232560896,3232561663,US
3232561664,3232561919,CA
3232561920,3232562431,US
-3232562432,3232562687,LU
+3232562432,3232562687,NL
3232562688,3232562943,CA
3232563456,3232564479,GB
3232565248,3232567295,US
@@ -51171,7 +56111,9 @@
3232705536,3232706559,FI
3232706560,3232706815,US
3232707584,3232716799,US
-3232716800,3232727039,CA
+3232716800,3232724151,CA
+3232724152,3232724159,US
+3232724160,3232727039,CA
3232727040,3232759807,US
3232759808,3232772095,SE
3232772096,3232774143,IT
@@ -51196,61 +56138,54 @@
3233286144,3233288191,US
3233288192,3233292287,CA
3233292288,3233431551,US
-3233431552,3233450047,CA
-3233450048,3233450111,US
-3233450112,3233451519,CA
+3233431552,3233447935,CA
+3233447936,3233449095,US
+3233449096,3233449103,GB
+3233449104,3233449207,US
+3233449208,3233449215,GB
+3233449216,3233449359,US
+3233449360,3233449367,GB
+3233449368,3233450199,US
+3233450200,3233450207,GB
+3233450208,3233451519,US
3233451520,3233451775,GB
-3233451776,3233452543,CA
-3233452544,3233452799,US
-3233452800,3233453567,CA
+3233451776,3233453567,US
3233453568,3233453823,IT
-3233453824,3233455743,CA
-3233455744,3233455775,US
-3233455776,3233456127,CA
+3233453824,3233456127,US
3233456128,3233456383,LV
3233456384,3233456639,UA
-3233456640,3233457855,CA
-3233457856,3233457863,US
-3233457864,3233458687,CA
+3233456640,3233457151,CA
+3233457152,3233458687,US
3233458688,3233458943,HU
3233458944,3233459199,BG
-3233459200,3233459455,US
-3233459456,3233460223,CA
-3233460224,3233460479,US
-3233460480,3233460735,CA
-3233460736,3233460991,US
-3233460992,3233463295,CA
-3233463296,3233463551,US
-3233463552,3233463967,CA
-3233463968,3233463999,US
-3233464000,3233464063,CA
-3233464064,3233484799,US
+3233459200,3233484799,US
3233484800,3233487359,ES
3233487872,3233488895,CA
3233488896,3233547519,US
3233547520,3233547775,CA
3233547776,3233548287,US
-3233548800,3233549055,PT
+3233548800,3233549055,NL
3233549056,3233549311,BR
3233549312,3233557247,US
-3233557248,3233557503,NZ
+3233557248,3233557503,AU
3233557504,3233561855,EC
3233561856,3233562367,US
3233562368,3233562879,GB
3233562880,3233563135,FR
3233563136,3233563903,US
-3233563904,3233564159,GB
+3233563904,3233564159,NL
3233564160,3233564415,US
-3233564416,3233564671,NZ
+3233564416,3233564671,AU
3233564672,3233564927,US
3233564928,3233566719,JP
-3233567744,3233570047,JP
+3233567744,3233568767,JP
+3233568768,3233570047,AU
3233570048,3233570559,US
3233570816,3233571071,GB
3233571072,3233572095,US
3233572096,3233572351,AU
3233572352,3233573119,US
-3233573120,3233573375,NO
+3233573120,3233573375,NL
3233573376,3233573631,US
3233573632,3233573887,AU
3233573888,3233575679,US
@@ -51258,66 +56193,64 @@
3233575936,3233576191,RU
3233576192,3233576447,GB
3233576448,3233576959,US
-3233577216,3233577471,AT
-3233577472,3233577727,GB
+3233576960,3233577983,NL
3233577984,3233578239,US
-3233578240,3233578495,GB
+3233578240,3233578495,NL
3233578496,3233578751,US
-3233578752,3233579007,IE
-3233579264,3233579519,GB
+3233578752,3233579007,NL
+3233579008,3233579263,AU
+3233579264,3233579519,NL
3233579520,3233580031,US
-3233580032,3233580287,GB
+3233580032,3233580287,NL
3233580288,3233581055,US
-3233581056,3233581311,DE
+3233581056,3233581311,NL
3233581312,3233583359,US
-3233583360,3233583615,GB
+3233583360,3233583615,NL
3233583616,3233584895,US
3233584896,3233585151,AU
-3233585152,3233586175,US
-3233586432,3233586943,GB
+3233585152,3233586431,US
+3233586432,3233586943,NL
3233586944,3233588223,US
3233588224,3233589247,GA
3233589248,3233589759,CA
3233589760,3233590015,CN
-3233590528,3233590783,US
-3233590784,3233591039,PH
-3233591040,3233591295,ID
+3233590528,3233590783,PR
+3233590784,3233591295,AU
3233591552,3233593599,US
3233593600,3233593855,NZ
3233593856,3233594111,AU
-3233594112,3233594367,RU
+3233594112,3233594367,NL
3233594368,3233594623,US
-3233594624,3233594879,RU
+3233594624,3233594879,NL
3233594880,3233595903,US
3233595904,3233596927,EC
3233596928,3233597695,US
3233597952,3233605887,US
3233605888,3233607167,PL
3233607168,3233607935,US
-3233607936,3233608191,NZ
+3233607936,3233608191,AU
3233608192,3233609727,HU
3233609984,3233610495,US
3233610752,3233611519,US
-3233612032,3233612287,GB
+3233612032,3233612287,NL
3233612544,3233613823,US
3233613824,3233614847,GB
3233615104,3233615359,US
-3233615360,3233615615,DE
+3233615360,3233615615,NL
3233615616,3233617151,US
3233617408,3233617663,CA
-3233617664,3233617919,GB
-3233617920,3233618175,JP
+3233617664,3233617919,NL
+3233617920,3233618175,AU
3233619456,3233620479,US
-3233620480,3233620735,NZ
+3233620480,3233620735,AU
3233620736,3233620991,US
3233620992,3233622015,CA
-3233622272,3233622527,GB
+3233622272,3233622527,NL
3233622528,3233624831,US
-3233624832,3233625087,AT
-3233625088,3233625343,GB
+3233624832,3233625343,NL
3233625344,3233625599,US
3233625600,3233625855,AU
-3233625856,3233626111,GB
+3233625856,3233626111,NL
3233626112,3233626879,US
3233627136,3233628671,US
3233628672,3233628927,FR
@@ -51327,58 +56260,62 @@
3233629952,3233630463,US
3233630464,3233630719,NL
3233630720,3233630975,US
-3233630976,3233631231,ZA
-3233631232,3233631487,DE
+3233630976,3233631231,MU
+3233631232,3233631487,NL
3233631488,3233631743,US
-3233632000,3233642239,US
+3233632000,3233635839,US
+3233635840,3233636095,AU
+3233636096,3233642239,US
3233642240,3233642495,GB
3233642496,3233646591,US
3233646592,3233646847,AU
3233646848,3233647359,US
-3233647360,3233647871,GA
+3233647360,3233647871,MU
3233647872,3233649663,US
3233649664,3233649919,AU
3233649920,3233650431,US
-3233650432,3233650687,DE
-3233651200,3233651455,IT
+3233650432,3233650687,NL
+3233651200,3233651455,NL
3233651456,3233651967,US
-3233651968,3233652223,GB
+3233651968,3233652223,NL
3233652224,3233652479,US
-3233652736,3233652991,GB
+3233652480,3233652735,AU
+3233652736,3233652991,NL
3233652992,3233654271,US
3233654272,3233655551,GB
3233655552,3233662975,US
-3233663488,3233663999,GB
+3233663488,3233663999,NL
3233664256,3233665023,US
3233665024,3233666047,AU
3233666048,3233668863,US
-3233668864,3233669119,PH
+3233668864,3233669119,AU
3233669120,3233670399,US
3233670400,3233670655,AU
3233671680,3233675263,US
3233675520,3233676031,US
-3233676032,3233676287,DE
-3233676288,3233679103,US
+3233676032,3233676287,NL
+3233676288,3233677055,US
+3233677312,3233679103,US
3233679360,3233682431,US
3233682944,3233684991,US
3233685248,3233685503,BR
3233685760,3233688063,US
-3233688576,3233688831,GB
+3233688576,3233688831,NL
3233688832,3233692159,US
-3233692160,3233692671,NO
+3233692160,3233692671,NL
3233692672,3233692927,US
3233692928,3233693183,AU
3233693184,3233693695,US
-3233693696,3233693951,GB
+3233693696,3233693951,NL
3233693952,3233694207,US
3233694208,3233694463,AU
-3233694464,3233694719,GB
+3233694464,3233694719,NL
3233694720,3233694975,US
3233694976,3233695231,FR
3233695232,3233696511,US
3233696512,3233696767,CA
3233696768,3233700863,US
-3233701632,3233701887,NO
+3233701632,3233701887,NL
3233701888,3233704959,US
3233704960,3233705215,NZ
3233705216,3233710335,US
@@ -51388,25 +56325,78 @@
3233721856,3233722111,PT
3233722112,3233723391,US
3233723392,3233723903,AU
-3233723904,3233724415,GB
+3233723904,3233724415,NL
3233724416,3233725439,US
3233725952,3233726975,NO
3233726976,3233728767,US
-3233728768,3233729279,GB
+3233728768,3233729279,NL
3233729280,3233729535,US
-3233729536,3233730047,SG
+3233729536,3233729791,SG
+3233729792,3233730047,AU
3233730560,3233732607,AU
3233732608,3233734911,US
3233735680,3233736959,US
3233736960,3233737983,FR
3233737984,3233738751,US
-3233738752,3233739007,GB
+3233738752,3233739007,NL
3233739008,3233739263,US
-3233739264,3233739519,FR
+3233739264,3233739519,NL
3233739520,3233740543,US
3233740544,3233741311,GB
3233741312,3233742591,US
-3233742848,3233808383,US
+3233742848,3233743359,US
+3233743360,3233743615,CA
+3233743616,3233744383,US
+3233744384,3233744639,PR
+3233744640,3233745663,US
+3233745664,3233745919,CA
+3233745920,3233746943,US
+3233746944,3233747199,PR
+3233747200,3233748735,US
+3233748736,3233748991,PR
+3233748992,3233749503,US
+3233749504,3233750015,CA
+3233750016,3233752831,US
+3233752832,3233753087,PR
+3233753088,3233763071,US
+3233763072,3233763327,CA
+3233763328,3233765887,US
+3233765888,3233766143,CA
+3233766144,3233768447,US
+3233768448,3233768703,CA
+3233768704,3233768959,PR
+3233768960,3233778175,US
+3233778176,3233778431,CA
+3233778432,3233779455,US
+3233779456,3233779711,CA
+3233779712,3233781503,US
+3233781504,3233781759,PR
+3233781760,3233783807,US
+3233783808,3233784063,PR
+3233784064,3233784319,CA
+3233784320,3233786111,US
+3233786112,3233786367,PR
+3233786368,3233790207,US
+3233790208,3233790463,PR
+3233790464,3233790719,CA
+3233790720,3233790975,PR
+3233790976,3233791231,CA
+3233791232,3233791487,PR
+3233791488,3233793023,US
+3233793024,3233793279,PR
+3233793280,3233794047,US
+3233794048,3233794303,CA
+3233794304,3233800447,US
+3233800448,3233800703,CA
+3233800704,3233800959,US
+3233800960,3233801215,CA
+3233801216,3233801983,US
+3233801984,3233802239,CA
+3233802240,3233802495,US
+3233802496,3233802751,CA
+3233802752,3233803007,US
+3233803008,3233803263,CA
+3233803264,3233808383,US
3233808384,3233873919,TW
3233873920,3233874175,US
3233874176,3233874687,AU
@@ -51418,10 +56408,12 @@
3233926295,3233926295,MX
3233926296,3233939455,US
3233939456,3234004991,FI
-3234005248,3234005503,GB
+3234005248,3234005503,NL
+3234005504,3234005759,AU
3234006528,3234007039,US
-3234007040,3234007295,RU
+3234007040,3234007295,NL
3234007296,3234007551,US
+3234007552,3234007807,AU
3234007808,3234008063,US
3234008064,3234008831,NZ
3234008832,3234013183,US
@@ -51429,24 +56421,23 @@
3234013696,3234013951,AU
3234013952,3234014207,US
3234014464,3234014975,US
-3234014976,3234015487,KR
+3234014976,3234015487,AU
3234015488,3234015743,US
3234015744,3234015999,IE
3234016000,3234016255,GB
3234016256,3234019327,AU
3234019840,3234023423,US
-3234023424,3234023679,PL
+3234023424,3234023679,NL
3234023680,3234024703,US
3234025472,3234026495,US
3234026752,3234030079,US
-3234030080,3234030335,DE
+3234030080,3234030335,NL
3234030336,3234031103,US
3234031104,3234031359,AU
3234031360,3234031871,US
-3234031872,3234032127,GB
-3234032128,3234032383,PL
+3234031872,3234032383,NL
3234032384,3234032895,US
-3234033152,3234033407,IT
+3234033152,3234033407,NL
3234033408,3234033663,US
3234033664,3234033919,AU
3234033920,3234034687,US
@@ -51455,31 +56446,41 @@
3234039296,3234043135,SE
3234043136,3234043903,US
3234043904,3234044159,AU
-3234044160,3234048511,US
+3234044160,3234047743,US
+3234047744,3234047999,GB
+3234048000,3234048511,US
3234048512,3234048767,AU
3234048768,3234051839,US
-3234051840,3234052095,NL
-3234052096,3234052351,DE
+3234051840,3234052351,NL
3234052352,3234052607,US
+3234052608,3234052863,AU
3234052864,3234054911,US
-3234054912,3234055167,PT
+3234054912,3234055167,NL
3234055168,3234055423,US
3234055424,3234055679,AU
3234055680,3234056959,US
3234057216,3234061055,US
-3234061056,3234061311,NZ
+3234061056,3234061311,AU
3234061312,3234064639,US
+3234064640,3234064895,AU
3234064896,3234065407,US
-3234065408,3234065663,GB
+3234065408,3234065663,NL
3234065664,3234065919,BR
3234065920,3234070527,US
3234070528,3234110463,FR
-3234110464,3234123775,US
-3234127872,3234136063,US
+3234110464,3234128455,US
+3234128456,3234128463,GB
+3234128464,3234130695,US
+3234130696,3234130703,AU
+3234130704,3234131183,US
+3234131184,3234131191,GB
+3234131192,3234136063,US
3234136064,3234150911,CA
3234151424,3234158847,CA
3234159104,3234159359,CA
-3234160128,3234167295,CA
+3234160128,3234164991,CA
+3234164992,3234165247,US
+3234165248,3234167295,CA
3234167808,3234172927,CA
3234172928,3234173951,US
3234173952,3234175999,CA
@@ -51489,11 +56490,20 @@
3234187520,3234189055,CA
3234189312,3234192383,CA
3234192384,3234193663,US
-3234193664,3234201343,CA
+3234193664,3234198783,CA
+3234199040,3234201343,CA
3234201600,3234203647,US
-3234203648,3234205695,BR
+3234203648,3234205183,BR
+3234205184,3234205439,AR
+3234205440,3234205695,BR
3234205696,3234208255,US
-3234208768,3234232319,US
+3234208768,3234226983,US
+3234226984,3234226991,CA
+3234226992,3234227455,US
+3234227456,3234227711,CA
+3234227712,3234230015,US
+3234230016,3234230271,ES
+3234230272,3234232319,US
3234232320,3234232575,EG
3234232576,3234232831,US
3234232832,3234233087,BR
@@ -51521,45 +56531,48 @@
3234353152,3234549759,US
3234549760,3234550015,RU
3234553856,3234554367,US
+3234554624,3234554879,AU
3234554880,3234556415,US
3234556416,3234556927,CA
3234556928,3234557439,FI
3234557440,3234564607,US
3234564608,3234566911,KR
3234566912,3234568703,US
-3234568704,3234568959,NZ
+3234568704,3234568959,AU
3234568960,3234569215,US
+3234569216,3234569727,AU
3234569728,3234569983,CL
3234569984,3234574335,US
3234574336,3234574591,AU
3234574592,3234574847,MX
3234574848,3234576127,US
3234576896,3234578687,US
+3234578688,3234578943,AU
3234578944,3234579711,US
3234579712,3234579967,CA
3234579968,3234581247,US
3234581248,3234581503,CA
3234581504,3234582527,US
+3234582528,3234583039,AU
3234583040,3234583807,US
3234583808,3234584063,AU
3234584064,3234584575,US
-3234584576,3234584831,NZ
+3234584576,3234584831,AU
3234584832,3234585343,US
3234585600,3234587391,US
-3234587392,3234587647,SA
-3234587648,3234588671,US
-3234588672,3234588927,MO
+3234587392,3234587647,NL
+3234587648,3234588415,US
+3234588672,3234588927,AU
3234588928,3234589439,US
3234589440,3234589695,AU
3234589696,3234592511,US
-3234592512,3234592767,TH
+3234592512,3234592767,AU
3234592768,3234594047,US
3234594816,3234725887,US
3234726144,3234726399,CA
3234726400,3234726911,US
3234726912,3234727935,CA
-3234727936,3234730495,US
-3234730752,3234733055,US
+3234727936,3234733055,US
3234733056,3234733311,CA
3234733312,3234735103,US
3234735616,3234737407,US
@@ -51569,13 +56582,16 @@
3234744832,3234745599,US
3234745600,3234746879,GB
3234746880,3234747903,US
-3234747904,3234748159,IL
+3234747904,3234748159,NL
3234748160,3234749439,US
3234749440,3234750463,CA
3234750464,3234751999,US
+3234752000,3234752255,AU
3234752256,3234753535,US
+3234753536,3234753791,AU
3234753792,3234754047,US
3234754560,3234755839,US
+3234755840,3234756095,AU
3234756096,3234762751,US
3234762752,3234764799,CA
3234764800,3234766335,NZ
@@ -51590,7 +56606,7 @@
3234784000,3234791167,US
3234791424,3234794495,US
3234794752,3234795007,US
-3234795008,3234795263,GB
+3234795008,3234795263,NL
3234795264,3234795519,US
3234795776,3234796031,US
3234796544,3234799359,US
@@ -51604,12 +56620,12 @@
3234803712,3234803967,PR
3234804224,3234806783,US
3234807552,3234807807,US
-3234807808,3234808063,TH
+3234807808,3234808063,AU
3234808064,3234809087,EC
3234809088,3234810879,US
3234810880,3234811135,CA
3234811136,3234814719,US
-3234814720,3234814975,HK
+3234814720,3234814975,AU
3234814976,3234815999,US
3234816000,3234816767,AU
3234816768,3234820351,US
@@ -51620,9 +56636,8 @@
3234822656,3234826751,US
3234826752,3234827007,CA
3234827008,3234827519,US
-3234827520,3234827775,GB
-3234827776,3234828031,LU
-3234828032,3234828287,NZ
+3234827520,3234828031,NL
+3234828032,3234828287,AU
3234828288,3234828799,US
3234828800,3234829055,CL
3234829056,3234830079,US
@@ -51638,18 +56653,19 @@
3234839296,3234839551,AU
3234839552,3234841087,US
3234841088,3234841599,BR
-3234841600,3234841855,PT
+3234841600,3234841855,NL
3234841856,3234842367,AU
3234842368,3234842623,US
3234842624,3234844415,BR
3234844416,3234853375,US
-3234853376,3234853631,TH
+3234853376,3234853631,AU
3234853632,3234853887,US
3234853888,3234854143,EC
3234854144,3234854911,US
3234854912,3234855167,AU
3234855168,3234855935,US
3234856192,3234856447,US
+3234856448,3234856703,AU
3234856960,3234861055,CA
3234861056,3234886143,US
3234886656,3234926847,US
@@ -51660,7 +56676,9 @@
3235004416,3235021823,CA
3235021824,3235026943,US
3235026944,3235028991,CA
-3235028992,3235045375,US
+3235028992,3235038463,US
+3235038464,3235038719,GB
+3235038720,3235045375,US
3235045376,3235046143,CA
3235046144,3235085311,US
3235085312,3235086335,CA
@@ -51671,10 +56689,12 @@
3235276800,3235278847,US
3235278848,3235282943,BB
3235282944,3235315711,CA
-3235315712,3235512319,US
+3235315712,3235389439,US
+3235389440,3235389951,VE
+3235389952,3235512319,US
3235512320,3235577855,JP
3235577856,3235641855,CA
-3235642112,3235643391,CA
+3235642112,3235643135,CA
3235643392,3235774463,US
3235774464,3235776767,CA
3235777536,3235807231,US
@@ -51683,21 +56703,73 @@
3235843072,3235844095,CA
3235844096,3235856383,US
3235856384,3235872767,BR
-3235872768,3235875839,US
-3235875840,3235876095,GB
-3235876096,3235880447,US
+3235872768,3235880447,US
3235880448,3235880703,GB
-3235880704,3235914495,US
+3235880704,3235906303,US
+3235906304,3235906559,CA
+3235906560,3235908863,US
+3235908864,3235909119,CA
+3235909120,3235912447,US
+3235912448,3235912703,CA
+3235912704,3235914495,US
3235914496,3235914751,CA
-3235914752,3235927295,US
+3235914752,3235916543,US
+3235916544,3235916799,VI
+3235916800,3235917567,US
+3235917568,3235917823,CA
+3235917824,3235919359,US
+3235919360,3235919615,CA
+3235919616,3235921151,US
+3235921152,3235921407,PR
+3235921408,3235926271,US
+3235926272,3235926527,CA
+3235926528,3235927295,US
3235927296,3235927807,CA
3235927808,3235928319,US
-3235928320,3235928575,CA
-3235928576,3235929087,US
-3235929088,3235929343,CA
-3235929344,3235945983,US
+3235928320,3235929343,CA
+3235929344,3235929599,US
+3235929600,3235929855,CA
+3235929856,3235932159,US
+3235932160,3235932415,CA
+3235932416,3235932671,US
+3235932672,3235932927,CA
+3235932928,3235937023,US
+3235937024,3235937535,CA
+3235937536,3235937791,US
+3235937792,3235938047,CA
+3235938048,3235941631,US
+3235941632,3235941887,CA
+3235941888,3235945983,US
3235945984,3235946239,CA
-3235946240,3235977727,US
+3235946240,3235946751,US
+3235946752,3235947007,CA
+3235947008,3235949311,US
+3235949312,3235950335,CA
+3235950336,3235950591,US
+3235950592,3235950847,CA
+3235950848,3235951871,US
+3235951872,3235952127,CA
+3235952128,3235957247,US
+3235957248,3235957503,PR
+3235957504,3235957759,US
+3235957760,3235958015,DE
+3235958016,3235959551,US
+3235959552,3235959807,CA
+3235959808,3235960319,US
+3235960320,3235960575,CA
+3235960576,3235962111,US
+3235962112,3235962367,CA
+3235962368,3235963647,US
+3235963648,3235963903,CA
+3235963904,3235966975,US
+3235966976,3235967231,PR
+3235967232,3235967743,US
+3235967744,3235967999,CA
+3235968000,3235968511,US
+3235968512,3235968767,CA
+3235968768,3235970559,US
+3235970560,3235970815,CA
+3235970816,3235977727,US
3235978240,3235985663,US
3235986432,3236010239,US
3236011008,3236044799,US
@@ -51719,17 +56791,18 @@
3236306944,3236364287,US
3236364544,3236365567,US
3236365824,3236368127,US
-3236368128,3236368383,NZ
+3236368128,3236368383,AU
3236368384,3236372991,US
3236372992,3236373247,AU
3236373760,3236379391,US
3236379392,3236379647,AU
3236379648,3236380927,US
3236381184,3236381439,CA
-3236381440,3236381695,AT
+3236381440,3236381695,NL
3236381696,3236383999,US
+3236384000,3236384255,AU
3236384256,3236385279,US
-3236385280,3236385535,DE
+3236385280,3236385535,NL
3236385536,3236385791,US
3236386304,3236387071,US
3236387072,3236387327,CA
@@ -51745,25 +56818,34 @@
3236398848,3236399359,AU
3236399616,3236400127,US
3236400128,3236400383,CL
-3236400384,3236406783,US
+3236400384,3236401151,US
+3236401152,3236401407,AU
+3236401408,3236406783,US
3236406784,3236407551,AU
3236407552,3236408063,SG
3236408064,3236408319,US
3236408320,3236409343,CA
-3236409600,3236412415,US
+3236409600,3236411135,US
+3236411136,3236411391,AU
+3236411392,3236412415,US
3236412672,3236413695,US
3236413696,3236413951,AU
3236413952,3236416255,US
3236416256,3236416511,AU
3236416512,3236418303,US
-3236418560,3236418815,AU
+3236418304,3236418815,AU
3236418816,3236419071,US
3236419328,3236419583,US
+3236419584,3236419839,AU
3236419840,3236420095,US
-3236420352,3236427519,US
+3236420096,3236420351,AU
+3236420352,3236424959,US
+3236424960,3236425215,MU
+3236425216,3236427519,US
3236427520,3236427775,CA
+3236427776,3236428031,AU
3236428800,3236429311,US
-3236429312,3236429567,ZA
+3236429312,3236429567,MU
3236429824,3236438015,US
3236446208,3236462591,US
3236462592,3236470783,AU
@@ -51773,6 +56855,7 @@
3236567040,3236568831,US
3236569856,3236570367,US
3236571136,3236575743,US
+3236575744,3236575999,AU
3236576000,3236583423,US
3236583680,3236585983,US
3236585984,3236586239,CA
@@ -51790,6 +56873,7 @@
3236617728,3236617983,US
3236617984,3236619775,CA
3236619776,3236620031,US
+3236620032,3236620287,AU
3236620288,3236623615,US
3236623616,3236623871,AU
3236623872,3236625919,US
@@ -51803,47 +56887,56 @@
3236696064,3236698623,US
3236699136,3236757503,US
3236757504,3236765695,CA
-3236765696,3236778239,US
+3236765696,3236774911,US
+3236774912,3236775423,HK
+3236775424,3236775679,NL
+3236775680,3236776191,CA
+3236776192,3236776447,DE
+3236776448,3236776959,US
+3236776960,3236777215,CA
+3236777216,3236778239,US
3236778240,3236778751,GB
-3236778752,3236788479,US
+3236778752,3236780287,US
+3236780288,3236780543,FR
+3236780544,3236780799,CH
+3236780800,3236781823,US
+3236781824,3236782335,ES
+3236782336,3236784383,US
+3236784384,3236784895,IT
+3236784896,3236785663,US
+3236785664,3236785919,DE
+3236785920,3236786175,ZA
+3236786176,3236786431,US
+3236786432,3236786687,FR
+3236786688,3236787199,CA
+3236787200,3236787967,US
+3236787968,3236788223,JP
+3236788224,3236788479,US
3236788480,3236789503,GB
3236789504,3236823039,US
3236823040,3236826111,CH
3236826112,3236827135,CA
3236827136,3236958207,US
3236958208,3236962303,AU
-3236962304,3237021695,US
+3236962304,3236966143,US
+3236966400,3237021695,US
3237021696,3237023743,CA
-3237023744,3237036031,US
-3237036032,3237036799,CA
-3237036800,3237037055,US
-3237037056,3237039359,CA
-3237039360,3237039615,US
-3237039616,3237039935,CA
-3237039936,3237040063,US
-3237040064,3237040383,CA
-3237040384,3237040511,US
-3237040512,3237041663,CA
-3237041664,3237041791,US
-3237041792,3237043199,CA
-3237043200,3237043455,US
-3237043456,3237043967,CA
+3237023744,3237038079,US
+3237038080,3237038335,CA
+3237038336,3237043967,US
3237043968,3237044223,CH
-3237044224,3237045759,CA
-3237045760,3237046015,US
-3237046016,3237047039,CA
+3237044224,3237046015,US
+3237046016,3237046271,RO
+3237046272,3237047039,US
3237047040,3237047295,FR
3237047296,3237047551,US
3237047552,3237047807,IE
-3237047808,3237048319,CA
-3237048320,3237048575,US
-3237048576,3237050367,CA
-3237050368,3237051135,US
-3237051136,3237051391,CA
-3237051392,3237051903,US
+3237047808,3237050111,US
+3237050112,3237050367,GB
+3237050368,3237051903,US
3237051904,3237052159,TR
-3237052160,3237052415,CA
-3237052416,3237154815,US
+3237052160,3237052287,CA
+3237052288,3237154815,US
3237154816,3237155839,ES
3237155840,3237156863,AU
3237156864,3237163007,US
@@ -51852,7 +56945,9 @@
3237182464,3237183487,NL
3237183488,3237216255,US
3237216256,3237281791,JP
-3237282560,3237285119,US
+3237282560,3237284607,US
+3237284608,3237284863,AU
+3237284864,3237285119,US
3237285120,3237285631,AU
3237285632,3237287935,US
3237287936,3237288191,CA
@@ -51862,57 +56957,63 @@
3237291264,3237294847,US
3237294848,3237295103,CA
3237295104,3237296639,US
-3237296640,3237297151,SG
+3237296640,3237297151,AU
3237297152,3237297407,CL
3237297408,3237300479,US
3237302528,3237305087,US
3237305088,3237305343,CA
-3237305344,3237308671,US
+3237305344,3237305855,US
+3237305856,3237306111,AU
+3237306112,3237308671,US
3237308672,3237310719,AU
3237310720,3237312767,US
3237312768,3237313023,BO
3237313024,3237317631,US
3237317888,3237319679,US
-3237319680,3237319935,DZ
+3237319680,3237319935,MU
3237319936,3237320703,US
3237320704,3237320959,UA
3237320960,3237321471,US
+3237321472,3237321727,AU
3237321728,3237321983,US
3237323264,3237325055,US
-3237325056,3237325311,PL
+3237325056,3237325311,NL
3237325312,3237325823,US
3237325824,3237326079,CA
3237326080,3237328127,US
3237328384,3237328639,US
3237328640,3237328895,CA
3237328896,3237329151,US
-3237329152,3237329407,NZ
+3237329152,3237329407,AU
3237329408,3237330943,US
3237330944,3237331199,AU
3237331456,3237331967,US
-3237331968,3237332223,HK
+3237331968,3237332223,AU
3237332224,3237335039,US
-3237335040,3237335295,HK
+3237335040,3237335295,AU
3237335296,3237335551,US
3237335552,3237337599,AU
3237337600,3237337855,US
-3237338112,3237339391,US
-3237339392,3237339647,GB
+3237337856,3237338367,AU
+3237338368,3237339391,US
+3237339392,3237339647,NL
3237339648,3237340159,US
3237340160,3237340415,CA
3237340416,3237345535,US
3237345536,3237346303,KR
3237346304,3237347071,US
-3237347328,3237412863,US
+3237347328,3237366015,US
+3237366016,3237366271,AU
+3237366272,3237412863,US
3237412864,3237415935,GB
3237415936,3237416959,CA
3237416960,3237478399,US
3237478400,3237511167,LK
3237511168,3237548031,US
3237548032,3237552127,KR
-3237552128,3237553154,US
-3237553155,3237553155,GB
-3237553156,3237568511,US
+3237552128,3237553151,US
+3237553152,3237553407,GB
+3237553408,3237568511,US
3237568512,3237572607,CA
3237572608,3237576703,US
3237576704,3237609471,CA
@@ -51924,9 +57025,7 @@
3237634310,3237634310,GB
3237634311,3237647103,US
3237647104,3237647359,AU
-3237647360,3237648639,US
-3237648640,3237648895,AU
-3237648896,3237679359,US
+3237647360,3237679359,US
3237679872,3237681663,US
3237681664,3237682943,CA
3237682944,3237684991,US
@@ -51948,11 +57047,12 @@
3237724928,3237725183,AU
3237725184,3237725439,CA
3237725440,3237725695,US
+3237726464,3237726719,AU
3237726720,3237726975,GH
3237726976,3237727231,US
3237727232,3237728255,AU
3237728256,3237732863,US
-3237732864,3237733119,DE
+3237732864,3237733119,NL
3237734144,3237734399,CA
3237734400,3237773311,US
3237773312,3237777407,CA
@@ -51962,14 +57062,31 @@
3237797888,3237801983,CA
3237806080,3237857535,US
3237858304,3237863423,CA
-3237863424,3237896191,US
+3237863424,3237867519,US
+3237867520,3237867647,HK
+3237867648,3237867775,US
+3237867776,3237868031,GB
+3237868032,3237868287,HK
+3237868288,3237869311,US
+3237869312,3237869567,CA
+3237869568,3237869823,US
+3237869824,3237869951,PH
+3237869952,3237870079,VN
+3237870080,3237870335,IS
+3237870336,3237870591,US
+3237870592,3237870847,DE
+3237870848,3237870975,KR
+3237870976,3237871103,JP
+3237871104,3237871231,TH
+3237871232,3237871359,TW
+3237871360,3237871615,NZ
+3237871616,3237896191,US
3237896192,3237900287,PR
3237900288,3238002687,US
3238002688,3238008831,NL
-3238008832,3238010879,GR
+3238008832,3238010879,PL
3238010880,3238017023,CH
-3238017024,3238018047,DK
-3238018048,3238018303,FR
+3238017024,3238018303,DK
3238018304,3238018559,UA
3238018560,3238018815,FR
3238018816,3238019071,DE
@@ -52074,7 +57191,7 @@
3238578944,3238579199,RU
3238579200,3238589951,CH
3238589952,3238590207,LT
-3238590208,3238590975,CH
+3238590208,3238590719,CH
3238590976,3238591231,SA
3238591232,3238592511,CH
3238592512,3238594559,GB
@@ -52096,7 +57213,6 @@
3238599936,3238600703,HU
3238600704,3238604799,DE
3238608896,3238621183,SE
-3238622976,3238623231,GB
3238623232,3238623487,LV
3238623488,3238623743,PL
3238623744,3238623999,CH
@@ -52172,7 +57288,7 @@
3239026688,3239028735,HR
3239028736,3239051263,SE
3239051264,3239053311,DE
-3239054336,3239062271,DE
+3239054336,3239059455,DE
3239062272,3239062527,ES
3239062528,3239062783,CH
3239062784,3239063039,UA
@@ -52180,7 +57296,8 @@
3239063296,3239063551,UA
3239063552,3239075839,DE
3239075840,3239076095,MT
-3239076096,3239076607,DE
+3239076096,3239076351,DE
+3239076352,3239076607,RU
3239076608,3239076863,PL
3239076864,3239077119,NL
3239077120,3239077375,UA
@@ -52191,7 +57308,6 @@
3239078656,3239078911,PL
3239078912,3239079167,GB
3239079168,3239079423,SI
-3239079424,3239079679,FR
3239079680,3239079935,MD
3239079936,3239088127,DE
3239088640,3239088895,DK
@@ -52203,7 +57319,6 @@
3239090432,3239090687,ES
3239090688,3239090943,NL
3239090944,3239091199,AT
-3239091200,3239091455,FR
3239091456,3239091711,BG
3239091712,3239091967,UA
3239091968,3239092223,FR
@@ -52211,14 +57326,12 @@
3239104512,3239105279,RU
3239105280,3239105535,CH
3239105536,3239105791,DE
-3239105792,3239106047,RO
3239106048,3239106559,AT
3239106560,3239106815,ES
3239106816,3239107071,CH
3239107072,3239107327,RO
3239107328,3239107583,GR
3239107584,3239107839,CH
-3239107840,3239108095,RO
3239108096,3239109887,DE
3239109888,3239110143,PL
3239110144,3239110655,DE
@@ -52228,7 +57341,7 @@
3239111424,3239111679,DE
3239111936,3239112191,AT
3239112192,3239112447,IL
-3239112448,3239112959,PL
+3239112704,3239112959,PL
3239112960,3239113215,CH
3239113216,3239113471,AT
3239113472,3239113727,ES
@@ -52240,13 +57353,16 @@
3239116544,3239116799,PL
3239116800,3239117055,PT
3239117056,3239117311,SI
-3239117312,3239119871,DE
+3239117312,3239117823,DE
+3239118336,3239118591,DE
+3239118848,3239119871,DE
3239119872,3239120127,GB
3239120128,3239120383,CZ
3239120384,3239120639,PL
3239120896,3239121663,DE
3239121664,3239121919,FR
-3239121920,3239127039,DE
+3239121920,3239123967,DE
+3239124992,3239127039,DE
3239127040,3239127295,PT
3239127296,3239127551,PL
3239127552,3239127807,IL
@@ -52260,7 +57376,6 @@
3239130368,3239130623,JO
3239130624,3239130879,PL
3239132160,3239133183,DE
-3239133184,3239133439,CH
3239133440,3239133695,GB
3239133696,3239133951,ES
3239133952,3239134207,SE
@@ -52279,8 +57394,8 @@
3239138304,3239138559,PL
3239138560,3239138815,CH
3239138816,3239141375,DE
-3239141376,3239143423,US
-3239143424,3239147519,DE
+3239141376,3239145471,US
+3239145472,3239147519,DE
3239147520,3239149567,SG
3239149568,3239160319,GB
3239160320,3239160575,RU
@@ -52291,11 +57406,9 @@
3239161600,3239161855,HU
3239161856,3239162623,DE
3239162624,3239162879,BE
-3239162880,3239163903,DE
3239163904,3239164159,PL
3239164160,3239164671,DE
3239164672,3239164927,GB
-3239164928,3239165951,DE
3239165952,3239166207,FR
3239166208,3239166463,DE
3239166464,3239166719,CH
@@ -52332,7 +57445,8 @@
3239176192,3239180287,DE
3239180288,3239181311,CZ
3239181312,3239181567,AT
-3239181824,3239205887,DE
+3239181824,3239182079,DE
+3239182336,3239205887,DE
3239205888,3239206143,US
3239206144,3239264255,DE
3239264256,3239264767,NO
@@ -52347,12 +57461,10 @@
3239270912,3239271423,SA
3239271424,3239271935,AT
3239271936,3239272447,CH
-3239272448,3239272959,UA
3239272960,3239273471,GB
3239273472,3239273983,UA
3239273984,3239274495,RU
3239274496,3239275007,PL
-3239275008,3239275519,RO
3239275520,3239276543,UA
3239276544,3239277055,LU
3239277056,3239277567,DE
@@ -52361,8 +57473,7 @@
3239278592,3239279103,RU
3239279104,3239280127,PL
3239280128,3239280639,RU
-3239280640,3239281663,IR
-3239281664,3239282687,UA
+3239281664,3239282687,RU
3239282688,3239283711,FI
3239283712,3239284735,PL
3239284736,3239285247,IR
@@ -52408,7 +57519,6 @@
3239465728,3239465983,PL
3239465984,3239466239,UA
3239466240,3239466495,AT
-3239466496,3239466751,FI
3239466752,3239467007,GB
3239467008,3239467263,RU
3239467264,3239467519,GB
@@ -52421,12 +57531,10 @@
3239469056,3239470591,DE
3239470592,3239470847,CH
3239470848,3239471103,BG
-3239471104,3239471871,DE
3239471872,3239472127,FR
3239472128,3239474943,DE
3239474944,3239475199,ES
-3239475200,3239479807,DE
-3239479808,3239480063,UA
+3239475200,3239477247,DE
3239480320,3239480575,UA
3239480576,3239480831,RO
3239480832,3239481087,CH
@@ -52434,7 +57542,6 @@
3239481344,3239486719,DE
3239486720,3239486975,ES
3239486976,3239487487,DE
-3239487488,3239487743,GB
3239487744,3239487999,PL
3239488000,3239488255,AT
3239488256,3239488511,CH
@@ -52457,15 +57564,16 @@
3239509504,3239509759,CH
3239509760,3239510015,DE
3239510016,3239510271,UA
-3239510272,3239514111,DE
-3239518208,3239522303,DE
+3239510272,3239511039,DE
+3239511552,3239511807,DE
+3239512064,3239514111,DE
+3239518208,3239521791,DE
3239522304,3239522559,PL
3239522560,3239522815,SI
3239523072,3239523327,PL
3239523328,3239523583,BG
3239523584,3239523839,UA
3239523840,3239524095,PL
-3239524096,3239524351,SE
3239524352,3239524607,DE
3239524608,3239524863,SE
3239524864,3239525119,UA
@@ -52487,7 +57595,6 @@
3239541760,3239542015,GB
3239542016,3239542271,PL
3239542272,3239542527,RU
-3239542528,3239542783,FR
3239542784,3239544831,DE
3239544832,3239545087,GB
3239545088,3239545343,SI
@@ -52519,11 +57626,11 @@
3239568128,3239568383,FR
3239568384,3239568639,SE
3239568640,3239568895,NO
-3239568896,3239574783,DE
+3239568896,3239573759,DE
+3239574016,3239574783,DE
3239575040,3239575295,DE
3239575296,3239575551,DK
-3239575552,3239575807,RO
-3239575808,3239579135,DE
+3239575552,3239578879,DE
3239579136,3239579391,PL
3239579392,3239581695,DE
3239581696,3239581951,PL
@@ -52533,8 +57640,9 @@
3239582720,3239582975,GB
3239582976,3239583231,IT
3239583232,3239583487,UA
-3239583488,3239583743,RO
-3239583744,3239591935,DE
+3239583744,3239584767,DE
+3239585024,3239585279,DE
+3239587840,3239591935,DE
3239591936,3239592447,FI
3239592448,3239592703,US
3239592704,3239593983,FI
@@ -52543,27 +57651,24 @@
3239625728,3239626751,RU
3239626752,3239628799,PL
3239628800,3239629823,DE
-3239629824,3239630847,FR
3239630848,3239631871,DE
3239631872,3239632895,UA
-3239632896,3239633919,DE
-3239633920,3239634943,FR
-3239634944,3239635967,RU
-3239635968,3239636991,DE
+3239632896,3239636991,DE
3239636992,3239638015,BG
3239638016,3239639039,PL
-3239639040,3239640063,SI
+3239639040,3239639551,SI
+3239639552,3239639807,CZ
+3239639808,3239640063,SI
3239640064,3239641087,DE
3239641088,3239643135,PL
3239643136,3239645183,RU
-3239645184,3239665663,DE
+3239645184,3239653375,DE
+3239653376,3239657471,NL
+3239657472,3239665663,DE
3239666176,3239666687,AT
3239666688,3239667199,DE
3239667200,3239667711,CH
-3239667712,3239668223,RO
-3239668224,3239668735,UA
-3239668736,3239669247,PL
-3239669248,3239670271,RO
+3239667712,3239670271,RO
3239670272,3239670783,DE
3239670784,3239671295,GB
3239671296,3239671807,DE
@@ -52581,7 +57686,7 @@
3239687168,3239687679,UA
3239687680,3239688191,DE
3239688192,3239688703,PL
-3239688704,3239689727,GB
+3239688704,3239689215,GB
3239689728,3239690239,RU
3239690240,3239690495,ES
3239690496,3239690751,PL
@@ -52590,11 +57695,12 @@
3239691520,3239691775,FR
3239691822,3239691822,GB
3239692032,3239692287,AT
-3239692288,3239697407,DE
+3239692288,3239695871,DE
3239697408,3239697663,HR
3239697664,3239697919,RU
-3239697920,3239698431,PL
-3239698432,3239706367,DE
+3239697920,3239698175,PL
+3239698432,3239704575,DE
+3239706112,3239706367,DE
3239706368,3239706623,UA
3239706880,3239707135,NL
3239707392,3239707647,UA
@@ -52606,7 +57712,6 @@
3239708928,3239709183,NL
3239709184,3239709439,RO
3239709440,3239709695,FR
-3239709696,3239709951,DE
3239709952,3239710207,UA
3239710464,3239710719,DE
3239710720,3239710975,RU
@@ -52614,7 +57719,6 @@
3239711232,3239711487,BY
3239711488,3239711743,RU
3239711744,3239711999,UA
-3239712256,3239712511,DE
3239712512,3239712767,GB
3239712768,3239713023,DE
3239713024,3239713279,PL
@@ -52632,21 +57736,15 @@
3239739904,3239740159,CH
3239740160,3239740415,PL
3239740416,3239740671,DK
-3239740672,3239740927,GB
3239740928,3239741183,UA
3239741184,3239741439,RU
3239741440,3239759871,DE
-3239759872,3239760127,RU
3239760128,3239760383,UA
-3239760384,3239760895,PL
-3239760896,3239761151,RU
-3239761152,3239761407,GB
+3239760640,3239760895,PL
3239761408,3239761663,RU
-3239761664,3239761919,PL
3239761920,3239762175,BG
3239762176,3239762431,RU
3239762432,3239762687,DK
-3239762688,3239762943,RO
3239762944,3239763199,SI
3239763200,3239763455,SE
3239763456,3239763711,GB
@@ -52657,7 +57755,6 @@
3239773184,3239773439,FR
3239773440,3239773951,PL
3239773952,3239774207,SA
-3239774208,3239774463,PL
3239774464,3239774719,ES
3239774976,3239775231,PT
3239775232,3239782399,DE
@@ -52699,7 +57796,7 @@
3239827456,3239827967,DK
3239827968,3239828479,CH
3239828480,3239828991,DE
-3239828992,3239830015,RU
+3239828992,3239829503,RU
3239830016,3239830527,CH
3239831040,3239831551,RU
3239832064,3239832575,UA
@@ -52719,7 +57816,7 @@
3239840512,3239840767,DE
3239840768,3239841023,AT
3239841024,3239841279,NL
-3239841280,3239848447,DE
+3239841536,3239848447,DE
3239848448,3239848703,CH
3239848960,3239849215,RU
3239849216,3239849471,GB
@@ -52737,7 +57834,6 @@
3239861760,3239862015,SA
3239862016,3239862271,IT
3239862272,3239874559,DE
-3239874560,3239874815,NL
3239874816,3239875071,DE
3239875072,3239875327,SI
3239875328,3239875583,DK
@@ -52767,16 +57863,14 @@
3239885824,3239886079,CH
3239886080,3239886335,PL
3239886336,3239886591,RU
-3239886592,3239886847,FR
3239886848,3239888895,DE
3239888896,3239889151,UA
3239889152,3239889407,GB
-3239889408,3239889663,CZ
3239889664,3239889919,FI
3239889920,3239890175,AT
3239890176,3239890431,FR
3239890432,3239890687,NL
-3239890688,3239895039,DE
+3239890688,3239894015,DE
3239895040,3239895295,DK
3239895296,3239895551,TR
3239895552,3239895807,PL
@@ -52784,12 +57878,11 @@
3239896064,3239896575,DE
3239896576,3239896831,PL
3239896832,3239897087,HU
-3239897088,3239897343,GB
+3239897088,3239897343,IE
3239897344,3239897599,FR
3239897600,3239897855,RU
3239897856,3239898111,FR
3239898112,3239898367,NO
-3239898368,3239898623,GB
3239898624,3239898879,DE
3239898880,3239899135,RU
3239899136,3239901695,DE
@@ -52797,7 +57890,8 @@
3239901952,3239902207,DE
3239902464,3239902719,RU
3239902720,3239902975,EE
-3239903232,3239907327,DE
+3239903232,3239904767,DE
+3239905024,3239907327,DE
3239907328,3239907583,UA
3239907584,3239908095,DE
3239908096,3239908351,RU
@@ -52813,11 +57907,16 @@
3239916800,3239917055,KZ
3239917056,3239917311,DE
3239917312,3239917567,BG
-3239917568,3239935999,DE
+3239919616,3239922687,DE
+3239922688,3239922724,LU
+3239922725,3239922725,DE
+3239922726,3239922943,LU
+3239922944,3239935999,DE
3239936256,3239936511,FR
3239936512,3239938815,DE
3239938816,3239939071,NL
-3239939072,3239951103,DE
+3239939072,3239950335,DE
+3239950848,3239951103,DE
3239951104,3239951359,AT
3239951360,3239954431,DE
3239954432,3239954687,UA
@@ -52832,10 +57931,11 @@
3239959808,3239960063,BE
3239960064,3239960319,FR
3239960320,3239960575,GB
-3239960576,3239968511,DE
+3239960576,3239968255,DE
3239968512,3239968767,PL
3239968768,3239969023,NO
-3239969280,3239974911,DE
+3239969536,3239971839,DE
+3239972864,3239974911,DE
3239974912,3239975935,GB
3239975936,3239976191,RO
3239976192,3239976447,DE
@@ -52870,18 +57970,22 @@
3240033536,3240033791,UA
3240033792,3240034303,RO
3240034304,3240034559,RU
-3240034560,3240037887,DE
+3240034560,3240035327,DE
+3240035840,3240037375,DE
3240037888,3240038143,AT
-3240038400,3240041983,DE
-3240042496,3240083455,DE
+3240038400,3240040447,DE
+3240042496,3240048639,DE
+3240049664,3240083455,DE
3240083456,3240085503,RU
3240085504,3240087551,KZ
3240087552,3240098815,DE
3240098816,3240099327,CH
-3240099328,3240099839,DE
-3240099840,3240102911,GB
+3240099584,3240099839,DE
+3240100096,3240100863,GB
+3240101376,3240101887,GB
+3240102144,3240102399,GB
3240102912,3240103935,UA
-3240103936,3240104703,GB
+3240104192,3240104703,GB
3240104704,3240104959,NL
3240104960,3240105215,RU
3240105216,3240105471,UA
@@ -52905,9 +58009,14 @@
3240117248,3240118271,RU
3240118272,3240120319,ES
3240120320,3240120831,IR
-3240120832,3240132607,GB
-3240140800,3240144895,GB
-3240153088,3240165375,GB
+3240120832,3240121343,GB
+3240122368,3240124927,GB
+3240125440,3240125695,RO
+3240125696,3240132607,GB
+3240140800,3240142847,GB
+3240153088,3240159231,GB
+3240161536,3240161791,GB
+3240163840,3240165375,GB
3240165376,3240165887,PL
3240165888,3240166399,ES
3240166400,3240166911,PL
@@ -52954,7 +58063,6 @@
3240190976,3240191487,RU
3240191488,3240191999,AE
3240192000,3240192511,UA
-3240192512,3240193023,RO
3240193024,3240193535,GB
3240193536,3240194047,PL
3240194560,3240195071,AT
@@ -52966,9 +58074,7 @@
3240198144,3240198655,CH
3240199168,3240199679,RU
3240199680,3240200191,NL
-3240200192,3240200703,RO
3240200704,3240201215,GB
-3240201216,3240201727,RO
3240201728,3240202239,CH
3240202240,3240202751,RU
3240202752,3240203263,GB
@@ -53017,7 +58123,7 @@
3240227840,3240228351,GB
3240228352,3240228863,SE
3240228864,3240229375,GB
-3240229376,3240230399,RO
+3240229376,3240229887,RO
3240230400,3240230911,GB
3240230912,3240231935,PL
3240231936,3240232959,NL
@@ -53036,7 +58142,7 @@
3240246272,3240247295,UA
3240247296,3240248319,RS
3240248320,3240249343,DE
-3240249344,3240251391,UA
+3240249344,3240250367,UA
3240251392,3240252415,IE
3240252416,3240253439,LT
3240253440,3240254463,BE
@@ -53106,7 +58212,8 @@
3240287232,3240288255,PL
3240288256,3240296447,GB
3240296448,3240296703,RO
-3240296704,3240302847,GB
+3240296704,3240296959,GB
+3240297472,3240300543,GB
3240302848,3240303103,UA
3240303104,3240303359,GB
3240303616,3240304639,GB
@@ -53135,10 +58242,13 @@
3240324352,3240324607,RU
3240324608,3240324863,PL
3240324864,3240325119,SI
-3240325120,3240361983,GB
+3240325120,3240334335,GB
+3240336640,3240353791,GB
+3240355840,3240361983,GB
3240361984,3240362239,TR
3240362240,3240362495,DE
-3240362496,3240370175,GB
+3240362496,3240362751,GB
+3240363008,3240370175,GB
3240370176,3240370431,CH
3240370432,3240370687,DE
3240370688,3240370943,GB
@@ -53153,7 +58263,10 @@
3240373248,3240373503,RO
3240373504,3240373759,FR
3240373760,3240374015,DE
-3240374016,3240407039,GB
+3240374016,3240374271,GB
+3240378368,3240394751,GB
+3240395264,3240398847,GB
+3240400896,3240407039,GB
3240407040,3240407295,IL
3240407296,3240407551,NL
3240407552,3240407807,NO
@@ -53166,14 +58279,15 @@
3240410624,3240410879,PT
3240410880,3240411135,NO
3240411136,3240419327,RO
-3240419328,3240419839,GB
3240419840,3240420095,AT
-3240420096,3240420351,DE
-3240420352,3240420607,RO
3240420608,3240420863,NL
-3240420864,3240436735,GB
+3240420864,3240421375,GB
+3240423424,3240435711,GB
+3240436224,3240436735,GB
3240436736,3240437759,DE
-3240437760,3240460287,GB
+3240437760,3240454911,GB
+3240454912,3240455167,IN
+3240456192,3240460287,GB
3240460288,3240461055,IL
3240461056,3240461567,DE
3240461568,3240461823,UA
@@ -53199,18 +58313,24 @@
3240467712,3240467967,RU
3240467968,3240468223,DE
3240468224,3240468479,CH
-3240468480,3240487935,GB
+3240468480,3240486911,GB
+3240487424,3240487935,GB
3240487936,3240488191,CH
3240488192,3240488447,GB
3240488448,3240488703,BG
3240488704,3240488959,NL
3240488960,3240493055,GB
3240493056,3240501247,SE
-3240501248,3240505343,GB
+3240503296,3240504319,GB
+3240505088,3240505343,GB
3240505344,3240505599,PL
-3240505600,3240536640,GB
+3240505600,3240505855,GB
+3240506368,3240506623,GB
+3240507392,3240529919,GB
+3240534016,3240536640,GB
3240536641,3240536641,US
-3240536642,3240575487,GB
+3240536642,3240550399,GB
+3240558592,3240575487,GB
3240575488,3240575743,RO
3240575744,3240575999,GB
3240576000,3240576255,DE
@@ -53235,9 +58355,11 @@
3240589312,3240593407,SE
3240593408,3240594175,GB
3240594176,3240594431,DK
-3240594432,3240609791,GB
+3240594432,3240599551,GB
+3240602624,3240605695,GB
3240609792,3240611839,DE
-3240611840,3240622079,GB
+3240611840,3240613887,GB
+3240615936,3240622079,GB
3240622080,3240622591,RU
3240622592,3240624127,GB
3240624128,3240689663,EE
@@ -53250,12 +58372,9 @@
3240693248,3240693759,ES
3240693760,3240695807,BE
3240695808,3240697855,ES
-3240697856,3240698111,SE
3240698112,3240698367,LV
-3240698368,3240698623,GB
3240698624,3240699135,SI
3240699136,3240699391,DE
-3240699648,3240699903,NO
3240699904,3240700159,LT
3240700160,3240700415,AT
3240700416,3240700671,BE
@@ -53264,7 +58383,6 @@
3240701184,3240701439,LV
3240701440,3240701695,ES
3240701952,3240702975,UA
-3240702976,3240703999,DE
3240704000,3240705023,GR
3240705024,3240706047,UA
3240706048,3240707071,BG
@@ -53280,8 +58398,6 @@
3240712192,3240712447,UA
3240712448,3240712703,SI
3240712704,3240712959,CH
-3240712960,3240713215,IT
-3240713216,3240713471,GB
3240713472,3240713727,RU
3240713728,3240713983,AT
3240713984,3240714239,FR
@@ -53302,7 +58418,7 @@
3240727040,3240727551,DZ
3240727552,3240728063,CH
3240728064,3240728575,GR
-3240728576,3240729599,GB
+3240728576,3240729087,GB
3240729600,3240730111,DK
3240730112,3240730623,BE
3240730624,3240731647,ES
@@ -53324,7 +58440,6 @@
3240741120,3240741375,AT
3240741376,3240741631,IL
3240741632,3240741887,RU
-3240741888,3240742143,LV
3240742144,3240742399,IT
3240742400,3240742655,RO
3240742656,3240742911,AT
@@ -53338,7 +58453,6 @@
3240746496,3240747007,FR
3240747008,3240747263,SE
3240747264,3240747519,TR
-3240747520,3240747775,RU
3240747776,3240748031,ES
3240748032,3240748287,AT
3240748288,3240748543,GR
@@ -53347,13 +58461,14 @@
3240749312,3240749567,BE
3240749568,3240749823,ES
3240749824,3240750335,IT
-3240750336,3240750591,LU
3240750592,3240750847,FR
3240750848,3240751103,UA
3240751104,3240752127,ES
3240752128,3240754175,RO
3240754176,3240755199,DE
-3240755200,3240791551,IT
+3240755200,3240759295,IT
+3240771584,3240779775,IT
+3240788992,3240791551,IT
3240791552,3240791807,RU
3240791808,3240792063,ES
3240792064,3240792319,GB
@@ -53369,23 +58484,18 @@
3240795648,3240795903,CH
3240795904,3240796159,SE
3240796160,3240808959,IT
-3240808960,3240809215,GB
3240809216,3240809471,PL
3240809472,3240809727,NL
3240809728,3240809983,FR
-3240809984,3240810239,GR
3240810240,3240810495,SE
3240810496,3240810751,TR
-3240810752,3240811007,GB
3240811008,3240811263,PL
-3240811264,3240811519,FR
3240811520,3240811775,SA
3240811776,3240812031,DE
3240812032,3240812287,HU
3240812288,3240812543,KW
-3240812544,3240813567,IT
3240813568,3240814591,PL
-3240814592,3240818687,IT
+3240814592,3240816639,IT
3240818688,3240819711,NL
3240819712,3240819715,GB
3240819716,3240819716,NL
@@ -53395,37 +58505,37 @@
3240820800,3240820831,CY
3240820832,3240820863,GB
3240820864,3240820991,PL
-3240820992,3240823807,IT
+3240820992,3240822783,IT
3240823808,3240824319,PL
-3240824320,3240827135,IT
+3240824320,3240825855,IT
+3240826880,3240827135,IT
3240827136,3240827391,FR
3240827392,3240827647,BG
3240827648,3240827903,CH
3240828160,3240828415,DE
3240828416,3240837119,IT
-3240837120,3240837375,GB
-3240837376,3240840447,IT
+3240839424,3240839679,IT
+3240840192,3240840447,IT
3240840448,3240840703,PL
3240840704,3240840959,RU
-3240840960,3240841215,GB
3240841216,3240843263,IT
3240843264,3240843775,NL
3240843776,3240844031,PL
-3240844032,3240844543,NL
+3240844288,3240844543,NL
3240844544,3240844799,CH
3240845056,3240845311,UA
-3240845312,3240846847,IT
+3240845312,3240845823,IT
+3240846336,3240846847,IT
3240846848,3240847359,VA
3240847360,3240852735,IT
3240852736,3240852991,GB
-3240852992,3240853247,IT
3240853248,3240853503,RU
3240853504,3240854527,VA
3240854528,3240855039,IT
3240855040,3240855295,RU
-3240855296,3240857599,IT
+3240855552,3240857599,IT
3240857600,3240857855,PL
-3240857856,3240858623,IT
+3240857856,3240858367,IT
3240858624,3240858879,PL
3240859136,3240859391,NL
3240859392,3240859647,SE
@@ -53456,7 +58566,8 @@
3241018112,3241029119,AT
3241029120,3241029375,UA
3241029376,3241029631,PL
-3241029632,3241032703,AT
+3241029632,3241031679,AT
+3241032192,3241032703,AT
3241032704,3241032959,RU
3241032960,3241033215,GB
3241033216,3241033727,DE
@@ -53484,15 +58595,14 @@
3241040128,3241040383,UA
3241040384,3241040639,GB
3241040640,3241040895,RO
-3241040896,3241063423,AT
+3241040896,3241062399,AT
3241063424,3241063679,IT
3241063680,3241063935,PL
3241063936,3241064191,DE
3241064192,3241064447,GB
3241064448,3241064703,DE
3241064704,3241065471,PL
-3241065472,3241068543,AT
-3241068544,3241068799,GB
+3241065472,3241066495,AT
3241068800,3241069311,UA
3241069312,3241069567,FR
3241069568,3241070079,GB
@@ -53500,23 +58610,21 @@
3241070336,3241070847,RU
3241070848,3241071103,AT
3241071104,3241071359,UA
-3241071360,3241071615,RU
3241071616,3241071871,PL
3241071872,3241072127,RU
3241072128,3241072383,BE
3241072384,3241072639,DE
-3241072640,3241073919,AT
+3241073664,3241073919,AT
3241073920,3241074175,GB
-3241074176,3241076735,AT
-3241076736,3241076991,GR
-3241076992,3241077759,AT
+3241074432,3241076735,AT
+3241077248,3241077759,AT
3241077760,3241078015,LV
3241078016,3241078271,PL
3241078272,3241078527,ES
3241078528,3241078783,DE
3241078784,3241082879,AT
3241082880,3241083135,FR
-3241083136,3241100799,CH
+3241083136,3241100287,CH
3241101056,3241101311,DK
3241101312,3241101567,RO
3241101568,3241101823,DE
@@ -53578,11 +58686,11 @@
3241146112,3241146367,PL
3241146368,3241146623,IL
3241146624,3241146879,RO
-3241146880,3241148415,CH
-3241148416,3241373951,FR
-3241373952,3241374207,RE
-3241374208,3241476095,FR
-3241476608,3241481727,BE
+3241146880,3241147903,CH
+3241148160,3241148415,CH
+3241148416,3241476095,FR
+3241476608,3241477631,BE
+3241478144,3241481727,BE
3241481728,3241481983,PT
3241481984,3241482239,DE
3241482240,3241484799,SE
@@ -53595,7 +58703,7 @@
3241498112,3241498367,BE
3241498624,3241498879,NO
3241498880,3241499135,UA
-3241499136,3241499903,BE
+3241499648,3241499903,BE
3241499904,3241500159,DE
3241500160,3241500671,GB
3241500672,3241501439,BE
@@ -53607,13 +58715,26 @@
3241508096,3241508351,NL
3241508352,3241541375,BE
3241541376,3241541631,PL
-3241541632,3241724415,FR
+3241541632,3241672703,FR
+3241673472,3241689087,FR
+3241691136,3241699327,FR
+3241699584,3241699839,FR
+3241699840,3241700095,SE
+3241700096,3241723903,FR
+3241724160,3241724415,FR
3241724416,3241724671,RU
-3241724672,3241771007,FR
+3241724672,3241724927,FR
+3241725952,3241740287,FR
+3241740544,3241748479,FR
+3241750528,3241752831,FR
+3241754368,3241758719,FR
+3241759744,3241763071,FR
+3241763072,3241763327,DE
+3241763328,3241771007,FR
3241772032,3241789439,FR
3241789696,3241789951,FR
3241790464,3241790975,FR
-3241791488,3241803775,FR
+3241793536,3241803775,FR
3241803776,3241803823,CY
3241803832,3241803839,GB
3241803840,3241804031,CY
@@ -53625,7 +58746,6 @@
3241843456,3241843711,CH
3241843712,3241848063,BE
3241848064,3241851391,CH
-3241851392,3241851903,GR
3241851904,3241852927,GB
3241852928,3241854463,SK
3241854464,3241854975,GB
@@ -53635,7 +58755,8 @@
3241857536,3241859071,AT
3241859072,3241859651,US
3241859652,3241859652,MY
-3241859653,3241861119,US
+3241859653,3241860863,US
+3241860864,3241861119,FR
3241861120,3241863167,BE
3241863168,3241863423,PL
3241863424,3241863679,FR
@@ -53644,19 +58765,16 @@
3241864192,3241864447,TR
3241864704,3241864959,SE
3241864960,3241865215,IT
-3241865216,3241865471,DE
3241865472,3241865727,NO
3241865728,3241865983,CH
3241865984,3241866239,RO
3241866240,3241866751,DE
3241866752,3241867007,UA
3241867008,3241867263,FR
-3241867520,3241867775,PL
3241867776,3241868031,NO
3241868032,3241868287,RU
3241868288,3241868543,HR
3241868544,3241868799,DE
-3241868800,3241869055,UA
3241869056,3241869311,BY
3241869312,3241934847,PL
3241934848,3242196991,GB
@@ -53675,18 +58793,20 @@
3242950656,3242983423,BE
3242983424,3243048959,IT
3243048960,3243114495,SI
-3243114496,3243245567,NL
+3243114496,3243238143,NL
+3243238144,3243238399,US
+3243238400,3243245567,NL
3243245568,3243376639,AT
3243376640,3243442175,GB
3243442176,3243507711,AT
3243507712,3243507967,GB
-3243507968,3243509759,CZ
+3243509248,3243509759,CZ
3243509760,3243510015,RU
3243510016,3243510271,NL
-3243510272,3243511807,CZ
+3243510272,3243510527,CZ
+3243510784,3243511807,CZ
3243512064,3243512319,UA
3243512320,3243512575,FR
-3243512576,3243512831,UA
3243512832,3243513087,DE
3243513088,3243513343,GR
3243513344,3243513855,UA
@@ -53696,9 +58816,8 @@
3243514624,3243514879,DK
3243514880,3243515135,AT
3243515136,3243515391,PL
-3243515392,3243515647,DE
3243515648,3243515903,RU
-3243515904,3243520511,CZ
+3243515904,3243519999,CZ
3243520512,3243520767,UA
3243520768,3243521023,GB
3243521024,3243521279,AT
@@ -53711,14 +58830,12 @@
3243524864,3243525119,NL
3243525120,3243525375,CZ
3243525376,3243525631,RO
-3243525632,3243525887,CZ
3243525888,3243526143,PL
3243526144,3243526399,UA
3243526400,3243526655,FR
-3243526656,3243526911,PL
3243526912,3243527167,SE
-3243527168,3243527679,UA
-3243527680,3243527935,GB
+3243527168,3243527423,RU
+3243527424,3243527679,UA
3243527936,3243528191,PL
3243528192,3243529215,CZ
3243529216,3243529471,BE
@@ -53726,35 +58843,35 @@
3243529984,3243530239,GB
3243530496,3243530751,FR
3243531008,3243531263,DE
-3243531264,3243531775,CZ
3243531776,3243532031,AT
3243532032,3243532287,DE
3243532288,3243536383,CZ
3243536384,3243536639,AT
3243536896,3243537151,CZ
3243537408,3243537919,CZ
-3243538432,3243544063,CZ
+3243538432,3243540991,CZ
+3243542528,3243543551,CZ
3243544064,3243544319,GB
3243544320,3243544575,NL
3243544576,3243552767,CZ
3243552768,3243553023,NL
3243553024,3243553279,FR
3243553280,3243553535,DE
-3243553792,3243554303,DE
+3243554048,3243554303,DE
3243554304,3243554559,PL
3243554560,3243554815,MD
3243554816,3243555071,LV
3243555072,3243555327,RO
3243555328,3243555583,CZ
-3243555584,3243555839,FR
-3243555840,3243565055,CZ
+3243556864,3243565055,CZ
3243565056,3243569151,GB
-3243569152,3243570687,CZ
+3243570432,3243570687,CZ
3243570688,3243570943,PL
-3243570944,3243571711,CZ
-3243571712,3243571967,GB
+3243570944,3243571199,CZ
+3243571456,3243571711,CZ
3243571968,3243572223,GR
-3243572224,3243572991,CZ
+3243572224,3243572479,CZ
+3243572736,3243572991,CZ
3243572992,3243573247,RU
3243573248,3243704319,CZ
3243704320,3243769855,SK
@@ -53782,7 +58899,7 @@
3244114944,3244115967,PL
3244115968,3244116991,SK
3244116992,3244118015,UA
-3244118016,3244120063,GB
+3244119040,3244120063,GB
3244120064,3244122111,PL
3244123136,3244124159,UA
3244124160,3244125183,PL
@@ -53821,9 +58938,7 @@
3244228608,3244261375,TN
3244261376,3244277759,IE
3244277760,3244294143,SI
-3244294144,3244501503,DE
-3244501504,3244501759,GB
-3244501760,3244818431,DE
+3244294144,3244818431,DE
3244818432,3244818687,ES
3244818688,3244818943,AT
3244818944,3244819199,PL
@@ -54014,7 +59129,7 @@
3244870912,3244871167,FR
3244871168,3244871423,LT
3244871424,3244871679,RU
-3244871680,3244872703,UA
+3244871680,3244872447,UA
3244872704,3244872959,IR
3244872960,3244873215,UA
3244873216,3244873471,SE
@@ -54319,7 +59434,7 @@
3244986368,3244987391,UA
3244987392,3244988415,RU
3244988416,3244990463,PL
-3244990464,3244991487,UA
+3244990464,3244991487,RU
3244991488,3244992511,DK
3244992512,3244994559,RU
3244994560,3244995583,ES
@@ -54349,7 +59464,11 @@
3245015040,3245016063,RU
3245016064,3245017087,RS
3245017088,3245018111,PL
-3245018112,3245021183,RU
+3245018112,3245019391,RU
+3245019392,3245019462,SC
+3245019463,3245019463,RU
+3245019464,3245019647,SC
+3245019648,3245021183,RU
3245021184,3245022207,UA
3245022208,3245023231,NO
3245023232,3245024255,PL
@@ -54380,7 +59499,6 @@
3245057024,3245058047,PL
3245058048,3245061119,UA
3245061120,3245062143,RU
-3245062144,3245063167,UA
3245063168,3245065215,RU
3245065216,3245066239,PL
3245066240,3245067263,UA
@@ -54403,7 +59521,6 @@
3245086208,3245086463,AT
3245086464,3245086719,GH
3245086720,3245086975,BG
-3245086976,3245087231,IT
3245087488,3245087743,NL
3245087744,3245087999,GH
3245088000,3245088255,LV
@@ -54453,13 +59570,14 @@
3245125120,3245125631,ES
3245125632,3245125887,DE
3245125888,3245126143,PL
-3245126144,3245126399,FR
3245126400,3245126655,DE
3245126656,3245126911,FR
3245126912,3245127167,DE
3245127168,3245127423,RU
3245127424,3245127679,AT
-3245127680,3245127935,DE
+3245127680,3245127742,US
+3245127743,3245127743,DE
+3245127744,3245127935,US
3245127936,3245128191,LV
3245128192,3245128447,IT
3245128448,3245128703,CH
@@ -54469,15 +59587,13 @@
3245130240,3245130495,PL
3245130496,3245130751,IL
3245130752,3245131007,SE
-3245131008,3245131519,FR
+3245131008,3245131263,FR
3245131520,3245132031,GB
3245132032,3245132287,BE
3245132288,3245132543,PL
3245132544,3245132799,FR
3245132800,3245133311,IT
3245133312,3245133567,PL
-3245133568,3245133823,RU
-3245133824,3245134079,NO
3245134080,3245134335,UA
3245134336,3245134591,NL
3245134592,3245134847,IL
@@ -54495,7 +59611,6 @@
3245137920,3245138431,DK
3245138432,3245138943,UA
3245138944,3245139455,PL
-3245139456,3245139967,RU
3245139968,3245140479,CH
3245140992,3245141503,UA
3245141504,3245141759,NL
@@ -54518,7 +59633,6 @@
3245161472,3245161727,RU
3245161728,3245161983,BG
3245161984,3245162495,BE
-3245162496,3245163007,DE
3245163008,3245163519,KE
3245163520,3245164543,RU
3245164544,3245165055,BE
@@ -54529,8 +59643,6 @@
3245166848,3245167103,GB
3245167104,3245167359,IL
3245167360,3245167615,GB
-3245167616,3245167871,UA
-3245167872,3245168127,LV
3245168128,3245168383,SE
3245168384,3245168639,FR
3245168640,3245168895,AT
@@ -54542,7 +59654,6 @@
3245170432,3245170687,CH
3245170688,3245171711,DE
3245172736,3245173759,IT
-3245173760,3245174783,UA
3245174784,3245175039,IT
3245175040,3245175295,DE
3245175296,3245175551,RU
@@ -54551,7 +59662,7 @@
3245176064,3245176319,SK
3245176320,3245176575,UA
3245176576,3245176831,FR
-3245176832,3245177343,ES
+3245177088,3245177343,ES
3245177344,3245177599,NL
3245177600,3245177855,PL
3245177856,3245178111,SI
@@ -54559,9 +59670,7 @@
3245178624,3245178879,PL
3245178880,3245179391,UA
3245179392,3245179903,LU
-3245179904,3245180415,DE
3245180416,3245180927,TR
-3245180928,3245181439,NL
3245181440,3245181951,DE
3245181952,3245182463,AT
3245182464,3245182975,FR
@@ -54578,18 +59687,16 @@
3245199872,3245200127,NO
3245200128,3245200383,LV
3245200384,3245200639,PL
-3245200640,3245200895,GR
3245200896,3245201151,DE
3245201152,3245201407,KW
3245201408,3245201663,UA
-3245201664,3245201919,NO
3245201920,3245202175,SA
3245202432,3245202687,GB
-3245202688,3245203455,DE
+3245202944,3245203455,DE
3245203712,3245204223,PL
3245204224,3245204479,SI
3245204480,3245204735,BE
-3245204736,3245205247,ES
+3245204736,3245204991,ES
3245205248,3245205503,DE
3245205504,3245205759,AT
3245205760,3245206015,IT
@@ -54605,7 +59712,6 @@
3245210112,3245210623,FR
3245210624,3245211135,HU
3245211136,3245211647,GB
-3245212160,3245212671,NG
3245212672,3245213183,GB
3245213184,3245213695,DE
3245213696,3245214207,LV
@@ -54626,7 +59732,6 @@
3245230080,3245232127,UA
3245232128,3245232383,PL
3245232384,3245232639,BE
-3245232640,3245232895,BG
3245232896,3245233151,IT
3245233152,3245233407,DK
3245233408,3245233663,CH
@@ -54655,17 +59760,14 @@
3245245440,3245245695,BG
3245245696,3245245951,DE
3245246208,3245246463,GB
-3245246464,3245246719,AT
3245246720,3245246975,PL
3245246976,3245247231,GB
3245247232,3245247487,DE
-3245247488,3245247999,FR
+3245247488,3245247743,FR
3245248000,3245248255,PL
-3245248256,3245248511,GB
3245248512,3245248767,UA
3245248768,3245249023,SI
3245249024,3245249535,NL
-3245249536,3245249791,FR
3245249792,3245250047,GB
3245250048,3245250303,DE
3245250304,3245250559,IT
@@ -54691,7 +59793,6 @@
3245260288,3245260799,BE
3245260800,3245261823,DE
3245261824,3245262847,DK
-3245262848,3245263871,IT
3245263872,3245264895,DE
3245264896,3245266943,TR
3245266944,3245268991,BG
@@ -54723,7 +59824,6 @@
3245287680,3245287935,PL
3245287936,3245288191,PT
3245288192,3245288703,DE
-3245288704,3245288959,FI
3245288960,3245289215,IT
3245289216,3245289471,AT
3245289472,3245290495,UA
@@ -54739,12 +59839,10 @@
3245298432,3245298687,UA
3245298688,3245298943,GB
3245298944,3245299199,UA
-3245299200,3245299455,GB
3245299456,3245299711,AT
3245299712,3245299967,DE
3245299968,3245300223,BG
-3245300224,3245300479,FR
-3245300480,3245300991,RU
+3245300736,3245300991,RU
3245300992,3245301247,FI
3245301248,3245301503,DK
3245301504,3245301759,BE
@@ -54753,16 +59851,13 @@
3245303808,3245304831,SE
3245304832,3245306367,DE
3245306368,3245306879,UA
-3245306880,3245307391,RU
3245307392,3245307903,FI
3245307904,3245308415,RO
3245308416,3245308927,ES
-3245309184,3245309439,SE
3245309440,3245309951,UA
3245309952,3245311999,CZ
3245312000,3245314047,DE
3245314048,3245315071,PL
-3245315072,3245316095,IT
3245317120,3245318143,UA
3245318144,3245318399,IT
3245318400,3245318655,RO
@@ -54771,9 +59866,7 @@
3245319168,3245319423,HR
3245319424,3245319679,SE
3245319680,3245319935,PL
-3245319936,3245320191,DE
-3245320448,3245320959,DE
-3245320960,3245321215,IE
+3245319936,3245321215,DE
3245321216,3245321471,NL
3245321472,3245321727,UA
3245321984,3245322239,DE
@@ -54793,11 +59886,8 @@
3245334784,3245335039,BE
3245335296,3245335551,GB
3245335552,3245335807,NL
-3245335808,3245336063,RO
3245336064,3245336575,GB
3245336576,3245336831,RO
-3245336832,3245337087,DE
-3245337344,3245337599,BE
3245337600,3245337855,PL
3245337856,3245338367,DE
3245338368,3245339647,UA
@@ -54815,20 +59905,19 @@
3246129152,3246260223,RU
3246260224,3246325759,PT
3246351616,3246352639,ES
+3246374400,3246374655,ES
3246376960,3246377215,ES
3246378752,3246379007,ES
3246379008,3246381055,GB
-3246381568,3246381823,ES
3246391296,3246613503,GB
3246613504,3246614527,HU
3246614528,3246744543,GB
3246744544,3246744559,NG
3246744560,3246784511,GB
-3246784512,3246825983,CH
+3246784512,3246825727,CH
+3246825728,3246825983,GB
3246825984,3246826239,US
-3246826240,3246862847,CH
-3246862848,3246863103,AU
-3246863104,3246874623,CH
+3246826240,3246874623,CH
3246874624,3246875647,DE
3246875648,3246915583,CH
3246915584,3247046655,PT
@@ -54861,7 +59950,6 @@
3247067648,3247067903,RU
3247067904,3247068159,CH
3247068160,3247068415,UA
-3247068416,3247068671,RO
3247068672,3247068927,GB
3247068928,3247069183,UA
3247069184,3247069439,DE
@@ -54885,15 +59973,12 @@
3247074304,3247074559,DE
3247074560,3247074815,SE
3247074816,3247075071,PL
-3247075072,3247075327,IE
3247075328,3247076095,DE
3247076096,3247076351,DK
3247076352,3247076607,TR
3247076608,3247076863,DE
3247076864,3247077119,PL
3247077120,3247077375,DE
-3247077632,3247077887,NL
-3247077888,3247078143,UA
3247078144,3247078399,AT
3247078400,3247078655,DK
3247078656,3247078911,HU
@@ -54924,7 +60009,6 @@
3247108096,3247109119,PL
3247109120,3247110143,UA
3247110144,3247111167,NL
-3247111168,3247112191,DE
3247112192,3247177727,FR
3247177728,3247243263,TR
3247243264,3247244287,DE
@@ -54938,11 +60022,12 @@
3247292416,3247300607,DE
3247300608,3247308799,NL
3247308800,3247309055,BG
-3247309056,3247313663,FI
+3247309056,3247309567,FI
+3247309824,3247313663,FI
3247313664,3247313919,AM
3247313920,3247316479,FI
3247316480,3247316991,RU
-3247316992,3247322367,FI
+3247321600,3247322111,FI
3247322368,3247322623,DE
3247322624,3247323135,FI
3247323136,3247323647,RU
@@ -54955,7 +60040,7 @@
3247334400,3247334655,NO
3247334656,3247335167,FI
3247335168,3247335423,DK
-3247335424,3247336447,FI
+3247335424,3247336447,DE
3247336448,3247337215,NO
3247337216,3247337471,CH
3247337472,3247337983,PL
@@ -54966,9 +60051,8 @@
3247339520,3247340543,FI
3247340544,3247340799,UA
3247340800,3247341055,CH
-3247341056,3247341311,FI
3247341312,3247341567,DE
-3247341568,3247345919,FI
+3247343616,3247345919,FI
3247345920,3247346175,HU
3247346176,3247346943,FI
3247346944,3247347199,SI
@@ -54976,12 +60060,14 @@
3247347456,3247347711,IL
3247347712,3247347967,FI
3247347968,3247348223,HU
-3247348224,3247348735,FI
+3247348224,3247348479,FI
3247348992,3247349247,DE
3247349248,3247349503,FR
3247349504,3247349759,UA
3247349760,3247353855,SE
-3247353856,3247362047,FI
+3247353856,3247357951,FI
+3247358464,3247359231,FI
+3247359488,3247362047,FI
3247362048,3247362303,RO
3247362304,3247362559,HU
3247362560,3247362815,PL
@@ -54996,18 +60082,19 @@
3247365120,3247365375,GB
3247365376,3247365631,UA
3247365632,3247365887,SA
-3247366144,3247371007,FI
+3247366144,3247370751,FI
3247371008,3247371263,PL
3247371264,3247371519,SE
3247371520,3247371775,GB
3247371776,3247372031,RU
3247372032,3247372287,FI
3247372288,3247372543,RO
-3247372544,3247372799,RU
3247372800,3247373055,RO
-3247373056,3247374335,FI
+3247373056,3247373567,FI
3247374336,3247374591,RU
-3247374592,3247394047,FI
+3247375360,3247380479,FI
+3247382528,3247390719,FI
+3247391744,3247394047,FI
3247394048,3247394303,PL
3247394304,3247397887,FI
3247397888,3247398143,RU
@@ -55018,31 +60105,31 @@
3247405056,3247405311,RO
3247405312,3247405567,PL
3247405568,3247405823,DE
-3247405824,3247432191,FI
+3247406080,3247432191,FI
3247432192,3247432447,TR
3247432448,3247438079,FI
3247438080,3247438335,IT
3247438336,3247439871,FI
3247439872,3247702015,ES
3247702016,3247702271,RO
-3247702272,3247703551,ES
+3247702528,3247703551,ES
3247703552,3247704063,FR
-3247704064,3247704831,ES
3247704832,3247705087,GB
3247705088,3247705855,ES
3247705856,3247706111,RU
3247706112,3247711743,ES
3247711744,3247712255,IT
-3247712256,3247713279,ES
+3247712768,3247713023,ES
3247713280,3247713535,RU
3247713536,3247713791,BE
3247713792,3247714047,SK
3247714304,3247716351,CH
-3247717376,3247717887,ES
-3247717888,3247718399,CH
-3247718400,3247742975,ES
+3247717376,3247717631,ES
+3247726592,3247742975,ES
3247742976,3247751167,DE
-3247751168,3247769599,ES
+3247751168,3247764479,ES
+3247764992,3247765247,ES
+3247765504,3247769599,ES
3247769600,3247771647,DE
3247771648,3247775743,ES
3247775744,3247783935,DE
@@ -55110,10 +60197,7 @@
3247872000,3247875327,NL
3247875328,3247875583,PL
3247875584,3247876095,DE
-3247876096,3247876351,PL
3247876352,3247876607,FR
-3247876608,3247876863,ES
-3247876864,3247877119,DE
3247877120,3247877631,GR
3247877632,3247879167,AT
3247879168,3247882239,GB
@@ -55147,62 +60231,58 @@
3247928320,3247929343,HU
3247929344,3247931391,GB
3247931392,3247939583,IR
-3247939584,3247947775,UA
3247947776,3247960063,RU
3247960064,3247962111,UA
3247962112,3247963135,DE
3247963136,3247964159,UA
3247964160,3248095231,ES
3248095232,3248160767,AT
-3248160768,3248169215,DE
-3248169216,3248169471,GB
-3248169472,3248226303,DE
+3248160768,3248226303,DE
3248226304,3248357375,NO
3248357376,3248488447,DE
3248488448,3248488703,FR
3248488704,3248491519,NO
3248491520,3248492031,RU
-3248492032,3248496895,NO
+3248492032,3248492543,NO
+3248493568,3248496895,NO
3248496896,3248497151,IL
3248497152,3248498431,NO
3248498432,3248498687,DE
-3248498688,3248513279,NO
+3248498688,3248504831,NO
3248513280,3248513535,UA
3248513536,3248514047,AT
-3248514048,3248521983,NO
+3248514048,3248521215,NO
3248521984,3248522239,RU
3248522240,3248524287,NO
3248525312,3248525567,DE
-3248525568,3248525823,DK
-3248525824,3248527871,NO
+3248526336,3248527359,NO
3248528384,3248528895,NO
3248528896,3248529151,RU
-3248529152,3248529407,BG
3248529408,3248540671,NO
3248540672,3248541183,RU
3248541184,3248541695,SE
-3248541696,3248545791,NO
3248545792,3248546815,UA
3248546816,3248547839,RU
-3248547840,3248549631,NO
+3248547840,3248548351,NO
3248549632,3248549887,SE
3248549888,3248553215,NO
-3248553472,3248553727,NO
3248553728,3248553983,RU
3248553984,3248554239,RO
-3248554240,3248557055,NO
+3248554496,3248557055,NO
3248557056,3248558079,UA
3248558080,3248575487,NO
3248575488,3248576511,CZ
-3248576512,3248599039,NO
+3248576512,3248591871,NO
+3248592384,3248599039,NO
3248599040,3248603135,SE
3248603136,3248603391,BG
3248603392,3248603647,RU
-3248603648,3248619519,NO
+3248603648,3248604159,NO
+3248604928,3248608767,NO
+3248609280,3248619519,NO
3248619520,3248750591,DK
3248750592,3248750847,PT
-3248750848,3248752383,PL
-3248752384,3248752639,NL
+3248751616,3248752127,PL
3248752640,3248752895,DE
3248752896,3248753151,TR
3248753408,3248753663,GB
@@ -55216,9 +60296,11 @@
3248783616,3248783871,PL
3248783872,3248784127,UA
3248784128,3248785407,DE
-3248785408,3248786943,SI
+3248785408,3248785535,SI
+3248785536,3248785663,RO
+3248785664,3248786943,SI
3248786944,3248787199,PL
-3248787200,3248787455,FR
+3248787200,3248787455,DE
3248787456,3248787711,NL
3248787712,3248787967,CH
3248787968,3248788223,RU
@@ -55252,8 +60334,7 @@
3248806912,3248807423,US
3248807936,3248808447,AT
3248808448,3248808959,GR
-3248808960,3248810079,FR
-3248810080,3248810111,UA
+3248808960,3248810111,FR
3248810112,3248810143,RU
3248810144,3248810175,CY
3248810176,3248810207,FR
@@ -55270,9 +60351,8 @@
3249012736,3249012991,DE
3249012992,3249014271,LU
3249014272,3249014783,DE
-3249014784,3249025535,LU
+3249014784,3249025023,LU
3249025536,3249025791,FR
-3249025792,3249026559,LU
3249026560,3249026815,PL
3249026816,3249045503,LU
3249045504,3249078271,DE
@@ -55387,11 +60467,12 @@
3249521280,3249521343,UA
3249521344,3249537023,DE
3249537024,3249537279,PT
-3249537280,3249537791,NL
+3249537536,3249537791,NL
3249537792,3249538047,GB
3249538048,3249551359,NL
3249551360,3249552639,GB
-3249552640,3249574143,NL
+3249552640,3249565695,NL
+3249569792,3249574143,NL
3249574144,3249574399,RU
3249574400,3249574655,GB
3249574656,3249574911,UA
@@ -55401,7 +60482,8 @@
3249600256,3249600511,AT
3249600512,3249601535,UA
3249601536,3249601791,RU
-3249601792,3249668095,NL
+3249601792,3249655807,NL
+3249659904,3249668095,NL
3249668096,3249676287,IE
3249676288,3249676543,GB
3249676544,3249676799,IE
@@ -55415,7 +60497,6 @@
3249698048,3249698303,PL
3249698304,3249698559,RU
3249698560,3249698815,HU
-3249698816,3249699839,GB
3249699840,3249700863,UA
3249701120,3249701631,SE
3249701632,3249701887,RU
@@ -55427,7 +60508,6 @@
3249703680,3249703935,GB
3249703936,3249704191,FR
3249704192,3249704447,RO
-3249704448,3249704703,DE
3249704704,3249704959,PL
3249704960,3249705983,UA
3249705984,3249706495,AT
@@ -55459,7 +60539,6 @@
3249716480,3249716735,NL
3249716736,3249717247,UA
3249717248,3249718271,LV
-3249718272,3249719295,DE
3249719296,3249720319,IR
3249720320,3249721343,IT
3249721344,3249721599,AT
@@ -55468,7 +60547,7 @@
3249722624,3249723135,PL
3249723136,3249723391,RU
3249723392,3249723647,IT
-3249723904,3249724159,TR
+3249723648,3249723903,GB
3249724160,3249724415,LU
3249724416,3249724671,IL
3249724672,3249724927,RU
@@ -55477,7 +60556,6 @@
3249725440,3249725951,RO
3249725952,3249726463,DE
3249726464,3249726975,UA
-3249726976,3249727487,IT
3249727488,3249727999,LV
3249728000,3249728511,IT
3249728512,3249729023,UA
@@ -55546,7 +60624,7 @@
3249961216,3249961471,SE
3249961472,3249961727,NL
3249961728,3249967103,SE
-3249967104,3249967615,AT
+3249967104,3249967615,IL
3249967616,3249967871,GB
3249967872,3249968127,SE
3249968128,3249969151,FR
@@ -55626,13 +60704,12 @@
3250233600,3250233855,AT
3250233856,3250234111,GB
3250234112,3250234367,GR
-3250234368,3250239743,AT
-3250239744,3250239999,DE
-3250240000,3250241535,AT
+3250234368,3250241535,AT
3250245632,3250245887,TR
3250245888,3250246143,AT
3250246144,3250246399,GB
-3250246656,3250257663,AT
+3250246656,3250247423,AT
+3250247680,3250257663,AT
3250257664,3250257919,PL
3250258176,3250271231,AT
3250271232,3250271743,PL
@@ -55647,16 +60724,16 @@
3250277632,3250277887,DE
3250277888,3250278399,UA
3250278400,3250279423,RU
-3250279424,3250323199,AT
+3250279424,3250298879,AT
+3250308096,3250323199,AT
3250323200,3250323455,RU
3250323456,3250323711,PL
-3250323712,3250324479,SA
3250324480,3250324991,GB
3250324992,3250325247,AE
3250325248,3250325503,MA
3250325504,3250326527,OM
3250326528,3250327039,BH
-3250327040,3250331647,SA
+3250327040,3250327551,SA
3250331648,3250335743,MT
3250335744,3250339839,KW
3250339840,3250348031,JO
@@ -55671,18 +60748,17 @@
3250357904,3250357919,FR
3250357920,3250357927,PL
3250357928,3250357959,CY
-3250357960,3250358015,GB
+3250357960,3250357967,GB
+3250357976,3250358015,GB
3250358016,3250358527,LB
3250358528,3250358783,HU
-3250358784,3250359295,LB
3250359296,3250359807,HU
3250359808,3250362879,KW
3250362880,3250363391,DE
3250363392,3250363903,SE
3250363904,3250364415,DE
3250364416,3250372607,KW
-3250372608,3250373375,HU
-3250373376,3250373631,GB
+3250372608,3250373631,HU
3250373632,3250374143,DE
3250374144,3250374655,PL
3250374656,3250374911,SA
@@ -55693,7 +60769,6 @@
3250386944,3250387199,SE
3250387200,3250387455,FR
3250387456,3250387711,DE
-3250387712,3250387967,FR
3250388224,3250388479,PL
3250388480,3250388735,UA
3250388736,3250388991,FR
@@ -55746,7 +60821,7 @@
3250446336,3250454527,DE
3250454528,3250585599,BE
3250585600,3250585855,NL
-3250585856,3250588671,PT
+3250586624,3250588671,PT
3250588800,3250588927,CY
3250588928,3250589183,GB
3250589184,3250589439,DE
@@ -55821,9 +60896,7 @@
3250752512,3250753023,BG
3250753024,3250754047,DE
3250754048,3250754303,AT
-3250754304,3250754559,GB
3250754560,3250755071,DE
-3250755072,3250755583,GB
3250755584,3250755839,FR
3250755840,3250756351,RU
3250756608,3250756863,BG
@@ -55853,10 +60926,7 @@
3251115264,3251115519,RU
3251115520,3251115775,UA
3251115776,3251116031,BE
-3251116032,3251116287,BG
3251116288,3251116543,GB
-3251116544,3251116799,DK
-3251116800,3251117055,GB
3251117056,3251117311,BG
3251117312,3251117567,FR
3251117568,3251117823,IL
@@ -55891,7 +60961,6 @@
3251133952,3251134463,RU
3251134464,3251134975,DE
3251134976,3251135999,GB
-3251136000,3251136511,RO
3251136512,3251137023,DK
3251137024,3251137535,DE
3251137536,3251138047,PL
@@ -55994,7 +61063,7 @@
3251170048,3251170303,NO
3251170304,3251170559,CH
3251170560,3251170815,BG
-3251170816,3251171327,RU
+3251171072,3251171327,RU
3251171328,3251171839,DE
3251171840,3251172095,RO
3251172096,3251172351,ES
@@ -56058,13 +61127,11 @@
3251203328,3251203583,SI
3251203584,3251203839,CZ
3251203840,3251204095,RU
-3251204096,3251204607,DE
3251205120,3251205631,UA
3251205632,3251206143,RU
3251206144,3251206655,GB
3251206656,3251207167,CH
3251207168,3251207679,GB
-3251207680,3251208191,RU
3251208192,3251209215,CY
3251209216,3251210239,GB
3251210240,3251211263,PL
@@ -56078,10 +61145,9 @@
3251213152,3251213183,FR
3251213184,3251213215,UA
3251213216,3251213247,CY
-3251213248,3251213311,GB
+3251213280,3251213311,GB
3251213312,3251213375,CY
3251213376,3251213439,DE
-3251213440,3251213503,GB
3251213504,3251213567,NL
3251213568,3251213631,FR
3251213632,3251213695,PL
@@ -56095,12 +61161,10 @@
3251214464,3251214591,UA
3251214592,3251214975,GB
3251214976,3251215103,RO
-3251215104,3251215231,SI
3251215232,3251215359,IL
3251215360,3251215487,UA
3251215488,3251215615,SE
3251215616,3251215743,CY
-3251215744,3251215871,GB
3251215872,3251216127,RO
3251216256,3251216383,RU
3251216384,3251216639,GB
@@ -56183,23 +61247,18 @@
3251307520,3251307775,MK
3251307776,3251308031,GB
3251308032,3251308543,RS
-3251308544,3251310591,US
3251310592,3251311103,SI
3251311104,3251311615,RS
3251311616,3251312127,GB
-3251312128,3251312383,RS
3251312384,3251312639,CH
-3251312640,3251314175,RS
-3251314176,3251314687,CH
+3251312640,3251314687,RS
3251314688,3251315711,FR
3251315712,3251317759,RU
3251317760,3251318783,PL
3251318784,3251319807,UA
3251320832,3251321855,PL
3251321856,3251322879,RU
-3251322880,3251331319,GB
-3251331320,3251331321,FR
-3251331322,3251331327,GB
+3251322880,3251331327,GB
3251331328,3251331583,FR
3251331584,3251332095,PL
3251332096,3251333119,RU
@@ -56236,14 +61295,16 @@
3251366912,3251367423,UA
3251367424,3251367935,DE
3251367936,3251372031,GB
-3251372032,3251634175,IT
-3251634176,3251806207,FI
-3251806208,3251810047,BE
-3251810048,3251812607,FI
-3251812608,3251814143,BE
-3251814144,3251815679,FI
-3251815680,3251817471,BE
-3251817472,3251896319,FI
+3251372032,3251376127,IT
+3251376128,3251378175,SI
+3251378176,3251406847,IT
+3251406848,3251407871,SI
+3251407872,3251460095,IT
+3251460096,3251462143,SI
+3251462144,3251470335,IT
+3251470336,3251472383,SI
+3251472384,3251634175,IT
+3251634176,3251896319,FI
3251896320,3252166655,NO
3252166656,3252167679,SE
3252167680,3252176127,NL
@@ -56260,19 +61321,15 @@
3252202496,3252203007,SE
3252203008,3252205567,HR
3252205568,3252205823,SE
-3252205824,3252206079,NO
-3252206080,3252206591,SE
-3252206592,3252207615,NO
+3252205824,3252207615,NO
3252207616,3252211711,NL
-3252211712,3252212735,SE
-3252212736,3252214527,NO
-3252214528,3252214783,SE
-3252214784,3252217855,NO
-3252217856,3252223999,SE
+3252211712,3252214271,NO
+3252214272,3252214783,SE
+3252214784,3252220927,NO
+3252220928,3252223999,SE
3252224000,3252232320,NL
3252232321,3252233215,SE
-3252233216,3252247551,NO
-3252247552,3252248575,SE
+3252233216,3252248575,NO
3252248576,3252256767,NL
3252256768,3252277247,NO
3252277248,3252277759,SE
@@ -56281,10 +61338,13 @@
3252287488,3252289535,LT
3252289536,3252289791,BG
3252289792,3252291327,GR
-3252291328,3252291583,SK
3252291584,3252293631,FR
3252293632,3252297727,DE
-3252297728,3252313599,GR
+3252297984,3252298239,GR
+3252298752,3252308223,GR
+3252308224,3252308479,DE
+3252308480,3252310527,GR
+3252311040,3252313599,GR
3252313600,3252313855,SI
3252313856,3252314111,DE
3252314112,3252314623,GR
@@ -56299,7 +61359,7 @@
3252319744,3252319999,RU
3252320000,3252320255,GR
3252320256,3252320511,CZ
-3252320512,3252321791,GR
+3252320768,3252321791,GR
3252321792,3252322303,PL
3252322304,3252323327,NO
3252323328,3252324351,PL
@@ -56314,9 +61374,8 @@
3252337664,3252338687,RU
3252338688,3252340735,BE
3252340736,3252340991,TR
-3252340992,3252341247,GR
3252341248,3252341503,DE
-3252341504,3252342015,GR
+3252341504,3252341759,GR
3252342016,3252342079,GB
3252342080,3252342239,CY
3252342240,3252342271,CH
@@ -56343,7 +61402,6 @@
3252380160,3252380415,BE
3252380416,3252380671,UA
3252380672,3252380927,SI
-3252380928,3252381183,RU
3252381184,3252381439,IT
3252381440,3252381695,ES
3252381696,3252381951,RU
@@ -56404,7 +61462,6 @@
3252516096,3252516351,FR
3252516352,3252516607,GB
3252516608,3252516863,SE
-3252516864,3252517119,FR
3252517376,3252517631,PL
3252517888,3252518143,DK
3252518144,3252518399,NL
@@ -56412,7 +61469,6 @@
3252518656,3252518911,DE
3252518912,3252527103,NL
3252527104,3252535295,BE
-3252535296,3252539391,GB
3252540416,3252541951,NL
3252541952,3252542207,CI
3252542208,3252551679,BE
@@ -56496,11 +61552,9 @@
3252909824,3252910335,UA
3252910848,3252911103,PL
3252911104,3252911359,DE
-3252911360,3252911615,RU
3252911616,3252911871,SE
3252911872,3252912127,SA
3252912128,3252912383,EG
-3252912384,3252912639,HU
3252912640,3252912895,FR
3252912896,3252913151,PL
3252913152,3252913407,ES
@@ -56524,7 +61578,6 @@
3252938240,3252938751,UA
3252938752,3252939263,RU
3252939264,3252939775,DE
-3252939776,3252940287,RO
3252940288,3252940799,PT
3252940800,3252941311,RU
3252941312,3252941823,RO
@@ -56541,7 +61594,6 @@
3252981248,3252981503,RU
3252981504,3252981759,SE
3252981760,3252982015,DE
-3252982016,3252982271,RO
3252982272,3252982527,DE
3252982528,3252982783,FR
3252983040,3252983551,DE
@@ -56637,7 +61689,6 @@
3253607424,3253608447,NG
3253608448,3253610495,UA
3253610496,3253611519,PL
-3253611520,3253612543,UA
3253612544,3253613567,RU
3253613568,3253614591,ES
3253614592,3253615615,RO
@@ -56721,14 +61772,11 @@
3253701120,3253702143,RO
3253702144,3253702655,UA
3253702656,3253703167,PL
-3253703168,3253703679,RO
3253703680,3253704191,HU
-3253704192,3253704703,RU
3253704704,3253705215,UA
3253705728,3253706239,DE
3253706240,3253706751,RO
-3253707264,3253708287,DE
-3253708288,3253708799,RO
+3253706752,3253708799,DE
3253708800,3253709311,DK
3253709312,3253709823,UA
3253709824,3253710335,RO
@@ -56740,7 +61788,6 @@
3253713152,3253713407,DE
3253713408,3253713919,NL
3253713920,3253714431,AT
-3253714432,3253714943,RO
3253714944,3253715455,FR
3253715456,3253715967,RO
3253716480,3253716991,FR
@@ -56780,13 +61827,35 @@
3253738568,3253738575,BE
3253738576,3253741679,GB
3253741680,3253741695,RU
-3253741696,3253760511,GB
+3253741696,3253745151,GB
+3253745152,3253745279,NO
+3253745280,3253745983,GB
+3253745984,3253745999,SE
+3253746000,3253746007,DK
+3253746008,3253746015,IE
+3253746016,3253746023,AT
+3253746024,3253746031,CH
+3253746032,3253746039,FI
+3253746040,3253746047,GB
+3253746048,3253746111,IT
+3253746112,3253746175,DE
+3253746176,3253760511,GB
3253760512,3253760767,FR
3253760768,3253761407,GB
3253761408,3253761471,ES
-3253761472,3253762687,GB
-3253762688,3253762751,IT
-3253762752,3253796863,GB
+3253761472,3253762559,GB
+3253762560,3253762815,IT
+3253762816,3253762943,CH
+3253762944,3253763071,GB
+3253763072,3253763327,SE
+3253763328,3253765119,GB
+3253765120,3253765183,ES
+3253765184,3253765247,FR
+3253765248,3253765279,GB
+3253765280,3253765295,NL
+3253765296,3253765311,BE
+3253765312,3253765375,TR
+3253765376,3253796863,GB
3253796864,3253862399,SE
3253862400,3253862655,GB
3253862656,3253882879,FR
@@ -56804,7 +61873,6 @@
3253889536,3253889791,DE
3253889792,3253890047,DK
3253890048,3253890303,NL
-3253890304,3253890559,SE
3253890560,3253890815,GB
3253890816,3253891071,IE
3253891072,3253891327,DE
@@ -56869,14 +61937,12 @@
3253923840,3253927935,GR
3253927936,3253961727,GB
3253961728,3253962239,MD
-3253962240,3253962751,SE
3253962752,3253963263,BE
3253963264,3253963775,RU
3253963776,3253964287,SI
3253964288,3253964799,PL
3253964800,3253965311,SE
3253965312,3253966335,PL
-3253966336,3253966847,DE
3253966848,3253967359,UA
3253967360,3253967871,PL
3253967872,3253968895,UA
@@ -56894,15 +61960,9 @@
3253975040,3253977087,DE
3253977088,3253985279,TR
3253985280,3253993471,GB
-3253993472,3254067711,BE
-3254067712,3254067967,CZ
-3254067968,3254079743,BE
-3254079744,3254079999,HU
-3254080000,3254124543,BE
+3253993472,3254124543,BE
3254124544,3254255615,CH
-3254255616,3254255871,FR
-3254255872,3254256127,RE
-3254256128,3254263807,FR
+3254255616,3254263807,FR
3254263808,3254264063,GF
3254264064,3254488431,FR
3254488432,3254488447,MG
@@ -56924,7 +61984,7 @@
3254493376,3254493410,GP
3254493411,3254493695,FR
3254493696,3254493951,GP
-3254493952,3254494207,GF
+3254493952,3254494207,MQ
3254494208,3254494527,GP
3254494528,3254494975,FR
3254494976,3254494983,DJ
@@ -56939,15 +61999,16 @@
3254522112,3254607871,FR
3254607872,3254610175,RE
3254610176,3254610431,FR
-3254610432,3254610943,RE
-3254610944,3254611199,FR
-3254611200,3254611455,RE
+3254610432,3254610687,RE
+3254610688,3254611455,FR
3254611456,3254611456,YT
3254611457,3254611711,FR
3254611712,3254611712,YT
3254611713,3254611967,FR
-3254611968,3254613759,RE
-3254613760,3254614527,FR
+3254611968,3254612991,RE
+3254612992,3254613247,FR
+3254613248,3254614015,RE
+3254614016,3254614527,FR
3254614528,3254615039,RE
3254615040,3254615551,FR
3254615552,3254615552,YT
@@ -56960,8 +62021,7 @@
3254650880,3254653439,CH
3254653440,3254654847,DE
3254654848,3254654975,DK
-3254654976,3254655743,IT
-3254655744,3254656255,GB
+3254654976,3254655999,IT
3254656256,3254656511,BG
3254656512,3254656767,DE
3254656768,3254657023,GB
@@ -56972,7 +62032,6 @@
3254699008,3254699519,UA
3254700032,3254700543,GR
3254700544,3254701055,DE
-3254701056,3254701567,RU
3254701568,3254702079,IL
3254702080,3254702591,RU
3254702592,3254703103,GB
@@ -57044,7 +62103,6 @@
3254804480,3254806527,PL
3254807552,3254808575,KZ
3254808576,3254809599,RU
-3254809600,3254810623,UA
3254810624,3254811647,RU
3254811648,3254812671,RO
3254812672,3254812927,PL
@@ -57093,12 +62151,11 @@
3254825216,3254825471,RO
3254825472,3254825727,TR
3254825728,3254825983,FR
-3254825984,3254826239,DE
3254826240,3254826495,PL
3254826496,3254827263,DE
3254827264,3254827519,GR
3254827776,3254828031,UA
-3254828288,3254828799,RO
+3254828544,3254828799,RO
3254828800,3254829055,SI
3254829056,3254829311,NO
3254829312,3254829567,GB
@@ -57129,7 +62186,6 @@
3254835968,3254836223,RU
3254836224,3254836479,PL
3254836736,3254836991,AT
-3254836992,3254837247,GB
3254837248,3254837503,HR
3254837504,3254837759,RU
3254837760,3254838015,IE
@@ -57146,7 +62202,6 @@
3254841344,3254841599,PL
3254841600,3254841855,IE
3254841856,3254842111,LV
-3254842368,3254842623,PL
3254842624,3254842879,RU
3254842880,3254843135,SE
3254843136,3254843391,DE
@@ -57188,7 +62243,7 @@
3254892032,3254892287,GB
3254892288,3254892543,BE
3254892544,3254892799,RU
-3254892800,3254893567,SK
+3254892800,3254893055,SK
3254893568,3254894079,CZ
3254894080,3254894335,CH
3254894336,3254894591,SK
@@ -57215,7 +62270,6 @@
3254899968,3254900479,RU
3254900480,3254900991,SK
3254900992,3254901247,PL
-3254901248,3254901503,SK
3254901504,3254901759,DK
3254901760,3254902271,UA
3254902272,3254904831,SK
@@ -57227,13 +62281,20 @@
3254908928,3254909951,RU
3254909952,3254910719,PL
3254910720,3254910975,HR
-3254910976,3255120639,FR
+3254910976,3255044095,FR
+3255044608,3255056383,FR
+3255058432,3255117823,FR
+3255118336,3255120639,FR
3255120640,3255120895,DE
3255120896,3255123711,FR
3255123712,3255123967,DE
-3255123968,3255129855,FR
+3255123968,3255127551,FR
+3255127808,3255128575,FR
3255129856,3255130111,HR
-3255130112,3255172351,FR
+3255130112,3255146495,FR
+3255148544,3255153151,FR
+3255153664,3255166975,FR
+3255167488,3255172351,FR
3255172352,3255172607,DE
3255172608,3255173119,FR
3255173120,3255173631,SH
@@ -57293,7 +62354,6 @@
3255231744,3255231999,PT
3255232000,3255232255,RO
3255232256,3255233023,UA
-3255233024,3255233279,DE
3255233280,3255233535,GB
3255233536,3255233791,SE
3255233792,3255234047,SI
@@ -57305,13 +62365,10 @@
3255235328,3255235583,SE
3255235584,3255235839,GB
3255235840,3255236351,PL
-3255236352,3255236607,IT
3255236608,3255236863,GB
3255236864,3255237119,DE
3255237120,3255237375,AT
-3255237632,3255237887,SE
3255237888,3255238143,ES
-3255238144,3255238399,GB
3255238400,3255238655,QA
3255238656,3255292311,BE
3255292312,3255292319,LU
@@ -57377,7 +62434,6 @@
3255370240,3255370751,RU
3255370752,3255371263,DE
3255371264,3255371775,BG
-3255371776,3255372287,SE
3255372288,3255372799,DE
3255372800,3255373311,MC
3255373312,3255373823,UA
@@ -57411,7 +62467,6 @@
3255388672,3255389183,SE
3255389184,3255389695,GB
3255389696,3255390207,PL
-3255390208,3255390719,GB
3255390720,3255391231,KE
3255391232,3255391743,NL
3255391744,3255392767,DE
@@ -57424,9 +62479,7 @@
3255412736,3255413247,DE
3255413248,3255413503,LV
3255413504,3255413759,UZ
-3255414272,3255414527,TR
3255414528,3255414783,LV
-3255414784,3255415807,BE
3255415808,3255416319,AT
3255416320,3255416831,DE
3255417856,3255418879,GB
@@ -57467,7 +62520,6 @@
3255565312,3255565955,DE
3255565956,3255565956,CH
3255565957,3255566079,DE
-3255566080,3255566335,CH
3255566336,3255570431,GB
3255570432,3255574527,CH
3255574528,3255578623,CZ
@@ -57493,7 +62545,8 @@
3255743488,3255743743,DE
3255743744,3255743999,US
3255744000,3255762943,SE
-3255762944,3255791615,DE
+3255762944,3255771135,DE
+3255779328,3255791615,DE
3255791616,3255792639,UA
3255792640,3255793663,RU
3255793664,3255794943,PL
@@ -57502,13 +62555,12 @@
3255799040,3255799295,SE
3255799296,3255800575,DE
3255800576,3255800831,UA
-3255800832,3255817215,DE
+3255800832,3255801855,DE
+3255802368,3255817215,DE
3255817216,3255817471,SE
3255817472,3255817727,ES
-3255817728,3255821311,DE
-3255821312,3255821823,CH
-3255821824,3255822079,DE
-3255822080,3255822335,CH
+3255817728,3255820287,DE
+3255821312,3255822335,CH
3255822336,3255828479,DE
3255828480,3256025087,SE
3256025088,3256057855,NO
@@ -57531,7 +62583,7 @@
3256396288,3256396799,GR
3256396800,3256397311,DE
3256397312,3256397823,PL
-3256397824,3256398847,RO
+3256398336,3256398847,RO
3256398848,3256399359,PL
3256399360,3256400895,UA
3256400896,3256401407,GB
@@ -57541,7 +62593,6 @@
3256410624,3256411135,GR
3256411136,3256411647,FR
3256411648,3256412159,DE
-3256412160,3256412671,GB
3256412672,3256413183,RO
3256413184,3256413695,UA
3256413696,3256414207,PL
@@ -57557,12 +62608,9 @@
3256483840,3256489471,NL
3256489472,3256489983,GR
3256489984,3256490239,BE
-3256490240,3256490495,DE
3256490496,3256490751,CH
3256490752,3256513023,NL
-3256513280,3256513791,NL
-3256513792,3256514047,GB
-3256514048,3256524287,NL
+3256513280,3256524287,NL
3256524288,3256524799,DE
3256524800,3256528895,NL
3256530688,3256530943,DE
@@ -57622,12 +62670,12 @@
3256680448,3256688639,CH
3256688640,3256692735,IL
3256692736,3256693759,GR
-3256693760,3256694783,IT
3256694784,3256695807,DE
3256695808,3256696831,UA
3256699392,3256699647,GB
3256705024,3256705279,IE
3256705536,3256705791,BE
+3256710656,3256710911,SE
3256713216,3256727551,PL
3256727552,3256727807,DE
3256727808,3256728063,HU
@@ -57658,7 +62706,6 @@
3256790016,3256790271,UA
3256790272,3256790783,DE
3256790784,3256791039,NL
-3256791296,3256791551,RO
3256791552,3256791807,GR
3256791808,3256792063,PL
3256792064,3256792319,DE
@@ -57694,7 +62741,9 @@
3256864512,3256864767,CH
3256864768,3256870911,DE
3256870912,3256871167,RU
-3256871168,3256875007,DE
+3256871168,3256871935,DE
+3256872448,3256874239,DE
+3256874496,3256875007,DE
3256875008,3256875519,UA
3256875520,3256876031,RU
3256876032,3256876287,PL
@@ -57758,11 +62807,12 @@
3257011456,3257024511,GB
3257024512,3257032703,AU
3257032704,3257051135,GB
-3257051648,3257058815,GB
+3257051648,3257057279,GB
3257058816,3257059071,PL
3257059072,3257092607,GB
3257092608,3257092863,RO
-3257092864,3257139199,GB
+3257092864,3257121535,GB
+3257121792,3257139199,GB
3257139200,3257139455,DK
3257139456,3257143295,GB
3257143296,3257143807,RU
@@ -57771,8 +62821,11 @@
3257144320,3257144575,DE
3257144576,3257144831,GB
3257144832,3257145087,FR
-3257145088,3257169919,GB
-3257170176,3257180159,GB
+3257145088,3257146367,GB
+3257147392,3257163775,GB
+3257167872,3257169919,GB
+3257170176,3257176063,GB
+3257178112,3257180159,GB
3257180160,3257180415,TR
3257180416,3257180671,RU
3257180672,3257180927,EE
@@ -57782,10 +62835,13 @@
3257181696,3257181951,FR
3257181952,3257182207,BG
3257182208,3257182463,PL
-3257182464,3257196543,GB
+3257182464,3257186303,GB
+3257188352,3257196543,GB
3257196544,3257200639,LU
3257200640,3257204735,GB
-3257204736,3257268223,AT
+3257204736,3257225215,AT
+3257226240,3257227263,AT
+3257229312,3257268223,AT
3257268224,3257268479,UA
3257268480,3257268735,SE
3257268736,3257269247,AT
@@ -57796,13 +62852,17 @@
3257294848,3257303039,HU
3257303040,3257311231,PT
3257311232,3257335807,CH
-3257335808,3257357311,DE
+3257335808,3257355775,DE
+3257356288,3257357311,DE
3257357312,3257357567,PT
3257357568,3257357823,SI
3257357824,3257371903,DE
3257371904,3257372159,BE
-3257372160,3257372671,GB
-3257372672,3257388799,DE
+3257372416,3257372671,GB
+3257372672,3257382911,DE
+3257382912,3257383167,NL
+3257383168,3257383679,DE
+3257383936,3257388799,DE
3257388800,3257389055,FR
3257389056,3257390079,DE
3257390592,3257401343,DE
@@ -57826,9 +62886,7 @@
3257475584,3257477119,DE
3257477120,3257477375,NL
3257477376,3257477887,SE
-3257477888,3257480447,GB
-3257480960,3257481215,SE
-3257481216,3257481471,GB
+3257479168,3257481471,GB
3257481472,3257481727,DE
3257481728,3257481983,FI
3257481984,3257482239,FR
@@ -57855,10 +62913,10 @@
3257546720,3257546751,DK
3257546752,3257548799,IE
3257548800,3257554943,GB
-3257554944,3257555199,CH
-3257555200,3257556991,GB
+3257554944,3257555455,CH
+3257555456,3257556991,GB
3257557504,3257558015,LU
-3257558016,3257559551,RO
+3257558016,3257559039,RO
3257559552,3257560063,UA
3257560064,3257560575,DE
3257560576,3257561087,PL
@@ -57898,8 +62956,8 @@
3257767936,3257782271,NL
3257782272,3257784319,DE
3257784320,3257794559,NL
-3257794560,3257827327,GB
-3257827328,3257843711,IE
+3257794560,3257835519,GB
+3257835520,3257843711,IE
3257843712,3257844735,GB
3257844736,3257860095,IE
3257860096,3257925631,SE
@@ -57924,25 +62982,25 @@
3257981696,3257981951,PL
3257981952,3257987327,AT
3257987328,3257987583,CZ
-3257987584,3257991167,AT
+3257987584,3257988095,AT
+3257989120,3257991167,AT
3257991168,3257995519,DE
3257995776,3258003967,DE
3258003968,3258004479,RU
-3258004480,3258021887,DE
+3258004480,3258018815,DE
+3258019328,3258021887,DE
3258021888,3258022911,RU
3258022912,3258023167,PL
3258023168,3258023423,DE
3258023424,3258023679,TR
3258023680,3258023935,RU
3258023936,3258056703,DE
-3258056704,3258056959,UA
-3258056960,3258058239,CZ
+3258057216,3258057727,CZ
3258058240,3258058495,RU
3258058496,3258059007,RO
3258059008,3258059263,UA
3258059264,3258059519,RU
3258059520,3258059775,RO
-3258059776,3258062847,CZ
3258062848,3258063103,RU
3258063104,3258063871,CZ
3258063872,3258064127,AT
@@ -57963,7 +63021,6 @@
3258069248,3258069503,PL
3258069504,3258069759,RO
3258069760,3258070015,UA
-3258070016,3258070271,GB
3258070272,3258070527,PL
3258070528,3258071295,GB
3258071296,3258071551,DK
@@ -57977,7 +63034,6 @@
3258074112,3258074879,DE
3258074880,3258075135,IL
3258075136,3258075391,RO
-3258075648,3258075903,FR
3258075904,3258076159,PL
3258076160,3258076415,BG
3258076416,3258076927,FR
@@ -57993,7 +63049,6 @@
3258079488,3258079743,PL
3258079744,3258079999,GB
3258080000,3258080255,BE
-3258080256,3258080511,FR
3258080512,3258080767,DE
3258081024,3258081279,FR
3258081280,3258081535,NL
@@ -58048,7 +63103,6 @@
3258099456,3258099711,UA
3258099712,3258099967,FI
3258099968,3258100223,UA
-3258100480,3258100735,DK
3258100736,3258100991,CH
3258100992,3258101247,AT
3258101248,3258101503,RO
@@ -58064,7 +63118,7 @@
3258104064,3258104319,GB
3258104320,3258104575,PL
3258104576,3258104831,DE
-3258104832,3258105599,CZ
+3258105088,3258105599,CZ
3258105600,3258105855,DE
3258105856,3258109951,CZ
3258109952,3258110207,DK
@@ -58072,9 +63126,9 @@
3258111488,3258111743,PL
3258111744,3258118399,CZ
3258118400,3258118655,UA
-3258118656,3258121215,CZ
+3258118656,3258119679,CZ
+3258120192,3258121215,CZ
3258121216,3258121471,PL
-3258121472,3258121727,AT
3258121728,3258121983,UA
3258121984,3258122239,RU
3258122240,3258187775,FR
@@ -58085,7 +63139,9 @@
3258253312,3258272767,NL
3258272768,3258273791,FR
3258273792,3258279935,NL
-3258281984,3258297343,NL
+3258281984,3258284031,NL
+3258284288,3258290175,NL
+3258294272,3258297343,NL
3258297344,3258297599,BE
3258297600,3258298111,NL
3258298112,3258298367,GB
@@ -58119,9 +63175,11 @@
3258365952,3258366975,UA
3258366976,3258367999,PL
3258368000,3258384383,KW
-3258384384,3258427647,DE
+3258384384,3258411007,DE
+3258411520,3258427647,DE
3258427648,3258427903,RO
-3258427904,3258449919,DE
+3258427904,3258428159,DE
+3258428416,3258449919,DE
3258449920,3258503935,CH
3258503936,3258504191,PL
3258504192,3258504703,CH
@@ -58133,7 +63191,6 @@
3258515456,3258580991,FR
3258580992,3258646527,RU
3258646528,3258691583,DE
-3258691584,3258691839,RU
3258691840,3258692351,AT
3258692352,3258692607,DE
3258692608,3258692863,FR
@@ -58143,7 +63200,6 @@
3258693632,3258693887,RU
3258693888,3258694143,SI
3258694144,3258694399,RU
-3258694400,3258694655,DE
3258694656,3258694911,GB
3258694912,3258712063,DE
3258712064,3258728447,GB
@@ -58163,7 +63219,10 @@
3258732544,3258732799,SE
3258732800,3258733055,CH
3258733056,3258733311,RO
-3258733312,3258764287,GB
+3258733312,3258734591,GB
+3258735104,3258735359,GB
+3258736640,3258762751,GB
+3258763264,3258764287,GB
3258764288,3258764543,DE
3258764800,3258765055,BE
3258765056,3258765311,NL
@@ -58197,14 +63256,16 @@
3258806272,3258813439,GB
3258814464,3258818047,GB
3258818048,3258818303,SE
-3258818304,3258843135,GB
+3258818560,3258843135,GB
3258843136,3258843391,RU
-3258843392,3258848767,GB
+3258843392,3258847231,GB
+3258848256,3258848767,GB
3258848768,3258849023,RO
3258849024,3258849279,DE
3258849280,3258859519,GB
3258859520,3258859775,BY
-3258859776,3258902783,GB
+3258859776,3258900479,GB
+3258901504,3258902783,GB
3258903040,3258903295,FR
3258903296,3258903551,GB
3258903552,3258903807,DE
@@ -58227,7 +63288,9 @@
3259226112,3259227391,RU
3259227392,3259227647,KZ
3259227648,3259236351,RU
-3259236352,3259237887,SE
+3259236352,3259236863,SE
+3259236864,3259237119,CH
+3259237120,3259237887,SE
3259237888,3259238143,FR
3259238144,3259243007,SE
3259243008,3259243519,AT
@@ -58275,8 +63338,6 @@
3259351552,3259352063,FR
3259352064,3259352575,CH
3259352576,3259353087,IE
-3259353088,3259353855,NO
-3259353856,3259354111,GB
3259354112,3259354367,NL
3259354368,3259354623,DE
3259354880,3259355135,PL
@@ -58287,7 +63348,9 @@
3259435264,3259435519,IT
3259435520,3259438079,SE
3259438080,3259438335,ES
-3259438336,3259470847,SE
+3259438336,3259457279,SE
+3259457280,3259457535,IT
+3259457536,3259470847,SE
3259470848,3259471871,US
3259471872,3259479807,SE
3259479808,3259480063,DK
@@ -58301,13 +63364,15 @@
3259543552,3259760639,GB
3259760640,3259814399,DE
3259814400,3259814655,AT
-3259814656,3259821823,DE
+3259814656,3259816447,DE
+3259816704,3259821823,DE
3259821824,3259822079,AT
3259822080,3259823103,DE
3259823104,3259823615,RO
3259823616,3259823871,NO
3259823872,3259824127,IE
-3259824128,3259891711,DE
+3259824128,3259825919,DE
+3259826176,3259891711,DE
3259891712,3259957247,BE
3259957248,3259958271,DE
3259958272,3259959295,RU
@@ -58318,7 +63383,6 @@
3259963392,3259964415,PL
3259964416,3259965439,GB
3259965440,3259966463,RU
-3259966464,3259967487,DE
3259967488,3259968511,RS
3259968512,3259969535,RU
3259970560,3259971583,CZ
@@ -58347,11 +63411,9 @@
3260547840,3260548095,PL
3260548096,3260548351,IE
3260548352,3260548607,DK
-3260548864,3260549119,CH
3260549120,3260549375,AT
3260549376,3260549631,CH
3260549632,3260549887,DE
-3260549888,3260550143,RU
3260550144,3260550399,PL
3260550400,3260550655,DE
3260550656,3260551167,RU
@@ -58434,9 +63496,7 @@
3261267968,3261297663,DE
3261297664,3261297919,RU
3261297920,3261298175,PL
-3261298176,3261323263,DE
-3261323264,3261323519,RU
-3261323520,3261333503,DE
+3261298176,3261333503,DE
3261333504,3261399039,FI
3261399040,3261472767,GB
3261472768,3261530111,RO
@@ -58449,24 +63509,24 @@
3261534976,3261539327,SE
3261539328,3261540351,SG
3261540352,3261595647,SE
-3261595648,3261636095,NL
-3261636352,3261661183,NL
+3261595648,3261599743,NL
+3261600768,3261627903,NL
+3261628160,3261632511,NL
+3261633536,3261636095,NL
+3261636352,3261643775,NL
+3261644800,3261661183,NL
3261661184,3261669375,RO
3261669376,3261673471,MT
3261673472,3261675519,IT
3261675520,3261675775,LV
3261675776,3261676031,IT
-3261676032,3261676287,GB
3261676800,3261677055,IT
3261677056,3261685759,GB
3261685760,3261687807,DE
3261687808,3261689855,RO
-3261689856,3261690352,GB
-3261690353,3261690354,SG
-3261690355,3261690623,GB
+3261689856,3261690623,GB
3261690624,3261690879,AU
-3261690880,3261691647,GB
-3261691648,3261691903,US
+3261690880,3261691903,GB
3261691904,3261692997,NL
3261692998,3261692998,US
3261692999,3261694463,NL
@@ -58508,7 +63568,9 @@
3261781504,3261782015,PL
3261782016,3261783039,UA
3261783040,3261784063,GB
-3261784064,3261796351,AT
+3261784064,3261787647,AT
+3261787648,3261788159,FR
+3261788160,3261796351,AT
3261796352,3261796607,GB
3261796608,3261796863,RU
3261796864,3261797119,PL
@@ -58537,7 +63599,8 @@
3261824000,3261824255,RU
3261824512,3261824767,FR
3261824768,3261825023,PT
-3261825024,3261857791,AT
+3261825024,3261837311,AT
+3261839360,3261855743,AT
3261857792,3261923327,CZ
3261923328,3261988863,NL
3261988864,3261989119,SE
@@ -58548,9 +63611,7 @@
3261993728,3261995263,FI
3261995264,3261995519,DE
3261995520,3261995775,PL
-3261995776,3261996031,FI
-3261996032,3261996287,NL
-3261996288,3262005247,FI
+3261995776,3262005247,FI
3262005248,3262005759,PL
3262005760,3262006015,RU
3262006016,3262006271,NL
@@ -58564,20 +63625,20 @@
3262008576,3262008831,PL
3262008832,3262009087,AT
3262009088,3262009343,UA
-3262009344,3262013439,FI
+3262009344,3262013183,FI
3262013440,3262017535,SE
3262017536,3262018559,FI
3262018560,3262018815,PL
-3262018816,3262021119,FI
+3262018816,3262019071,FI
+3262019328,3262021119,FI
3262021120,3262021375,UA
3262021376,3262021631,PL
3262021632,3262021887,CH
3262021888,3262022143,UA
3262022144,3262022911,FI
3262022912,3262023167,DE
-3262023168,3262023679,FI
3262023680,3262023935,DK
-3262023936,3262027263,FI
+3262023936,3262026239,FI
3262027264,3262027519,TR
3262027520,3262027775,BE
3262027776,3262028287,RU
@@ -58624,7 +63685,6 @@
3262050816,3262051071,CH
3262051072,3262051583,GB
3262051584,3262051839,FR
-3262052096,3262052351,DE
3262052352,3262052607,UA
3262052608,3262052863,IL
3262052864,3262053119,GB
@@ -58633,7 +63693,9 @@
3262053632,3262053887,RU
3262054144,3262054399,RU
3262054400,3262119935,FI
-3262119936,3262124031,AX
+3262119936,3262122175,AX
+3262122176,3262122183,SE
+3262122184,3262124031,AX
3262124032,3262128127,DE
3262128128,3262136319,GB
3262137600,3262137855,DE
@@ -58665,11 +63727,17 @@
3262151936,3262152191,DE
3262152664,3262152671,DE
3262152704,3262185471,AT
-3262185472,3262224383,DE
+3262185472,3262191615,DE
+3262192128,3262192383,DE
+3262192640,3262196479,DE
+3262196736,3262203903,DE
+3262204928,3262224383,DE
3262224896,3262225151,AT
3262225152,3262227711,DE
3262227712,3262227967,RO
-3262227968,3262283775,DE
+3262227968,3262229247,DE
+3262229248,3262229503,NL
+3262229504,3262283775,DE
3262283776,3262284799,RU
3262284800,3262286847,UA
3262286848,3262287871,SE
@@ -58690,7 +63758,6 @@
3262419968,3262420479,FR
3262420480,3262420991,CH
3262420992,3262421503,ES
-3262421504,3262422015,DE
3262422016,3262422527,SE
3262422528,3262423039,AT
3262423040,3262423551,GB
@@ -58719,7 +63786,6 @@
3262434816,3262435839,DE
3262435840,3262436351,CH
3262436352,3262436863,SE
-3262436864,3262437375,GB
3262437888,3262438399,FR
3262438400,3262438911,NL
3262438912,3262439423,DK
@@ -58866,7 +63932,7 @@
3262505984,3262506495,PL
3262506496,3262507007,RO
3262507008,3262507519,DK
-3262507520,3262509055,RO
+3262507520,3262508543,RO
3262509056,3262509567,PL
3262509568,3262510079,RO
3262510080,3262511103,FR
@@ -58880,15 +63946,15 @@
3262636032,3262644223,BE
3262644224,3262648319,NL
3262648320,3262648575,DE
-3262648576,3262664703,NL
+3262648576,3262654463,NL
+3262654464,3262654719,DE
+3262654720,3262664703,NL
3262664704,3262670847,DE
3262670848,3262690815,NL
3262690816,3262691583,DE
3262691584,3262693375,NL
3262693376,3262701567,DE
-3262701568,3262712575,NL
-3262712576,3262712831,DE
-3262712832,3262715135,NL
+3262701568,3262715135,NL
3262715136,3262715391,DE
3262715392,3262722815,NL
3262722816,3262723071,DE
@@ -58904,7 +63970,6 @@
3262965248,3262971903,CH
3262971904,3263029247,IE
3263029248,3263030271,UA
-3263030272,3263031295,GB
3263031296,3263032319,TR
3263032320,3263033343,RU
3263033344,3263033855,LV
@@ -58920,7 +63985,6 @@
3263070208,3263070719,FR
3263070720,3263070975,NL
3263070976,3263071487,DE
-3263071488,3263072255,NL
3263072256,3263074303,LB
3263074304,3263074815,CH
3263074816,3263075327,RO
@@ -58941,7 +64005,6 @@
3263088128,3263088383,DE
3263088384,3263088639,LV
3263088640,3263089151,CH
-3263089152,3263089407,RO
3263089408,3263089663,RU
3263089664,3263089919,UA
3263089920,3263090175,RO
@@ -58969,7 +64032,6 @@
3263096320,3263096575,TR
3263096576,3263096831,SA
3263096832,3263097087,PL
-3263097088,3263097343,FR
3263097344,3263097599,DK
3263097600,3263097855,NL
3263097856,3263098111,FR
@@ -58980,7 +64042,6 @@
3263099136,3263099391,NL
3263099392,3263099903,DE
3263099904,3263100159,RO
-3263100160,3263100415,FR
3263100416,3263100671,DE
3263100672,3263100927,GB
3263100928,3263101183,AT
@@ -58991,9 +64052,14 @@
3263102208,3263102463,RO
3263102464,3263102719,PL
3263102720,3263102975,GR
-3263102976,3263121420,DE
+3263102976,3263104030,DE
+3263104031,3263104031,FR
+3263104032,3263104040,DE
+3263104041,3263104041,GB
+3263104042,3263121420,DE
3263121421,3263121421,BE
-3263121422,3263137791,DE
+3263121422,3263131647,DE
+3263132672,3263137791,DE
3263137792,3263138303,PL
3263138304,3263138551,DE
3263138552,3263138815,AT
@@ -59034,7 +64100,13 @@
3263526144,3263545343,DE
3263545344,3263561727,US
3263561728,3263627263,NL
-3263627264,3263692799,RU
+3263627264,3263647743,RU
+3263647744,3263651839,LT
+3263651840,3263666175,RU
+3263666176,3263676415,AZ
+3263676416,3263678463,RU
+3263678464,3263680511,DE
+3263680512,3263692799,RU
3263692800,3263823871,FI
3263823872,3263826943,DE
3263826944,3263827199,AT
@@ -59047,9 +64119,7 @@
3263979520,3263987711,DE
3263987712,3264004095,ES
3264004096,3264012287,HU
-3264012288,3264012543,AT
-3264012544,3264012799,FR
-3264012800,3264013055,GB
+3264012544,3264013055,GB
3264013056,3264013311,TR
3264013312,3264013567,UA
3264013824,3264014079,NL
@@ -59115,7 +64185,6 @@
3264314624,3264314879,SE
3264314880,3264315135,GB
3264315392,3264317439,IE
-3264317440,3264318463,SK
3264318464,3264318975,ES
3264318976,3264319487,DE
3264319488,3264319743,FR
@@ -59147,7 +64216,6 @@
3264334848,3264335359,PL
3264335360,3264335871,SK
3264335872,3264336383,GB
-3264336896,3264337407,RU
3264337408,3264338431,UA
3264338432,3264338943,DE
3264338944,3264339455,UA
@@ -59169,7 +64237,8 @@
3264345088,3264346111,NL
3264346112,3264347135,SE
3264347136,3264348159,DE
-3264348672,3264372223,FR
+3264348672,3264358143,FR
+3264358400,3264372223,FR
3264372736,3264375039,FR
3264375040,3264376063,SE
3264376064,3264376319,HR
@@ -59177,8 +64246,7 @@
3264376576,3264376831,CH
3264376832,3264377087,UA
3264377088,3264377343,RU
-3264377344,3264377599,IT
-3264377600,3264378111,RU
+3264377600,3264377855,RU
3264378112,3264378367,SE
3264378368,3264378623,DE
3264378624,3264378879,RU
@@ -59186,7 +64254,6 @@
3264379136,3264379391,BE
3264379392,3264379647,RU
3264379648,3264379903,PL
-3264379904,3264380159,DE
3264380160,3264380415,RO
3264380672,3264380927,NL
3264380928,3264381951,PL
@@ -59194,16 +64261,13 @@
3264385024,3264386047,DE
3264386048,3264387071,IR
3264387072,3264388095,LB
-3264388096,3264389119,UA
3264389120,3264390143,RU
-3264390144,3264391167,IR
3264391168,3264392191,SE
3264392192,3264393215,FR
3264393216,3264394239,DE
3264394240,3264395263,UA
3264395264,3264396287,AT
3264396288,3264397311,UA
-3264397312,3264398335,GB
3264398336,3264399359,UA
3264399360,3264400383,RU
3264401408,3264402431,DE
@@ -59216,18 +64280,19 @@
3264409600,3264410623,RU
3264410624,3264411647,NO
3264411648,3264413695,PL
-3264413696,3264431103,CH
+3264417536,3264431103,CH
3264431104,3264431615,LI
3264431616,3264431871,CH
3264432128,3264441343,CH
3264441344,3264441599,PL
-3264441600,3264444927,CH
+3264442112,3264444927,CH
3264444928,3264445183,DE
-3264445184,3264446207,CH
-3264446208,3264446463,FR
-3264446464,3264447743,CH
+3264445184,3264445439,CH
+3264447488,3264447743,CH
3264447744,3264447999,DE
-3264448000,3264463871,CH
+3264448000,3264452607,CH
+3264454656,3264456191,CH
+3264456704,3264463871,CH
3264463872,3264466943,LI
3264466944,3264476671,CH
3264476672,3264477183,RU
@@ -59260,9 +64325,7 @@
3264606976,3264607231,BE
3264607232,3264607487,IT
3264607488,3264610303,DE
-3264610304,3264612351,GB
-3264612352,3264612607,FR
-3264612608,3264614911,GB
+3264610304,3264614911,GB
3264614912,3264615167,SE
3264615168,3264617983,GB
3264617984,3264618239,US
@@ -59282,7 +64345,7 @@
3264637952,3264639999,DK
3264640000,3264641023,BG
3264641024,3264642047,GB
-3264642048,3264651263,RU
+3264643072,3264651263,RU
3264651264,3264651775,CH
3264651776,3264652287,IT
3264652288,3264652799,RU
@@ -59308,7 +64371,6 @@
3264663552,3264664063,NL
3264664064,3264664575,DE
3264664576,3264665087,NO
-3264665088,3264665599,SE
3264665600,3264666111,RO
3264666112,3264666623,IL
3264666624,3264667135,UA
@@ -59317,7 +64379,6 @@
3264668160,3264669183,DE
3264669184,3264669695,PL
3264669696,3264670207,UA
-3264670208,3264670719,RU
3264670720,3264671231,FR
3264671232,3264671743,PL
3264671744,3264672255,DE
@@ -59400,7 +64461,6 @@
3264844800,3264845311,UA
3264845312,3264845951,DE
3264845952,3264846079,GB
-3264846080,3264846207,UG
3264846208,3264846335,AE
3264846336,3264846463,GB
3264846464,3264846591,NO
@@ -59420,7 +64480,6 @@
3264847808,3264847871,SE
3264847872,3264849919,DE
3264849920,3264850431,GB
-3264850432,3264850687,PL
3264850688,3264850943,LV
3264850944,3264851967,IT
3264851968,3264854015,CH
@@ -59445,13 +64504,13 @@
3264921600,3264929791,LU
3264929792,3264937983,SK
3264937984,3265003519,GB
-3265003520,3265014804,DE
-3265014805,3265014805,PL
-3265014806,3265018879,DE
+3265003520,3265018879,DE
3265018880,3265019903,HK
-3265019904,3265045759,DE
+3265019904,3265043199,DE
+3265043456,3265045759,DE
3265045760,3265046015,TR
-3265046016,3265055231,DE
+3265046016,3265049087,DE
+3265049600,3265055231,DE
3265055232,3265055743,FR
3265055744,3265069055,DE
3265069056,3265134591,FI
@@ -59466,8 +64525,10 @@
3265141248,3265141551,CH
3265141552,3265141555,IE
3265141556,3265141759,CH
-3265141760,3265142015,GB
-3265142016,3265142783,CH
+3265141760,3265141775,GB
+3265141776,3265141791,CH
+3265141792,3265141887,GB
+3265141888,3265142783,CH
3265142784,3265150975,MT
3265150976,3265159167,AD
3265159168,3265167359,FR
@@ -59532,7 +64593,7 @@
3265606656,3265606911,AT
3265606912,3265607167,RU
3265607168,3265607423,PL
-3265607424,3265607935,DK
+3265607424,3265607679,DK
3265607936,3265608191,CZ
3265608448,3265608703,SE
3265608704,3265608959,GB
@@ -59548,12 +64609,12 @@
3265724416,3265789951,FR
3265789952,3265824767,GB
3265824768,3265825023,US
-3265825024,3265887487,GB
+3265825024,3265879039,GB
+3265880064,3265887487,GB
3265887488,3265887743,PT
3265887744,3265888255,PL
3265888256,3265902335,GB
3265902336,3265902591,FR
-3265902592,3265904383,GB
3265904384,3265904639,RO
3265904640,3265904895,DE
3265905152,3265905663,GB
@@ -59571,7 +64632,6 @@
3265909248,3265909503,UA
3265909504,3265909759,DE
3265909760,3265910015,RO
-3265910016,3265910271,PL
3265910272,3265910527,FR
3265910528,3265910783,PT
3265910784,3265911295,DE
@@ -59584,7 +64644,6 @@
3265912832,3265913087,CZ
3265913088,3265913343,SE
3265913344,3265914367,PL
-3265914368,3265914623,RU
3265914624,3265914879,BG
3265914880,3265915135,GR
3265915136,3265915391,RO
@@ -59613,14 +64672,12 @@
3266330624,3266338815,GB
3266338816,3266339071,RU
3266339072,3266339327,UA
-3266339328,3266339583,ES
3266339840,3266340095,RU
3266340096,3266340607,PL
3266340608,3266340863,FI
3266340864,3266341119,CH
3266341120,3266341375,GB
3266341376,3266341631,DE
-3266341632,3266341887,GB
3266341888,3266342143,KW
3266342144,3266342399,CH
3266342400,3266342655,BE
@@ -59632,8 +64689,7 @@
3266343936,3266344191,CH
3266344448,3266344703,RU
3266344704,3266344959,ES
-3266344960,3266345727,DE
-3266345728,3266345983,DK
+3266344960,3266345983,DE
3266345984,3266346495,GB
3266346496,3266346751,IT
3266346752,3266347007,FR
@@ -59672,9 +64728,11 @@
3266473216,3266510847,NL
3266510848,3266543615,ES
3266543616,3266576383,IT
-3266576384,3266617327,DE
+3266576384,3266582783,DE
+3266583040,3266603519,DE
+3266604032,3266617327,DE
3266617328,3266617343,GB
-3266617344,3266634391,DE
+3266617344,3266634383,DE
3266634392,3266634399,EE
3266634400,3266641919,DE
3266641920,3266707455,PL
@@ -59755,11 +64813,7 @@
3267166208,3267231743,GB
3267231744,3267297279,RU
3267297280,3267362815,CH
-3267362816,3267368447,DK
-3267368448,3267368480,SE
-3267368481,3267368481,DK
-3267368482,3267368703,SE
-3267368704,3267428351,DK
+3267362816,3267428351,DK
3267428352,3267493887,GB
3267501056,3267504127,GB
3267511296,3267512319,FR
@@ -59783,10 +64837,7 @@
3267648320,3267648335,GB
3267650320,3267650335,AT
3267660608,3267660671,ES
-3267662848,3267663103,GB
-3267665920,3267666287,GB
-3267666288,3267666295,GR
-3267666296,3267666943,GB
+3267665920,3267666943,GB
3267667456,3267667967,GB
3267670016,3267671039,ZA
3267674208,3267674239,GB
@@ -59802,9 +64853,7 @@
3267845632,3267846655,FR
3267846656,3267846911,MQ
3267846912,3267887103,FR
-3267887104,3268115711,GB
-3268115712,3268115967,DE
-3268115968,3268149247,GB
+3267887104,3268149247,GB
3268149248,3268165631,EE
3268165632,3268173823,CH
3268173824,3268182015,MT
@@ -59848,7 +64897,7 @@
3268236544,3268236607,GB
3268236672,3268236799,GB
3268238336,3268238359,GB
-3268238368,3268238383,GB
+3268238368,3268238399,GB
3268238472,3268238543,GB
3268238552,3268238847,GB
3268239584,3268240127,GB
@@ -59869,7 +64918,6 @@
3268244792,3268244799,GB
3268245504,3268245759,GB
3268246272,3268246783,GB
-3268246800,3268246807,GB
3268246976,3268246991,GB
3268248320,3268248447,GB
3268248512,3268248543,GB
@@ -59916,12 +64964,7 @@
3268267616,3268267647,GB
3268267744,3268267775,GB
3268267952,3268267959,GB
-3268268544,3268268799,GB
-3268270352,3268270367,GB
-3268270496,3268270511,GB
-3268270848,3268271359,GB
-3268271912,3268271919,GB
-3268271928,3268271935,GB
+3268268032,3268272127,GB
3268272640,3268272671,GB
3268272704,3268272711,GB
3268272728,3268272735,GB
@@ -59959,11 +65002,9 @@
3268740352,3268740607,DE
3268740608,3268740863,RO
3268740864,3268741119,CH
-3268741120,3268741375,FR
3268741376,3268741631,LV
3268741888,3268742143,AT
3268742144,3268742399,RU
-3268742400,3268742655,CZ
3268742656,3268742911,BE
3268742912,3268743167,NL
3268743168,3268743423,RO
@@ -60039,7 +65080,7 @@
3269283328,3269283583,DE
3269283872,3269283903,DE
3269284096,3269284351,GB
-3269284864,3269285055,FR
+3269284864,3269285079,FR
3269285088,3269285135,DE
3269285136,3269285151,GB
3269285152,3269285215,DE
@@ -60113,11 +65154,14 @@
3269918720,3269984255,DE
3269984256,3270049791,AT
3270049792,3270115327,DE
+3270140928,3270141183,NO
3270148352,3270149887,FI
3270150656,3270151423,FI
3270152704,3270153727,FI
3270166528,3270167551,NO
-3270235136,3270236159,NL
+3270205440,3270207487,ES
+3270208512,3270209535,NL
+3270234112,3270242303,NL
3270246400,3270377471,SE
3270377472,3270443007,GB
3270443008,3270508543,DK
@@ -60143,8 +65187,7 @@
3270649856,3270650111,DK
3270650112,3270650367,AT
3270650368,3270650623,DK
-3270650624,3270651391,FR
-3270651392,3270651647,DE
+3270650624,3270651135,FR
3270651648,3270651903,FR
3270652416,3270652671,DK
3270652672,3270652927,CH
@@ -60170,24 +65213,23 @@
3270688768,3270836223,IT
3270836224,3270901759,DE
3270901760,3270909951,IT
-3270909952,3270911839,DE
+3270909952,3270911807,DE
3270911840,3270911871,PL
3270911872,3270911935,DE
3270911936,3270911967,PL
3270911968,3270911999,NL
-3270912000,3270920703,DE
+3270913024,3270920703,DE
3270920704,3270921215,UA
3270921216,3270921471,DK
3270921472,3270921727,UA
3270921728,3270922239,GB
-3270922240,3270926335,DE
+3270922240,3270924287,DE
3270926336,3270926591,AT
3270926592,3270926847,CH
3270926848,3270927103,PL
3270927104,3270927359,UA
3270927616,3270927871,FR
3270927872,3270928127,HU
-3270928128,3270928383,RO
3270928384,3270928895,UA
3270928896,3270929407,PL
3270929408,3270929919,GB
@@ -60384,7 +65426,8 @@
3271933440,3271933695,SE
3271933696,3271933951,DE
3271933952,3272015871,FR
-3272015872,3272019967,RO
+3272015872,3272017407,RO
+3272017664,3272018943,RO
3272019968,3272020991,IT
3272020992,3272024063,DK
3272024064,3272032255,IE
@@ -60404,7 +65447,7 @@
3272090112,3272091647,RU
3272091648,3272092671,UA
3272092672,3272093183,RU
-3272093184,3272094207,RO
+3272093184,3272093695,RO
3272094208,3272094719,AM
3272094720,3272095231,PL
3272095232,3272095743,FI
@@ -60418,7 +65461,6 @@
3272106752,3272107007,PL
3272107008,3272107263,GB
3272107264,3272107519,PL
-3272107520,3272107775,RU
3272107776,3272108031,GB
3272108032,3272108287,DE
3272108288,3272108543,RO
@@ -60426,11 +65468,10 @@
3272109056,3272109311,CH
3272109312,3272109567,TR
3272109824,3272110079,FR
-3272110080,3272110335,SE
3272110336,3272110591,CH
3272110848,3272111103,LV
3272111104,3272111615,GB
-3272111872,3272112383,RO
+3272112128,3272112383,RO
3272112384,3272113151,DE
3272113152,3272113407,FR
3272113408,3272113919,GB
@@ -60534,6 +65575,7 @@
3272221440,3272221447,SE
3272221448,3272221455,NO
3272221456,3272221463,SE
+3272221472,3272221495,SE
3272221696,3272221951,NL
3272221952,3272222207,GB
3272222208,3272222463,ES
@@ -60548,9 +65590,10 @@
3272225280,3272225535,IT
3272225536,3272225791,GB
3272225856,3272225919,GB
+3272225920,3272226047,IT
3272226048,3272226815,FR
3272226816,3272227071,GB
-3272227072,3272227327,FR
+3272227072,3272227327,PT
3272227328,3272227359,US
3272227360,3272227511,GB
3272227520,3272227583,GB
@@ -60597,9 +65640,7 @@
3272268800,3272269055,IL
3272269056,3272269311,GB
3272269312,3272269567,IL
-3272269568,3272293631,GB
-3272293632,3272293887,AU
-3272293888,3272351743,GB
+3272269568,3272351743,GB
3272351744,3272352767,PL
3272352768,3272353791,UA
3272353792,3272355839,CH
@@ -60613,7 +65654,7 @@
3272384512,3272392703,LT
3272392704,3272400895,AT
3272400912,3272400919,GB
-3272402560,3272402623,GB
+3272402432,3272402687,GB
3272402688,3272402815,SE
3272403968,3272404991,FR
3272404992,3272406015,DE
@@ -60625,7 +65666,6 @@
3272420608,3272420863,DE
3272420864,3272420991,PL
3272420992,3272421119,DK
-3272421120,3272421375,UA
3272421376,3272421887,RO
3272421888,3272422143,RU
3272422144,3272422399,GB
@@ -60692,7 +65732,9 @@
3272628224,3272629247,UA
3272629248,3272638463,RU
3272638464,3272646655,ES
-3272646656,3272654847,GB
+3272646656,3272647385,GB
+3272647386,3272647386,DE
+3272647387,3272654847,GB
3272654848,3272663039,FI
3272663040,3272671231,AT
3272671232,3272736767,SE
@@ -60716,10 +65758,8 @@
3272876032,3272884223,NL
3272884224,3272892415,DE
3272892416,3272892927,UA
-3272892928,3272893439,DE
3272893440,3272893951,SE
3272893952,3272894463,UA
-3272894464,3272894975,FR
3272894976,3272895487,RO
3272895488,3272895999,GB
3272896000,3272896511,PL
@@ -60798,7 +65838,6 @@
3273035264,3273035775,DE
3273035776,3273036287,FR
3273036288,3273036799,BG
-3273036800,3273037311,IL
3273037312,3273037823,GB
3273038336,3273038847,GR
3273038848,3273039871,GB
@@ -60833,7 +65872,6 @@
3273261568,3273262079,BE
3273262080,3273262591,LU
3273262592,3273263103,RU
-3273263104,3273263615,FR
3273263616,3273264127,SE
3273264128,3273264639,PL
3273264640,3273265151,AT
@@ -60859,7 +65897,7 @@
3273326984,3273326987,DE
3273326992,3273327047,DE
3273327264,3273327287,DE
-3273327360,3273327423,IE
+3273327376,3273327423,IE
3273327424,3273327511,GB
3273327520,3273327551,IE
3273327552,3273327583,GB
@@ -60876,7 +65914,9 @@
3273330432,3273331199,GB
3273331712,3273331743,GB
3273331752,3273331791,GB
-3273331808,3273331967,GB
+3273331808,3273331823,GB
+3273331832,3273331887,GB
+3273331904,3273331967,GB
3273331968,3273332031,DE
3273332032,3273332095,GB
3273332096,3273332223,DE
@@ -60885,8 +65925,8 @@
3273332608,3273332671,DE
3273333056,3273333119,DE
3273334272,3273334783,DE
+3273334784,3273335039,AE
3273335040,3273335295,DE
-3273335296,3273335807,GB
3273335936,3273335999,DE
3273336848,3273336863,DE
3273336864,3273336871,GB
@@ -60899,10 +65939,12 @@
3273340928,3273341695,FR
3273341696,3273341951,DE
3273341952,3273342207,GB
+3273342208,3273342231,AE
3273342464,3273342975,DE
3273342976,3273343999,GB
3273344000,3273344767,DE
3273345024,3273345279,DE
+3273346560,3273346815,OM
3273346816,3273347071,DE
3273347840,3273348351,DE
3273349120,3273349631,DE
@@ -60914,7 +65956,6 @@
3273351936,3273352191,DE
3273352928,3273352959,DE
3273352992,3273353023,DE
-3273355520,3273356287,DE
3273357312,3273358335,GB
3273359888,3273359903,DE
3273360016,3273360079,DE
@@ -60978,7 +66019,7 @@
3273388912,3273388927,GB
3273388928,3273389055,DE
3273390080,3273390207,DE
-3273390336,3273390463,DE
+3273390368,3273390463,DE
3273391104,3273391359,DE
3273391872,3273392127,DE
3273392128,3273392639,PL
@@ -61011,7 +66052,7 @@
3273440256,3273440767,RO
3273440768,3273441023,AT
3273441024,3273441279,PL
-3273441280,3273449471,GB
+3273441280,3273449471,FR
3273449472,3273457663,CH
3273457664,3273523199,HR
3273523200,3273588735,DE
@@ -61021,14 +66062,15 @@
3273720832,3273720847,IE
3273720848,3273726719,NL
3273726720,3273726975,GB
-3273726976,3273727087,NL
+3273726976,3273727087,DK
3273727088,3273727088,GB
3273727089,3273727095,ES
-3273727096,3273727119,NL
+3273727096,3273727119,DK
3273727120,3273727127,PT
-3273727128,3273727135,NL
+3273727128,3273727135,DK
3273727136,3273727167,IT
-3273727168,3273732095,NL
+3273727168,3273727231,DK
+3273727232,3273732095,NL
3273732096,3273736191,GB
3273736192,3273744383,FR
3273744384,3273746943,GB
@@ -61042,7 +66084,6 @@
3273785344,3273801727,RU
3273801728,3273802239,DE
3273802752,3273803263,SA
-3273803264,3273803775,ES
3273803776,3273804287,CH
3273804288,3273804799,UA
3273804800,3273805311,RO
@@ -61099,7 +66140,6 @@
3273879552,3273880063,GB
3273880064,3273880575,NL
3273880576,3273881087,RU
-3273881088,3273881343,RO
3273881600,3273881855,GB
3273881856,3273882111,CH
3273882112,3273882367,SI
@@ -61141,10 +66181,9 @@
3274167296,3274167807,BG
3274168320,3274168831,PL
3274168832,3274169343,DZ
-3274169344,3274170367,DE
+3274169856,3274170367,DE
3274170368,3274170879,TR
-3274170880,3274171135,BE
-3274171136,3274171391,DE
+3274170880,3274171391,DE
3274171392,3274171903,RU
3274171904,3274172415,DE
3274172416,3274172927,UA
@@ -61156,8 +66195,6 @@
3274175488,3274175999,BE
3274176000,3274176511,DE
3274176512,3274177023,UA
-3274177024,3274177535,FR
-3274177536,3274178047,UA
3274178048,3274178559,NL
3274178560,3274244095,GB
3274244096,3274309631,DK
@@ -61191,12 +66228,12 @@
3274347520,3274348031,FR
3274348032,3274348543,DK
3274348544,3274349055,PL
-3274349056,3274358783,RU
+3274349056,3274350079,RU
+3274350592,3274358783,RU
3274358784,3274366975,SE
3274366976,3274368511,NL
3274368512,3274368767,AT
3274368768,3274369023,FR
-3274369024,3274370047,DE
3274370048,3274371071,GB
3274371072,3274373375,NL
3274373376,3274373631,PL
@@ -61328,7 +66365,8 @@
3274472960,3274483711,GB
3274489600,3274489855,GB
3274490176,3274490895,GB
-3274490912,3274491247,GB
+3274490912,3274491199,GB
+3274491208,3274491247,GB
3274491256,3274491295,GB
3274491304,3274491319,GB
3274491328,3274491383,GB
@@ -61375,13 +66413,10 @@
3274690816,3274691071,ES
3274691072,3274691327,DK
3274691328,3274691583,SI
-3274691584,3274691839,UA
3274691840,3274692095,SI
3274692096,3274692351,RO
3274692352,3274692607,BE
-3274692608,3274692863,DK
3274692864,3274693119,AT
-3274693120,3274693375,LT
3274693376,3274693631,UA
3274693632,3274693887,RU
3274693888,3274694143,IT
@@ -61402,10 +66437,8 @@
3274697728,3274697983,ES
3274697984,3274698239,GB
3274698240,3274698495,SE
-3274698496,3274698751,PL
3274698752,3274699007,GB
3274699008,3274699263,FR
-3274699264,3274699519,RO
3274699520,3274699775,SI
3274699776,3274700031,GB
3274700032,3274700287,CH
@@ -61419,7 +66452,6 @@
3274702336,3274702591,SE
3274702592,3274702847,KZ
3274702848,3274801151,CH
-3274801152,3274802175,UA
3274802176,3274803199,FR
3274803200,3274804223,DE
3274804224,3274805247,FR
@@ -61434,8 +66466,11 @@
3274814464,3274815487,GB
3274815488,3274816511,RU
3274816512,3274817535,SK
-3274817536,3274819583,RU
-3274819584,3274821631,UA
+3274817536,3274819839,RU
+3274819840,3274820095,UA
+3274820096,3274821119,RU
+3274821120,3274821375,UA
+3274821376,3274821631,RU
3274821632,3274823679,KZ
3274823680,3274825727,TR
3274825728,3274827775,DE
@@ -61503,8 +66538,9 @@
3275407360,3275415551,GB
3275415552,3275423743,UA
3275423744,3275423751,GB
-3275423776,3275423839,GB
-3275423872,3275425343,GB
+3275423808,3275423839,GB
+3275423872,3275424735,GB
+3275424752,3275425343,GB
3275425536,3275425559,GB
3275425568,3275425583,GB
3275425792,3275426559,GB
@@ -61517,7 +66553,8 @@
3275430656,3275430911,GB
3275431936,3275432959,GB
3275433984,3275436543,GB
-3275436800,3275438847,GB
+3275436800,3275438655,GB
+3275438672,3275438847,GB
3275439104,3275441407,GB
3275441424,3275441439,GB
3275441472,3275441535,GB
@@ -61526,11 +66563,10 @@
3275441840,3275442723,GB
3275443200,3275443227,GB
3275443232,3275443239,GB
-3275443248,3275443391,GB
-3275443424,3275443439,GB
-3275443448,3275443727,GB
+3275443248,3275443407,GB
+3275443424,3275443727,GB
3275443760,3275443775,GB
-3275443840,3275443903,GB
+3275443840,3275443967,GB
3275444224,3275444735,GB
3275446272,3275446783,GB
3275446800,3275446823,GB
@@ -61551,6 +66587,7 @@
3275458560,3275460095,IE
3275460096,3275460223,GB
3275460224,3275460239,IE
+3275460288,3275460295,GB
3275460352,3275460607,IE
3275460608,3275460863,HK
3275460864,3275468655,GB
@@ -61559,10 +66596,13 @@
3275468736,3275468751,IE
3275468752,3275468767,GB
3275468768,3275468799,IE
-3275468800,3275469071,GB
-3275469072,3275469087,IE
-3275469088,3275476223,GB
+3275468800,3275474951,GB
+3275474960,3275475039,GB
+3275475044,3275475071,GB
+3275475200,3275476223,GB
3275476288,3275476479,GB
+3275476656,3275476687,GB
+3275476704,3275476735,GB
3275476992,3275477567,GB
3275477760,3275478271,GB
3275478528,3275481087,GB
@@ -61572,7 +66612,7 @@
3275485224,3275485231,GB
3275485248,3275485375,GB
3275485408,3275485423,GB
-3275485440,3275485695,GB
+3275485440,3275485759,GB
3275488768,3275489279,CZ
3275489280,3275497471,GB
3275497472,3275505663,DE
@@ -61581,7 +66621,6 @@
3275506688,3275507199,SE
3275507200,3275507711,UA
3275507712,3275509759,RO
-3275509760,3275509855,IT
3275509856,3275509887,PL
3275509888,3275509919,AM
3275509920,3275509951,PL
@@ -61622,7 +66661,6 @@
3275513216,3275513279,CH
3275513280,3275513343,CY
3275513344,3275513471,PL
-3275513472,3275513599,FR
3275513600,3275513727,CY
3275513728,3275513855,GB
3275513856,3275522047,DE
@@ -61664,7 +66702,6 @@
3275624448,3275624959,SK
3275624960,3275625471,IL
3275625472,3275625983,DE
-3275625984,3275626495,BG
3275626496,3275627007,UA
3275627008,3275627519,AT
3275627520,3275628031,GB
@@ -61775,7 +66812,6 @@
3275908352,3275908607,SE
3275908608,3275908863,DE
3275908864,3275909119,PL
-3275909120,3275909375,RU
3275909376,3275909631,UA
3275909632,3275909887,EE
3275909888,3275910143,SI
@@ -61785,7 +66821,6 @@
3275910912,3275911167,DE
3275911168,3275911423,FR
3275911424,3275911679,RO
-3275911680,3275911935,UA
3275911936,3275912191,BE
3275912192,3275912447,PL
3275912448,3275912703,RU
@@ -61807,7 +66842,6 @@
3275919872,3275920383,UA
3275920384,3275920895,GB
3275920896,3275921407,ES
-3275921408,3275921919,UA
3275921920,3275922431,DE
3275922432,3275922943,UA
3275922944,3275923455,GR
@@ -61821,7 +66855,9 @@
3276014800,3276014815,FR
3276014816,3276014951,GB
3276014952,3276014959,ES
-3276014960,3276019495,GB
+3276014960,3276018175,GB
+3276018176,3276018431,FR
+3276018432,3276019495,GB
3276019496,3276019503,FR
3276019504,3276019631,GB
3276019632,3276019639,FR
@@ -61837,15 +66873,15 @@
3276027648,3276027903,FR
3276027904,3276029375,GB
3276029376,3276029439,FR
-3276029440,3276031479,GB
+3276029440,3276030591,GB
+3276030592,3276030607,FR
+3276030608,3276031479,GB
3276031480,3276031487,FR
3276031488,3276032311,GB
3276032312,3276032319,FR
-3276032320,3276033535,GB
-3276033536,3276033791,FR
-3276033792,3276039167,GB
-3276039168,3276039423,FR
-3276039424,3276040351,GB
+3276032320,3276039263,GB
+3276039264,3276039279,FR
+3276039280,3276040351,GB
3276040352,3276040367,FR
3276040368,3276042015,GB
3276042016,3276042031,FR
@@ -61872,8 +66908,6 @@
3276068864,3276069887,UA
3276069888,3276070399,GB
3276070400,3276070911,UA
-3276070912,3276071423,GB
-3276071424,3276071935,PL
3276071936,3276072447,GB
3276072448,3276072959,SK
3276072960,3276073471,PL
@@ -61885,10 +66919,8 @@
3276076032,3276076287,NL
3276076288,3276076543,RU
3276076544,3276077055,DE
-3276077056,3276077567,UA
3276077568,3276078079,FR
3276078080,3276078591,RU
-3276078592,3276079103,GB
3276079104,3276095487,NO
3276095488,3276096511,RU
3276096512,3276097535,IT
@@ -61899,7 +66931,6 @@
3276101632,3276102655,LV
3276102656,3276103679,GB
3276103680,3276104703,SI
-3276104704,3276105727,RU
3276105728,3276106751,AT
3276106752,3276107775,BG
3276107776,3276108799,DE
@@ -61908,7 +66939,6 @@
3276110848,3276111871,PL
3276111872,3276112895,DK
3276112896,3276114943,UA
-3276114944,3276115967,KW
3276115968,3276116991,NL
3276116992,3276118015,RU
3276118016,3276119039,GB
@@ -61929,12 +66959,10 @@
3276134400,3276135423,RU
3276135424,3276136447,UA
3276136448,3276137471,NL
-3276137472,3276138495,PL
3276138496,3276139519,NL
3276139520,3276140543,RU
3276140544,3276141567,DE
3276141568,3276143615,UA
-3276143616,3276144639,GB
3276144640,3276152831,CH
3276152832,3276161023,HU
3276161024,3276169215,GB
@@ -62012,6 +67040,7 @@
3276485632,3276486655,GB
3276503040,3276505087,DE
3276508680,3276508687,GB
+3276508928,3276509183,GB
3276509184,3276510207,IT
3276512256,3276513023,ZA
3276517632,3276517887,NL
@@ -62020,7 +67049,6 @@
3276527616,3276527743,PK
3276528352,3276528359,GB
3276530688,3276531711,NL
-3276532480,3276532607,NL
3276536688,3276536695,HU
3276537344,3276537599,AT
3276537856,3276668927,ES
@@ -62032,10 +67060,8 @@
3276679680,3276680191,UA
3276680192,3276680703,SK
3276680704,3276681215,AT
-3276681216,3276681727,PL
3276681728,3276682239,BE
3276682240,3276682751,AT
-3276682752,3276683263,GB
3276683264,3276684287,UA
3276684288,3276684799,RU
3276684800,3276685311,DE
@@ -62104,7 +67130,7 @@
3276858112,3276858367,KW
3276858368,3276858623,RU
3276858624,3276858879,PL
-3276859136,3276859647,UA
+3276859392,3276859647,UA
3276859648,3276859903,CH
3276859904,3276860159,AT
3276860160,3276860415,CH
@@ -62113,13 +67139,17 @@
3276861184,3276861439,DE
3276861440,3276865535,DK
3276865536,3276866303,NL
-3276866304,3276873983,GB
+3276866304,3276866559,GB
+3276866560,3276866815,IT
+3276866816,3276873983,GB
3276873984,3276874239,ES
3276874240,3276876383,GB
3276876384,3276876415,NL
3276876416,3276882431,GB
3276882432,3276882943,IT
-3276882944,3276886363,GB
+3276882944,3276883711,GB
+3276883712,3276883967,IT
+3276883968,3276886363,GB
3276886364,3276886367,DE
3276886368,3276890111,GB
3276890112,3276890367,US
@@ -62129,15 +67159,20 @@
3276893696,3276893951,IT
3276893952,3276898671,GB
3276898672,3276898687,CH
-3276898688,3276903423,GB
-3276903424,3276903679,SE
+3276898688,3276903167,GB
+3276903168,3276903679,SE
3276903680,3276907519,GB
3276907520,3276907775,NL
3276907776,3276908287,GB
3276908288,3276908543,BE
-3276908544,3276911615,GB
+3276908544,3276908799,SE
+3276908800,3276909823,GB
+3276909824,3276910079,SE
+3276910080,3276911615,GB
3276911616,3276911871,IT
-3276911872,3276912383,GB
+3276911872,3276912207,GB
+3276912208,3276912215,IT
+3276912216,3276912383,GB
3276912384,3276912511,IT
3276912512,3276912879,GB
3276912880,3276912895,IT
@@ -62151,9 +67186,9 @@
3276919488,3276919535,DE
3276919536,3276922879,GB
3276922880,3276923135,FR
-3276923136,3276923391,GB
-3276923392,3276923903,FR
-3276923904,3276925951,GB
+3276923136,3276923647,GB
+3276923648,3276924159,FR
+3276924160,3276925951,GB
3276925952,3276926207,FR
3276926208,3276931071,GB
3276931072,3276939263,KZ
@@ -62182,12 +67217,10 @@
3277178368,3277178623,UA
3277178624,3277178879,PL
3277178880,3277179135,ES
-3277179136,3277179391,RO
3277179392,3277179647,DE
3277179648,3277180159,BE
3277180160,3277180415,NL
3277180416,3277180671,RU
-3277180672,3277180927,FR
3277180928,3277181183,UA
3277181184,3277181439,PL
3277181440,3277181695,DE
@@ -62202,7 +67235,6 @@
3277184000,3277184255,DE
3277184256,3277184511,PT
3277184512,3277184767,DE
-3277184768,3277185023,UA
3277185024,3277185279,SA
3277185280,3277185535,RU
3277185792,3277186047,PL
@@ -62279,7 +67311,7 @@
3277348352,3277348863,FR
3277348864,3277349887,RO
3277349888,3277350399,GB
-3277350400,3277351423,RU
+3277350400,3277350911,RU
3277351424,3277351935,NO
3277351936,3277352447,DE
3277352448,3277352959,SE
@@ -62303,7 +67335,7 @@
3277362176,3277362687,ES
3277363200,3277363711,ES
3277363712,3277364223,RU
-3277364224,3277364735,NL
+3277364224,3277364735,GB
3277364736,3277365247,UA
3277365248,3277365759,NL
3277365760,3277366271,GR
@@ -62357,8 +67389,8 @@
3277403312,3277403327,GB
3277403328,3277403359,FR
3277403360,3277403391,GB
-3277403392,3277403439,FR
-3277403440,3277403647,GB
+3277403392,3277403455,FR
+3277403456,3277403647,GB
3277403648,3277403807,ES
3277403808,3277404159,GB
3277404160,3277404415,DE
@@ -62367,9 +67399,9 @@
3277404528,3277404649,IT
3277404650,3277404671,GB
3277404672,3277404735,CH
-3277404736,3277404943,GB
-3277404944,3277404959,NL
-3277404960,3277405183,GB
+3277404736,3277404927,GB
+3277404928,3277404975,NL
+3277404976,3277405183,GB
3277405184,3277405263,SE
3277405264,3277405439,GB
3277405440,3277405471,DE
@@ -62384,16 +67416,15 @@
3277475712,3277476607,NL
3277476608,3277477631,BE
3277477632,3277479935,NL
-3277479936,3277480959,GB
+3277479936,3277480447,GB
3277480960,3277481471,DK
3277481472,3277481983,PL
3277481984,3277482495,SE
3277482496,3277483007,PL
3277483008,3277483519,IT
3277483520,3277484031,RO
-3277484032,3277484543,CH
-3277485056,3277485567,CH
-3277485568,3277486591,GB
+3277484032,3277486079,CH
+3277486080,3277486591,GB
3277486592,3277487103,UA
3277487104,3277487615,RO
3277487616,3277488127,PL
@@ -62428,7 +67459,6 @@
3277695488,3277695999,ES
3277696000,3277696511,UA
3277696512,3277697023,AT
-3277697024,3277697535,RO
3277697536,3277698047,PL
3277698048,3277698559,RU
3277698560,3277699071,DE
@@ -62463,7 +67493,8 @@
3277717504,3277725695,YE
3277725696,3277733887,CH
3277733888,3277742079,DE
-3277742080,3277750271,FI
+3277742080,3277746175,FI
+3277746176,3277750271,GB
3277750272,3277766655,IT
3277766656,3277774847,PL
3277774848,3277783039,RU
@@ -62518,7 +67549,6 @@
3277829632,3277829887,PL
3277829888,3277830143,IL
3277830144,3277830399,SE
-3277830400,3277830655,UA
3277830656,3277830911,PL
3277830912,3277831167,GB
3277831168,3277831423,PL
@@ -62526,7 +67556,6 @@
3277831680,3277832191,IE
3277833216,3277833727,BE
3277833728,3277834239,NL
-3277834240,3277834751,RU
3277834752,3277835263,UA
3277835264,3277835775,SK
3277835776,3277836287,UA
@@ -62581,7 +67610,6 @@
3278307328,3278372863,IT
3278372864,3278635007,GB
3278635008,3278766079,NL
-3278766080,3278766591,RO
3278767104,3278767615,RO
3278767616,3278768127,UA
3278768128,3278769151,GB
@@ -62589,7 +67617,6 @@
3278769664,3278770175,DE
3278770176,3278770687,DK
3278770688,3278771711,DE
-3278771712,3278772223,NL
3278772224,3278772735,BG
3278772736,3278773247,DE
3278773248,3278773759,NO
@@ -62769,7 +67796,6 @@
3279056896,3279057151,RU
3279057152,3279057407,GB
3279057408,3279057919,FR
-3279057920,3279058431,RO
3279058944,3279059455,UA
3279059456,3279060479,RU
3279060480,3279060991,PL
@@ -62779,9 +67805,7 @@
3279085568,3279089663,NL
3279089664,3279093759,KG
3279093760,3279123455,FR
-3279123456,3279123720,RE
-3279123721,3279123721,FR
-3279123722,3279123967,RE
+3279123456,3279123967,RE
3279123968,3279159295,FR
3279159296,3279290367,PL
3279292416,3279294463,NL
@@ -62948,7 +67972,6 @@
3280460800,3280462847,DE
3280462848,3280463871,PL
3280463872,3280466943,RU
-3280466944,3280467967,UA
3280467968,3280468991,ES
3280470016,3280535551,PL
3280535552,3280568319,GB
@@ -62978,7 +68001,6 @@
3280582400,3280582655,DK
3280582656,3280582911,FR
3280582912,3280583167,UA
-3280583168,3280583423,RO
3280583424,3280583679,RU
3280583936,3280584191,PL
3280584192,3280584447,KW
@@ -63042,7 +68064,6 @@
3280655872,3280656127,RO
3280656128,3280656639,CH
3280656640,3280657407,UA
-3280657408,3280657663,RU
3280657664,3280657919,SE
3280657920,3280658175,RO
3280658176,3280658431,DE
@@ -63051,7 +68072,6 @@
3280662528,3280666623,DE
3280666624,3280732159,NO
3280732160,3280764927,DE
-3280764928,3280765183,TJ
3280765952,3280766975,DK
3280766976,3280767999,AT
3280768000,3280769023,FR
@@ -63074,7 +68094,7 @@
3280785408,3280787455,DE
3280787456,3280788479,GB
3280788480,3280789503,PL
-3280789504,3280791551,UA
+3280790528,3280791551,UA
3280791552,3280792575,DE
3280792576,3280793599,PL
3280793600,3280794623,NL
@@ -63093,7 +68113,9 @@
3280958920,3280958927,DE
3280958928,3280963375,GB
3280963376,3280963383,DE
-3280963384,3280994559,GB
+3280963384,3280991231,GB
+3280991232,3280991743,DE
+3280991744,3280994559,GB
3280994560,3280994815,RU
3280994816,3280995071,NL
3280995072,3280995327,DE
@@ -63117,7 +68139,6 @@
3281000448,3281000703,FR
3281000704,3281000959,UA
3281000960,3281001215,SI
-3281001216,3281001471,RO
3281001472,3281001727,UA
3281001728,3281001983,RU
3281001984,3281002239,CH
@@ -63143,9 +68164,7 @@
3281149952,3281158143,CZ
3281158144,3281166335,SK
3281166336,3281174527,GB
-3281174528,3281189375,FR
-3281189376,3281189631,GB
-3281189632,3281190911,FR
+3281174528,3281190911,FR
3281190912,3281256447,GB
3281256448,3281321983,FI
3281321984,3281338367,GB
@@ -63172,7 +68191,6 @@
3281344768,3281345279,RU
3281345280,3281345535,SA
3281345536,3281345791,CH
-3281345792,3281346047,RU
3281346048,3281346303,SI
3281346304,3281346559,PL
3281346560,3281346815,UA
@@ -63252,7 +68270,6 @@
3282088448,3282089471,PL
3282089472,3282089983,SK
3282089984,3282090495,PL
-3282090496,3282091007,GB
3282091008,3282091519,FR
3282091520,3282092031,CH
3282092032,3282093055,UA
@@ -63328,7 +68345,6 @@
3282739968,3282740223,IR
3282740224,3282740479,FR
3282740736,3282740991,BG
-3282740992,3282741247,DE
3282741248,3282741503,PT
3282741504,3282741759,GB
3282741760,3282742015,ES
@@ -63391,7 +68407,6 @@
3283214336,3283214847,RO
3283214848,3283215359,RU
3283215360,3283215871,AT
-3283215872,3283216383,TR
3283216384,3283216895,DE
3283216896,3283217407,CH
3283217408,3283218943,UA
@@ -63428,9 +68443,7 @@
3283251712,3283252223,PL
3283252224,3283252735,BG
3283252736,3283253247,SI
-3283253248,3283253759,RO
3283253760,3283254271,PL
-3283254784,3283255295,RO
3283255296,3283263487,UA
3283263488,3283271679,SE
3283271680,3283279871,RU
@@ -63501,8 +68514,6 @@
3283525632,3283533823,GB
3283533824,3283534847,UA
3283534848,3283535359,DE
-3283535360,3283535871,RO
-3283535872,3283536383,GI
3283536384,3283536895,UA
3283537408,3283537919,PL
3283537920,3283538431,RO
@@ -63517,7 +68528,6 @@
3283561472,3283562495,GB
3283563520,3283564543,GB
3283568640,3283569663,GB
-3283570688,3283570943,GB
3283576832,3283579903,DE
3283593216,3283595263,IT
3283615744,3283623935,HU
@@ -63531,7 +68541,6 @@
3283635712,3283636223,RU
3283636224,3283636735,UA
3283636736,3283637759,PL
-3283637760,3283638271,UA
3283638272,3283638783,PL
3283638784,3283639295,RU
3283639296,3283639807,CH
@@ -63553,7 +68562,8 @@
3283944448,3283945471,AT
3283945472,3283946495,UA
3283946496,3283947519,GB
-3283947520,3283948543,UA
+3283947520,3283947775,UA
+3283947776,3283948543,RU
3283948544,3283949567,NL
3283949568,3283950591,SE
3283950592,3283951615,KZ
@@ -63590,12 +68600,12 @@
3283979776,3283980287,NO
3283980288,3283980799,RO
3283980800,3283981823,CH
-3283981824,3283983359,RO
+3283981824,3283982335,RO
+3283982848,3283983359,RO
3283983360,3283983871,CY
3283983872,3283984383,GB
3283984384,3283984895,SE
3283984896,3283985407,GR
-3283985408,3283985919,RO
3283985920,3283986431,AT
3283986944,3283987455,AT
3283987456,3283987967,GB
@@ -63603,7 +68613,7 @@
3283988992,3283989503,FR
3283989504,3283990015,RU
3283990016,3283990527,SE
-3283990528,3283991551,RO
+3283991040,3283991551,RO
3283991552,3283992063,SE
3283992064,3283992575,RO
3283992576,3283993087,IL
@@ -63664,7 +68674,9 @@
3284016384,3284016639,CH
3284016640,3284017151,DK
3284017152,3284025343,GR
-3284025344,3284033535,GB
+3284025344,3284030479,GB
+3284030480,3284030495,FR
+3284030496,3284033535,GB
3284033536,3284041727,RU
3284041728,3284041983,DK
3284041984,3284042239,SI
@@ -63676,7 +68688,7 @@
3284043520,3284043775,DE
3284043776,3284044031,HR
3284044032,3284044287,FR
-3284044288,3284044799,DE
+3284044288,3284044543,DE
3284044800,3284045055,CZ
3284045056,3284045311,LT
3284045312,3284045567,DE
@@ -63685,12 +68697,10 @@
3284046336,3284046591,NL
3284046592,3284046847,SE
3284046848,3284047103,DE
-3284047360,3284047615,DE
3284047616,3284047871,NL
3284047872,3284048127,UA
3284048128,3284048383,DK
3284048640,3284049151,FR
-3284049152,3284049407,UA
3284049408,3284049663,SI
3284049664,3284049919,RO
3284049920,3284058111,CH
@@ -63891,9 +68901,7 @@
3284811776,3284819967,KE
3284819968,3284828159,GB
3284828160,3284844543,AT
-3284844544,3284847999,CH
-3284848000,3284848127,FR
-3284848128,3284856063,CH
+3284844544,3284856063,CH
3284856064,3284856191,DE
3284856192,3284860927,CH
3284860928,3284926463,DE
@@ -63903,7 +68911,6 @@
3285065728,3285073919,RU
3285073920,3285082111,NL
3285082112,3285084159,AT
-3285085184,3285086207,GB
3285086208,3285088255,PL
3285088256,3285088511,RO
3285088512,3285088767,DK
@@ -64017,6 +69024,7 @@
3285472272,3285472287,DE
3285472288,3285472511,US
3285480960,3285481215,CH
+3285501696,3285501951,GB
3285510144,3285512191,GB
3285516288,3285516687,BE
3285516688,3285516691,NL
@@ -64125,12 +69133,13 @@
3285910336,3285910399,ES
3285911552,3285912447,GB
3285913648,3285913655,IE
-3285913656,3285913659,GB
-3285913664,3285913679,GB
+3285913656,3285913695,GB
3285917696,3285917703,GB
+3285917728,3285917759,GB
3285919744,3285921791,QA
3285922048,3285922303,FR
3285926432,3285926463,CH
+3285926592,3285926623,DE
3285928304,3285928311,GB
3285931528,3285931535,DE
3285935872,3285936127,GB
@@ -64145,8 +69154,11 @@
3285951648,3285951679,ES
3285953536,3285954047,PK
3285954048,3285954303,AE
-3285954560,3285954815,GB
+3285954560,3285954567,GB
+3285954568,3285954575,PL
+3285954576,3285954815,GB
3285962752,3285963775,DE
+3285964800,3285964927,DE
3285975040,3286013695,FR
3286013696,3286013951,RE
3286013952,3286106111,FR
@@ -64207,7 +69219,6 @@
3286345728,3286346751,IT
3286346752,3286347775,UA
3286347776,3286348799,PA
-3286348800,3286349823,PL
3286349824,3286350847,SE
3286350848,3286351871,GB
3286351872,3286352895,CH
@@ -64230,11 +69241,13 @@
3286384640,3286401023,DE
3286401024,3286403071,GB
3286403072,3286403327,GG
-3286403328,3286404607,GB
-3286404608,3286405375,GG
+3286403328,3286404863,GB
+3286404864,3286405375,GG
3286405376,3286405887,GB
3286405888,3286406143,GG
-3286406144,3286409215,GB
+3286406144,3286406399,GB
+3286406400,3286406655,GG
+3286406656,3286409215,GB
3286409216,3286417407,DE
3286417408,3286417663,UA
3286417664,3286417919,IT
@@ -64286,7 +69299,6 @@
3286657024,3286657279,BE
3286657280,3286657535,ES
3286657536,3286657791,HU
-3286657792,3286658047,RU
3286658048,3286658303,US
3286658304,3286658559,RU
3286658560,3286658815,NL
@@ -64366,12 +69378,11 @@
3286917120,3286918143,RU
3286918144,3286919167,AT
3286919168,3286920191,DE
-3286920192,3286921215,RU
+3286920192,3286920447,RU
3286921216,3286922239,UA
3286922240,3286923263,GB
3286923264,3286924287,CM
3286925312,3286925823,DE
-3286925824,3286926079,RO
3286926080,3286926335,LV
3286926336,3286926591,UA
3286926592,3286926847,DE
@@ -64396,7 +69407,7 @@
3286931968,3286932223,FR
3286932224,3286932479,DK
3286932736,3286932991,AT
-3286932992,3286933503,IL
+3286932992,3286933247,IL
3286933504,3286933759,DK
3286933760,3286934015,RO
3286934016,3286934271,BE
@@ -64416,16 +69427,14 @@
3286938112,3286938367,DE
3286938368,3286938623,ES
3286938624,3286938879,CH
-3286938880,3286939391,RO
+3286939136,3286939391,RO
3286939392,3286939647,DE
3286939648,3286939903,BE
3286939904,3286940159,EG
3286940160,3286940415,BE
3286940416,3286940671,NL
3286940672,3286940927,RO
-3286940928,3286941183,PL
3286941184,3286941439,RU
-3286941440,3286941695,RO
3286941696,3286942719,DE
3286942720,3286943743,FI
3286943744,3286944767,UA
@@ -64473,7 +69482,6 @@
3287180288,3287181311,RU
3287181312,3287182335,UZ
3287182336,3287185407,UA
-3287186432,3287187455,FI
3287187456,3287196671,DE
3287196672,3287198719,PL
3287198720,3287199743,GB
@@ -64524,10 +69532,9 @@
3287439872,3287440895,PL
3287440896,3287441407,UA
3287441408,3287442431,NL
-3287442944,3287443967,DE
+3287443456,3287443967,DE
3287443968,3287444479,BG
3287444480,3287444991,PL
-3287444992,3287445503,DE
3287445504,3287446527,UA
3287446528,3287447039,PL
3287447040,3287447551,IL
@@ -64563,7 +69570,6 @@
3287461376,3287461631,CH
3287461632,3287461887,AT
3287461888,3287462143,PL
-3287462144,3287462399,SA
3287462400,3287462655,BE
3287462656,3287462911,UA
3287462912,3287463167,FR
@@ -64597,7 +69603,6 @@
3287550464,3287550975,DE
3287550976,3287551487,LT
3287552000,3287552511,GB
-3287552512,3287553023,RO
3287553024,3287553535,FR
3287553536,3287554047,IL
3287554048,3287554559,RU
@@ -64637,7 +69642,6 @@
3287662592,3287662847,DE
3287662848,3287663103,DK
3287663104,3287663359,LV
-3287663360,3287663615,GB
3287663616,3287663871,ES
3287663872,3287664127,PT
3287664128,3287664383,PL
@@ -64647,7 +69651,6 @@
3287665152,3287665407,NO
3287665408,3287665919,PL
3287665920,3287666431,RU
-3287666432,3287666687,DK
3287666688,3287666943,SI
3287666944,3287667199,CZ
3287667200,3287667455,DK
@@ -64678,11 +69681,7 @@
3287673600,3287673855,GB
3287673856,3287674111,NL
3287674112,3287674367,CH
-3287674368,3287674623,DE
-3287674624,3287674879,RO
3287674880,3287675135,SE
-3287675136,3287675391,GB
-3287675392,3287675647,SE
3287675648,3287675903,DE
3287675904,3287676159,BE
3287676160,3287676415,DE
@@ -64716,12 +69715,9 @@
3287711744,3287719935,GB
3287719936,3287728127,DE
3287728128,3287729407,IT
-3287729408,3287729663,SE
3287729664,3287729919,DK
3287729920,3287730175,HU
-3287730176,3287730431,PL
-3287730432,3287730687,GB
-3287730688,3287732223,DE
+3287730176,3287732223,DE
3287732224,3287734271,IT
3287734272,3287734527,PL
3287734528,3287734783,UA
@@ -64740,7 +69736,6 @@
3287741440,3287741951,CH
3287742976,3287743487,RO
3287743488,3287743999,DE
-3287744000,3287744511,FR
3287744512,3287810047,DE
3287810048,3287818239,FR
3287818240,3287826431,AT
@@ -64794,7 +69789,6 @@
3287869952,3287870463,UA
3287870464,3287870975,RU
3287870976,3287871487,NL
-3287872000,3287872511,RU
3287872512,3287873023,GB
3287873024,3287873535,PL
3287873536,3287874047,RU
@@ -64845,7 +69839,6 @@
3288237056,3288238591,RO
3288238592,3288239103,PL
3288239104,3288239615,RO
-3288239616,3288240127,UA
3288240128,3288240639,CH
3288240640,3288241151,FR
3288241152,3288241663,ES
@@ -64915,15 +69908,11 @@
3288436224,3288436479,US
3288436480,3288436735,EG
3288436736,3288440831,ZA
-3288440832,3288441135,BB
-3288441136,3288441143,VC
-3288441144,3288441183,BB
-3288441184,3288441191,VC
-3288441192,3288441239,BB
-3288441240,3288441247,VC
-3288441248,3288441303,BB
-3288441304,3288441311,VC
-3288441312,3288444927,BB
+3288440832,3288441343,VC
+3288441344,3288442879,BB
+3288442880,3288443135,KN
+3288443136,3288443647,VC
+3288443648,3288444927,BB
3288444928,3288449023,NG
3288449024,3288465407,SD
3288465408,3288465919,JM
@@ -64944,11 +69933,12 @@
3288532992,3288534527,PR
3288534528,3288535039,MG
3288535040,3288539135,CW
-3288539136,3288543995,US
-3288543996,3288543996,FR
+3288539136,3288540415,US
+3288540416,3288540671,BR
+3288540672,3288543743,US
+3288543744,3288543996,CH
3288543997,3288543997,US
-3288543998,3288543998,CH
-3288543999,3288543999,FR
+3288543998,3288543999,CH
3288544000,3288544767,US
3288544768,3288545023,MX
3288545024,3288545279,FR
@@ -65012,6 +70002,7 @@
3288788224,3288792831,ZA
3288792832,3288793087,AO
3288793088,3289004031,ZA
+3289004032,3289005055,NG
3289005056,3289005311,TZ
3289005312,3289014527,ZA
3289014528,3289014783,EG
@@ -65021,11 +70012,13 @@
3289020160,3289020415,UG
3289020416,3289020671,EG
3289020672,3289020927,ZA
+3289020928,3289021439,CI
3289021440,3289024767,ZA
3289024768,3289025023,GH
3289025024,3289025535,UG
3289026048,3289027327,ZA
3289027328,3289027583,TZ
+3289027584,3289027839,MZ
3289027840,3289041407,ZA
3289041408,3289041663,NG
3289041664,3289044991,ZA
@@ -65049,14 +70042,21 @@
3289082112,3289086975,ZA
3289086976,3289087231,SZ
3289087232,3289089791,ZA
+3289089792,3289090047,MZ
3289090048,3289093631,ZA
-3289096192,3289100287,ZA
+3289093632,3289094143,NG
+3289096192,3289100031,ZA
+3289100032,3289100287,LS
3289102336,3289103359,NG
3289103360,3289103615,ZA
+3289103616,3289103871,AO
+3289103872,3289104383,KE
3289104384,3289107967,ZA
-3289108480,3289115135,ZA
-3289115392,3289119231,ZA
-3289119744,3289120767,ZA
+3289108480,3289114367,ZA
+3289114368,3289114623,NG
+3289114624,3289115135,ZA
+3289115392,3289120511,ZA
+3289120512,3289120767,TZ
3289120768,3289123327,PR
3289123328,3289123583,NA
3289123584,3289123839,EG
@@ -65067,15 +70067,19 @@
3289153536,3289161727,RW
3289161728,3289169919,PR
3289169920,3289186303,MA
-3289186304,3289212927,ZA
+3289186304,3289212159,ZA
+3289212160,3289212415,MZ
+3289214976,3289215231,NG
3289215232,3289220351,ZA
3289221632,3289229311,ZA
3289229312,3289229567,SZ
3289229824,3289230591,ZA
3289233408,3289233919,ZA
-3289234176,3289235455,ZA
-3289237504,3289239551,ZA
-3289240064,3289321471,ZA
+3289234176,3289235199,ZA
+3289235200,3289235455,KE
+3289237504,3289243391,ZA
+3289243392,3289243647,BI
+3289243648,3289321471,ZA
3289321472,3289325567,IN
3289325568,3289333759,SA
3289333760,3289645055,ZA
@@ -65105,23 +70109,28 @@
3290031360,3290060287,ZA
3290060288,3290060543,SZ
3290060544,3290103807,ZA
-3290103808,3290104831,US
-3290104832,3290106879,VE
-3290106880,3290108415,US
-3290108416,3290108671,CA
-3290108672,3290116095,US
-3290116096,3290118143,PE
-3290118144,3290120191,US
+3290103808,3290107647,US
+3290107648,3290107903,CA
+3290107904,3290111999,US
+3290112000,3290112255,CA
+3290112256,3290120191,US
3290120192,3290128383,MU
3290128384,3290136575,ZW
3290136576,3290169343,NG
3290169344,3290171135,ZA
3290171136,3290171391,SZ
-3290171392,3290171647,ZA
+3290171392,3290171903,ZA
3290171904,3290172159,NG
3290172160,3290172415,KE
3290172416,3290181631,ZA
-3290181632,3290185727,PR
+3290181632,3290181887,US
+3290181888,3290182911,PR
+3290182912,3290183167,US
+3290183168,3290183423,PR
+3290183424,3290183679,US
+3290183680,3290184959,PR
+3290184960,3290185215,US
+3290185216,3290185727,PR
3290185728,3290226687,ZA
3290226688,3290230783,MZ
3290230784,3290234879,BF
@@ -65298,10 +70307,15 @@
3291529216,3291545599,US
3291545600,3291545855,CI
3291545856,3291546111,GM
+3291546112,3291546367,NA
+3291546368,3291546623,BI
+3291546624,3291546879,SZ
+3291546880,3291547135,TZ
3291742208,3292004351,US
3292004352,3292266495,SC
3292397568,3292528639,ZA
3300917248,3300921343,MU
+3300921344,3300925439,BJ
3300925440,3300929535,MG
3300933632,3300935679,MU
3300937728,3300938751,MU
@@ -65351,11 +70365,14 @@
3301507840,3301508095,EG
3301508608,3301509119,ZA
3301510144,3301511167,MW
-3301511168,3301513215,ZW
+3301511168,3301512191,ZW
+3301512192,3301513215,MU
3301513216,3301515263,EG
3301515264,3301523455,GH
3301523456,3301531647,CI
-3301539840,3301548031,KE
+3301539840,3301544191,KE
+3301544192,3301544959,DE
+3301544960,3301548031,KE
3301548032,3301556223,GH
3301556224,3301557759,DJ
3301557760,3301558015,US
@@ -65424,7 +70441,6 @@
3302551040,3302551551,MU
3302551552,3302552063,EG
3302552064,3302552575,KE
-3302552576,3302552831,TZ
3302552832,3302553087,KE
3302553088,3302553343,EG
3302553344,3302553599,TZ
@@ -65479,6 +70495,10 @@
3302957056,3302957311,CG
3302957312,3302957567,MZ
3302957568,3302957823,GM
+3302957824,3302958079,NA
+3302958080,3302958335,BI
+3302958336,3302958591,SZ
+3302985728,3302987775,MU
3304062976,3304456191,SC
3304456192,3304521727,NG
3304521728,3304587263,SC
@@ -65486,17 +70506,20 @@
3304849408,3305111551,ZA
3305111552,3305130239,TN
3305130240,3305130495,GP
-3305130496,3307208703,TN
+3305130496,3305362687,TN
+3305362688,3305362943,GP
+3305362944,3307208703,TN
3307208704,3309305855,EG
-3309305856,3310878719,ZA
-3311403008,3312451583,ZA
+3309305856,3312451583,ZA
3312451584,3312975871,DZ
3312975872,3313500159,EG
3313500160,3313762303,MA
3313762304,3314024447,EG
3314024448,3314286591,KE
3314286592,3314548735,DZ
-3314548736,3314810879,MA
+3314548736,3314750463,MA
+3314750464,3314751487,US
+3314751488,3314810879,MA
3314810880,3314827263,AO
3314827264,3314829311,ZA
3314829312,3314831359,GM
@@ -65585,7 +70608,9 @@
3317301248,3317432319,TZ
3317432320,3317497855,NA
3317497856,3317530623,CD
-3317530624,3317547007,LS
+3317530624,3317538815,LS
+3317538816,3317539071,ZA
+3317539072,3317547007,LS
3317547008,3317563391,ZA
3317563392,3317694463,GH
3317694464,3318218751,EG
@@ -65741,21 +70766,28 @@
3322023936,3322028031,CL
3322028032,3322036223,US
3322036224,3322052607,CA
-3322052608,3322354175,US
+3322052608,3322202111,US
+3322202112,3322203135,GB
+3322203136,3322339583,US
+3322339584,3322339839,GB
+3322339840,3322354175,US
3322354176,3322354431,JP
3322354432,3322609663,US
3322609664,3322610687,SA
3322610688,3322683391,US
3322683392,3322691583,BR
-3322691584,3322875903,US
+3322691584,3322691839,US
+3322691840,3322692095,SE
+3322692096,3322773503,US
+3322773504,3322806271,CA
+3322806272,3322875903,US
3322880000,3322888191,AU
3322888192,3322945535,US
3322945536,3322951679,CN
3322951680,3322970111,US
3322970112,3323002879,CA
-3323002880,3323003135,US
-3323003136,3323003391,JP
-3323003392,3323013887,US
+3323002880,3323004671,US
+3323004928,3323013887,US
3323013888,3323014143,CA
3323014144,3323017727,US
3323017728,3323017983,CA
@@ -65763,8 +70795,7 @@
3323020800,3323021055,SG
3323021056,3323022591,US
3323022592,3323022847,GB
-3323022848,3323023103,US
-3323023360,3323027455,US
+3323022848,3323027455,US
3323027456,3323027711,CA
3323027712,3323030015,US
3323030272,3323031807,US
@@ -65787,10 +70818,16 @@
3323207680,3323215871,CA
3323215872,3323224063,US
3323224064,3323232255,NL
-3323232256,3323270420,US
+3323232256,3323241727,US
+3323241728,3323241983,CA
+3323241984,3323244543,US
+3323244544,3323244671,CA
+3323244672,3323245319,US
+3323245320,3323245327,CA
+3323245328,3323270420,US
3323270421,3323270421,CH
-3323270422,3323331071,US
-3323331072,3323331839,CA
+3323270422,3323331583,US
+3323331584,3323331839,CA
3323331840,3323339263,US
3323339776,3323340031,CA
3323340288,3323342591,US
@@ -65816,58 +70853,63 @@
3323416400,3323416479,GB
3323416480,3323437823,US
3323437824,3323438079,CA
-3323438080,3323462655,US
+3323438080,3323461119,US
+3323461120,3323461375,GB
+3323461376,3323462655,US
3323462656,3323463167,BR
-3323463168,3323659263,US
+3323463168,3323477983,US
+3323477984,3323478015,GB
+3323478016,3323659263,US
3323659264,3323660543,NZ
3323660544,3323661311,US
3323661312,3323662335,CA
3323662336,3323674623,US
-3323674624,3323678523,CA
+3323674624,3323678207,CA
+3323678208,3323678463,US
+3323678464,3323678523,CA
3323678524,3323678527,US
3323678528,3323678583,CA
3323678584,3323678587,US
-3323678588,3323682955,CA
+3323678588,3323680327,CA
+3323680328,3323680328,US
+3323680329,3323680413,CA
+3323680414,3323680414,US
+3323680415,3323680511,CA
+3323680512,3323680767,US
+3323680768,3323681023,CA
+3323681024,3323681279,US
+3323681280,3323682955,CA
3323682956,3323682959,US
-3323682960,3323687073,CA
-3323687074,3323687074,US
-3323687075,3323691007,CA
-3323691008,3323741439,US
+3323682960,3323684863,CA
+3323684864,3323685375,US
+3323685376,3323685887,CA
+3323685888,3323687423,US
+3323687424,3323688959,CA
+3323688960,3323689471,US
+3323689472,3323690495,CA
+3323690496,3323741439,US
3323741440,3323741695,GB
3323741696,3323747327,US
3323747328,3323747583,GB
-3323747584,3323805695,US
-3323805696,3323806207,CA
-3323806208,3323987967,US
-3323987968,3324011263,KN
-3324011264,3324018175,US
-3324018176,3324018687,KN
-3324018688,3324019199,US
-3324019200,3324019711,KN
-3324019712,3324020735,US
-3324020736,3324022783,KN
-3324022784,3324023039,US
+3323747584,3323987967,US
+3323987968,3323988223,KN
+3323988224,3324011007,US
+3324011008,3324011263,KN
+3324011264,3324023039,US
3324023040,3324023295,KN
-3324023296,3324023551,US
-3324023552,3324026879,KN
-3324026880,3324027391,US
-3324027392,3324030719,KN
-3324030720,3324031487,US
-3324031488,3324032255,KN
-3324032256,3324033023,US
-3324033024,3324033535,KN
-3324033536,3324033791,US
-3324033792,3324034559,KN
-3324034560,3324035327,US
-3324035328,3324035839,KN
-3324035840,3324036351,US
-3324036352,3324040191,KN
+3324023296,3324030463,US
+3324030464,3324030719,KN
+3324030720,3324031999,US
+3324032000,3324032255,KN
+3324032256,3324033791,US
+3324033792,3324034047,KN
+3324034048,3324035327,US
+3324035328,3324035583,KN
+3324035584,3324040191,US
3324040192,3324040447,AU
-3324040448,3324043263,KN
-3324043264,3324047359,US
+3324040448,3324047359,US
3324047360,3324047615,KN
-3324047616,3324048383,US
-3324048384,3324051455,KN
+3324047616,3324051455,US
3324051456,3324182527,CA
3324182528,3324193279,US
3324193280,3324193791,CA
@@ -65883,21 +70925,93 @@
3324380160,3324380927,US
3324380928,3324381183,CA
3324381184,3324470271,US
-3324470272,3324470527,GB
-3324470528,3324471295,US
-3324471296,3324474367,GB
-3324474368,3324533247,US
+3324470272,3324474367,GB
+3324474368,3324522495,US
+3324522496,3324522751,CN
+3324522752,3324523007,US
+3324523008,3324523263,CN
+3324523264,3324525311,US
+3324525312,3324525567,CN
+3324525568,3324526335,US
+3324526336,3324526591,CN
+3324526592,3324533247,US
3324533248,3324533503,DE
3324533504,3324579839,US
3324582912,3324583935,CA
3324583936,3324587775,CL
-3324587776,3324647679,US
+3324587776,3324642303,US
+3324642304,3324642559,CA
+3324642560,3324645887,US
+3324645888,3324646143,CA
+3324646144,3324647679,US
3324647680,3324647935,CA
-3324647936,3324655871,US
+3324647936,3324650495,US
+3324650496,3324650751,CA
+3324650752,3324653311,US
+3324653312,3324653567,CA
+3324653568,3324655871,US
3324655872,3324656127,CA
-3324656128,3324696063,US
-3324696064,3324696319,CA
-3324696320,3324843775,US
+3324656128,3324659967,US
+3324659968,3324660223,CA
+3324660224,3324660479,US
+3324660480,3324660735,CA
+3324660736,3324662015,US
+3324662016,3324662271,CA
+3324662272,3324662527,US
+3324662528,3324662783,CA
+3324662784,3324664319,US
+3324664320,3324664575,CA
+3324664576,3324665855,US
+3324665856,3324666367,CA
+3324666368,3324668415,US
+3324668416,3324668671,CA
+3324668672,3324672767,US
+3324672768,3324673023,CA
+3324673024,3324674815,US
+3324674816,3324675327,CA
+3324675328,3324676351,US
+3324676352,3324676863,CA
+3324676864,3324678911,US
+3324678912,3324679167,CA
+3324679168,3324679423,US
+3324679424,3324679935,CA
+3324679936,3324681215,US
+3324681216,3324681471,CA
+3324681472,3324682495,US
+3324682496,3324682751,CA
+3324682752,3324684799,US
+3324684800,3324685055,CA
+3324685056,3324686335,US
+3324686336,3324686591,CA
+3324686592,3324690687,US
+3324690688,3324690943,CA
+3324690944,3324692991,US
+3324692992,3324693247,CA
+3324693248,3324693503,US
+3324693504,3324693759,CA
+3324693760,3324694527,US
+3324694528,3324695039,CA
+3324695040,3324695551,US
+3324695552,3324695807,CA
+3324695808,3324696063,US
+3324696064,3324696575,CA
+3324696576,3324696831,US
+3324696832,3324697087,CA
+3324697088,3324698623,US
+3324698624,3324699135,CA
+3324699136,3324699391,US
+3324699392,3324699647,CA
+3324699648,3324701183,US
+3324701184,3324701695,CA
+3324701696,3324701951,US
+3324701952,3324702207,CA
+3324702208,3324703999,US
+3324704000,3324704255,CA
+3324704256,3324706303,US
+3324706304,3324706559,CA
+3324706560,3324811047,US
+3324811048,3324811055,AU
+3324811056,3324843775,US
3324843776,3324843799,AU
3324843800,3324843801,US
3324843802,3324844031,AU
@@ -65924,7 +71038,9 @@
3325145088,3325169663,US
3325169664,3325171711,BR
3325171712,3325190143,US
-3325190144,3325202047,CA
+3325190144,3325191687,CA
+3325191688,3325191695,US
+3325191696,3325202047,CA
3325202048,3325202079,US
3325202080,3325204479,CA
3325204480,3325205503,US
@@ -65938,25 +71054,31 @@
3325211420,3325211423,US
3325211424,3325211647,CA
3325211648,3325211775,US
-3325211776,3325216527,CA
+3325211776,3325213687,CA
+3325213688,3325213695,US
+3325213696,3325216527,CA
3325216528,3325216531,US
3325216532,3325217939,CA
3325217940,3325217943,US
3325217944,3325218207,CA
3325218208,3325218239,US
-3325218240,3325220863,CA
+3325218240,3325220635,CA
+3325220636,3325220636,US
+3325220637,3325220863,CA
3325220864,3325220879,US
3325220880,3325221451,CA
3325221452,3325221455,US
-3325221456,3325224671,CA
+3325221456,3325221791,CA
+3325221792,3325221795,FR
+3325221796,3325224671,CA
3325224672,3325224675,US
3325224676,3325225671,CA
3325225672,3325225675,US
3325225676,3325226592,CA
3325226593,3325226593,US
-3325226594,3325226949,CA
-3325226950,3325226950,US
-3325226951,3325229591,CA
+3325226594,3325226751,CA
+3325226752,3325227007,US
+3325227008,3325229591,CA
3325229592,3325229599,US
3325229600,3325230319,CA
3325230320,3325230323,US
@@ -65988,51 +71110,66 @@
3325284864,3325285119,AU
3325285376,3325296383,US
3325296384,3325296639,CA
-3325296640,3325304831,US
-3325304832,3325313023,CA
-3325313024,3325362175,US
+3325296640,3325304063,US
+3325304064,3325304319,AS
+3325304320,3325304831,US
+3325304832,3325307647,CA
+3325307648,3325307903,BB
+3325307904,3325313023,CA
+3325313024,3325337599,US
+3325337600,3325338111,GB
+3325338112,3325362175,US
3325362176,3325427711,CA
3325427712,3325427967,US
-3325427968,3325430527,ZA
+3325427968,3325430527,MU
3325430528,3325431551,US
-3325431552,3325443583,ZA
+3325431552,3325433343,MU
+3325433344,3325438975,ZA
+3325438976,3325442559,MU
+3325442560,3325443583,ZA
3325443584,3325444095,US
-3325444096,3325448447,ZA
+3325444096,3325444351,MU
+3325444352,3325444607,ZA
+3325444608,3325448447,MU
3325448448,3325448959,US
-3325448960,3325450239,ZA
+3325448960,3325450239,MU
3325450240,3325451007,US
-3325451008,3325451263,ZA
+3325451008,3325451263,MU
3325451264,3325452799,US
-3325452800,3325453311,ZA
+3325452800,3325453311,MU
3325453312,3325454335,CA
3325454336,3325463807,US
-3325463808,3325466623,ZA
+3325463808,3325466623,MU
3325466624,3325467135,US
-3325467136,3325469695,ZA
+3325467136,3325469695,MU
3325469696,3325469951,US
-3325469952,3325470207,ZA
+3325469952,3325470207,MU
3325470208,3325471231,US
-3325471232,3325471487,ZA
+3325471232,3325471487,MU
3325471488,3325471999,US
-3325472000,3325474303,ZA
+3325472000,3325472255,ZA
+3325472256,3325474303,MU
3325474304,3325474559,US
-3325474560,3325478911,ZA
+3325474560,3325478655,MU
+3325478656,3325478911,ZA
3325478912,3325479423,US
-3325479424,3325481727,ZA
+3325479424,3325481471,ZA
+3325481472,3325481727,MU
3325481728,3325481983,US
3325481984,3325483007,CA
3325483008,3325483775,US
-3325483776,3325484287,ZA
+3325483776,3325484287,MU
3325484288,3325484799,US
3325484800,3325485055,ZA
3325485056,3325485311,US
-3325485312,3325486591,ZA
+3325485312,3325486591,MU
3325486592,3325486847,US
-3325486848,3325487359,ZA
+3325486848,3325487103,ZA
+3325487104,3325487359,MU
3325487360,3325487615,US
3325487616,3325487871,ZA
3325487872,3325490943,US
-3325490944,3325492991,ZA
+3325490944,3325492991,MU
3325492992,3325497343,US
3325497344,3325499903,PR
3325499904,3325505535,US
@@ -66040,7 +71177,7 @@
3325509632,3325551615,US
3325551616,3325552639,CA
3325552640,3325562879,US
-3325564928,3325573119,US
+3325565440,3325573119,US
3325573120,3325575167,BB
3325575168,3325630975,US
3325630976,3325631487,CA
@@ -66053,8 +71190,7 @@
3325691904,3325693183,BR
3325693184,3325722623,US
3325722624,3325755391,CA
-3325755392,3325886463,US
-3325886464,3325886719,UM
+3325755392,3325886719,US
3325887488,3325888511,US
3325890560,3325956095,US
3325956096,3325960191,CA
@@ -66068,17 +71204,20 @@
3325993984,3325994239,CA
3325994240,3325996799,US
3325996800,3325997055,CA
-3325997056,3326406655,US
+3325997056,3326349823,US
+3326349824,3326350335,EC
+3326350336,3326406655,US
3326406656,3326408703,CO
-3326408704,3326420991,US
+3326408704,3326413823,US
+3326413824,3326414335,YE
+3326414336,3326420991,US
3326420992,3326423039,PR
-3326423040,3326609151,US
-3326609408,3326613503,US
+3326423040,3326526463,US
+3326526464,3326526719,CA
+3326526720,3326613503,US
3326613504,3326615551,CA
3326615552,3326619647,US
-3326619648,3326620159,CA
-3326620160,3326620415,US
-3326620416,3326623743,CA
+3326619648,3326623743,CA
3326623744,3326631935,US
3326631936,3326640127,CA
3326640128,3326680831,US
@@ -66104,28 +71243,35 @@
3326738176,3326740479,US
3326741760,3326742015,US
3326742528,3326746623,US
-3326749184,3327144959,US
+3326749184,3326796863,US
+3326796864,3326796927,GB
+3326796928,3326952191,US
+3326952192,3326952447,AS
+3326952448,3326953983,US
+3326953984,3326954495,AS
+3326954496,3327144959,US
3327144960,3327145983,CA
-3327145984,3327197183,US
+3327145984,3327162367,US
+3327162368,3327162623,GB
+3327162624,3327162879,US
+3327162880,3327163391,GB
+3327163392,3327197183,US
3327197184,3327198207,JP
3327198208,3327199231,US
3327199232,3327200255,BR
-3327200256,3327397375,US
+3327200256,3327256831,US
+3327256832,3327257087,GU
+3327257088,3327397375,US
3327397376,3327397887,CA
3327397888,3327426559,US
3327426560,3327459327,CA
3327459328,3327723519,US
3327723520,3327725311,CA
-3327725312,3327769087,US
-3327770112,3327788287,US
-3327788288,3327788543,CA
-3327789056,3327790591,US
-3327791104,3327805951,US
+3327725312,3327788287,US
+3327788288,3327789055,CA
+3327789056,3327806463,US
3327806464,3327811583,CA
-3327811584,3327858175,US
-3327858688,3327863295,US
-3327863808,3327871487,US
-3327872000,3327885311,US
+3327811584,3327885311,US
3327885312,3327918079,CA
3327918080,3327995903,US
3327995904,3327996927,CW
@@ -66133,6 +71279,7 @@
3328028672,3328030719,CW
3328030720,3328180479,US
3328180480,3328181247,CA
+3328181248,3328181759,US
3328181760,3328185855,CA
3328185856,3328186111,US
3328186112,3328187647,CA
@@ -66148,31 +71295,23 @@
3328224512,3328235007,CA
3328235008,3328235519,US
3328235520,3328236543,CA
-3328237056,3328237311,US
+3328236544,3328237311,US
3328237312,3328241663,CA
-3328241664,3328242175,US
-3328242688,3328242943,US
+3328241664,3328242943,US
3328242944,3328243199,GB
3328243200,3328245759,CA
-3328245760,3328249343,US
-3328249856,3328255487,US
-3328255744,3328259071,US
-3328259584,3328265471,US
+3328245760,3328265471,US
3328265728,3328271871,US
3328272128,3328297471,US
3328297984,3328299775,US
3328299776,3328301055,CA
-3328301056,3328303103,US
-3328303616,3328305151,US
-3328305664,3328306431,US
+3328301056,3328306431,US
3328306432,3328306687,CA
-3328307200,3328307455,US
+3328306688,3328307455,US
3328307968,3328309247,US
-3328309504,3328314879,US
-3328315392,3328356863,US
-3328357376,3328358399,US
+3328309504,3328358399,US
3328358400,3328360447,CA
-3328360448,3328383487,US
+3328360448,3328383999,US
3328384000,3328385023,CA
3328385024,3328394239,US
3328394240,3328394495,GB
@@ -66185,16 +71324,15 @@
3328421376,3328432639,US
3328432640,3328433663,CA
3328433664,3328433919,CH
-3328433920,3328447999,US
-3328448512,3328475135,US
+3328433920,3328475135,US
3328475136,3328477183,CA
3328477184,3328479231,US
-3328479232,3328481759,CA
-3328481760,3328481760,US
-3328481761,3328482303,CA
-3328482304,3328482815,US
-3328482816,3328483327,CA
-3328483328,3328514559,US
+3328479232,3328481279,CA
+3328481280,3328481791,US
+3328481792,3328482303,CA
+3328482304,3328510064,US
+3328510065,3328510077,AE
+3328510078,3328515071,US
3328515072,3328516095,DM
3328516096,3328617983,US
3328617984,3328618239,CA
@@ -66204,22 +71342,29 @@
3328630784,3328631807,CA
3328631808,3328638975,US
3328638976,3328704511,CA
-3328704512,3328773631,US
-3328774144,3328776703,US
-3328777216,3328788479,US
+3328704512,3328774399,US
+3328774400,3328775935,CA
+3328775936,3328788479,US
3328788480,3328789503,FR
3328789504,3328794623,US
3328794624,3328802815,CA
3328802816,3328826813,US
3328826814,3328826814,SG
-3328826815,3330621183,US
+3328826815,3329230335,US
+3329230336,3329230591,JP
+3329230592,3329498623,US
+3329498624,3329498879,ES
+3329498880,3330613247,US
+3330613248,3330614783,CA
+3330614784,3330617087,US
+3330617088,3330617343,CA
+3330617344,3330621183,US
3330621184,3330623743,CA
3330623744,3330624255,US
3330624256,3330624511,CA
3330624512,3330625535,US
3330625536,3330627071,GB
-3330627072,3330637823,US
-3330638336,3330640895,US
+3330627072,3330640895,US
3330640896,3330641151,CH
3330641152,3330646527,US
3330646528,3330647295,CA
@@ -66230,8 +71375,7 @@
3330662912,3330663167,GB
3330663168,3330664191,US
3330664192,3330664447,CA
-3330664448,3330672127,US
-3330672640,3330677759,US
+3330664448,3330677759,US
3330677760,3330678783,CA
3330678784,3330714367,US
3330714368,3330714623,CA
@@ -66243,17 +71387,15 @@
3330763520,3330763775,CA
3330763776,3330765823,US
3330765824,3330766335,CA
-3330766336,3330767871,US
-3330768384,3330771199,US
+3330766336,3330771199,US
3330771200,3330771711,CH
3330771712,3330778879,US
3330778880,3330779135,GB
3330779136,3330785279,US
+3330785280,3330785791,CA
3330785792,3330791423,US
3330791424,3330791679,CA
-3330791680,3330796543,US
-3330796544,3330796799,CA
-3330796800,3330812927,US
+3330791680,3330812927,US
3330812928,3330813951,CA
3330813952,3330815743,US
3330815744,3330815999,CA
@@ -66261,24 +71403,45 @@
3330866944,3330867199,CA
3330867200,3330883583,US
3330883584,3330884351,NL
-3330884352,3330889471,US
+3330884352,3330884863,US
+3330884864,3330885119,GB
+3330885120,3330888191,US
+3330888192,3330888703,AU
+3330888704,3330888959,US
+3330888960,3330889215,CH
+3330889216,3330889471,GB
3330889472,3330890239,JP
-3330890240,3330898431,US
+3330890240,3330890751,BE
+3330890752,3330891263,GB
+3330891264,3330892287,US
+3330892288,3330892543,FR
+3330892544,3330893567,US
+3330893568,3330893823,NL
+3330893824,3330894079,CA
+3330894080,3330894591,GB
+3330894592,3330894847,DE
+3330894848,3330897919,US
+3330897920,3330898175,CA
+3330898176,3330898431,DE
3330898432,3330898943,FR
3330898944,3330904575,US
3330904576,3330904831,CA
-3330904832,3331070463,US
-3331070464,3331070975,UM
-3331070976,3331098111,US
+3330904832,3331098111,US
3331098112,3331098367,CA
3331098368,3331102463,US
3331102464,3331102719,CA
3331102720,3331194879,US
3331194880,3331260415,AU
-3331260416,3331362815,US
+3331260416,3331356671,US
+3331356672,3331357183,BZ
+3331357184,3331362815,US
3331362816,3331366911,CA
-3331366912,3331527423,US
-3331527424,3331527679,GB
+3331366912,3331523583,US
+3331523584,3331523839,GB
+3331523840,3331524095,US
+3331524096,3331524607,SG
+3331524608,3331527167,US
+3331527168,3331527679,GB
3331527680,3331563519,US
3331563520,3331563775,CH
3331563776,3331565567,US
@@ -66305,14 +71468,17 @@
3331983104,3331983359,CA
3331983360,3331988479,US
3331988480,3331989503,CA
-3331989504,3332001791,US
-3332001792,3332003839,CA
-3332003840,3332028415,US
-3332028416,3332030463,CA
+3331989504,3332002047,US
+3332002048,3332002559,CA
+3332002560,3332002815,US
+3332002816,3332003583,CA
+3332003584,3332028415,US
+3332028416,3332028927,CA
+3332028928,3332029183,US
+3332029184,3332030463,CA
3332030464,3332083967,US
3332083968,3332084223,AU
-3332084224,3332389375,US
-3332389888,3332423423,US
+3332084224,3332423423,US
3332423424,3332423679,CA
3332423680,3332440319,US
3332440320,3332460543,CA
@@ -66329,8 +71495,7 @@
3332491264,3332492031,US
3332492032,3332500735,CA
3332500736,3332500991,US
-3332500992,3332501247,CA
-3332501504,3332503039,CA
+3332500992,3332503039,CA
3332503040,3332503551,US
3332503552,3332505343,CA
3332505344,3332505855,US
@@ -66344,9 +71509,7 @@
3332562944,3332563455,US
3332563456,3332564479,CA
3332564480,3332564735,US
-3332564736,3332566783,CA
-3332566784,3332567039,US
-3332567040,3332570879,CA
+3332564736,3332570879,CA
3332570880,3332571391,US
3332571392,3332579327,CA
3332579328,3332581375,US
@@ -66401,18 +71564,16 @@
3332930560,3332931327,US
3332931328,3332947967,CA
3332947968,3332948223,US
-3332948224,3332964351,CA
-3332964352,3332964607,US
-3332964608,3332966143,CA
+3332948224,3332966143,CA
3332966144,3332966399,US
-3332966400,3332966911,CA
-3332967424,3332979967,CA
-3332979968,3332980223,US
+3332966400,3332979967,CA
+3332979968,3332980735,US
3332980736,3332988927,CA
3332988928,3332989951,US
3332989952,3332997119,CA
3332997120,3332997375,US
3332997376,3333008383,CA
+3333008384,3333008895,US
3333008896,3333012479,CA
3333012480,3333012991,US
3333012992,3333014015,CA
@@ -66424,7 +71585,14 @@
3333025280,3333029631,CA
3333029632,3333374975,US
3333374976,3333375231,IN
-3333375232,3333480191,US
+3333375232,3333385983,US
+3333385984,3333386239,JP
+3333386240,3333427967,US
+3333427968,3333428007,GB
+3333428008,3333428008,US
+3333428009,3333428223,GB
+3333428224,3333476607,US
+3333477376,3333480191,US
3333480192,3333481471,DE
3333481472,3333517823,US
3333517824,3333518335,CA
@@ -66434,18 +71602,32 @@
3333593856,3333594111,CA
3333594112,3333609733,US
3333609734,3333609734,AU
-3333609735,3333613567,US
-3333613824,3333614591,US
+3333609735,3333614591,US
3333614592,3333614847,GB
3333614848,3333624319,US
3333624320,3333624575,CA
3333624576,3333675775,US
3333675776,3333676031,CA
-3333676032,3333705727,US
+3333676032,3333701887,US
+3333701888,3333702143,GB
+3333702144,3333702399,US
+3333702400,3333702655,CH
+3333702656,3333705727,US
3333705728,3333709567,GB
-3333709568,3333721599,US
-3333721600,3333721855,JP
-3333721856,3333781503,US
+3333709568,3333710591,US
+3333710592,3333710847,IT
+3333710848,3333711359,GB
+3333711360,3333712127,DE
+3333712128,3333712383,CH
+3333712384,3333712639,DE
+3333712640,3333716223,US
+3333716224,3333716735,CA
+3333716736,3333716991,GB
+3333716992,3333717247,AU
+3333717248,3333717503,FR
+3333717504,3333717759,SG
+3333717760,3333718015,NL
+3333718016,3333781503,US
3333781504,3333783551,CA
3333783552,3333801727,US
3333801728,3333801983,CA
@@ -66461,21 +71643,21 @@
3333988608,3333988863,BR
3333988864,3333997823,US
3333997824,3333998079,CA
-3333998080,3334006527,US
-3334006528,3334006783,NL
-3334006784,3334020095,US
+3333998080,3334006781,US
+3334006782,3334006782,NL
+3334006783,3334020095,US
3334020096,3334021119,CA
-3334021120,3334111487,US
-3334111744,3334138623,US
+3334021120,3334138623,US
3334138624,3334138879,BM
3334138880,3334187775,US
3334187776,3334188031,BM
-3334188032,3334205183,US
-3334205440,3334932223,US
+3334188032,3334932223,US
3334932224,3334932479,CA
3334932480,3334934015,US
3334934016,3334934527,CA
-3334934528,3334995967,US
+3334934528,3334962431,US
+3334962432,3334963199,NL
+3334963200,3334995967,US
3334995968,3334998527,PH
3334998528,3335004655,US
3335004656,3335004671,CN
@@ -66495,7 +71677,9 @@
3335440384,3335441151,CH
3335441152,3335458815,US
3335458816,3335460863,BM
-3335460864,3335524351,US
+3335460864,3335475199,US
+3335475200,3335475455,DE
+3335475456,3335524351,US
3335524352,3335524607,AU
3335524608,3335573759,US
3335573760,3335574015,IN
@@ -66550,19 +71734,29 @@
3337355008,3337650175,US
3337650176,3337650431,GB
3337650432,3337650943,US
-3337650944,3337651199,HK
-3337651200,3337651455,CH
+3337650944,3337651455,CH
3337651456,3337651711,SG
-3337651712,3337682943,CH
+3337651712,3337654783,CH
+3337654784,3337655039,AU
+3337655040,3337682943,CH
3337682944,3337892607,US
3337892608,3337892671,HK
-3337892672,3337895935,US
+3337892672,3337893119,US
+3337893120,3337893631,CN
+3337893632,3337895679,US
+3337895680,3337895935,CN
3337895936,3337900031,PR
3337900032,3337948671,US
3337948672,3337949183,CA
3337949184,3337957375,US
-3337957376,3337961471,CA
-3337961472,3337969663,US
+3337957376,3337958399,CA
+3337958400,3337960447,US
+3337960448,3337961471,CA
+3337961472,3337961727,US
+3337961728,3337961983,CA
+3337961984,3337963391,US
+3337963392,3337963519,CA
+3337963520,3337969663,US
3337969664,3337973759,PR
3337973760,3337977855,CA
3337977856,3337980671,US
@@ -66579,11 +71773,91 @@
3338021888,3338022911,CA
3338022912,3338069247,US
3338069248,3338069759,BB
-3338069760,3338248959,US
-3338248960,3338249215,CA
-3338249216,3338261503,US
-3338261504,3338261759,CA
-3338261760,3338350591,US
+3338069760,3338207487,US
+3338207488,3338207743,CA
+3338207744,3338208511,US
+3338208512,3338208767,CA
+3338208768,3338211583,US
+3338211584,3338212095,CA
+3338212096,3338215423,US
+3338215424,3338215935,CA
+3338215936,3338216447,US
+3338216448,3338216703,CA
+3338216704,3338217215,US
+3338217216,3338217471,CA
+3338217472,3338220543,US
+3338220544,3338221055,CA
+3338221056,3338222847,US
+3338222848,3338223359,CA
+3338223360,3338228735,US
+3338228736,3338228991,CA
+3338228992,3338229759,US
+3338229760,3338230015,CA
+3338230016,3338230527,US
+3338230528,3338230783,CA
+3338230784,3338231807,US
+3338231808,3338232063,CA
+3338232064,3338233599,US
+3338233600,3338233855,VG
+3338233856,3338235135,US
+3338235136,3338235391,CA
+3338235392,3338235647,US
+3338235648,3338235903,CA
+3338235904,3338236671,US
+3338236672,3338236927,CA
+3338236928,3338238975,US
+3338238976,3338239231,CA
+3338239232,3338239999,US
+3338240000,3338240255,CA
+3338240256,3338241535,US
+3338241536,3338242047,CA
+3338242048,3338246143,US
+3338246144,3338246399,CA
+3338246400,3338246655,US
+3338246656,3338247167,CA
+3338247168,3338247423,US
+3338247424,3338247679,CA
+3338247680,3338247935,US
+3338247936,3338249215,CA
+3338249216,3338249727,US
+3338249728,3338249983,CA
+3338249984,3338250751,US
+3338250752,3338251775,CA
+3338251776,3338252543,US
+3338252544,3338252799,CA
+3338252800,3338253311,US
+3338253312,3338253567,CA
+3338253568,3338254079,US
+3338254080,3338254335,CA
+3338254336,3338255615,US
+3338255616,3338255871,CA
+3338255872,3338257407,US
+3338257408,3338257663,CA
+3338257664,3338257919,US
+3338257920,3338258175,CA
+3338258176,3338258431,US
+3338258432,3338258687,CA
+3338258688,3338259455,US
+3338259456,3338259711,CA
+3338259712,3338260735,US
+3338260736,3338261759,CA
+3338261760,3338262527,US
+3338262528,3338263039,CA
+3338263040,3338264063,US
+3338264064,3338264575,CA
+3338264576,3338265855,US
+3338265856,3338266623,CA
+3338266624,3338267647,US
+3338267648,3338268159,CA
+3338268160,3338269183,US
+3338269184,3338270207,CA
+3338270208,3338270719,US
+3338270720,3338271231,CA
+3338271232,3338271487,US
+3338271488,3338271743,CA
+3338271744,3338271999,US
+3338272000,3338272255,CA
+3338272256,3338350591,US
3338350592,3338354687,CA
3338354688,3338371071,US
3338371072,3338403839,CA
@@ -66603,15 +71877,14 @@
3338770432,3338772479,PR
3338772480,3338825727,US
3338825728,3338827775,AW
-3338827776,3338934015,US
-3338934016,3338934271,GB
-3338934272,3338935039,US
+3338827776,3338912767,US
+3338912768,3338913023,EC
+3338913024,3338935039,US
3338935040,3338935295,GB
3338935296,3338964991,US
3338964992,3338965247,CA
3338965248,3338969343,US
-3338969600,3338993407,US
-3338993664,3339000319,US
+3338969600,3339000319,US
3339000832,3339028735,US
3339028992,3339031295,US
3339031552,3339045119,US
@@ -66621,19 +71894,26 @@
3339059886,3339063039,US
3339063296,3339075583,US
3339075584,3339076863,GB
-3339076864,3339077631,JP
-3339077632,3339079679,US
+3339076864,3339077631,NO
+3339077632,3339077887,SG
+3339077888,3339079167,US
+3339079168,3339079423,DK
+3339079424,3339079679,CA
3339079680,3339080703,IT
-3339080704,3339080959,US
+3339080704,3339080959,FR
3339080960,3339081727,HK
-3339081728,3339081983,US
+3339081728,3339081983,NL
3339081984,3339082751,FR
-3339082752,3339091967,US
+3339082752,3339086335,US
+3339086336,3339086591,JP
+3339086592,3339091967,US
3339091968,3339092991,NL
-3339092992,3339142655,US
+3339092992,3339093503,US
+3339093504,3339094015,NL
+3339094016,3339142655,US
3339142656,3339142911,NL
3339142912,3339146239,US
-3339146752,3339147007,US
+3339146496,3339147007,US
3339147008,3339147775,CA
3339147776,3339148031,MS
3339148032,3339153407,US
@@ -66645,7 +71925,9 @@
3339165696,3339167743,US
3339167744,3339168767,PR
3339168768,3339177983,US
-3339177984,3339179007,PR
+3339177984,3339178495,PR
+3339178496,3339178751,DO
+3339178752,3339179007,PR
3339179008,3339180031,US
3339180032,3339181055,CA
3339181056,3339184127,US
@@ -66664,19 +71946,29 @@
3339656192,3339667967,US
3339668480,3339669503,US
3339669504,3339671807,CA
-3339672576,3339728591,US
+3339672576,3339679487,US
+3339679488,3339679743,CN
+3339679744,3339728591,US
3339728592,3339728599,IN
3339728600,3339728895,US
3339728896,3339729919,AG
3339729920,3339743231,US
3339743232,3339744255,CA
3339744256,3339747327,US
-3339747328,3339748351,CA
+3339747328,3339747583,CA
+3339747584,3339747839,FR
+3339747840,3339748351,CA
3339748352,3339753471,US
3339753472,3339754495,CA
3339754496,3339760639,US
3339760640,3339761663,CA
-3339761664,3339923455,US
+3339761664,3339766047,US
+3339766048,3339766055,DE
+3339766056,3339766183,US
+3339766184,3339766191,AU
+3339766192,3339767007,US
+3339767008,3339767015,DE
+3339767016,3339923455,US
3339923456,3339926015,CA
3339926528,3339927551,CA
3339927552,3339934719,US
@@ -66724,7 +72016,9 @@
3340490752,3340492799,CA
3340492800,3340493567,US
3340493568,3340493823,HK
-3340493824,3340664831,US
+3340493824,3340584703,US
+3340584704,3340584959,KW
+3340584960,3340664831,US
3340664832,3340665855,CA
3340665856,3340677119,US
3340677120,3340679167,CA
@@ -66737,12 +72031,13 @@
3340849408,3340849663,US
3340850176,3340857343,US
3340857344,3340858367,CA
-3340859136,3340861439,US
-3340861952,3340865279,US
+3340859136,3340865279,US
3340865536,3340923391,US
3340923904,3340925815,US
3340925816,3340925823,AU
-3340925824,3341027839,US
+3340925824,3340926295,US
+3340926296,3340926303,DE
+3340926304,3341027839,US
3341028352,3341031935,US
3341032448,3341082623,US
3341082624,3341084671,CA
@@ -66764,7 +72059,15 @@
3341340160,3341340415,CZ
3341340416,3341439200,US
3341439201,3341439201,CA
-3341439202,3341484287,US
+3341439202,3341444863,US
+3341444864,3341445631,DE
+3341445632,3341464575,US
+3341464576,3341464831,GB
+3341464832,3341470207,US
+3341470208,3341470463,GB
+3341470464,3341479935,US
+3341479936,3341480447,DE
+3341480448,3341484287,US
3341484288,3341485055,CA
3341485056,3341488639,US
3341488640,3341488895,JP
@@ -66774,7 +72077,8 @@
3341495808,3341500159,US
3341500160,3341500415,HK
3341500416,3341511679,US
-3341511680,3341517823,CA
+3341511680,3341513215,CA
+3341513728,3341517823,CA
3341517824,3341518847,US
3341518848,3341520895,CA
3341520896,3341521663,US
@@ -66787,7 +72091,23 @@
3341546240,3341547007,CA
3341547008,3341547519,CH
3341547520,3341549567,CA
-3341549568,3341709311,US
+3341549568,3341631999,US
+3341632000,3341632767,CA
+3341632768,3341634815,US
+3341634816,3341635071,CA
+3341635072,3341641727,US
+3341641728,3341642239,CA
+3341642240,3341642495,US
+3341642496,3341642751,CA
+3341642752,3341643519,US
+3341643520,3341643775,CA
+3341643776,3341644287,US
+3341644288,3341644799,CA
+3341644800,3341645055,US
+3341645056,3341645567,CA
+3341645568,3341646079,US
+3341646080,3341646591,CA
+3341646592,3341709311,US
3341709312,3341710335,CA
3341710336,3341727999,US
3341728000,3341728255,AU
@@ -66836,14 +72156,19 @@
3342565376,3342567423,CA
3342567424,3342579711,US
3342579712,3342581759,CA
-3342581760,3342595071,US
-3342595072,3342596095,CA
+3342581760,3342585599,US
+3342585600,3342585855,MU
+3342585856,3342595071,US
+3342595072,3342595583,CA
+3342595584,3342596095,FR
3342596096,3342598143,US
3342598144,3342603263,CA
3342603264,3342604799,US
3342604800,3342605311,CA
3342605312,3342605567,US
-3342605568,3342627839,CA
+3342605568,3342614271,CA
+3342614528,3342623743,CA
+3342624256,3342627839,CA
3342628096,3342663423,CA
3342663680,3342831103,US
3342831104,3342831359,IN
@@ -66851,9 +72176,7 @@
3343013888,3343015935,CA
3343015936,3343055871,US
3343055872,3343056895,CA
-3343056896,3343127551,US
-3343127552,3343127807,GB
-3343127808,3343129087,US
+3343056896,3343129087,US
3343129600,3343153151,US
3343153152,3343154943,CA
3343154944,3343167487,US
@@ -66861,7 +72184,8 @@
3343169536,3343171583,US
3343171584,3343172607,BM
3343172608,3343319295,US
-3343319296,3343346175,CA
+3343319296,3343342847,CA
+3343343104,3343346175,CA
3343346176,3343346687,US
3343346688,3343355391,CA
3343355392,3343355903,US
@@ -66870,8 +72194,18 @@
3343364096,3343365631,US
3343365632,3343366655,CA
3343366912,3343372543,CA
-3343372800,3343380479,US
-3343380480,3343384575,CA
+3343372800,3343378511,US
+3343378512,3343378519,GB
+3343378520,3343378535,US
+3343378536,3343378543,GB
+3343378544,3343378575,US
+3343378576,3343378583,GB
+3343378584,3343378823,US
+3343378824,3343378839,SE
+3343378840,3343379079,US
+3343379080,3343379087,SE
+3343379088,3343380479,US
+3343380480,3343384319,CA
3343384576,3343456511,US
3343456768,3343460863,US
3343460864,3343461375,CA
@@ -66880,8 +72214,8 @@
3343466496,3343470847,US
3343471104,3343557119,US
3343557376,3343858687,US
-3343858688,3343859711,VG
-3343859712,3344111871,US
+3343858688,3343859199,VG
+3343859200,3344111871,US
3344112128,3344116223,US
3344116224,3344116735,CA
3344116736,3344126975,US
@@ -66898,9 +72232,10 @@
3344158720,3344166911,US
3344166912,3344168959,CA
3344168960,3344171263,US
-3344171264,3344236543,CA
+3344171264,3344236287,CA
3344236544,3344237055,US
-3344237056,3344242175,CA
+3344237056,3344238335,CA
+3344238592,3344242175,CA
3344242176,3344242687,US
3344242688,3344255999,CA
3344256000,3344261631,US
@@ -66922,7 +72257,8 @@
3344299776,3344300543,CA
3344300544,3344300799,US
3344300800,3344301823,CA
-3344302080,3344379903,US
+3344302080,3344367871,US
+3344368128,3344379903,US
3344379904,3344380927,CA
3344380928,3344406527,US
3344406528,3344408575,CA
@@ -66943,7 +72279,9 @@
3344637952,3344649215,US
3344649216,3344650239,PR
3344650240,3344652287,CA
-3344652288,3344658431,US
+3344652288,3344654335,US
+3344654336,3344656383,VG
+3344656384,3344658431,US
3344658432,3344660479,CA
3344660480,3344670719,US
3344670720,3344671231,GP
@@ -66957,7 +72295,13 @@
3344681984,3344685055,CA
3344685056,3344694271,US
3344694272,3344695295,CA
-3344695296,3344964607,US
+3344695296,3344937471,US
+3344937472,3344937983,EG
+3344937984,3344938239,US
+3344938240,3344938495,UZ
+3344938496,3344955391,US
+3344955392,3344955647,GB
+3344955648,3344964607,US
3344964608,3344965631,CA
3344965632,3344973823,US
3344973824,3344974847,BM
@@ -67033,7 +72377,8 @@
3345446656,3345446911,IT
3345446912,3345447679,US
3345447680,3345448447,FR
-3345448448,3345448959,BE
+3345448448,3345448703,BE
+3345448704,3345448959,DE
3345448960,3346140671,US
3346141184,3346188799,US
3346189312,3346196479,US
@@ -67064,14 +72409,17 @@
3346497536,3346498559,CA
3346498560,3346520063,US
3346520064,3346521087,CA
-3346521088,3346524159,US
+3346521088,3346523135,US
+3346523136,3346523391,BO
+3346523392,3346523647,RU
+3346523648,3346523903,US
+3346523904,3346524159,FR
3346524160,3346525183,CA
3346525184,3346528255,US
3346528256,3346529279,PR
3346529280,3346530303,CA
3346530304,3346545151,US
-3346545664,3346568703,US
-3346569216,3346591231,US
+3346545664,3346591487,US
3346591488,3346591743,CA
3346591744,3346663167,US
3346663168,3346663423,CA
@@ -67085,20 +72433,28 @@
3346799616,3346807295,US
3346807808,3346923519,US
3346923520,3346989055,CA
-3346989056,3346999807,US
+3346989056,3346998527,US
+3346998528,3346998783,CA
+3346998784,3346999807,US
3347000320,3347015647,US
3347015648,3347015663,AE
3347015664,3347016703,US
3347016704,3347017727,CA
3347017728,3347021823,US
3347021824,3347022847,CA
-3347022848,3347033087,US
+3347022848,3347030527,US
+3347030528,3347030783,IN
+3347030784,3347033087,US
3347033088,3347034111,CA
3347034112,3347039231,US
3347039232,3347040255,DM
-3347040256,3349273087,US
+3347040256,3349268479,US
+3349268480,3349268991,CA
+3349268992,3349273087,US
3349273088,3349273343,CA
-3349273344,3349446911,US
+3349273344,3349341695,US
+3349341696,3349341951,CA
+3349341952,3349446911,US
3349446912,3349447167,CA
3349447168,3349463039,US
3349463040,3349463295,CA
@@ -67109,14 +72465,18 @@
3349533952,3349545215,US
3349545216,3349545727,CA
3349545728,3349545983,US
-3349545984,3349551103,CA
+3349545984,3349549567,CA
+3349550080,3349551103,CA
3349551104,3349553663,US
-3349553664,3349607423,CA
+3349553664,3349605375,CA
+3349605632,3349607423,CA
3349607936,3349608447,CA
3349608448,3349609471,US
3349609472,3349610239,CA
3349610240,3349614591,US
-3349614592,3349617663,CA
+3349614592,3349616127,CA
+3349616128,3349616639,US
+3349616640,3349617663,CA
3349617664,3349637119,US
3349637120,3349639167,CA
3349639168,3349640191,US
@@ -67135,8 +72495,12 @@
3349733376,3349739519,US
3349739520,3349740543,CA
3349740544,3349987327,US
-3349987328,3350003711,BM
-3350003712,3350134783,US
+3349987328,3349996543,BM
+3349996544,3349997055,KY
+3349997056,3350003711,BM
+3350003712,3350042879,US
+3350042880,3350043135,KW
+3350043136,3350134783,US
3350134784,3350146047,CA
3350146048,3350150143,US
3350150144,3350160639,CA
@@ -67151,7 +72515,11 @@
3350475776,3350476799,CA
3350476800,3350487039,US
3350487040,3350488063,CA
-3350488064,3350505471,US
+3350488064,3350491647,US
+3350491648,3350491903,PL
+3350491904,3350501631,US
+3350501632,3350501887,MX
+3350501888,3350505471,US
3350505472,3350507519,CA
3350507520,3350548735,US
3350548736,3350548991,CA
@@ -67214,12 +72582,10 @@
3351035904,3351036927,US
3351036928,3351037951,CA
3351037952,3351043071,US
-3351043072,3351043327,CA
-3351043328,3351043583,FR
+3351043072,3351043583,FR
3351043584,3351044095,CA
3351044096,3351058943,US
-3351059456,3351068159,US
-3351068672,3351071743,US
+3351059456,3351071743,US
3351071744,3351072767,CA
3351072768,3351074815,US
3351074816,3351076863,CA
@@ -67227,8 +72593,8 @@
3351080960,3351081983,AG
3351081984,3351086079,US
3351086080,3351087103,CA
-3351087104,3351094271,US
-3351094272,3351095295,CA
+3351087104,3351094527,US
+3351094528,3351095295,CA
3351095296,3351103487,US
3351103488,3351104511,CA
3351104512,3351104639,JP
@@ -67243,7 +72609,11 @@
3351112704,3351113727,CA
3351113728,3351167487,US
3351168512,3351171327,US
-3351171584,3351275519,US
+3351171584,3351196159,US
+3351196672,3351197183,US
+3351197696,3351232511,US
+3351232512,3351232767,IL
+3351232768,3351275519,US
3351275520,3351276543,CA
3351276544,3351293951,US
3351293952,3351294975,CA
@@ -67252,8 +72622,7 @@
3351298048,3351303167,US
3351303168,3351304191,CA
3351304192,3351306239,US
-3351306240,3351307007,VC
-3351307008,3351307263,LC
+3351306240,3351307263,VC
3351307264,3351308287,US
3351308288,3351310335,CA
3351310336,3351318015,US
@@ -67263,23 +72632,123 @@
3351336960,3351339007,CA
3351339008,3351357439,US
3351357440,3351359487,CA
-3351359488,3351372799,US
+3351359488,3351364607,US
+3351364608,3351365119,AU
+3351365120,3351372799,US
3351372800,3351373823,BM
-3351373824,3351382271,US
+3351373824,3351380223,US
+3351380224,3351380479,CA
+3351380480,3351380735,US
+3351380736,3351381759,CA
+3351381760,3351382271,US
3351382272,3351382527,CA
-3351382528,3351390463,US
-3351390464,3351390719,CA
-3351390720,3351447039,US
+3351382528,3351383039,US
+3351383040,3351383295,CA
+3351383296,3351384319,US
+3351384320,3351384575,CA
+3351384576,3351385343,US
+3351385344,3351385599,CA
+3351385600,3351386623,US
+3351386624,3351386879,CA
+3351386880,3351387135,US
+3351387136,3351387391,CA
+3351387392,3351387903,US
+3351387904,3351388159,CA
+3351388160,3351388927,US
+3351388928,3351389439,CA
+3351389440,3351390463,US
+3351390464,3351390975,CA
+3351390976,3351394815,US
+3351394816,3351395071,CA
+3351395072,3351396095,US
+3351396096,3351396351,CA
+3351396352,3351397375,US
+3351397376,3351397631,CA
+3351397632,3351397887,US
+3351397888,3351398143,CA
+3351398144,3351398399,US
+3351398400,3351398655,CA
+3351398656,3351398911,US
+3351398912,3351399167,CA
+3351399168,3351399423,US
+3351399424,3351399935,CA
+3351399936,3351400191,US
+3351400192,3351400447,CA
+3351400448,3351400959,US
+3351400960,3351401215,CA
+3351401216,3351401983,US
+3351401984,3351402239,CA
+3351402240,3351402495,US
+3351402496,3351403775,CA
+3351403776,3351404031,US
+3351404032,3351404287,CA
+3351404288,3351405311,US
+3351405312,3351405567,CA
+3351405568,3351405823,US
+3351405824,3351406079,CA
+3351406080,3351407103,US
+3351407104,3351407359,CA
+3351407360,3351407615,US
+3351407616,3351407871,CA
+3351407872,3351408895,US
+3351408896,3351409407,CA
+3351409408,3351410687,US
+3351410688,3351410943,CA
+3351410944,3351411711,US
+3351411712,3351411967,CA
+3351411968,3351412223,US
+3351412224,3351412479,CA
+3351412480,3351412735,US
+3351412736,3351413247,CA
+3351413248,3351413503,US
+3351413504,3351413759,CA
+3351413760,3351414271,US
+3351414272,3351414783,CA
+3351414784,3351415039,US
+3351415040,3351415551,CA
+3351415552,3351415807,US
+3351415808,3351416063,CA
+3351416064,3351417087,US
+3351417088,3351417599,CA
+3351417600,3351419647,US
+3351419648,3351419903,CA
+3351419904,3351423743,US
+3351423744,3351423999,PR
+3351424000,3351428351,US
+3351428352,3351428607,CA
+3351428608,3351436031,US
+3351436032,3351436287,CA
+3351436288,3351436543,US
+3351436544,3351436799,PR
+3351436800,3351437055,US
+3351437056,3351437311,CA
+3351437312,3351437567,US
+3351437568,3351437823,CA
+3351437824,3351438079,US
+3351438080,3351438335,CA
+3351438336,3351438591,US
+3351438592,3351439103,CA
+3351439104,3351441151,US
+3351441152,3351441407,CA
+3351441408,3351441919,US
+3351441920,3351442175,CA
+3351442176,3351447039,US
3351447552,3351449087,US
3351449600,3351474687,US
-3351475200,3351483391,US
+3351475200,3351475711,US
+3351475712,3351475967,IS
+3351475968,3351483391,US
3351483392,3351484415,CA
3351484416,3351485439,US
-3351485440,3351488511,CA
+3351485440,3351485695,CA
+3351485696,3351486463,US
+3351486464,3351488511,CA
3351488512,3351494911,US
3351494912,3351495679,SG
3351495680,3351495935,US
-3351495936,3351496703,SG
+3351495936,3351496191,SG
+3351496192,3351496447,US
+3351496448,3351496703,SG
3351496704,3351497727,US
3351497728,3351498751,CA
3351498752,3351501823,US
@@ -67287,7 +72756,9 @@
3351502848,3351503871,US
3351503872,3351504895,CA
3351504896,3351512575,US
-3351513088,3351579135,US
+3351513088,3351524095,US
+3351524096,3351524351,GB
+3351524352,3351579135,US
3351579648,3351642111,US
3351642112,3351695871,CA
3351696384,3351696639,CA
@@ -67304,10 +72775,15 @@
3351869440,3351871487,CA
3351871488,3351895551,US
3351895552,3351895807,CA
-3351895808,3351896319,US
-3351896576,3351904255,US
-3351912448,3351959551,CA
-3351961600,3351969791,CA
+3351895808,3351904255,US
+3351904256,3351927551,CA
+3351927552,3351927807,US
+3351927808,3351959551,CA
+3351959552,3351961599,US
+3351961600,3351963647,CA
+3351963648,3351969279,US
+3351969280,3351969535,CA
+3351969536,3351969791,US
3351969792,3352035327,IL
3352035328,3352036351,CA
3352036352,3352046591,US
@@ -67318,9 +72794,7 @@
3352066048,3352067071,CA
3352067072,3352068095,US
3352068096,3352069119,CA
-3352069120,3352082431,US
-3352082432,3352083455,JM
-3352083456,3352088575,US
+3352069120,3352088575,US
3352088576,3352090623,CA
3352090624,3352094719,US
3352094720,3352096767,VG
@@ -67328,7 +72802,7 @@
3352559872,3352563199,CA
3352563200,3352563455,US
3352563456,3352573951,CA
-3352573952,3352574207,US
+3352573952,3352574463,US
3352574464,3352581631,CA
3352582144,3352583935,CA
3352583936,3352584191,US
@@ -67340,13 +72814,19 @@
3352887296,3352918015,US
3352918016,3352919039,CA
3352919040,3353309695,US
-3353310208,3353722367,US
+3353310208,3353653503,US
+3353653504,3353653759,GB
+3353653760,3353722367,US
3353722368,3353722623,GB
-3353722624,3353730047,US
+3353722624,3353729023,US
+3353729024,3353729279,HK
+3353729280,3353730047,US
3353730048,3353731071,CA
3353731072,3353731487,US
3353731488,3353731503,AU
-3353731504,3353736191,US
+3353731504,3353732607,US
+3353732608,3353732863,DE
+3353732864,3353736191,US
3353736192,3353736703,PR
3353736704,3353737215,US
3353737216,3353737471,GB
@@ -67357,14 +72837,19 @@
3353856000,3353858047,CA
3353858048,3353861119,US
3353861120,3353862143,CA
-3353862144,3353884927,US
+3353862144,3353862719,US
+3353862720,3353862751,CA
+3353862752,3353864447,US
+3353864448,3353864703,CA
+3353864704,3353864959,US
+3353864960,3353865215,CA
+3353865216,3353884927,US
3353884928,3353885183,GB
3353885184,3353942527,US
3353942528,3353943039,CA
3353943040,3353960191,US
3353960192,3353960447,CA
-3353960448,3353968895,US
-3353969152,3353979647,US
+3353960448,3353979647,US
3353979648,3353979903,CA
3353979904,3353982719,US
3353982720,3353983231,CA
@@ -67376,7 +72861,9 @@
3354494976,3354499071,US
3354499072,3354501119,AU
3354501120,3354503167,CA
-3354503168,3354532351,US
+3354503168,3354513151,US
+3354513152,3354513407,CA
+3354513408,3354532351,US
3354532864,3354571775,US
3354572288,3354591231,US
3354591232,3354656767,CA
@@ -67386,11 +72873,7 @@
3354677248,3354687487,US
3354687488,3354688511,CA
3354688512,3354720767,US
-3354721280,3354731007,US
-3354731008,3354731018,GB
-3354731019,3354731019,US
-3354731020,3354731263,GB
-3354731264,3354758655,US
+3354721280,3354758655,US
3354759168,3354770687,US
3354770688,3354770943,CA
3354770944,3354788095,US
@@ -67412,16 +72895,13 @@
3355017216,3355052031,US
3355052032,3355052287,CA
3355052288,3355052543,AU
-3355052544,3355053567,CA
+3355052544,3355053311,CA
+3355053312,3355053567,US
3355054080,3355249151,US
3355249664,3355253247,US
3355253760,3355260927,US
3355260928,3355262719,CA
-3355262720,3355271935,US
-3355271936,3355272189,GB
-3355272190,3355272190,US
-3355272191,3355272191,GB
-3355272192,3355310591,US
+3355262720,3355310591,US
3355310592,3355311103,CA
3355311104,3355319295,US
3355319296,3355320319,CA
@@ -67437,12 +72917,13 @@
3355384832,3355385855,CA
3355385856,3355407359,US
3355407360,3355408383,PR
-3355408384,3355431167,US
-3355431168,3355431423,SA
-3355431424,3355432959,US
+3355408384,3355412479,US
+3355412480,3355412991,BE
+3355412992,3355432959,US
3355432960,3355435007,CA
3355435008,3355443199,US
-3355443200,3355445247,CO
+3355443200,3355443200,GB
+3355443201,3355445247,CO
3355445248,3355447295,BR
3355447296,3355447551,CU
3355447552,3355447807,AR
@@ -67452,8 +72933,7 @@
3355448832,3355449343,SX
3355449344,3355450367,CU
3355450368,3355451391,EC
-3355451392,3355455487,BR
-3355457536,3355459071,BR
+3355451392,3355459071,BR
3355459328,3355459583,EC
3355459584,3355459839,PA
3355459840,3355460095,VE
@@ -67538,6 +73018,7 @@
3355557888,3355559935,CO
3355559936,3355561983,PY
3355561984,3355564031,SR
+3355564032,3355566079,BR
3355566080,3355574271,AR
3355574272,3355576319,CL
3355576320,3355578367,VE
@@ -67545,6 +73026,7 @@
3355582464,3355590655,UY
3355590656,3355592703,CO
3355592704,3355599871,CL
+3355599872,3355600895,BR
3355600896,3355604991,CL
3355604992,3355607039,AR
3355607040,3355615231,HT
@@ -67601,10 +73083,7 @@
3355843584,3355844863,EC
3355844864,3355845119,CL
3355845120,3355845375,EC
-3355845376,3355845631,BR
-3355846144,3355847679,BR
-3355848192,3355848447,BR
-3355849216,3355849727,AR
+3355845376,3355848703,BR
3355849728,3355849983,PA
3355849984,3355850495,CL
3355850496,3355850751,NI
@@ -67613,10 +73092,12 @@
3355856640,3355856895,PA
3355856896,3355858943,EC
3355860992,3355869183,CL
-3355870208,3355870719,BR
+3355869184,3355870719,BR
3355870720,3355871231,CR
+3355871232,3355873279,BR
3355873280,3355875327,BQ
-3355875328,3355877375,VE
+3355875328,3355876351,MX
+3355876352,3355877375,VE
3355877376,3355885567,CO
3355885568,3355901951,GT
3355901952,3355902975,BR
@@ -67629,6 +73110,7 @@
3355918336,3355923455,EC
3355923456,3355924479,UY
3355924480,3355926527,TT
+3355930624,3355934719,BR
3355934720,3355939839,AR
3355939840,3355940863,SR
3355940864,3355942911,AR
@@ -67645,7 +73127,7 @@
3356041216,3356049407,CR
3356049408,3356049663,CL
3356049664,3356050175,BR
-3356050432,3356050687,BR
+3356050432,3356051455,BR
3356051456,3356051711,CO
3356051712,3356051967,CL
3356051968,3356052223,GT
@@ -67658,18 +73140,18 @@
3356057344,3356057599,BR
3356057600,3356057855,EC
3356057856,3356059135,CL
-3356059136,3356059903,BR
-3356060160,3356060671,BR
+3356059136,3356060671,BR
3356060672,3356061695,CL
3356061696,3356062463,BR
3356062464,3356062719,JM
3356062720,3356062975,BR
+3356062976,3356063231,CR
3356063232,3356063743,BR
3356064000,3356064255,BR
3356064256,3356064511,CL
3356065024,3356065791,BR
3356065792,3356066047,CL
-3356066048,3356067071,BR
+3356066048,3356067839,BR
3356068352,3356069119,BR
3356069120,3356069631,CL
3356069888,3356070143,BR
@@ -67828,7 +73310,15 @@
3356280832,3356282879,AR
3356282880,3356284927,PA
3356284928,3356286975,AR
-3356286976,3356291071,US
+3356286976,3356287487,US
+3356287488,3356287743,SV
+3356287744,3356288255,HN
+3356288256,3356288767,SV
+3356288768,3356289023,GT
+3356289024,3356289791,SV
+3356289792,3356290303,US
+3356290304,3356290559,SV
+3356290560,3356291071,CR
3356291072,3356293119,TT
3356293120,3356295167,AW
3356295168,3356297215,CL
@@ -67877,11 +73367,11 @@
3356390400,3356390655,AR
3356390656,3356391167,CL
3356391168,3356391423,PA
-3356393472,3356413695,CL
-3356413696,3356413823,CO
+3356393472,3356413439,CL
+3356413440,3356413823,CO
3356413824,3356420607,CL
-3356420608,3356420863,CO
-3356420864,3356421247,CL
+3356420608,3356420991,CO
+3356420992,3356421247,CL
3356421248,3356421375,CO
3356421376,3356421759,CL
3356421760,3356422015,CO
@@ -67926,6 +73416,7 @@
3356989952,3356996607,MX
3356997632,3357003007,MX
3357003776,3357007871,MX
+3357007872,3357011967,BR
3357011968,3357015551,MX
3357016064,3357018623,CO
3357020160,3357032447,CO
@@ -67952,20 +73443,27 @@
3357407232,3357409279,AR
3357409280,3357411327,BR
3357411328,3357412351,VE
-3357412352,3357412863,US
+3357412352,3357412863,PE
3357412864,3357413119,BR
-3357413120,3357414399,US
+3357413120,3357413375,FR
+3357413376,3357414399,US
3357414400,3357415423,PR
-3357415424,3357417471,US
+3357415424,3357415679,US
+3357415680,3357416447,MX
+3357416448,3357417215,VE
+3357417216,3357417471,US
3357417472,3357418495,CL
-3357418496,3357419007,US
+3357418496,3357418751,NI
+3357418752,3357419007,PR
3357419008,3357419519,GT
-3357419520,3357420031,US
+3357419520,3357420031,SZ
3357420032,3357421055,CO
-3357421056,3357421567,US
+3357421056,3357421311,CL
+3357421312,3357421567,CO
3357421568,3357422847,NI
-3357422848,3357423615,US
-3357423616,3357424639,VE
+3357422848,3357423103,PR
+3357423104,3357423359,CO
+3357423360,3357424639,VE
3357424640,3357425663,CL
3357425664,3357442047,CO
3357442048,3357442303,NI
@@ -67983,7 +73481,8 @@
3357442960,3357442967,SV
3357442968,3357443007,GT
3357443008,3357443071,SV
-3357443072,3357443583,GT
+3357443072,3357443327,NI
+3357443328,3357443583,GT
3357443584,3357444351,HN
3357444352,3357444479,GT
3357444480,3357444487,HN
@@ -68003,12 +73502,8 @@
3357451120,3357451127,HN
3357451128,3357451143,GT
3357451144,3357451151,HN
-3357451152,3357451343,GT
-3357451344,3357451351,HN
-3357451352,3357451375,GT
-3357451376,3357451383,HN
-3357451384,3357451503,GT
-3357451504,3357451519,HN
+3357451152,3357451263,GT
+3357451264,3357451519,HN
3357451520,3357451575,GT
3357451576,3357451583,NI
3357451584,3357452287,GT
@@ -68024,9 +73519,13 @@
3357454592,3357454847,NI
3357454848,3357455103,HN
3357455104,3357455359,SV
-3357455360,3357456639,GT
+3357455360,3357455871,GT
+3357455872,3357456127,NI
+3357456128,3357456639,GT
3357456640,3357456895,HN
-3357456896,3357458431,GT
+3357456896,3357457711,GT
+3357457712,3357457727,CR
+3357457728,3357458431,GT
3357458432,3357474815,CL
3357474816,3357475071,US
3357475072,3357475887,AR
@@ -68053,9 +73552,13 @@
3357477544,3357477551,EC
3357477552,3357477887,AR
3357477888,3357478911,CO
-3357478912,3357479135,AR
+3357478912,3357479063,AR
+3357479064,3357479071,CO
+3357479072,3357479135,AR
3357479136,3357479151,CO
-3357479152,3357479215,AR
+3357479152,3357479183,AR
+3357479184,3357479191,CO
+3357479192,3357479215,AR
3357479216,3357479223,CO
3357479224,3357479551,AR
3357479552,3357479679,CO
@@ -68071,7 +73574,9 @@
3357480360,3357480367,CO
3357480368,3357480463,AR
3357480464,3357480479,CO
-3357480480,3357480959,AR
+3357480480,3357480719,AR
+3357480720,3357480735,CO
+3357480736,3357480959,AR
3357480960,3357483007,EC
3357483008,3357491199,CL
3357491200,3357499391,CO
@@ -68116,17 +73621,21 @@
3357635072,3357635327,MX
3357635584,3357635839,MX
3357636096,3357637887,MX
+3357638656,3357640703,BR
3357640704,3357644799,MX
+3357644800,3357646847,BR
3357646848,3357647871,MX
3357648896,3357650431,MX
3357650944,3357657855,MX
3357658112,3357670655,MX
3357670912,3357712383,MX
-3357713408,3357715711,MX
+3357713408,3357715199,MX
+3357715456,3357715711,MX
3357715968,3357723903,MX
3357724416,3357725183,MX
3357725440,3357726463,MX
-3357727744,3357728767,MX
+3357728000,3357728767,MX
+3357728768,3357736959,BR
3357736960,3357745151,VE
3357745152,3357753343,CO
3357753344,3357757487,VE
@@ -68136,11 +73645,13 @@
3357775872,3357776127,US
3357776128,3357776383,UY
3357776384,3357776895,US
+3357776896,3357777919,CL
3357777920,3357786111,GT
3357786112,3357802495,VE
3357802496,3357868031,MX
3357868032,3357933567,PE
3357933568,3358015487,MX
+3358015488,3358023679,BR
3358023680,3358040063,MX
3358048256,3358064639,MX
3358064640,3358130175,UY
@@ -68161,21 +73672,22 @@
3358132992,3358133119,EC
3358133120,3358133247,AR
3358133248,3358133759,VE
-3358133760,3358142975,AR
+3358133760,3358142719,AR
+3358142720,3358142975,US
3358142976,3358143231,CO
3358143232,3358143487,AR
3358143488,3358143999,US
3358144000,3358144255,AR
3358144256,3358144511,CL
3358144512,3358145023,VE
-3358145024,3358149719,AR
-3358149720,3358149727,CO
-3358149728,3358150015,AR
+3358145024,3358149631,AR
+3358149632,3358149887,CO
+3358149888,3358150015,AR
3358150016,3358150143,CO
3358150144,3358150423,AR
3358150424,3358150431,CO
-3358150432,3358150495,AR
-3358150496,3358150655,CO
+3358150432,3358150479,AR
+3358150480,3358150655,CO
3358150656,3358150911,EC
3358150912,3358151263,AR
3358151264,3358151271,EC
@@ -68192,8 +73704,8 @@
3358152960,3358153087,EC
3358153088,3358153279,AR
3358153280,3358153311,US
-3358153312,3358153471,AR
-3358153472,3358153535,US
+3358153312,3358153343,AR
+3358153344,3358153535,US
3358153536,3358153599,AR
3358153600,3358153663,PR
3358153664,3358153703,AR
@@ -68315,7 +73827,9 @@
3358728192,3358736383,CL
3358736384,3358738175,BB
3358738176,3358738687,GD
-3358738688,3358744575,BB
+3358738688,3358739711,BB
+3358739712,3358739967,KN
+3358739968,3358744575,BB
3358744576,3358752767,CL
3358752768,3358756863,BB
3358756864,3358760959,CL
@@ -68325,8 +73839,11 @@
3358779392,3358781439,EC
3358781440,3358851071,AR
3358851072,3358855167,MX
+3358855168,3358859263,BR
3358859264,3358887935,MX
+3358887936,3358892031,HN
3358892032,3358918655,MX
+3358918656,3358920703,BR
3358924800,3358965759,MX
3358966784,3358967039,MX
3358973952,3358982143,MX
@@ -68351,6 +73868,7 @@
3359318016,3359356927,AR
3359356928,3359358975,VE
3359358976,3359363071,AR
+3359363072,3359367167,PA
3359367168,3359375359,AR
3359375360,3359440895,PE
3359440896,3359461951,AR
@@ -68368,16 +73886,17 @@
3359505664,3359505919,CW
3359505920,3359506431,AR
3359506432,3359508479,US
-3359508480,3359510527,VE
-3359510528,3359510815,US
-3359510816,3359510847,VE
-3359510848,3359511535,US
-3359511536,3359511543,VE
-3359511544,3359511807,US
-3359511808,3359512575,VE
-3359512576,3359514623,US
+3359508480,3359514623,VE
3359514624,3359514879,CL
-3359514880,3359522815,US
+3359514880,3359516671,US
+3359516672,3359516927,VG
+3359516928,3359517183,US
+3359517184,3359517439,VG
+3359517440,3359517695,US
+3359517696,3359517951,VG
+3359517952,3359520255,US
+3359520256,3359520767,AR
+3359520768,3359522815,US
3359522816,3359539199,NI
3359539200,3359571967,PE
3359571968,3359582207,AR
@@ -68386,7 +73905,8 @@
3359586304,3359588351,CL
3359588352,3359596543,AR
3359596544,3359598591,CL
-3359600640,3359621119,AR
+3359598592,3359599615,EC
+3359599616,3359621119,AR
3359621120,3359637503,EC
3359637504,3359789583,MX
3359789584,3359789599,US
@@ -68412,7 +73932,7 @@
3360161792,3360251903,CL
3360251904,3360253951,BO
3360253952,3360255999,SV
-3360258048,3360260095,CL
+3360256000,3360260095,CL
3360260096,3360276479,AR
3360276480,3360278527,VE
3360278528,3360280575,EC
@@ -68435,33 +73955,41 @@
3360456448,3360456703,US
3360456704,3360534527,MX
3360538624,3360667647,MX
+3360667648,3360669695,BR
3360669696,3360686079,MX
3360686080,3360705535,AR
3360705536,3360706047,US
-3360706048,3360707071,AR
-3360707072,3360707327,US
+3360706048,3360706815,AR
+3360706816,3360707327,US
3360707328,3360707583,AR
3360707584,3360708095,US
3360708096,3360708223,AR
3360708224,3360708351,US
3360708352,3360708991,AR
3360708992,3360709247,US
-3360709248,3360710271,AR
+3360709248,3360709631,AR
+3360709632,3360709759,US
+3360709760,3360710271,AR
3360710272,3360710399,US
-3360710400,3360710655,AR
+3360710400,3360710527,AR
+3360710528,3360710655,US
3360710656,3360718847,HT
3360718848,3360760575,AR
3360760576,3360760831,UY
3360760832,3360763903,AR
3360763904,3360765951,GT
3360765952,3360767999,CO
-3360768000,3360781839,AR
+3360768000,3360772351,AR
+3360772352,3360772479,BO
+3360772480,3360781839,AR
3360781840,3360781847,DO
-3360781848,3360782167,AR
+3360781848,3360781943,AR
+3360781944,3360781947,MX
+3360781948,3360782167,AR
3360782168,3360782175,MX
3360782176,3360788479,AR
3360788480,3360790527,CL
-3360792576,3360849919,AR
+3360790528,3360849919,AR
3360849920,3360882687,VE
3360882688,3360948223,CL
3360948224,3361013759,VE
@@ -68476,18 +74004,13 @@
3361054720,3361058815,NI
3361058816,3361062911,AR
3361062912,3361071103,CL
-3361071104,3361071455,VE
-3361071456,3361071471,CO
-3361071472,3361071631,VE
-3361071632,3361071635,CO
-3361071636,3361072127,VE
-3361072128,3361072639,CO
+3361071104,3361072639,CO
3361072640,3361072767,VE
3361072768,3361072895,CO
-3361072896,3361074431,VE
-3361074432,3361074687,CO
-3361074688,3361075199,VE
-3361075200,3361079295,CO
+3361072896,3361073151,VE
+3361073152,3361074175,CO
+3361074176,3361074431,VE
+3361074432,3361079295,CO
3361079296,3361144831,CL
3361144832,3361210367,BO
3361210368,3361275903,DO
@@ -68572,7 +74095,7 @@
3362476288,3362476543,AR
3362476544,3362477055,CR
3362477056,3362478079,BQ
-3362478080,3362480127,AR
+3362478080,3362484223,AR
3362486272,3362488319,HN
3362488320,3362504703,PE
3362504704,3362506751,VE
@@ -68620,13 +74143,14 @@
3362716672,3362717695,VE
3362717696,3362815999,CL
3362816000,3362832383,AR
-3362836480,3362838527,CO
+3362832384,3362838527,CO
3362838528,3362840575,EC
3362840576,3362897919,CL
3362897920,3362903551,HT
3362903552,3362904063,MX
3362904064,3362914303,HT
3362914304,3362930687,CO
+3362930688,3362934783,CL
3362934784,3362936831,AR
3362936832,3362938879,CL
3362938880,3362942975,AR
@@ -68641,7 +74165,9 @@
3362992128,3362996223,AR
3362996224,3363000319,UY
3363000320,3363004415,AR
-3363012608,3363024895,PA
+3363012608,3363013967,PA
+3363013968,3363013975,NI
+3363013976,3363024895,PA
3363024896,3363025151,HN
3363025152,3363025407,PA
3363025408,3363025663,CO
@@ -68665,7 +74191,9 @@
3363504128,3363512319,PE
3363512320,3363554047,AR
3363554048,3363554175,US
-3363554176,3363555839,AR
+3363554176,3363554943,AR
+3363554944,3363555071,US
+3363555072,3363555839,AR
3363555840,3363556223,US
3363556224,3363556351,AR
3363556352,3363556607,US
@@ -68696,6 +74224,8 @@
3363684352,3363708927,EC
3363708928,3363713023,CL
3363713024,3363713279,EC
+3363713536,3363714047,CL
+3363714048,3363717119,PE
3363717120,3363733503,CL
3363733504,3363831807,AR
3363831808,3364794367,BR
@@ -68704,9 +74234,7 @@
3368325120,3370487807,BR
3370491904,3370504191,BR
3370508288,3372732415,BR
-3372736512,3375493119,BR
-3375493376,3375493631,BR
-3375497216,3375874047,BR
+3372736512,3375874047,BR
3375878144,3376873471,BR
3376881664,3376922623,BR
3376926720,3377291263,BR
@@ -68716,27 +74244,28 @@
3380506880,3380507135,BR
3380507136,3380744191,MX
3380748288,3380760831,MX
+3380762624,3380764671,BR
3380764672,3380807167,MX
3380807680,3380808191,MX
3380808704,3380811775,MX
3380813824,3380815103,MX
-3380815872,3380818175,MX
-3380818944,3380820991,MX
-3380822016,3380822527,MX
+3380815872,3380816127,MX
+3380816896,3380817151,MX
+3380817920,3380818175,MX
+3380818944,3380822527,MX
3380824064,3380826111,MX
3380828160,3380828671,MX
3380830208,3380830463,MX
-3380831232,3380831487,MX
+3380831232,3380831743,MX
3380832256,3380832767,MX
3380833280,3380833791,MX
-3380834304,3380834559,MX
+3380834304,3380834815,MX
3380835328,3380835839,MX
3380836352,3380836607,MX
-3380838400,3380840447,MX
+3380837376,3380840447,MX
3380854784,3380858879,MX
-3380865024,3380866047,MX
-3380869120,3380869631,MX
-3380870144,3381350399,MX
+3380865024,3380867071,MX
+3380869120,3381350399,MX
3381354496,3381373951,MX
3381374976,3381377023,MX
3381379072,3381448703,MX
@@ -68761,13 +74290,12 @@
3382652928,3382653951,MX
3382657024,3382659071,MX
3382661120,3382662143,MX
-3382665216,3382668287,MX
+3382665216,3382669311,MX
3382673408,3382677503,MX
3382681600,3382683647,MX
3382685696,3382686719,MX
3382689792,3382695935,MX
-3382697984,3382788095,MX
-3382804480,3382853631,MX
+3382697984,3382853631,MX
3382902784,3383148543,MX
3383164928,3383295999,MX
3383361536,3383630843,MX
@@ -68826,6 +74354,8 @@
3386613760,3386621951,AR
3386621952,3386630143,CO
3386630144,3386632191,UY
+3386632192,3386634239,CL
+3386634240,3386636287,CO
3386637312,3386638335,UY
3386638336,3386640895,CW
3386640896,3386641151,US
@@ -68836,11 +74366,7 @@
3386645248,3386645503,CL
3386645504,3386645759,AR
3386645760,3386646015,CR
-3386646016,3386649855,CO
-3386649856,3386650111,VE
-3386650112,3386650623,CO
-3386650624,3386652671,VE
-3386652672,3386662911,CO
+3386646016,3386662911,CO
3386662912,3386671103,CL
3386671104,3386675199,HN
3386675200,3386687487,AR
@@ -68971,9 +74497,7 @@
3389071360,3389079551,PG
3389079552,3389087743,SG
3389087744,3389087999,HK
-3389088000,3389090815,SG
-3389090816,3389091071,HK
-3389091072,3389092351,SG
+3389088000,3389092351,SG
3389092352,3389092863,PH
3389092864,3389093887,AU
3389093888,3389095935,IN
@@ -69022,7 +74546,8 @@
3389214720,3389218815,NZ
3389218816,3389222911,AU
3389222912,3389223935,US
-3389223936,3389226239,IN
+3389223936,3389225983,IN
+3389225984,3389226239,SG
3389226240,3389226495,AU
3389226496,3389227007,IN
3389227008,3389227519,CN
@@ -69872,11 +75397,11 @@
3392692224,3392700415,IN
3392700416,3392708607,SG
3392708608,3392712703,ID
-3392712704,3392716799,AF
-3392716800,3392733695,IN
-3392733696,3392733951,ID
-3392733952,3392734207,IN
-3392734208,3392741375,ID
+3392712704,3392714751,AF
+3392714752,3392715007,FR
+3392715008,3392716799,AF
+3392716800,3392733183,IN
+3392733184,3392741375,ID
3392741376,3392765951,PH
3392765952,3392782335,TH
3392789504,3392790527,HK
@@ -69899,7 +75424,6 @@
3392830464,3392830719,ID
3392830720,3392830975,IN
3392830976,3392831231,TH
-3392831232,3392831487,IN
3392831488,3392832511,PG
3392832512,3392833535,IN
3392833536,3392835583,AU
@@ -69923,7 +75447,6 @@
3392861696,3392861951,PH
3392861952,3392862207,AU
3392864256,3392864511,CN
-3392864512,3392864767,AU
3392864768,3392865279,IN
3392865280,3392866303,NU
3392866304,3392880639,AU
@@ -70038,7 +75561,9 @@
3393189888,3393190911,CN
3393190912,3393191167,IN
3393191424,3393191935,SB
-3393191936,3393257471,HK
+3393191936,3393222911,HK
+3393222912,3393223167,MY
+3393223168,3393257471,HK
3393257472,3393260031,CN
3393260032,3393260543,BD
3393260544,3393265663,AU
@@ -70175,7 +75700,9 @@
3393867776,3393871871,CN
3393871872,3393874943,HK
3393874944,3393875967,AU
-3393875968,3393880063,HK
+3393875968,3393878271,HK
+3393878272,3393878527,IN
+3393878528,3393880063,HK
3393880064,3393896447,AU
3393896448,3393906687,NZ
3393908736,3393910783,BD
@@ -70294,8 +75821,7 @@
3394500608,3394501631,SG
3394501632,3394502655,CN
3394502656,3394503679,HK
-3394503680,3394506751,CN
-3394506752,3394507263,HK
+3394503680,3394507263,CN
3394507264,3394507775,JP
3394508544,3394508799,PH
3394508800,3394510847,CN
@@ -70357,8 +75883,8 @@
3394832384,3394834431,CN
3394834432,3394836479,HK
3394836480,3394838527,BT
-3394838528,3394842623,NZ
-3394842624,3394845695,AU
+3394838528,3394844671,NZ
+3394844672,3394845695,AU
3394845696,3394846207,NZ
3394846208,3394846719,AU
3394846720,3394850815,IN
@@ -70367,7 +75893,7 @@
3394856960,3394859007,IN
3394859008,3394860031,JP
3394860032,3394860543,ID
-3394860544,3394861055,IN
+3394860544,3394860799,IN
3394861056,3394862079,HK
3394862080,3394863103,KR
3394863104,3394871295,NZ
@@ -70472,7 +75998,6 @@
3395175936,3395176191,SG
3395176192,3395176703,AU
3395176704,3395176959,TH
-3395176960,3395177215,IN
3395177216,3395177471,HK
3395177472,3395177983,TH
3395177984,3395178495,AU
@@ -70482,7 +76007,6 @@
3395180032,3395180287,JP
3395180288,3395180543,HK
3395180544,3395181055,VN
-3395181056,3395181567,HK
3395181568,3395182591,CN
3395182592,3395190783,SG
3395190784,3395198975,JP
@@ -70529,8 +76053,8 @@
3397074944,3397083135,HK
3397083136,3397087231,CN
3397091328,3397097471,GU
-3397097472,3397097983,MP
-3397097984,3397099519,GU
+3397097472,3397097855,MP
+3397097856,3397099519,GU
3397099520,3397103615,HK
3397103616,3397105663,LA
3397105664,3397107711,JP
@@ -70616,13 +76140,7 @@
3397298432,3397298495,HK
3397298496,3397298511,SG
3397298512,3397298559,HK
-3397298560,3397298815,SG
-3397298816,3397298847,HK
-3397298848,3397298895,SG
-3397298896,3397298911,HK
-3397298912,3397298927,SG
-3397298928,3397298942,HK
-3397298943,3397298943,SG
+3397298560,3397298943,SG
3397298944,3397298959,HK
3397298960,3397299047,SG
3397299048,3397299055,HK
@@ -70725,9 +76243,7 @@
3397530624,3397531647,ID
3397531648,3397532671,SG
3397532672,3397533695,JP
-3397533696,3397565183,HK
-3397565184,3397565439,SG
-3397565440,3397566463,HK
+3397533696,3397566463,HK
3397566464,3397574655,AU
3397574656,3397582847,CN
3397582848,3397584895,MN
@@ -70772,7 +76288,6 @@
3397794816,3397812223,HK
3397812224,3397816319,CN
3397816320,3397832703,IN
-3397832704,3397836799,JP
3397836800,3397844991,AU
3397844992,3397869823,JP
3397869824,3397870079,AU
@@ -70879,18 +76394,17 @@
3398637120,3398637183,HK
3398637184,3398637823,JP
3398637824,3398638079,PH
-3398638080,3398640639,JP
-3398640640,3398640895,MY
-3398640896,3398641151,SG
-3398641152,3398641407,JP
-3398641408,3398641663,SG
-3398641664,3398642431,JP
-3398642432,3398642687,AU
-3398642688,3398643199,JP
+3398638080,3398639903,JP
+3398639904,3398639907,MY
+3398639908,3398641407,JP
+3398641408,3398641663,MY
+3398641664,3398641919,JP
+3398641920,3398642175,AU
+3398642176,3398642431,JP
+3398642432,3398642943,AU
+3398642944,3398643199,JP
3398643200,3398643455,AU
-3398643456,3398646783,JP
-3398646784,3398647039,AU
-3398647040,3398647807,JP
+3398643456,3398647807,JP
3398647808,3398668287,AU
3398668288,3398672383,CN
3398672384,3398680575,PK
@@ -71091,18 +76605,20 @@
3399942144,3399945983,HK
3399945984,3399946239,AU
3399946240,3399950335,HK
-3399950336,3399954175,US
-3399954176,3399954431,AU
-3399954432,3399974911,US
+3399950336,3399954943,AU
+3399954944,3399974911,US
3399974912,3399983744,MY
3399983745,3399983745,SG
-3399983746,3399995391,MY
+3399983746,3399991295,MY
+3399991296,3399995391,IN
3399995392,3399999487,KR
3399999488,3400000255,SG
3400000256,3400000511,AU
3400000512,3400004607,SG
3400004608,3400004863,AU
-3400004864,3400006911,SG
+3400004864,3400005119,SG
+3400005120,3400005375,AU
+3400005376,3400006911,SG
3400006912,3400006927,AU
3400006928,3400007679,SG
3400007680,3400024063,AU
@@ -71231,9 +76747,7 @@
3400648192,3400648815,SG
3400648816,3400648831,HK
3400648832,3400650239,SG
-3400650240,3400650495,AU
-3400650496,3400650751,SG
-3400650752,3400654847,AU
+3400650240,3400654847,AU
3400654848,3400663039,IN
3400663040,3400683519,MY
3400683520,3400691711,JP
@@ -71637,9 +77151,7 @@
3406528768,3406529023,AU
3406529024,3406529535,HK
3406529536,3406529791,IL
-3406529792,3406530047,HK
-3406530048,3406530303,SG
-3406530304,3406530559,HK
+3406529792,3406530559,HK
3406530560,3406531583,CN
3406531584,3406531839,AU
3406531840,3406532607,CN
@@ -71661,7 +77173,7 @@
3406577920,3406578431,CN
3406578432,3406579199,AU
3406579200,3406579711,CN
-3406579712,3406583551,AU
+3406579712,3406583295,AU
3406583552,3406585855,CN
3406585856,3406586879,AU
3406586880,3406587391,CN
@@ -71831,7 +77343,7 @@
3406930944,3406931199,CN
3406931200,3406936831,AU
3406936832,3406937087,CN
-3406937088,3406937599,AU
+3406937088,3406937343,AU
3406937600,3406938111,CN
3406938112,3406938623,AU
3406938624,3406938879,IN
@@ -71963,7 +77475,8 @@
3407101440,3407101695,AU
3407101952,3407102207,AU
3407102208,3407102463,CN
-3407102464,3407107071,AU
+3407102464,3407104255,AU
+3407104512,3407107071,AU
3407107072,3407107583,CN
3407107584,3407108351,AU
3407108352,3407108607,CN
@@ -71982,7 +77495,11 @@
3407120128,3407122431,CN
3407122432,3407123967,AU
3407123968,3407124223,CN
-3407124224,3407144447,AU
+3407124224,3407124479,AU
+3407124480,3407126015,HK
+3407126016,3407126271,AU
+3407126272,3407126527,HK
+3407126528,3407144447,AU
3407144448,3407144703,CN
3407144704,3407144959,AU
3407144960,3407145215,CN
@@ -72043,7 +77560,8 @@
3407241984,3407242239,CN
3407242240,3407243775,AU
3407243776,3407244031,CN
-3407244032,3407247871,AU
+3407244032,3407244543,AU
+3407244800,3407247871,AU
3407247872,3407248383,CN
3407248384,3407250175,AU
3407250176,3407250431,CN
@@ -72767,7 +78285,9 @@
3409462272,3409462783,CN
3409462784,3409465855,AU
3409465856,3409466879,CN
-3409466880,3409467903,AU
+3409466880,3409467135,AU
+3409467136,3409467391,HK
+3409467392,3409467903,AU
3409467904,3409468415,HK
3409468416,3409469183,AU
3409469184,3409469439,CN
@@ -72988,7 +78508,6 @@
3411204608,3411204863,IN
3411204864,3411205631,KR
3411205632,3411206143,HK
-3411206144,3411210239,KH
3411210240,3411212287,KR
3411212288,3411213311,IN
3411213312,3411214335,HK
@@ -73008,7 +78527,8 @@
3411270656,3411271679,SG
3411271680,3411275775,CN
3411275776,3411277823,JP
-3411277824,3411278335,HK
+3411277824,3411278079,IN
+3411278080,3411278335,HK
3411278336,3411278591,SG
3411278592,3411278847,FJ
3411278848,3411296255,HK
@@ -73068,7 +78588,9 @@
3411644928,3411645951,ID
3411645952,3411646207,SG
3411646208,3411647487,IN
-3411647488,3411649279,AU
+3411647488,3411648767,AU
+3411648768,3411649023,NZ
+3411649024,3411649279,AU
3411649280,3411649535,NZ
3411649536,3411649791,AU
3411649792,3411650303,NZ
@@ -73115,7 +78637,7 @@
3411859252,3411861503,JP
3411861504,3411869695,AU
3411869696,3411943423,CN
-3411943424,3411951615,AU
+3411943424,3411951615,NZ
3411951616,3411967999,LK
3411968000,3411984383,AU
3411984384,3412000767,IN
@@ -73194,7 +78716,9 @@
3412606976,3412615167,PH
3412615168,3412656127,JP
3412656128,3412672511,HK
-3412672512,3412680191,JP
+3412672512,3412675071,JP
+3412675072,3412675327,US
+3412675328,3412680191,JP
3412680192,3412680447,US
3412680448,3412680703,JP
3412680704,3412697087,CN
@@ -73219,9 +78743,7 @@
3413041152,3413043199,JP
3413043200,3413043967,CN
3413043968,3413044223,AU
-3413044224,3413044479,HK
-3413044480,3413044735,SG
-3413044736,3413045247,HK
+3413044224,3413045247,HK
3413045248,3413047295,IN
3413047296,3413098495,AU
3413098496,3413102591,JP
@@ -73257,7 +78779,9 @@
3413327872,3413344255,IN
3413344256,3413360639,PH
3413360640,3413377023,MY
-3413377024,3413415935,SG
+3413377024,3413395199,SG
+3413395200,3413395455,AU
+3413395456,3413415935,SG
3413415936,3413416191,AU
3413416192,3413524479,SG
3413524480,3413540863,TH
@@ -73545,7 +79069,10 @@
3416391680,3416457215,VN
3416457216,3416475391,JP
3416475392,3416475647,NZ
-3416475648,3416489983,JP
+3416475648,3416482047,JP
+3416482048,3416482303,SG
+3416482304,3416489727,JP
+3416489728,3416489983,AU
3416489984,3416506367,VN
3416506368,3416514559,TW
3416514560,3416522751,IN
@@ -73613,7 +79140,7 @@
3417014272,3417022463,JP
3417022464,3417030655,KR
3417030656,3417034751,AU
-3417035008,3417035775,IN
+3417034752,3417035775,IN
3417035776,3417036799,JP
3417036800,3417037823,ID
3417037824,3417038079,AU
@@ -73643,7 +79170,9 @@
3417185792,3417186303,NZ
3417186304,3417194495,HK
3417194496,3417198591,JP
-3417198592,3417200639,SG
+3417198592,3417200127,SG
+3417200128,3417200383,AU
+3417200384,3417200639,SG
3417200640,3417202687,JP
3417202688,3417210879,CN
3417210880,3417227263,AU
@@ -73736,7 +79265,6 @@
3418184960,3418185727,AU
3418185728,3418189823,JP
3418189824,3418190847,CN
-3418190848,3418191871,TH
3418191872,3418192895,ID
3418192896,3418193919,AU
3418193920,3418202111,KH
@@ -73802,8 +79330,8 @@
3418365952,3418374143,TH
3418374144,3418382335,AU
3418382336,3418390527,JP
-3418390528,3418392575,AU
-3418392576,3418393919,JP
+3418390528,3418392831,AU
+3418392832,3418393919,JP
3418393920,3418393927,AU
3418393928,3418397183,JP
3418397184,3418397439,MY
@@ -73811,16 +79339,15 @@
3418399232,3418399247,PH
3418399248,3418400255,JP
3418400256,3418400511,AU
-3418400512,3418405631,JP
-3418405632,3418405887,MY
-3418405888,3418406143,PH
-3418406144,3418406911,JP
+3418400512,3418401455,JP
+3418401456,3418401459,TW
+3418401460,3418403583,JP
+3418403584,3418403839,AU
+3418403840,3418406911,JP
3418406912,3418423295,IN
3418423296,3418444091,HK
3418444092,3418444095,CN
-3418444096,3418452479,HK
-3418452480,3418452543,SG
-3418452544,3418456063,HK
+3418444096,3418456063,HK
3418456064,3418472447,IN
3418472448,3418480639,AU
3418480640,3418488831,CN
@@ -73845,10 +79372,7 @@
3418642944,3418643199,ID
3418643200,3418643455,JP
3418643456,3418644479,AU
-3418644480,3418644735,JP
-3418644736,3418644991,AU
-3418644992,3418645247,TW
-3418645248,3418652671,JP
+3418644480,3418652671,JP
3418652672,3418750975,IN
3418750976,3418816511,HK
3418816512,3418947583,IN
@@ -73877,9 +79401,7 @@
3419078656,3419209727,TW
3419209728,3419226111,VN
3419226112,3419234303,CN
-3419234304,3419241983,JP
-3419241984,3419242239,US
-3419242240,3419242495,JP
+3419234304,3419242495,JP
3419242496,3419275263,CN
3419275264,3419340799,AU
3419340800,3419344895,TW
@@ -74052,7 +79574,9 @@
3423163392,3423171583,US
3423172608,3423182847,US
3423182848,3423184895,CA
-3423184896,3423221759,US
+3423184896,3423204095,US
+3423204096,3423204351,CA
+3423204352,3423221759,US
3423221760,3423222783,CA
3423222784,3423229951,US
3423232000,3423236095,US
@@ -74071,7 +79595,9 @@
3423302656,3423303679,US
3423303680,3423304703,CA
3423304704,3423311871,US
-3423311872,3423313919,VI
+3423311872,3423313151,VI
+3423313152,3423313407,US
+3423313408,3423313919,VI
3423313920,3423366479,US
3423366480,3423366495,IT
3423366496,3423371263,US
@@ -74085,12 +79611,17 @@
3423459328,3423468543,US
3423471616,3423473663,US
3423473664,3423474687,CA
-3423474688,3423480831,US
+3423474688,3423480063,US
+3423480064,3423480319,AU
+3423480320,3423480831,US
3423480832,3423480987,NG
3423480988,3423480988,US
3423480989,3423481343,NG
-3423481344,3423490047,US
-3423491072,3423533055,US
+3423481344,3423489023,US
+3423489024,3423490047,CA
+3423491072,3423493631,US
+3423493632,3423493887,RU
+3423493888,3423533055,US
3423533056,3423535103,AI
3423535104,3423543295,US
3423543296,3423545343,CA
@@ -74118,7 +79649,9 @@
3423725428,3423797503,US
3423797504,3423801087,CA
3423801088,3423801343,US
-3423801344,3423827711,CA
+3423801344,3423823359,CA
+3423823360,3423823871,US
+3423823872,3423827711,CA
3423827712,3423827967,US
3423827968,3423830271,CA
3423830272,3423830527,US
@@ -74140,9 +79673,7 @@
3423859968,3423862527,CA
3423862528,3424334847,US
3424334848,3424335871,CA
-3424335872,3424367359,US
-3424367360,3424367615,GB
-3424367616,3424378879,US
+3424335872,3424378879,US
3424378880,3424379135,PR
3424379136,3424412415,US
3424412416,3424412671,CA
@@ -74153,29 +79684,37 @@
3424507136,3424507391,CA
3424507392,3425173503,US
3425173504,3425304575,CA
-3425304576,3425452031,US
-3425468416,3425471487,US
-3425472512,3425484543,US
-3425484544,3425484799,GU
-3425484800,3425697791,US
+3425304576,3425471487,US
+3425472512,3425697791,US
3425697792,3425699839,CA
-3425699840,3425705983,US
-3425706496,3425711615,US
+3425699840,3425711615,US
3425713152,3425714175,US
3425714176,3425722367,CA
3425722368,3425726463,US
3425728512,3425828863,US
3425828864,3425894399,CA
-3425894400,3426008831,US
-3426009088,3426013183,US
+3425894400,3426013183,US
3426013184,3426013439,IL
-3426013440,3426369023,US
+3426013440,3426306559,US
+3426306560,3426306815,IN
+3426306816,3426369023,US
3426369024,3426369535,CA
3426369536,3426387967,US
3426387968,3426388991,MX
-3426388992,3426415871,US
+3426388992,3426400255,US
+3426400256,3426400511,CA
+3426400512,3426415871,US
3426415872,3426416127,GB
-3426416128,3426617855,US
+3426416128,3426418687,US
+3426418688,3426435071,GB
+3426435072,3426439167,SG
+3426439168,3426441215,AU
+3426441216,3426441727,HK
+3426441728,3426445823,US
+3426445824,3426446335,DE
+3426446336,3426482687,US
+3426482688,3426484223,CA
+3426484224,3426617855,US
3426617856,3426618367,CA
3426618368,3426628607,US
3426629632,3426679039,US
@@ -74198,24 +79737,84 @@
3427428864,3427429119,GB
3427429120,3427487743,US
3427487744,3427487999,GB
-3427488000,3427503615,US
-3427503616,3427503871,AU
-3427503872,3427631103,US
+3427488000,3427618303,US
+3427618304,3427618559,CA
+3427618560,3427631103,US
3427632128,3427647999,US
3427648000,3427648511,CA
3427648512,3427651071,US
3427651072,3427651327,CA
-3427651328,3427732735,US
+3427651328,3427729407,US
+3427729408,3427729663,CA
+3427729664,3427730431,US
+3427730432,3427730687,BE
+3427730688,3427730943,DE
+3427730944,3427731967,US
+3427731968,3427732223,DE
+3427732224,3427732479,US
+3427732480,3427732735,CH
3427732736,3427735039,IE
3427735040,3427735295,US
3427735296,3427736063,HK
-3427736064,3427748863,US
-3427748864,3427749631,DE
-3427749632,3427749887,US
+3427736064,3427736319,GB
+3427736320,3427741951,US
+3427741952,3427742207,DE
+3427742208,3427742463,US
+3427742464,3427742719,AT
+3427742720,3427743231,CH
+3427743232,3427743487,GB
+3427743488,3427743743,DE
+3427743744,3427743999,CA
+3427744000,3427744255,SE
+3427744256,3427745279,DE
+3427745280,3427745791,TW
+3427745792,3427746047,GB
+3427746048,3427746303,DK
+3427746304,3427746559,US
+3427746560,3427746815,JP
+3427746816,3427747071,DE
+3427747072,3427747327,US
+3427747328,3427747583,DE
+3427747584,3427747839,US
+3427747840,3427748095,NO
+3427748096,3427748351,CH
+3427748352,3427748607,JP
+3427748608,3427749631,DE
+3427749632,3427749887,NL
3427749888,3427750655,DE
-3427750656,3427760127,US
+3427750656,3427750911,GB
+3427750912,3427752703,US
+3427752704,3427752959,GB
+3427752960,3427753215,US
+3427753216,3427753471,JP
+3427753472,3427753727,FI
+3427753728,3427753983,IT
+3427753984,3427754239,CH
+3427754240,3427754495,GB
+3427754496,3427754751,DE
+3427754752,3427755007,CA
+3427755008,3427755263,IT
+3427755264,3427755519,US
+3427755520,3427755775,DE
+3427755776,3427756287,BE
+3427756288,3427756543,AU
+3427756544,3427756799,DE
+3427756800,3427757055,US
+3427757056,3427757311,GR
+3427757312,3427757567,FR
+3427757568,3427757823,JP
+3427757824,3427758079,DE
+3427758080,3427758335,BE
+3427758336,3427758591,US
+3427758592,3427758847,IT
+3427758848,3427759103,US
+3427759104,3427759359,BE
+3427759360,3427759871,GB
+3427759872,3427760127,US
3427760128,3427760895,CA
-3427760896,3427762175,US
+3427760896,3427761663,US
+3427761664,3427761919,JP
+3427761920,3427762175,US
3427762176,3427762431,DE
3427762432,3427762687,CA
3427762688,3427763455,IT
@@ -74288,21 +79887,23 @@
3427791872,3427792383,CA
3427792384,3427792639,NL
3427792640,3427793407,SG
-3427793408,3427793919,NL
+3427793408,3427793919,HK
3427793920,3427794175,US
3427794176,3427794943,NL
3427794944,3427796991,CA
3427796992,3427831551,US
3427831552,3427831807,MX
3427831808,3427860479,US
-3427860480,3428057087,CA
+3427860480,3428025343,CA
+3428025344,3428025855,US
+3428025856,3428057087,CA
3428057088,3428217855,US
3428218880,3428286719,US
3428286720,3428286975,CA
3428286976,3428296959,US
3428296960,3428297215,CL
3428297216,3428299519,US
-3428299520,3428299775,ZA
+3428299520,3428299775,MU
3428299776,3428302079,US
3428302080,3428302335,CA
3428302336,3428306175,US
@@ -74317,23 +79918,87 @@
3428434944,3428435199,CA
3428435200,3428437503,US
3428437504,3428437759,MX
-3428437760,3428592639,US
-3428592640,3428593919,CA
-3428593920,3428598591,US
+3428437760,3428582655,US
+3428582656,3428582911,CA
+3428582912,3428585215,US
+3428585216,3428585471,CA
+3428585472,3428585983,US
+3428585984,3428586495,CA
+3428586496,3428587007,US
+3428587008,3428587519,CA
+3428587520,3428587775,US
+3428587776,3428588287,CA
+3428588288,3428588543,US
+3428588544,3428588799,CA
+3428588800,3428589311,US
+3428589312,3428589567,CA
+3428589568,3428591871,US
+3428591872,3428592127,CA
+3428592128,3428592383,US
+3428592384,3428594175,CA
+3428594176,3428594687,US
+3428594688,3428595199,CA
+3428595200,3428596223,US
+3428596224,3428596735,CA
+3428596736,3428597247,US
+3428597248,3428597503,CA
+3428597504,3428598015,US
+3428598016,3428598271,CA
+3428598272,3428598591,US
3428598592,3428598623,CA
-3428598624,3428607999,US
+3428598624,3428598783,US
+3428598784,3428599039,CA
+3428599040,3428599551,US
+3428599552,3428600575,CA
+3428600576,3428600831,US
+3428600832,3428601599,CA
+3428601600,3428602111,US
+3428602112,3428602367,CA
+3428602368,3428603903,US
+3428603904,3428605183,CA
+3428605184,3428607999,US
3428608000,3428609023,CA
-3428609024,3428630527,US
-3428630528,3428634623,CA
-3428634624,3428635903,US
-3428635904,3428636671,CA
-3428636672,3428638719,US
-3428638720,3428638975,CA
-3428638976,3428642815,US
-3428642816,3428643071,CA
-3428643072,3428660735,US
-3428660736,3428661247,CA
-3428661248,3428743167,US
+3428609024,3428610047,US
+3428610048,3428611071,CA
+3428611072,3428612607,US
+3428612608,3428613887,CA
+3428613888,3428614143,US
+3428614144,3428620031,CA
+3428620032,3428620287,US
+3428620288,3428621823,CA
+3428621824,3428622335,US
+3428622336,3428623615,CA
+3428623616,3428623871,US
+3428623872,3428624639,CA
+3428624640,3428625407,US
+3428625408,3428628223,CA
+3428628224,3428630015,US
+3428630016,3428634623,CA
+3428634624,3428634879,US
+3428634880,3428635135,CA
+3428635136,3428635391,US
+3428635392,3428635647,CA
+3428635648,3428635903,US
+3428635904,3428636927,CA
+3428636928,3428637439,US
+3428637440,3428637951,CA
+3428637952,3428638719,US
+3428638720,3428639487,CA
+3428639488,3428640255,US
+3428640256,3428640511,CA
+3428640512,3428640767,US
+3428640768,3428643327,CA
+3428643328,3428643583,US
+3428643584,3428643839,CA
+3428643840,3428644351,US
+3428644352,3428645631,CA
+3428645632,3428646143,US
+3428646144,3428646399,CA
+3428646400,3428646655,US
+3428646656,3428646911,CA
+3428646912,3428660735,US
+3428660736,3428661503,CA
+3428661504,3428743167,US
3428743168,3428744191,CA
3428744192,3428752383,US
3428752384,3428753407,GH
@@ -74343,7 +80008,9 @@
3429171200,3429236735,CA
3429236736,3429382143,US
3429382144,3429382399,DE
-3429382400,3429500927,US
+3429382400,3429401855,US
+3429401856,3429402111,CA
+3429402112,3429500927,US
3429500928,3429502975,CA
3429502976,3429517407,US
3429517408,3429517411,HK
@@ -74363,9 +80030,13 @@
3430073356,3430074111,US
3430074112,3430074367,AU
3430074368,3430146047,US
-3430148096,3430354943,US
+3430148096,3430328831,US
+3430328832,3430329087,GH
+3430329088,3430354943,US
3430354944,3430356991,PR
-3430356992,3430701055,US
+3430356992,3430468607,US
+3430468608,3430468863,AQ
+3430468864,3430701055,US
3430702080,3430703871,US
3430703872,3430704127,PR
3430704128,3430705151,US
@@ -74379,7 +80050,45 @@
3430729472,3430729727,GB
3430729728,3430732543,US
3430732544,3430732799,GB
-3430732800,3430812671,US
+3430732800,3430747903,US
+3430747904,3430748159,CA
+3430748160,3430749951,US
+3430749952,3430750207,CA
+3430750208,3430767615,US
+3430767616,3430768127,CA
+3430768128,3430768895,US
+3430768896,3430769151,CA
+3430769152,3430769407,US
+3430769408,3430769663,CA
+3430769664,3430770943,US
+3430770944,3430771199,CA
+3430771200,3430771711,US
+3430771712,3430772223,CA
+3430772224,3430773247,US
+3430773248,3430773503,CA
+3430773504,3430774271,US
+3430774272,3430774527,CA
+3430774528,3430777343,US
+3430777344,3430777599,CA
+3430777600,3430777855,US
+3430777856,3430778111,CA
+3430778112,3430778623,US
+3430778624,3430778879,CA
+3430778880,3430779903,US
+3430779904,3430780159,CA
+3430780160,3430780671,US
+3430780672,3430780927,CA
+3430780928,3430782463,US
+3430782464,3430782719,CA
+3430782720,3430795007,US
+3430795008,3430795263,CA
+3430795264,3430805759,US
+3430805760,3430806015,CA
+3430806016,3430807295,US
+3430807296,3430807551,CA
+3430807552,3430809087,US
+3430809088,3430809343,CA
+3430809344,3430812671,US
3430812672,3430813183,MX
3430813184,3430842367,US
3430842368,3430842879,DO
@@ -74387,7 +80096,8 @@
3430845440,3430845951,MX
3430845952,3430849535,US
3430849536,3430850047,CA
-3430850048,3431114495,US
+3430850048,3430973951,US
+3430974208,3431114495,US
3431114496,3431114751,CA
3431114752,3431468031,US
3431468032,3431469055,CA
@@ -74414,13 +80124,26 @@
3431657472,3431658495,US
3431658496,3431661311,CA
3431661312,3431675903,US
-3431677952,3431751423,US
+3431677952,3431745023,US
+3431745024,3431745279,BE
+3431745280,3431745791,US
+3431745792,3431746047,GB
+3431746048,3431746559,US
+3431746560,3431746815,DE
+3431746816,3431747071,US
+3431747072,3431747327,LU
+3431747328,3431748607,US
+3431748608,3431749119,FR
+3431749120,3431751423,US
3431751424,3431752703,IT
-3431752704,3431753727,US
+3431752704,3431753215,US
+3431753216,3431753471,SG
+3431753472,3431753727,US
3431753728,3431755007,CA
3431755008,3431755775,NL
3431755776,3431759615,CA
-3431759616,3432004607,US
+3431759616,3431759871,DE
+3431759872,3432004607,US
3432004608,3432005631,CA
3432005632,3432009215,US
3432009216,3432009471,PR
@@ -74428,19 +80151,31 @@
3432106240,3432106495,MX
3432106496,3432113407,US
3432113408,3432113663,CA
-3432113664,3432205311,US
+3432113664,3432133887,US
+3432133888,3432134143,GB
+3432134144,3432205311,US
3432205312,3432206335,CA
-3432206336,3432265983,US
-3432265984,3432267007,DE
-3432267008,3432329215,US
+3432206336,3432253439,US
+3432253440,3432253951,CA
+3432253952,3432265983,US
+3432265984,3432267263,DE
+3432267264,3432280063,US
+3432280064,3432280319,GB
+3432280320,3432324607,US
+3432324608,3432324863,CA
+3432324864,3432329215,US
3432329216,3432330239,DE
3432330240,3432361983,US
3432361984,3432366079,DE
-3432366080,3432494079,US
-3432494080,3432495103,DE
+3432366080,3432476415,US
+3432476416,3432476671,DE
+3432476672,3432493823,US
+3432493824,3432495103,DE
3432495104,3432517119,US
-3432517120,3432517631,NA
-3432517632,3432579071,US
+3432517120,3432517631,MU
+3432517632,3432571647,US
+3432571648,3432571903,CA
+3432571904,3432579071,US
3432580096,3432585215,US
3432585216,3432585727,MX
3432585728,3432609791,US
@@ -74465,7 +80200,8 @@
3433964800,3433965055,US
3433965056,3433967359,CA
3433967360,3433967615,US
-3433967616,3433981951,CA
+3433967616,3433980927,CA
+3433981184,3433981951,CA
3433981952,3433983999,US
3433984000,3434012671,CA
3434012672,3434012927,US
@@ -74474,16 +80210,34 @@
3434015232,3434020607,CA
3434020608,3434427391,US
3434427392,3434428415,HR
-3434428416,3434571775,US
+3434428416,3434433279,US
+3434433280,3434433535,PR
+3434433536,3434553343,US
+3434553344,3434553599,ES
+3434553600,3434571775,US
3434571776,3434573823,CO
-3434573824,3434583039,US
+3434573824,3434575359,US
+3434575360,3434575615,BR
+3434575616,3434583039,US
3434583040,3434584063,NL
3434584064,3434807551,US
3434807552,3434831359,CA
3434831360,3434831615,US
3434831616,3434872575,CA
3434872576,3434913791,US
-3434913792,3434917887,AG
+3434913792,3434914047,AG
+3434914048,3434914303,DM
+3434914304,3434914559,VG
+3434914560,3434914815,AG
+3434914816,3434915327,VG
+3434915328,3434915583,DM
+3434915584,3434915839,KN
+3434915840,3434916095,LC
+3434916096,3434916351,AG
+3434916352,3434916607,DM
+3434916608,3434917119,AG
+3434917120,3434917375,LC
+3434917376,3434917887,AG
3434917888,3435069439,US
3435069440,3435134975,CA
3435134976,3435271423,US
@@ -74502,16 +80256,43 @@
3436290048,3436314367,CA
3436314368,3436476415,US
3436476416,3436478463,AW
-3436478464,3436507135,US
+3436478464,3436492799,US
+3436492800,3436493055,NL
+3436493056,3436507135,US
3436507136,3436509183,BB
-3436509184,3437297919,US
+3436509184,3436697087,US
+3436697088,3436697343,VE
+3436697344,3437232383,US
+3437232384,3437232639,CA
+3437232640,3437242879,US
+3437242880,3437243135,CA
+3437243136,3437249279,US
+3437249280,3437249535,CA
+3437249536,3437259775,US
+3437259776,3437260031,CA
+3437260032,3437262079,US
+3437262080,3437262335,CA
+3437262336,3437263615,US
+3437263616,3437263871,CA
+3437263872,3437266431,US
+3437266432,3437266687,CA
+3437266688,3437279487,US
+3437279488,3437279743,CA
+3437279744,3437281279,US
+3437281280,3437281535,CA
+3437281536,3437292799,US
+3437292800,3437293055,CA
+3437293056,3437297919,US
3437297920,3437301759,CA
3437301760,3437305855,US
3437305856,3437307391,CA
3437307392,3437307903,US
-3437307904,3437310975,CA
+3437307904,3437308415,CA
+3437308416,3437308927,US
+3437308928,3437310975,CA
3437310976,3437311487,US
-3437311488,3437331711,CA
+3437311488,3437326591,CA
+3437326848,3437331711,CA
3437331712,3437331967,US
3437331968,3437332479,CA
3437332480,3437332735,US
@@ -74523,7 +80304,7 @@
3437336064,3437336319,US
3437336320,3437341695,CA
3437341696,3437341951,US
-3437342208,3437343231,CA
+3437341952,3437343231,CA
3437343232,3437343487,US
3437343488,3437350911,CA
3437350912,3437351423,US
@@ -74532,22 +80313,54 @@
3437359104,3437428735,CA
3437428736,3437691391,US
3437691392,3437691647,HK
-3437691648,3437692671,US
+3437691648,3437691903,JP
+3437691904,3437692415,FR
+3437692416,3437692671,US
3437692672,3437693439,CA
-3437693440,3437694207,US
+3437693440,3437693695,HK
+3437693696,3437693951,NO
+3437693952,3437694207,ES
3437694208,3437695231,AT
3437695232,3437695999,HK
-3437696000,3437702911,US
+3437696000,3437696767,NL
+3437696768,3437702911,US
3437702912,3437703167,HK
-3437703168,3437712639,US
+3437703168,3437703423,US
+3437703424,3437703679,NL
+3437703680,3437703935,ES
+3437703936,3437704191,US
+3437704192,3437704703,CH
+3437704704,3437706495,US
+3437706496,3437706751,CH
+3437706752,3437707263,US
+3437707264,3437707519,DE
+3437707520,3437707775,US
+3437707776,3437708031,FR
+3437708032,3437708287,US
+3437708288,3437708799,FI
+3437708800,3437710079,US
+3437710080,3437710335,GB
+3437710336,3437712639,US
3437712640,3437713663,GB
-3437713664,3437715967,US
+3437713664,3437715199,US
+3437715200,3437715455,DE
+3437715456,3437715711,JP
+3437715712,3437715967,IT
3437715968,3437716991,DE
3437716992,3437717247,US
3437717248,3437718527,BE
3437718528,3437720063,US
3437720064,3437723135,SG
-3437723136,3437748223,US
+3437723136,3437725183,US
+3437725184,3437725695,MN
+3437725696,3437726207,DE
+3437726208,3437726463,US
+3437726464,3437726975,GB
+3437726976,3437734399,US
+3437734400,3437734655,SG
+3437734656,3437736447,US
+3437736448,3437737471,CL
+3437737472,3437748223,US
3437748224,3437748479,GB
3437748480,3437748991,NL
3437748992,3437749247,US
@@ -74577,9 +80390,7 @@
3438010368,3438034943,US
3438034944,3438051327,BS
3438051328,3438084095,US
-3438084096,3438094847,CA
-3438094848,3438094975,US
-3438094976,3438116863,CA
+3438084096,3438116863,CA
3438116864,3438215423,US
3438215424,3438215935,CA
3438215936,3438216191,US
@@ -74603,14 +80414,37 @@
3438614616,3438813183,US
3438813184,3438814207,GH
3438814208,3438895103,US
-3438895104,3438896127,HN
-3438896128,3439071103,US
+3438895104,3438896639,HN
+3438896640,3439059711,US
+3439059712,3439059967,PR
+3439059968,3439071103,US
3439071104,3439071135,MX
-3439071136,3448380839,US
+3439071136,3448263423,US
+3448263424,3448263935,AG
+3448263936,3448303615,US
+3448303616,3448303871,KY
+3448303872,3448377343,US
+3448377344,3448377855,AG
+3448377856,3448379647,US
+3448379648,3448379903,SG
+3448379904,3448380415,US
+3448380416,3448380671,SG
+3448380672,3448380839,US
3448380840,3448380847,SG
3448380848,3448380943,US
3448380944,3448380959,SG
-3448380960,3448651775,US
+3448380960,3448381183,US
+3448381184,3448381439,SG
+3448381440,3448381695,GB
+3448381696,3448398335,US
+3448398336,3448399103,CA
+3448399104,3448399359,US
+3448399360,3448399871,CA
+3448399872,3448500479,US
+3448500480,3448500735,SG
+3448500736,3448559103,US
+3448559104,3448559359,GB
+3448559360,3448651775,US
3448652800,3448673279,US
3448674304,3448711167,US
3448713216,3448717311,US
@@ -74623,71 +80457,138 @@
3448989696,3448990719,HK
3448990720,3448991743,IN
3448991744,3449096191,US
-3449098240,3449161983,US
-3449161984,3449162239,CA
-3449162240,3449174495,US
-3449174496,3449174783,CA
-3449174784,3449176063,US
-3449176064,3449176319,CA
-3449176320,3449176831,US
-3449176832,3449177087,CA
-3449177088,3449182015,US
+3449098240,3449159679,US
+3449159680,3449160703,CA
+3449160704,3449161471,US
+3449161472,3449163519,CA
+3449163520,3449163775,US
+3449163776,3449165055,CA
+3449165056,3449165311,US
+3449165312,3449165567,CA
+3449165568,3449166079,US
+3449166080,3449168639,CA
+3449168640,3449168895,US
+3449168896,3449169151,CA
+3449169152,3449169663,US
+3449169664,3449170431,CA
+3449170432,3449170687,US
+3449170688,3449171199,CA
+3449171200,3449171711,US
+3449171712,3449172991,CA
+3449172992,3449173247,US
+3449173248,3449173503,CA
+3449173504,3449173759,US
+3449173760,3449174783,CA
+3449174784,3449175039,US
+3449175040,3449175295,CA
+3449175296,3449175551,US
+3449175552,3449175807,CA
+3449175808,3449176063,US
+3449176064,3449178367,CA
+3449178368,3449178623,US
+3449178624,3449179903,CA
+3449179904,3449180671,US
+3449180672,3449181951,CA
+3449181952,3449182015,US
3449182016,3449182031,CA
-3449182032,3449182975,US
-3449182976,3449184255,CA
-3449184256,3449188671,US
+3449182032,3449182207,US
+3449182208,3449186303,CA
+3449186304,3449186559,US
+3449186560,3449186815,CA
+3449186816,3449187071,US
+3449187072,3449187583,CA
+3449187584,3449187839,US
+3449187840,3449188095,CA
+3449188096,3449188351,US
+3449188352,3449188607,CA
+3449188608,3449188671,US
3449188672,3449188703,CA
-3449188704,3449191167,US
-3449191168,3449191423,CA
-3449191424,3449192447,US
-3449192448,3449194495,CA
-3449194496,3449198687,US
+3449188704,3449188863,US
+3449188864,3449189375,CA
+3449189376,3449189887,US
+3449189888,3449190655,CA
+3449190656,3449190911,US
+3449190912,3449191679,CA
+3449191680,3449192447,US
+3449192448,3449195775,CA
+3449195776,3449196031,US
+3449196032,3449196287,CA
+3449196288,3449198687,US
3449198688,3449198719,CA
3449198720,3449203711,US
3449203712,3449203775,CA
-3449203776,3449204735,US
+3449203776,3449204223,US
+3449204224,3449204479,CA
+3449204480,3449204735,US
3449204736,3449205759,CA
3449205760,3449208927,US
3449208928,3449208943,CA
-3449208944,3449215871,US
+3449208944,3449209343,US
+3449209344,3449209599,CA
+3449209600,3449210367,US
+3449210368,3449212927,CA
+3449212928,3449213183,US
+3449213184,3449213695,CA
+3449213696,3449214975,US
+3449214976,3449215743,CA
+3449215744,3449215871,US
3449215872,3449215999,CA
-3449216000,3449220863,US
-3449220864,3449221119,CA
-3449221120,3449225471,US
+3449216000,3449220607,US
+3449220608,3449221375,CA
+3449221376,3449222655,US
+3449222656,3449224959,CA
+3449224960,3449225471,US
3449225472,3449254143,CA
3449254144,3449254911,US
3449254912,3449273599,CA
3449273600,3449273855,US
3449273856,3449278975,CA
+3449278976,3449279487,US
3449279488,3449290495,CA
3449290496,3449409535,US
3449410560,3449575423,US
3449575424,3449575679,AU
3449575680,3449593855,US
3449593856,3449594111,AU
-3449594112,3449598975,US
-3449598976,3449599231,AU
-3449599232,3449769727,US
-3449769728,3449769983,ZA
+3449594112,3449638911,US
+3449638912,3449639167,GB
+3449639168,3449639423,US
+3449639424,3449639679,GB
+3449639680,3449639935,US
+3449639936,3449640191,GB
+3449640192,3449640447,NL
+3449640448,3449640959,GB
+3449640960,3449641215,NL
+3449641216,3449641471,GB
+3449641472,3449769727,US
+3449769728,3449769983,MU
3449769984,3449823231,US
3449823232,3449824255,CO
3449824256,3449835519,US
3449835520,3449836543,ES
-3449836544,3449974783,US
+3449836544,3449843199,US
+3449843200,3449843711,YE
+3449843712,3449874687,US
+3449874688,3449874943,AG
+3449874944,3449923583,US
+3449923584,3449923839,ES
+3449923840,3449974783,US
3449974784,3449976831,CA
-3449976832,3450213887,US
+3449976832,3449994239,US
+3449994240,3449994495,MX
+3449994496,3450213887,US
3450214144,3450217215,US
3450217216,3450217471,LC
-3450217472,3450253567,US
-3450253568,3450253823,AU
-3450253824,3450254079,US
+3450217472,3450254079,US
3450254080,3450254335,CA
3450254336,3450272511,US
3450272512,3450272767,MX
3450272768,3450275327,US
3450275328,3450275583,GB
3450275584,3450275839,FR
-3450275840,3450612479,US
+3450275840,3450345359,US
+3450345360,3450345367,DE
+3450345368,3450612479,US
3450612480,3450612735,CA
3450612736,3450685183,US
3450685184,3450685439,CA
@@ -74697,7 +80598,9 @@
3450699776,3450731519,US
3450731520,3450732543,CA
3450732544,3450773503,US
-3450773504,3450777599,CA
+3450773504,3450774783,CA
+3450774784,3450775039,US
+3450775040,3450777599,CA
3450777600,3450851839,US
3450855424,3450935295,US
3450935296,3450935551,MY
@@ -74718,9 +80621,22 @@
3450975744,3450982399,US
3450982400,3450984447,TW
3450984448,3450986495,PH
-3450986496,3450987007,US
+3450986496,3450986751,HK
+3450986752,3450987007,US
3450987008,3450987263,CN
-3450987264,3451715839,US
+3450987264,3451170303,US
+3451170304,3451170559,VE
+3451170560,3451187967,US
+3451187968,3451188223,AU
+3451188224,3451207423,US
+3451207424,3451207679,CH
+3451207680,3451236351,US
+3451236352,3451236607,HU
+3451236608,3451371519,US
+3451371520,3451371775,GB
+3451371776,3451507199,US
+3451507200,3451507711,BR
+3451507712,3451715839,US
3451715840,3451724543,CA
3451724544,3451724799,US
3451725312,3451725567,US
@@ -74740,7 +80656,41 @@
3451767296,3451767551,CA
3451767552,3451767807,US
3451767808,3451780863,CA
-3451780864,3451884287,US
+3451780864,3451783935,US
+3451783936,3451784191,CA
+3451784192,3451786751,US
+3451786752,3451787007,CA
+3451787008,3451788031,US
+3451788032,3451788287,CA
+3451788288,3451798783,US
+3451798784,3451799039,CA
+3451799040,3451800063,US
+3451800064,3451800319,CA
+3451800320,3451807231,US
+3451807232,3451807487,CA
+3451807488,3451808511,US
+3451808512,3451808767,CA
+3451808768,3451810815,US
+3451810816,3451811327,CA
+3451811328,3451821567,US
+3451821568,3451821823,PR
+3451821824,3451824127,US
+3451824128,3451824383,CA
+3451824384,3451828991,US
+3451828992,3451829247,CA
+3451829248,3451835903,US
+3451835904,3451836159,CA
+3451836160,3451836415,US
+3451836416,3451836671,CA
+3451836672,3451836927,US
+3451836928,3451837183,CA
+3451837184,3451837695,US
+3451837696,3451837951,CA
+3451837952,3451840255,US
+3451840256,3451840767,CA
+3451840768,3451879423,US
+3451879424,3451879935,DE
+3451879936,3451884287,US
3451884288,3451884543,DE
3451884544,3451890431,US
3451890432,3451890687,AU
@@ -74755,8 +80705,128 @@
3452678400,3452682239,BE
3452682240,3452715007,US
3452715008,3452723199,CA
-3452723200,3452764159,US
-3452764160,3452895231,CA
+3452723200,3452764671,US
+3452764672,3452765183,CA
+3452765184,3452765439,US
+3452765440,3452766463,CA
+3452766464,3452766975,US
+3452766976,3452767487,CA
+3452767488,3452767743,US
+3452767744,3452767999,CA
+3452768000,3452768607,US
+3452768608,3452768639,CA
+3452768640,3452769023,US
+3452769024,3452769535,CA
+3452769536,3452769791,US
+3452769792,3452770047,CA
+3452770048,3452770303,US
+3452770304,3452770559,CA
+3452770560,3452770815,US
+3452770816,3452771071,CA
+3452771072,3452771327,US
+3452771328,3452771583,CA
+3452771584,3452771839,US
+3452771840,3452773119,CA
+3452773120,3452773375,US
+3452773376,3452773887,CA
+3452773888,3452774143,US
+3452774144,3452774911,CA
+3452774912,3452775167,US
+3452775168,3452775935,CA
+3452775936,3452776191,US
+3452776192,3452776703,CA
+3452776704,3452776959,US
+3452776960,3452777471,CA
+3452777472,3452777727,US
+3452777728,3452779007,CA
+3452779008,3452779263,US
+3452779264,3452779519,CA
+3452779520,3452780031,US
+3452780032,3452780543,CA
+3452780544,3452781055,US
+3452781056,3452781567,CA
+3452781568,3452781823,US
+3452781824,3452782079,CA
+3452782080,3452782335,US
+3452782336,3452783359,CA
+3452783360,3452783871,US
+3452783872,3452784639,CA
+3452784640,3452784895,US
+3452784896,3452785151,CA
+3452785152,3452785407,US
+3452785408,3452785919,CA
+3452785920,3452786175,US
+3452786176,3452787455,CA
+3452787456,3452787711,US
+3452787712,3452789503,CA
+3452789504,3452789759,US
+3452789760,3452790271,CA
+3452790272,3452791551,US
+3452791552,3452793087,CA
+3452793088,3452793343,US
+3452793344,3452793599,CA
+3452793600,3452793855,US
+3452793856,3452795135,CA
+3452795136,3452795391,US
+3452795392,3452796159,CA
+3452796160,3452796415,US
+3452796416,3452797183,CA
+3452797184,3452797439,US
+3452797440,3452798719,CA
+3452798720,3452798975,US
+3452798976,3452799487,CA
+3452799488,3452799743,US
+3452799744,3452801535,CA
+3452801536,3452801791,US
+3452801792,3452802559,CA
+3452802560,3452802815,US
+3452802816,3452803327,CA
+3452803328,3452803583,US
+3452803584,3452806143,CA
+3452806144,3452806911,US
+3452806912,3452807167,CA
+3452807168,3452807423,US
+3452807424,3452807679,CA
+3452807680,3452807935,US
+3452807936,3452808191,CA
+3452808192,3452808447,US
+3452808448,3452809727,CA
+3452809728,3452809983,US
+3452809984,3452810239,CA
+3452810240,3452811007,US
+3452811008,3452811519,CA
+3452811520,3452811775,US
+3452811776,3452812287,CA
+3452812288,3452812543,US
+3452812544,3452813311,CA
+3452813312,3452813567,US
+3452813568,3452816127,CA
+3452816128,3452816511,US
+3452816512,3452816527,CA
+3452816528,3452816895,US
+3452816896,3452817663,CA
+3452817664,3452817919,US
+3452817920,3452818431,CA
+3452818432,3452818687,US
+3452818688,3452818943,CA
+3452818944,3452819199,US
+3452819200,3452819711,CA
+3452819712,3452820479,US
+3452820480,3452820735,CA
+3452820736,3452820991,US
+3452820992,3452821503,CA
+3452821504,3452822271,US
+3452822272,3452822527,CA
+3452822528,3452822783,US
+3452822784,3452824063,CA
+3452824064,3452824319,US
+3452824320,3452824575,CA
+3452824576,3452824831,US
+3452824832,3452825599,CA
+3452825600,3452825855,US
+3452825856,3452828927,CA
+3452828928,3452829439,US
+3452829440,3452895231,CA
3452895232,3452895487,US
3452895488,3452902399,CA
3452902400,3452902655,US
@@ -74771,11 +80841,11 @@
3452931584,3452933119,CA
3452933632,3452934911,CA
3452934912,3452936191,US
-3452936192,3452938751,CA
-3452938752,3452939023,US
-3452939024,3452939039,CA
-3452939040,3452939263,US
-3452939264,3452942847,CA
+3452936192,3452938839,CA
+3452938840,3452938847,US
+3452938848,3452939066,CA
+3452939067,3452939067,US
+3452939068,3452942847,CA
3452942848,3452943103,US
3452943104,3452953087,CA
3452953088,3452953343,US
@@ -74812,45 +80882,76 @@
3453159936,3453163519,CA
3453163520,3453164031,US
3453164032,3453178623,CA
+3453178624,3453178879,US
3453178880,3453180671,CA
3453180672,3453180927,US
3453180928,3453195263,CA
3453195264,3453195519,US
3453195520,3453199871,CA
3453200384,3453206527,CA
-3453206528,3453207807,US
+3453206528,3453207551,HN
+3453207552,3453207807,NI
3453207808,3453208575,HN
-3453208576,3453210623,US
+3453208576,3453208831,NI
+3453208832,3453209599,HN
+3453209600,3453209855,US
+3453209856,3453210367,HN
+3453210368,3453210623,SV
3453210624,3453213183,CR
-3453213184,3453214207,HN
-3453214208,3453215231,US
+3453213184,3453214719,HN
+3453214720,3453215231,GT
3453215232,3453215999,SV
3453216000,3453217023,CR
-3453217024,3453217791,US
+3453217024,3453217791,SV
3453217792,3453219327,CR
-3453219328,3453220607,US
+3453219328,3453219583,US
+3453219584,3453219839,SV
+3453219840,3453220607,US
3453220608,3453222911,HN
3453222912,3453403135,US
-3453403136,3453406975,BB
+3453403136,3453405951,BB
+3453405952,3453406207,KN
+3453406208,3453406463,TC
+3453406464,3453406975,VC
3453406976,3453407231,GD
3453407232,3453407743,BB
3453407744,3453408255,GD
-3453408256,3453411327,BB
-3453411328,3453607935,US
+3453408256,3453409023,BB
+3453409024,3453409535,KN
+3453409536,3453411327,BB
+3453411328,3453552127,US
+3453552128,3453552383,GB
+3453552384,3453552639,US
+3453552640,3453552895,GB
+3453552896,3453553151,US
+3453553152,3453553407,GB
+3453553408,3453554431,US
+3453554432,3453554687,GB
+3453554688,3453599999,US
+3453600000,3453600767,GB
+3453600768,3453607935,US
3453607936,3453608959,KN
3453608960,3453609983,LC
-3453609984,3453611263,AG
-3453611264,3453611519,DM
-3453611520,3453615359,AG
+3453609984,3453610495,AG
+3453610496,3453610751,MS
+3453610752,3453611007,AG
+3453611008,3453611263,MS
+3453611264,3453612543,DM
+3453612544,3453613055,KN
+3453613056,3453614591,AG
+3453614592,3453615103,DM
+3453615104,3453615359,AG
3453615360,3453615615,KN
3453615616,3453616127,AG
3453616128,3454003013,US
3454003014,3454003014,ES
-3454003015,3454004991,US
-3454004992,3454005247,GB
-3454005248,3454292479,US
-3454292480,3454292735,GB
-3454292736,3454497791,US
+3454003015,3454004997,US
+3454004998,3454004998,GB
+3454004999,3454287871,US
+3454287872,3454296063,GB
+3454296064,3454436351,US
+3454436352,3454436607,GU
+3454436608,3454497791,US
3454497792,3454498815,MX
3454498816,3454599423,US
3454599424,3454601215,CA
@@ -74893,8 +80994,7 @@
3454808832,3454809087,US
3454809088,3454810111,CA
3454810112,3454810367,US
-3454810368,3454813951,CA
-3454814208,3454814975,CA
+3454810368,3454814975,CA
3454814976,3454815231,US
3454815232,3454815743,CA
3454815744,3454816255,US
@@ -74911,38 +81011,127 @@
3454881792,3454883839,CA
3454883840,3454915071,US
3454915072,3454926591,CA
-3454926592,3455034879,US
-3455034880,3455035135,AU
-3455035136,3455042565,US
+3454926592,3455035391,US
+3455035392,3455035903,AU
+3455035904,3455042565,US
3455042566,3455042566,CA
3455042567,3455096831,US
3455096832,3455097855,EC
3455097856,3455109119,US
3455109120,3455111167,HN
3455111168,3455115263,SR
-3455115264,3455132671,US
-3455132672,3455133695,BO
+3455115264,3455126527,US
+3455126528,3455126783,MX
+3455126784,3455132159,US
+3455132160,3455133695,BO
3455133696,3455320063,US
3455320064,3455322111,FR
3455322112,3455328255,US
3455328256,3455329279,DO
-3455329280,3455357951,US
+3455329280,3455330815,US
+3455330816,3455331327,ES
+3455331328,3455333887,US
+3455333888,3455334399,NL
+3455334400,3455357951,US
3455357952,3455358975,BB
-3455358976,3455453439,US
+3455358976,3455359231,US
+3455359232,3455359487,ES
+3455359488,3455418367,US
+3455418368,3455418879,KY
+3455418880,3455421439,US
+3455421440,3455421951,BE
+3455421952,3455453439,US
3455453440,3455453695,HT
-3455453696,3455582207,US
+3455453696,3455551999,US
+3455552000,3455552255,EC
+3455552256,3455566079,US
+3455566080,3455566335,EC
+3455566336,3455582207,US
3455582208,3455583743,SG
-3455583744,3455617279,US
+3455583744,3455584255,NL
+3455584256,3455584767,GB
+3455584768,3455588351,US
+3455588352,3455588863,BE
+3455588864,3455589119,FR
+3455589120,3455589375,US
+3455589376,3455589631,BE
+3455589632,3455592191,US
+3455592192,3455592447,IE
+3455592448,3455592703,KR
+3455592704,3455594239,US
+3455594240,3455594495,DE
+3455594496,3455594751,TW
+3455594752,3455595519,US
+3455595520,3455595775,KR
+3455595776,3455596031,FR
+3455596032,3455596543,CH
+3455596544,3455596799,NL
+3455596800,3455597311,US
+3455597312,3455597567,FR
+3455597568,3455598847,US
+3455598848,3455599103,NO
+3455599104,3455599359,US
+3455599360,3455599615,MX
+3455599616,3455600127,TW
+3455600128,3455600639,GB
+3455600640,3455600895,US
+3455600896,3455601151,GB
+3455601152,3455601407,US
+3455601408,3455601919,GB
+3455601920,3455602175,US
+3455602176,3455602687,GB
+3455602688,3455616511,US
+3455616512,3455616767,CA
+3455616768,3455617279,US
3455617280,3455619071,GB
-3455619072,3455627519,US
+3455619072,3455619839,US
+3455619840,3455620095,GB
+3455620096,3455621631,US
+3455621632,3455622143,GB
+3455622144,3455624191,US
+3455624192,3455624447,FR
+3455624448,3455627519,US
3455627520,3455628287,DK
-3455628288,3455628799,US
+3455628288,3455628543,BE
+3455628544,3455628799,CA
3455628800,3455630847,GB
-3455630848,3455631359,US
+3455630848,3455631103,US
+3455631104,3455631359,GB
3455631360,3455632639,ES
-3455632640,3455634431,US
+3455632640,3455632895,US
+3455632896,3455633407,GB
+3455633408,3455634431,US
3455634432,3455635455,DE
-3455635456,3455713279,US
+3455635456,3455635711,US
+3455635712,3455635967,FR
+3455635968,3455636223,DE
+3455636224,3455636479,CA
+3455636480,3455637759,US
+3455637760,3455638271,GB
+3455638272,3455638527,BE
+3455638528,3455639551,US
+3455639552,3455639807,IT
+3455639808,3455640063,US
+3455640064,3455640319,CA
+3455640320,3455640575,GB
+3455640576,3455640831,US
+3455640832,3455641087,GB
+3455641088,3455641343,NL
+3455641344,3455641599,GB
+3455641600,3455642879,US
+3455642880,3455643135,FR
+3455643136,3455644159,US
+3455644160,3455644415,HK
+3455644416,3455644927,US
+3455644928,3455645439,GB
+3455645440,3455645695,JP
+3455645696,3455645951,BE
+3455645952,3455646719,FR
+3455646720,3455646975,SE
+3455646976,3455647231,GB
+3455647232,3455647487,HK
+3455647488,3455647743,IT
+3455647744,3455713279,US
3455713280,3455778815,CA
3455778816,3455864831,US
3455864832,3455866879,TW
@@ -74957,32 +81146,80 @@
3456360448,3456364543,BG
3456364544,3456892927,US
3456892928,3456958463,CA
-3456958464,3457553407,US
-3457553408,3457553663,CA
-3457553664,3458039807,US
+3456958464,3457551871,US
+3457551872,3457552127,CA
+3457552128,3457553151,US
+3457553152,3457553663,CA
+3457553664,3457554175,US
+3457554176,3457554431,CA
+3457554432,3457555711,US
+3457555712,3457555967,CA
+3457555968,3457564927,US
+3457564928,3457565183,CA
+3457565184,3457575167,US
+3457575168,3457575423,CA
+3457575424,3457577727,US
+3457577728,3457578239,CA
+3457578240,3457580543,US
+3457580544,3457580799,CA
+3457580800,3457582591,US
+3457582592,3457582847,CA
+3457582848,3457592319,US
+3457592320,3457592575,CA
+3457592576,3457595391,US
+3457595392,3457595903,CA
+3457595904,3457596671,US
+3457596672,3457597695,CA
+3457597696,3457598207,US
+3457598208,3457598463,CA
+3457598464,3457600511,US
+3457600512,3457600767,CA
+3457600768,3457683967,US
+3457683968,3457684991,CA
+3457684992,3457859839,US
+3457859840,3457860095,CA
+3457860096,3457892351,US
+3457892352,3457892607,IN
+3457892608,3458039807,US
3458039808,3458043903,CA
3458043904,3458195455,US
3458195456,3458196479,SG
3458196480,3458233343,US
3458233344,3458234367,CA
-3458234368,3458811903,US
+3458234368,3458813951,US
3458813952,3458818047,CA
3458818048,3458820095,US
+3458820096,3458820351,CA
+3458820352,3458820607,US
3458822144,3459055615,US
3459055616,3459121151,CA
3459121152,3459186687,US
3459186688,3459252223,CA
3459252224,3459253247,BS
-3459253248,3459257343,US
+3459253248,3459256831,US
+3459256832,3459257087,CO
+3459257088,3459257343,US
3459257344,3459258367,AW
3459258368,3459259391,CL
-3459259392,3459266559,US
-3459266560,3459268607,AG
+3459259392,3459264767,US
+3459264768,3459265023,VE
+3459265024,3459266559,US
+3459266560,3459267327,AG
+3459267328,3459267583,AI
+3459267584,3459267839,AG
+3459267840,3459268095,DM
+3459268096,3459268607,AG
3459268608,3459273727,US
3459273728,3459274751,CL
3459274752,3459277823,US
3459277824,3459278847,AW
-3459278848,3459295231,US
+3459278848,3459285503,US
+3459285504,3459286271,CL
+3459286272,3459287807,US
+3459287808,3459288063,CL
+3459288064,3459290111,US
+3459290112,3459290623,CL
+3459290624,3459295231,US
3459295232,3459296255,KR
3459296256,3459310591,US
3459310592,3459310847,KY
@@ -74990,28 +81227,81 @@
3459312640,3459312671,MX
3459312672,3459312767,US
3459312768,3459312895,MX
-3459312896,3459326463,US
+3459312896,3459325951,US
+3459325952,3459326207,VE
+3459326208,3459326463,SZ
3459326464,3459327487,CA
3459327488,3459327999,CO
3459328000,3459329023,CL
3459329024,3459330047,VE
-3459330048,3459331583,US
-3459331584,3459332607,PA
-3459332608,3459341055,US
+3459330048,3459334399,US
+3459334400,3459334655,CA
+3459334656,3459335423,US
+3459335424,3459335679,VE
+3459335680,3459335935,DO
+3459335936,3459336191,VE
+3459336192,3459336447,MX
+3459336448,3459336703,US
+3459336704,3459336959,LK
+3459336960,3459337215,AW
+3459337216,3459337471,CO
+3459337472,3459337727,VE
+3459337728,3459337983,MX
+3459337984,3459338239,US
+3459338240,3459338495,SV
+3459338496,3459339263,PH
+3459339264,3459339519,ID
+3459339520,3459339775,US
+3459339776,3459340031,ID
+3459340032,3459340287,VE
+3459340288,3459340543,MX
+3459340544,3459340799,FM
+3459340800,3459341055,SK
3459341056,3459341311,MX
-3459341312,3459343487,US
-3459343488,3459343551,CA
-3459343552,3459350527,US
+3459341312,3459341567,TW
+3459341568,3459341823,US
+3459341824,3459342079,IL
+3459342080,3459342335,LK
+3459342336,3459342591,VE
+3459342592,3459342847,BY
+3459342848,3459343103,VE
+3459343104,3459343359,BR
+3459343360,3459343615,CA
+3459343616,3459344127,OM
+3459344128,3459345663,US
+3459345664,3459345919,OM
+3459345920,3459346431,US
+3459346432,3459346687,LK
+3459346688,3459346943,US
+3459346944,3459347455,PR
+3459347456,3459347711,US
+3459347712,3459348223,PR
+3459348224,3459348479,AG
+3459348480,3459348735,CO
+3459348736,3459348991,BW
+3459348992,3459349503,IT
+3459349504,3459350527,US
3459350528,3459352575,VE
-3459352576,3459353599,US
-3459353600,3459354623,CO
+3459352576,3459352831,US
+3459352832,3459353087,FM
+3459353088,3459353343,US
+3459353344,3459354623,CO
3459354624,3459357183,NI
-3459357184,3459359999,US
+3459357184,3459357439,VE
+3459357440,3459357695,HT
+3459357696,3459357951,SV
+3459357952,3459358207,TG
+3459358208,3459358719,PR
+3459358720,3459358975,VE
+3459358976,3459359999,US
3459360000,3459360511,VE
3459360512,3459362815,US
3459362816,3459364863,CO
3459364864,3459366911,AR
-3459366912,3459368959,VE
+3459366912,3459367167,VE
+3459367168,3459367423,US
+3459367424,3459368703,VE
+3459368704,3459368959,US
3459368960,3459371007,MX
3459371008,3459373055,PE
3459373056,3459373311,US
@@ -75026,6 +81316,7 @@
3459455744,3459456511,CA
3459456512,3459456767,US
3459456768,3459457279,CA
+3459457280,3459457535,US
3459457536,3459457791,CA
3459457792,3459458047,PR
3459458048,3459512319,US
@@ -75033,11 +81324,9 @@
3459513856,3459592191,US
3459592192,3459596287,CA
3459596288,3459614719,US
-3459616768,3459616799,CA
-3459616800,3459616801,US
-3459616802,3459617023,CA
-3459617024,3459617535,US
-3459617536,3459617999,CA
+3459616768,3459617023,CA
+3459617024,3459617791,US
+3459617792,3459617999,CA
3459618000,3459618000,ID
3459618001,3459618047,CA
3459618048,3459618815,US
@@ -75047,8 +81336,10 @@
3459629056,3459631103,US
3459633152,3459731455,US
3459731456,3459735551,CA
-3459735552,3459842815,US
-3459842816,3459843071,BR
+3459735552,3459745535,US
+3459745536,3459745791,IT
+3459745792,3459842815,US
+3459842816,3459843071,AR
3459843072,3459848959,US
3459848960,3459849215,FR
3459849216,3459850239,US
@@ -75063,46 +81354,255 @@
3460070960,3460070963,GB
3460070964,3460071043,US
3460071044,3460071047,GB
-3460071048,3460114431,US
+3460071048,3460104703,US
+3460104704,3460105215,MX
+3460105216,3460114431,US
3460114432,3460116479,SR
3460116480,3460161535,US
3460161536,3460165631,PR
3460165632,3460374527,US
3460374528,3460375551,MX
-3460375552,3460507647,US
+3460375552,3460453631,US
+3460453632,3460453887,BS
+3460453888,3460507647,US
3460507648,3460507903,MX
3460507904,3460761599,US
3460763648,3460794367,US
3460796416,3460878335,US
3460878336,3460878591,CA
3460878592,3460879359,US
-3460882432,3460944127,US
+3460882432,3460893439,US
+3460893440,3460893695,IT
+3460893696,3460894463,US
+3460894464,3460894719,JP
+3460894720,3460895231,US
+3460895232,3460895487,BE
+3460895488,3460896255,US
+3460896256,3460896511,ZA
+3460896512,3460896767,ES
+3460896768,3460897023,FR
+3460897024,3460897279,GB
+3460897280,3460899327,US
+3460899328,3460899583,ZA
+3460899584,3460901375,US
+3460901376,3460901631,SE
+3460901632,3460907263,US
+3460907264,3460907519,SG
+3460907520,3460908287,US
+3460908288,3460908543,FI
+3460908544,3460908799,US
+3460908800,3460910335,IE
+3460910336,3460910591,US
+3460910592,3460910847,IE
+3460910848,3460912127,US
+3460912128,3460912383,IT
+3460912384,3460912639,FR
+3460912640,3460912895,ES
+3460912896,3460916223,US
+3460916224,3460916479,CH
+3460916480,3460916735,GB
+3460916736,3460916991,AR
+3460916992,3460917759,US
+3460917760,3460918015,CA
+3460918016,3460918271,US
+3460918272,3460918527,NL
+3460918528,3460918783,US
+3460918784,3460919039,JP
+3460919040,3460919295,NL
+3460919296,3460920319,US
+3460920320,3460920575,IT
+3460920576,3460920831,BE
+3460920832,3460921343,US
+3460921344,3460921599,DE
+3460921600,3460921855,AU
+3460921856,3460924671,US
+3460924672,3460925183,GB
+3460925184,3460925695,US
+3460925696,3460925951,ES
+3460925952,3460926207,US
+3460926208,3460926463,GB
+3460926464,3460926719,US
+3460926720,3460926975,DE
+3460926976,3460927231,US
+3460927232,3460929023,BE
+3460929024,3460929279,US
+3460929280,3460929535,DE
+3460929536,3460929791,GB
+3460929792,3460930047,DK
+3460930048,3460931583,US
+3460931584,3460931839,SE
+3460931840,3460932095,DE
+3460932096,3460932351,GB
+3460932352,3460932607,FR
+3460932608,3460932863,US
+3460932864,3460933119,GB
+3460933120,3460933887,US
+3460933888,3460934143,DE
+3460934144,3460934911,US
+3460934912,3460935167,SG
+3460935168,3460935679,US
+3460935680,3460935935,FI
+3460935936,3460936191,FR
+3460936192,3460936447,US
+3460936448,3460936703,GB
+3460936704,3460936959,IT
+3460936960,3460937215,DE
+3460937216,3460937471,FR
+3460937472,3460937727,US
+3460937728,3460937983,DK
+3460937984,3460938239,IE
+3460938240,3460938495,DE
+3460938496,3460939263,US
+3460939264,3460939519,HK
+3460939520,3460941567,US
+3460941568,3460941823,AU
+3460941824,3460942079,US
+3460942080,3460942335,GB
+3460942336,3460943359,US
+3460943360,3460943615,ID
+3460943616,3460943871,HK
+3460943872,3460944127,US
3460944128,3460944383,AU
-3460944384,3460954527,US
+3460944384,3460944895,US
+3460944896,3460945151,DE
+3460945152,3460945663,US
+3460945664,3460945919,GB
+3460945920,3460946687,US
+3460946688,3460946943,DE
+3460946944,3460947455,US
+3460947456,3460947711,DE
+3460947712,3460947967,SE
+3460947968,3460950271,US
+3460950272,3460950527,DE
+3460950528,3460951295,US
+3460951296,3460951551,GB
+3460951552,3460952319,US
+3460952320,3460952575,GB
+3460952576,3460952831,ES
+3460952832,3460953855,US
+3460953856,3460954111,GB
+3460954112,3460954527,US
3460954528,3460954559,KR
-3460954560,3461021695,US
-3461021696,3461087231,CA
-3461087232,3461356543,US
+3460954560,3460954623,US
+3460954624,3460954879,DE
+3460954880,3460955135,LU
+3460955136,3461021695,US
+3461021696,3461031935,CA
+3461031936,3461032191,US
+3461032192,3461087231,CA
+3461087232,3461330943,US
+3461330944,3461331199,SG
+3461331200,3461331711,US
+3461331712,3461331967,SG
+3461331968,3461332223,US
+3461332224,3461332479,SG
+3461332480,3461332735,US
+3461332736,3461332991,SG
+3461332992,3461356543,US
3461356544,3461357567,AS
3461357568,3461408767,US
3461410816,3461414911,CA
3461414912,3461441535,US
3461443584,3461507071,US
-3461509120,3461513215,US
-3461513216,3461516287,CA
+3461509120,3461513727,US
+3461513728,3461513983,BF
+3461513984,3461514495,US
+3461514496,3461514751,QA
+3461514752,3461516287,US
3461516288,3461516543,IL
-3461516544,3461517311,CA
-3461517312,3461548031,US
+3461516544,3461548031,US
3461550080,3461554175,US
3461554176,3461556223,CA
3461558272,3461580799,US
3461582848,3461808127,US
3461808128,3461873663,CA
-3461873664,3462593791,US
+3461873664,3461897727,US
+3461897728,3461897983,CA
+3461897984,3461905407,US
+3461905408,3461905663,CA
+3461905664,3461940735,US
+3461940736,3461940991,CA
+3461940992,3461948159,US
+3461948160,3461948415,CA
+3461948416,3461948927,US
+3461948928,3461949183,CA
+3461949184,3461949695,US
+3461949696,3461950207,CA
+3461950208,3461950719,US
+3461950720,3461951231,CA
+3461951232,3461953535,US
+3461953536,3461953791,CA
+3461953792,3461968127,US
+3461968128,3461968383,CA
+3461968384,3461970431,US
+3461970432,3461970687,CA
+3461970688,3461972223,US
+3461972224,3461972479,CA
+3461972480,3461977855,US
+3461977856,3461978111,CA
+3461978112,3461992703,US
+3461992704,3461992959,CA
+3461992960,3462000895,US
+3462000896,3462001151,CA
+3462001152,3462001919,US
+3462001920,3462002431,CA
+3462002432,3462148607,US
+3462148608,3462148863,CA
+3462148864,3462163967,US
+3462163968,3462164223,CA
+3462164224,3462168319,US
+3462168320,3462168575,CA
+3462168576,3462169599,US
+3462169600,3462169855,CA
+3462169856,3462170623,US
+3462170624,3462171135,CA
+3462171136,3462171391,US
+3462171392,3462171647,CA
+3462171648,3462173695,US
+3462173696,3462173951,CA
+3462173952,3462174463,US
+3462174464,3462174719,CA
+3462174720,3462179839,US
+3462179840,3462180095,CA
+3462180096,3462181375,US
+3462181376,3462181887,CA
+3462181888,3462194175,US
+3462194176,3462194431,CA
+3462194432,3462231039,US
+3462231040,3462231295,CA
+3462231296,3462231807,US
+3462231808,3462232063,CA
+3462232064,3462268415,US
+3462268416,3462268671,CA
+3462268672,3462290175,US
+3462290176,3462290431,CA
+3462290432,3462314239,US
+3462314240,3462314495,CA
+3462314496,3462321407,US
+3462321408,3462321663,CA
+3462321664,3462321919,US
+3462321920,3462322175,CA
+3462322176,3462323711,US
+3462323712,3462323967,CA
+3462323968,3462339071,US
+3462339072,3462339583,CA
+3462339584,3462340607,US
+3462340608,3462340863,CA
+3462340864,3462350847,US
+3462350848,3462351103,CA
+3462351104,3462593791,US
3462593792,3462594559,GN
-3462594560,3462633823,US
+3462594560,3462633471,US
+3462633472,3462633727,SG
+3462633728,3462633823,US
3462633824,3462633855,SG
-3462633856,3463004159,US
+3462633856,3462633983,US
+3462633984,3462634239,SG
+3462634240,3462634751,US
+3462634752,3462635007,SG
+3462635008,3462635263,US
+3462635264,3462635519,SG
+3462635520,3463004159,US
3463004160,3463006207,CO
3463006208,3463032319,US
3463032320,3463032831,PR
@@ -75117,13 +81617,10 @@
3463157760,3463176447,US
3463176448,3463176703,CW
3463176704,3463184383,US
-3463184384,3463192575,CA
-3463192576,3463192831,US
-3463192832,3463194623,CA
+3463184384,3463194623,CA
3463194624,3463198719,US
3463198720,3463213311,CA
-3463213312,3463213567,US
-3463214080,3463215103,US
+3463213312,3463215103,US
3463215104,3463243775,CA
3463243776,3463245055,US
3463245056,3463249663,CA
@@ -75133,9 +81630,13 @@
3463536896,3463537151,NG
3463537152,3463708671,US
3463708672,3463774207,CA
-3463774208,3464127999,US
+3463774208,3464108031,US
+3464108032,3464108287,DE
+3464108288,3464127999,US
3464128000,3464128255,DE
-3464128256,3464167679,US
+3464128256,3464129535,US
+3464129536,3464130047,DE
+3464130048,3464167679,US
3464167680,3464169215,CA
3464169216,3464169471,US
3464169472,3464171775,CA
@@ -75160,13 +81661,8 @@
3464384512,3464388607,CA
3464388608,3464391935,US
3464391936,3464392191,CA
-3464392192,3464392703,US
-3464392704,3464392959,CA
-3464392960,3464394751,US
-3464394752,3464396031,LC
-3464396032,3464396287,VC
-3464396288,3464396543,LC
-3464396544,3464396799,VC
+3464392192,3464394751,US
+3464394752,3464396799,VC
3464396800,3464415231,US
3464417280,3464421631,US
3464421632,3464421887,CA
@@ -75178,10 +81674,16 @@
3464428800,3464429311,US
3464429568,3464464383,US
3464466432,3464472575,US
-3464474624,3464549695,US
+3464474624,3464548607,US
+3464548608,3464548863,LC
+3464548864,3464549119,KN
+3464549120,3464549375,VG
+3464549376,3464549695,US
3464549696,3464549727,AG
3464549728,3464549759,KN
-3464549760,3464626175,US
+3464549760,3464550143,US
+3464550144,3464550399,LC
+3464550400,3464626175,US
3464626176,3464626687,CA
3464626688,3464627199,US
3464627968,3464628735,CA
@@ -75189,12 +81691,15 @@
3464628992,3464630271,CA
3464630272,3464631295,US
3464631296,3464631807,CA
-3464632064,3464639487,CA
-3464639744,3464642047,CA
-3464642560,3464648703,CA
+3464632064,3464642047,CA
+3464642560,3464642815,CA
+3464643072,3464647935,CA
+3464648192,3464648703,CA
3464649216,3464650239,CA
3464650752,3464664063,US
-3464664320,3464691711,CA
+3464664320,3464684543,CA
+3464684800,3464688383,CA
+3464688640,3464691711,CA
3464691712,3464769535,US
3464769536,3464773631,CA
3464773632,3464774079,US
@@ -75209,44 +81714,78 @@
3465154560,3465158655,BS
3465158656,3465177087,US
3465177088,3465179135,PE
-3465179136,3465468671,US
+3465179136,3465412607,US
+3465412608,3465412863,HK
+3465412864,3465462783,US
+3465462784,3465463039,GB
+3465463040,3465468159,US
+3465468160,3465468415,GB
+3465468416,3465468671,US
3465468672,3465468927,GB
3465468928,3465510911,US
3465510912,3465543679,JP
-3465543680,3466069071,US
-3466069072,3466069087,CA
-3466069088,3466158079,US
+3465543680,3465962495,US
+3465962496,3465962751,CA
+3465962752,3466067967,US
+3466067968,3466068223,CA
+3466068224,3466068991,US
+3466068992,3466069247,CA
+3466069248,3466069343,US
+3466069344,3466069375,CA
+3466069376,3466069447,US
+3466069448,3466069455,CA
+3466069456,3466072431,US
+3466072432,3466072439,CA
+3466072440,3466072775,US
+3466072776,3466072783,CA
+3466072784,3466073055,US
+3466073056,3466073087,CA
+3466073088,3466158079,US
3466158080,3466166271,PA
-3466166272,3466313727,US
+3466166272,3466290687,US
+3466290688,3466290943,CH
+3466290944,3466296575,US
+3466296576,3466296831,GB
+3466296832,3466313727,US
3466313728,3466317823,CA
-3466317824,3466661887,US
+3466317824,3466489855,US
+3466489856,3466490111,CA
+3466490112,3466558207,US
+3466558208,3466558463,EC
+3466558464,3466560255,US
+3466560256,3466560511,GH
+3466560512,3466661887,US
3466661888,3466663935,TW
3466663936,3466683135,US
3466683136,3466683391,NG
-3466683392,3466756095,US
+3466683392,3466734847,US
+3466734848,3466735103,RU
+3466735104,3466756095,US
3466756096,3466772479,CA
3466772480,3466846207,US
3466846208,3466854399,CA
-3466854400,3466901503,US
+3466854400,3466860799,US
+3466860800,3466861311,FR
+3466861312,3466901503,US
3466901504,3466903551,DE
3466903552,3466907647,US
3466907648,3466909695,DE
-3466909696,3466929407,US
+3466909696,3466914303,US
+3466914304,3466914559,FR
+3466914560,3466929407,US
3466929408,3466929663,IT
-3466929664,3466937599,US
-3466937600,3466937663,ES
+3466929664,3466937663,US
3466937664,3466937669,DE
3466937670,3466937670,US
3466937671,3466937727,DE
-3466937728,3466937855,ES
-3466937856,3466938444,US
+3466937728,3466938444,US
3466938445,3466938448,HK
3466938449,3466938807,US
3466938808,3466938811,GB
-3466938812,3467051007,US
-3467051008,3467051263,CA
-3467051264,3467051519,US
-3467051520,3467068927,CA
+3466938812,3466958079,US
+3466958080,3466958335,CA
+3466958336,3467051007,US
+3467051008,3467068927,CA
3467069440,3467116543,CA
3467116544,3467378687,US
3467378688,3467444223,CA
@@ -75256,9 +81795,101 @@
3467706368,3467902975,CA
3467902976,3467964415,US
3467964416,3467968511,CA
-3467968512,3468058687,US
+3467968512,3468034047,US
+3468034048,3468036095,GB
+3468036096,3468036351,BE
+3468036352,3468036607,DE
+3468036608,3468036863,ES
+3468036864,3468037375,DE
+3468037376,3468037887,US
+3468037888,3468038143,IE
+3468038144,3468038655,FR
+3468038656,3468038911,NL
+3468038912,3468039167,SE
+3468039168,3468039423,FR
+3468039424,3468041215,US
+3468041216,3468041471,FI
+3468041472,3468041727,US
+3468041728,3468041983,TW
+3468041984,3468042495,US
+3468042496,3468042751,AT
+3468042752,3468045055,US
+3468045056,3468045311,DE
+3468045312,3468045823,US
+3468045824,3468046079,NO
+3468046080,3468046335,ZA
+3468046336,3468046591,FR
+3468046592,3468046847,US
+3468046848,3468047103,IT
+3468047104,3468047359,US
+3468047360,3468047615,DE
+3468047616,3468048383,US
+3468048384,3468048639,FR
+3468048640,3468049407,US
+3468049408,3468049663,GB
+3468049664,3468049919,US
+3468049920,3468050175,IT
+3468050176,3468050431,US
+3468050432,3468050687,SE
+3468050688,3468052479,US
+3468052480,3468052735,ES
+3468052736,3468052991,GB
+3468052992,3468053759,US
+3468053760,3468054015,CH
+3468054016,3468054271,DE
+3468054272,3468055551,US
+3468055552,3468055807,IT
+3468055808,3468056575,US
+3468056576,3468056831,NO
+3468056832,3468057599,US
+3468057600,3468057855,IL
+3468057856,3468058687,US
3468058688,3468058719,ES
-3468058720,3468127743,US
+3468058720,3468059647,US
+3468059648,3468059903,FR
+3468059904,3468060159,DE
+3468060160,3468060671,FR
+3468060672,3468061695,US
+3468061696,3468061951,JP
+3468061952,3468062463,US
+3468062464,3468062719,AT
+3468062720,3468063231,NL
+3468063232,3468063487,US
+3468063488,3468063743,BE
+3468063744,3468063999,US
+3468064000,3468064255,HK
+3468064256,3468064767,US
+3468064768,3468065023,DE
+3468065024,3468065279,US
+3468065280,3468065535,DE
+3468065536,3468068095,US
+3468068096,3468068351,MC
+3468068352,3468068863,US
+3468068864,3468069631,CA
+3468069632,3468081407,US
+3468081408,3468081663,DE
+3468081664,3468081919,AT
+3468081920,3468082431,US
+3468082432,3468082687,NO
+3468082688,3468083967,US
+3468083968,3468084223,AU
+3468084224,3468084735,US
+3468084736,3468084991,SG
+3468084992,3468085759,US
+3468085760,3468086015,ID
+3468086016,3468087807,US
+3468087808,3468088063,SG
+3468088064,3468091391,US
+3468091392,3468091647,NL
+3468091648,3468093695,US
+3468093696,3468093951,DE
+3468093952,3468095231,US
+3468095232,3468095487,SE
+3468095488,3468096511,US
+3468096512,3468096767,NO
+3468096768,3468099327,US
+3468099328,3468099583,FR
+3468099584,3468127743,US
3468127744,3468128255,IN
3468128256,3468142591,US
3468144640,3468296191,US
@@ -75266,22 +81897,28 @@
3468361728,3468443647,US
3468443648,3468460031,CA
3468460032,3468468223,BM
-3468468224,3468598527,US
+3468468224,3468545791,US
+3468545792,3468546047,SG
+3468546048,3468598527,US
3468598528,3468598783,SG
3468598784,3468599039,NL
3468599040,3468599295,SG
-3468599296,3468623871,US
+3468599296,3468619007,US
+3468619008,3468619263,CA
+3468619264,3468623871,US
3468623872,3468656639,CA
-3468656640,3468799999,US
-3468800000,3468800255,GB
-3468800256,3469010687,US
+3468656640,3469010687,US
3469010688,3469010943,AU
3469010944,3469055743,US
3469055744,3469055999,CA
3469056000,3469068287,US
3469068800,3469070335,US
3469070336,3469070591,CA
-3469070592,3469859583,US
+3469070592,3469176319,US
+3469176320,3469176575,MX
+3469176576,3469186303,US
+3469186304,3469186559,MX
+3469186560,3469859583,US
3469859584,3469859839,CA
3469859840,3469893631,US
3469893632,3469901823,CA
@@ -75290,7 +81927,15 @@
3470131200,3470135295,AG
3470135296,3470137343,LC
3470137344,3470139391,VG
-3470139392,3470188111,US
+3470139392,3470148095,US
+3470148096,3470148351,CA
+3470148352,3470148607,US
+3470148608,3470148863,CA
+3470148864,3470151807,US
+3470151808,3470151871,CA
+3470151872,3470151935,US
+3470151936,3470152191,EG
+3470152192,3470188111,US
3470188112,3470188115,CA
3470188116,3470192639,US
3470192640,3470194927,CA
@@ -75305,6 +81950,7 @@
3470559232,3470573567,US
3470573568,3470575615,CA
3470575616,3470610431,US
+3470610432,3470614527,AR
3470614528,3470646591,US
3470646592,3470646599,CN
3470646600,3470651391,US
@@ -75324,9 +81970,11 @@
3470753024,3470754303,US
3470754304,3470754559,PE
3470754560,3470755839,US
-3470755840,3470756095,ZA
+3470755840,3470756095,MU
3470756096,3470761983,US
-3470761984,3470770175,CA
+3470761984,3470767871,CA
+3470767872,3470768127,IE
+3470768128,3470770175,CA
3470770176,3470778367,US
3470778368,3470786559,CA
3470786560,3470794751,US
@@ -75335,15 +81983,17 @@
3470884864,3470885887,HK
3470885888,3471057919,US
3471057920,3471058943,VE
-3471058944,3471059967,US
-3471059968,3471060223,ES
-3471060224,3471262719,US
+3471058944,3471059455,US
+3471059456,3471060223,ES
+3471060224,3471060991,US
+3471060992,3471061247,NL
+3471061248,3471061503,US
+3471061504,3471061759,NL
+3471061760,3471262719,US
3471262720,3471263743,EC
3471263744,3471265791,CO
3471265792,3471276031,US
-3471276032,3471277055,BB
-3471277056,3471277311,GB
-3471277312,3471278079,BB
+3471276032,3471278079,BB
3471278080,3471529215,US
3471529216,3471529983,CA
3471529984,3471558655,US
@@ -75357,16 +82007,37 @@
3472571648,3472571903,GH
3472571904,3472721919,US
3472723968,3473039359,US
-3473039360,3473041407,BM
-3473041408,3473067007,US
+3473039360,3473040639,BM
+3473040640,3473040895,US
+3473040896,3473041407,BM
+3473041408,3473043455,US
+3473047552,3473067007,US
3473067008,3473068031,CA
3473068032,3473276927,US
3473276928,3473342463,CA
-3473342464,3474053119,US
+3473342464,3473755391,US
+3473755392,3473755647,HN
+3473755648,3473765887,US
+3473765888,3473766399,EC
+3473766400,3473901055,US
+3473901056,3473901311,EC
+3473901312,3473917439,US
+3473917440,3473917695,PR
+3473917696,3474053119,US
3474053120,3474055167,PE
-3474055168,3474391039,US
+3474055168,3474193407,US
+3474193408,3474193663,PH
+3474193664,3474193919,US
+3474193920,3474194431,PH
+3474194432,3474391039,US
3474391040,3474456575,CA
-3474456576,3475112191,US
+3474456576,3474463231,US
+3474463232,3474463487,GB
+3474463488,3474464255,US
+3474464256,3474464767,GB
+3474464768,3474548223,US
+3474548224,3474548479,JP
+3474548480,3475112191,US
3475112192,3475113215,CA
3475113216,3475115007,US
3475115008,3475120127,CA
@@ -75376,20 +82047,22 @@
3475296462,3475296462,AE
3475296463,3475310847,US
3475310848,3475311103,DE
-3475311104,3475670015,US
-3475670016,3475670783,AG
+3475311104,3475589887,US
+3475589888,3475590143,EC
+3475590144,3475670015,US
+3475670016,3475670271,AG
+3475670272,3475670527,AI
+3475670528,3475670783,LC
3475670784,3475670847,DM
3475670848,3475671039,AG
3475671040,3475681279,US
3475681280,3475685375,HN
3475685376,3475851263,US
-3475853312,3475881983,US
-3475881984,3475882767,CA
+3475853312,3475882767,US
3475882768,3475882783,FR
-3475882784,3475882799,CA
+3475882784,3475882799,US
3475882800,3475882815,FR
-3475882816,3475890175,CA
-3475890176,3475896319,US
+3475882816,3475896319,US
3475896320,3475896575,FR
3475896576,3475897471,US
3475897472,3475897503,FR
@@ -75401,17 +82074,17 @@
3475921152,3475921407,JP
3475921408,3475996671,US
3475996672,3476029439,CA
-3476029440,3476418559,US
-3476418560,3476421631,CA
-3476421632,3476447231,US
+3476029440,3476111359,US
+3476111360,3476111871,CA
+3476111872,3476348927,US
+3476348928,3476349183,CA
+3476349184,3476447231,US
3476447232,3476455423,CA
3476455424,3476881407,US
3476881408,3476946943,CA
-3476946944,3477541887,US
-3477541888,3477542207,IN
-3477542208,3477542271,US
-3477542272,3477542911,IN
-3477542912,3478114303,US
+3476946944,3477542143,US
+3477542144,3477542399,IN
+3477542400,3478114303,US
3478114304,3478118399,PE
3478118400,3478192127,US
3478192128,3478257663,CA
@@ -75425,26 +82098,136 @@
3479240704,3479568383,US
3479568384,3479633919,CA
3479633920,3479896063,US
-3479896064,3479961599,CA
+3479896064,3479956479,CA
+3479956480,3479956735,US
+3479956736,3479961599,CA
3479961600,3480223743,US
3480223744,3480256511,CA
-3480256512,3480444927,US
+3480256512,3480284159,US
+3480284160,3480284671,CA
+3480284672,3480444927,US
3480444928,3480449023,CA
-3480453120,3480556287,US
+3480453120,3480551423,US
+3480551424,3480551679,JP
+3480551680,3480551935,DE
+3480551936,3480552191,GB
+3480552192,3480552447,US
+3480552448,3480552703,CH
+3480552704,3480552959,US
+3480552960,3480553215,AT
+3480553216,3480553471,US
+3480553472,3480553727,SG
+3480553728,3480553983,HK
+3480553984,3480554239,US
+3480554240,3480554495,GB
+3480554496,3480554751,SG
+3480554752,3480555263,US
+3480555264,3480555519,NO
+3480555520,3480555775,FR
+3480555776,3480556287,SG
3480556288,3480556543,HK
-3480556544,3480575743,US
+3480556544,3480557055,US
+3480557056,3480557311,HK
+3480557312,3480557567,US
+3480557568,3480557823,JP
+3480557824,3480558079,CA
+3480558080,3480558591,US
+3480558592,3480558847,DO
+3480558848,3480559359,US
+3480559360,3480559615,IT
+3480559616,3480560895,US
+3480560896,3480561151,BR
+3480561152,3480561919,US
+3480561920,3480562175,JP
+3480562176,3480564735,US
+3480564736,3480564991,DE
+3480564992,3480567039,US
+3480567040,3480567551,GB
+3480567552,3480568319,US
+3480568320,3480568575,HK
+3480568576,3480569599,US
+3480569600,3480569855,HK
+3480569856,3480570111,US
+3480570112,3480570367,FR
+3480570368,3480570623,ES
+3480570624,3480570879,JP
+3480570880,3480571391,CH
+3480571392,3480571647,BE
+3480571648,3480575231,US
+3480575232,3480575487,IL
+3480575488,3480575743,US
3480575744,3480577023,IT
-3480577024,3480582655,US
+3480577024,3480580607,US
+3480580608,3480580863,SE
+3480580864,3480581119,DK
+3480581120,3480581631,US
+3480581632,3480581887,CL
+3480581888,3480582143,NO
+3480582144,3480582399,US
+3480582400,3480582655,RU
3480582656,3480583423,MX
-3480583424,3480595967,US
+3480583424,3480588799,US
+3480588800,3480589055,SE
+3480589056,3480591103,US
+3480591104,3480591359,ZA
+3480591360,3480591615,US
+3480591616,3480592127,ID
+3480592128,3480592383,NO
+3480592384,3480592639,CH
+3480592640,3480592895,IE
+3480592896,3480593151,SG
+3480593152,3480593407,DK
+3480593408,3480593663,SG
+3480593664,3480593919,CN
+3480593920,3480594175,ZA
+3480594176,3480594431,BE
+3480594432,3480595711,US
+3480595712,3480595967,TH
3480595968,3480596991,SG
3480596992,3480597247,US
3480597248,3480598271,AU
-3480598272,3480602879,US
+3480598272,3480598527,FR
+3480598528,3480599039,AU
+3480599040,3480599295,JP
+3480599296,3480599551,CA
+3480599552,3480599807,SG
+3480599808,3480600575,US
+3480600576,3480601087,DE
+3480601088,3480601343,BE
+3480601344,3480601599,AU
+3480601600,3480601855,GB
+3480601856,3480602111,FR
+3480602112,3480602879,US
3480602880,3480603647,IT
-3480603648,3480612351,US
+3480603648,3480603903,BE
+3480603904,3480604159,HK
+3480604160,3480604671,ES
+3480604672,3480604927,IL
+3480604928,3480605183,GB
+3480605184,3480605439,MX
+3480605440,3480605695,PH
+3480605696,3480605951,MX
+3480605952,3480606207,PH
+3480606208,3480606463,MX
+3480606464,3480606719,BE
+3480606720,3480606975,GR
+3480606976,3480607231,US
+3480607232,3480607487,IT
+3480607488,3480610303,US
+3480610304,3480610559,ES
+3480610560,3480611327,US
+3480611328,3480611583,JP
+3480611584,3480611839,MX
+3480611840,3480612095,BR
+3480612096,3480612351,LU
3480612352,3480613631,DE
-3480613632,3481176063,US
+3480613632,3480839423,US
+3480839424,3480839935,GB
+3480839936,3480907263,US
+3480907264,3480907775,FR
+3480907776,3480968191,US
+3480968192,3480968447,AU
+3480968448,3481176063,US
3481178112,3481665535,US
3481665536,3481731071,CA
3481731072,3481812991,US
@@ -75455,11 +82238,114 @@
3481951396,3481951399,GB
3481951400,3481964575,US
3481964576,3481964579,IE
-3481964580,3481973247,US
-3481973248,3481973503,CA
-3481973504,3481993215,US
-3481993216,3482058751,CA
-3482058752,3482583039,US
+3481964580,3481993791,US
+3481993792,3481993799,CA
+3481993800,3481994239,US
+3481994240,3481994751,CA
+3481994752,3481995007,US
+3481995008,3481995263,CA
+3481995264,3481996031,US
+3481996032,3481996287,CA
+3481996288,3481996543,US
+3481996544,3481997311,CA
+3481997312,3481997567,US
+3481997568,3481998591,CA
+3481998592,3481998847,AG
+3481998848,3481999103,US
+3481999104,3481999359,CA
+3481999360,3481999615,US
+3481999616,3482001663,CA
+3482001664,3482001919,US
+3482001920,3482002175,CA
+3482002176,3482002431,US
+3482002432,3482003455,CA
+3482003456,3482004479,US
+3482004480,3482006015,CA
+3482006016,3482007551,US
+3482007552,3482008063,CA
+3482008064,3482008319,US
+3482008320,3482011135,CA
+3482011136,3482011647,US
+3482011648,3482012159,CA
+3482012160,3482012927,US
+3482012928,3482013951,CA
+3482013952,3482014207,US
+3482014208,3482014719,CA
+3482014720,3482014863,US
+3482014864,3482014879,CA
+3482014880,3482016255,US
+3482016256,3482016767,CA
+3482016768,3482017023,US
+3482017024,3482017279,CA
+3482017280,3482017535,US
+3482017536,3482017791,CA
+3482017792,3482018047,US
+3482018048,3482018303,CA
+3482018304,3482018559,US
+3482018560,3482018815,CA
+3482018816,3482019327,US
+3482019328,3482019583,CA
+3482019584,3482020607,US
+3482020608,3482020863,CA
+3482020864,3482021119,US
+3482021120,3482022143,CA
+3482022144,3482022911,US
+3482022912,3482024703,CA
+3482024704,3482024959,US
+3482024960,3482025215,CA
+3482025216,3482025471,US
+3482025472,3482028543,CA
+3482028544,3482028799,US
+3482028800,3482029311,CA
+3482029312,3482029567,US
+3482029568,3482032895,CA
+3482032896,3482033151,US
+3482033152,3482033663,CA
+3482033664,3482033919,US
+3482033920,3482034431,CA
+3482034432,3482035199,US
+3482035200,3482035711,CA
+3482035712,3482035967,US
+3482035968,3482036223,CA
+3482036224,3482036479,US
+3482036480,3482036735,CA
+3482036736,3482036991,US
+3482036992,3482037247,CA
+3482037248,3482037759,US
+3482037760,3482038015,CA
+3482038016,3482038271,US
+3482038272,3482038783,CA
+3482038784,3482039039,US
+3482039040,3482039295,CA
+3482039296,3482039551,US
+3482039552,3482040319,CA
+3482040320,3482041087,US
+3482041088,3482041343,CA
+3482041344,3482041599,US
+3482041600,3482042367,CA
+3482042368,3482043903,US
+3482043904,3482044927,CA
+3482044928,3482045183,US
+3482045184,3482045695,CA
+3482045696,3482046207,US
+3482046208,3482046463,CA
+3482046464,3482046975,US
+3482046976,3482047487,CA
+3482047488,3482047743,US
+3482047744,3482047999,CA
+3482048000,3482048511,US
+3482048512,3482048767,CA
+3482048768,3482049791,US
+3482049792,3482050559,CA
+3482050560,3482051327,US
+3482051328,3482051583,CA
+3482051584,3482051839,US
+3482051840,3482052863,CA
+3482052864,3482053631,US
+3482053632,3482054655,CA
+3482054656,3482058239,US
+3482058240,3482058495,CA
+3482058496,3482583039,US
3482583040,3482632191,CA
3482632192,3482775551,US
3482775552,3482779647,PR
@@ -75474,33 +82360,95 @@
3483791624,3483791631,US
3483791632,3483791815,PR
3483791816,3483791823,US
-3483791824,3483795455,PR
+3483791824,3483793919,PR
+3483793920,3483794431,US
+3483794432,3483795455,PR
3483795456,3483828223,US
3483828224,3483836415,CA
3483836416,3483877375,US
3483877376,3483893759,CA
3483893760,3484006911,US
3484006912,3484007167,AU
-3484007168,3484319743,US
+3484007168,3484013055,US
+3484013056,3484013567,DE
+3484013568,3484319743,US
3484320256,3484320511,US
3484321792,3484322047,PR
3484322048,3484323839,US
3484326912,3484327423,US
3484331008,3484437503,US
3484437504,3484442623,GB
-3484442624,3484459007,US
+3484442624,3484450815,US
+3484450816,3484451839,CA
+3484451840,3484452095,US
+3484452096,3484453631,CA
+3484453632,3484453887,US
+3484453888,3484455167,CA
+3484455168,3484455423,US
+3484455424,3484455679,CA
+3484455680,3484455935,US
+3484455936,3484456191,CA
+3484456192,3484456703,US
+3484456704,3484457727,CA
+3484457728,3484457983,US
+3484457984,3484458751,CA
+3484458752,3484459007,US
3484459008,3484459775,CA
3484459776,3484460687,US
3484460688,3484460703,CA
3484460704,3484460735,US
3484460736,3484460751,CA
-3484460752,3484464319,US
+3484460752,3484460799,US
+3484460800,3484461055,CA
+3484461056,3484461823,US
+3484461824,3484462079,CA
+3484462080,3484462335,US
+3484462336,3484462591,CA
+3484462592,3484463359,US
+3484463360,3484464127,CA
+3484464128,3484464319,US
3484464320,3484464335,CA
-3484464336,3484472831,US
-3484472832,3484473087,CA
-3484473088,3484480255,US
-3484480256,3484480511,CA
-3484480512,3484647423,US
+3484464336,3484464895,US
+3484464896,3484465151,CA
+3484465152,3484465663,US
+3484465664,3484465919,CA
+3484465920,3484466175,US
+3484466176,3484466431,CA
+3484466432,3484466687,US
+3484466688,3484468223,CA
+3484468224,3484468479,US
+3484468480,3484468991,CA
+3484468992,3484469247,US
+3484469248,3484469759,CA
+3484469760,3484470015,US
+3484470016,3484470527,CA
+3484470528,3484471807,US
+3484471808,3484472063,CA
+3484472064,3484472319,US
+3484472320,3484472575,CA
+3484472576,3484472967,US
+3484472968,3484472975,CA
+3484472976,3484473343,US
+3484473344,3484473599,CA
+3484473600,3484473855,US
+3484473856,3484474879,CA
+3484474880,3484475135,US
+3484475136,3484477183,CA
+3484477184,3484477695,US
+3484477696,3484477951,CA
+3484477952,3484478719,US
+3484478720,3484478975,CA
+3484478976,3484479231,US
+3484479232,3484479487,CA
+3484479488,3484479743,US
+3484479744,3484479999,CA
+3484480000,3484480255,US
+3484480256,3484481279,CA
+3484481280,3484481535,US
+3484481536,3484482047,CA
+3484482048,3484482559,US
+3484482560,3484483583,CA
+3484483584,3484647423,US
3484647424,3484663807,CA
3484663808,3484762111,US
3484762112,3484778495,CA
@@ -75514,34 +82462,235 @@
3485446144,3485462527,US
3485462528,3485464575,VC
3485464576,3485466623,LC
-3485466624,3485499391,US
-3485515776,3485597695,US
+3485466624,3485597695,US
3485597696,3485672543,CA
3485672544,3485672551,US
3485672552,3485695999,CA
3485696000,3485721056,US
3485721057,3485721057,AE
-3485721058,3486023679,US
+3485721058,3485959423,US
+3485959424,3485960191,CA
+3485960192,3486023679,US
3486023680,3486031871,CA
3486031872,3486269439,US
3486269440,3486285823,JM
3486285824,3486302207,PR
3486302208,3486310399,CA
-3486310400,3486646271,US
+3486310400,3486580735,US
+3486580736,3486580991,GB
+3486580992,3486581503,DE
+3486581504,3486581759,TW
+3486581760,3486582015,GB
+3486582016,3486582271,NO
+3486582272,3486582527,BE
+3486582528,3486582783,AU
+3486582784,3486583039,DE
+3486583040,3486583295,CH
+3486583296,3486583807,US
+3486583808,3486584063,KR
+3486584064,3486584319,US
+3486584320,3486584831,CA
+3486584832,3486585343,US
+3486585344,3486585599,PT
+3486585600,3486586367,FR
+3486586368,3486586623,NZ
+3486586624,3486586879,US
+3486586880,3486587135,AU
+3486587136,3486587391,FR
+3486587392,3486587647,NL
+3486587648,3486587903,CL
+3486587904,3486588415,GB
+3486588416,3486588671,FR
+3486588672,3486589951,US
+3486589952,3486590207,IT
+3486590208,3486590463,US
+3486590464,3486591743,GB
+3486591744,3486591999,CH
+3486592000,3486592255,US
+3486592256,3486592511,NL
+3486592512,3486593023,NO
+3486593024,3486593279,NL
+3486593280,3486593791,DE
+3486593792,3486594047,FR
+3486594048,3486594303,DE
+3486594304,3486594559,BE
+3486594560,3486595071,US
+3486595072,3486595327,DK
+3486595328,3486595583,ID
+3486595584,3486595839,PR
+3486595840,3486596095,DK
+3486596096,3486596351,NL
+3486596352,3486596607,NO
+3486596608,3486596863,US
+3486596864,3486597119,GB
+3486597120,3486597375,IE
+3486597376,3486597631,IT
+3486597632,3486597887,GB
+3486597888,3486598655,US
+3486598656,3486598911,BR
+3486598912,3486599167,NO
+3486599168,3486599423,SE
+3486599424,3486599679,BR
+3486599680,3486599935,US
+3486599936,3486600447,BR
+3486600448,3486601215,US
+3486601216,3486601471,BE
+3486601472,3486601727,US
+3486601728,3486601983,BE
+3486601984,3486602239,NZ
+3486602240,3486603007,US
+3486603008,3486603263,SG
+3486603264,3486603519,US
+3486603520,3486603775,JP
+3486603776,3486604287,US
+3486604288,3486604543,BE
+3486604544,3486605055,US
+3486605056,3486605311,ES
+3486605312,3486605567,NL
+3486605568,3486606079,US
+3486606080,3486606335,MY
+3486606336,3486606591,US
+3486606592,3486606847,FI
+3486606848,3486607359,US
+3486607360,3486607615,JP
+3486607616,3486607871,US
+3486607872,3486608127,PH
+3486608128,3486608383,GB
+3486608384,3486609151,US
+3486609152,3486609663,HK
+3486609664,3486609919,AU
+3486609920,3486610175,SG
+3486610176,3486610431,US
+3486610432,3486610687,SE
+3486610688,3486610943,NL
+3486610944,3486611455,US
+3486611456,3486611711,SG
+3486611712,3486611967,US
+3486611968,3486612223,HK
+3486612224,3486612479,SG
+3486612480,3486612735,US
+3486612736,3486612991,DE
+3486612992,3486613247,US
+3486613248,3486613759,GB
+3486613760,3486614015,ES
+3486614016,3486614271,US
+3486614272,3486614527,GB
+3486614528,3486614783,US
+3486614784,3486615039,FR
+3486615040,3486615295,BE
+3486615296,3486615551,PH
+3486615552,3486616319,US
+3486616320,3486616831,NO
+3486616832,3486617599,US
+3486617600,3486617855,CH
+3486617856,3486618111,AU
+3486618112,3486618367,NO
+3486618368,3486618623,ES
+3486618624,3486618879,BE
+3486618880,3486619135,FR
+3486619136,3486619391,SG
+3486619392,3486619647,BE
+3486619648,3486619903,CA
+3486619904,3486620159,US
+3486620160,3486620415,SE
+3486620416,3486620671,HK
+3486620672,3486620927,US
+3486620928,3486621183,NL
+3486621184,3486621439,US
+3486621440,3486621695,NL
+3486621696,3486621951,FI
+3486621952,3486622207,ES
+3486622208,3486622463,ZA
+3486622464,3486622719,GB
+3486622720,3486622975,MX
+3486622976,3486623231,DE
+3486623232,3486623487,JP
+3486623488,3486623743,DE
+3486623744,3486623999,US
+3486624000,3486624255,PH
+3486624256,3486624511,SG
+3486624512,3486624767,SE
+3486624768,3486625023,ES
+3486625024,3486625279,US
+3486625280,3486625535,SE
+3486625536,3486625791,NO
+3486625792,3486626047,NL
+3486626048,3486626303,FI
+3486626304,3486626559,IL
+3486626560,3486627071,US
+3486627072,3486627327,JP
+3486627328,3486627583,US
+3486627584,3486627839,BE
+3486627840,3486628095,BW
+3486628096,3486628351,ZA
+3486628352,3486628607,US
+3486628608,3486628863,NO
+3486628864,3486629375,PT
+3486629376,3486629631,US
+3486629632,3486629887,CL
+3486629888,3486630143,SE
+3486630144,3486631679,JP
+3486631680,3486631935,ID
+3486631936,3486632447,JP
+3486632448,3486632703,US
+3486632704,3486632959,JP
+3486632960,3486633215,IT
+3486633216,3486633471,GB
+3486633472,3486633983,US
+3486633984,3486634239,HK
+3486634240,3486634495,US
+3486634496,3486634751,KR
+3486634752,3486635007,CH
+3486635008,3486635263,DK
+3486635264,3486635519,FR
+3486635520,3486635775,ES
+3486635776,3486636031,IL
+3486636032,3486636287,ES
+3486636288,3486636543,NL
+3486636544,3486636799,TW
+3486636800,3486637055,DE
+3486637056,3486637311,US
+3486637312,3486637823,BE
+3486637824,3486638335,SE
+3486638336,3486638591,FR
+3486638592,3486638847,US
+3486638848,3486639103,DK
+3486639104,3486639359,BE
+3486639360,3486639615,SG
+3486639616,3486640127,US
+3486640128,3486640383,BE
+3486640384,3486640639,GB
+3486640640,3486642175,US
+3486642176,3486642431,BR
+3486642432,3486642687,PT
+3486642688,3486642943,DK
+3486642944,3486646271,US
3486646272,3486662655,CA
3486662656,3486688255,US
3486688256,3486688511,GB
-3486688512,3487039487,US
+3486688512,3486699519,US
+3486699520,3486699775,CA
+3486699776,3486702591,US
+3486702592,3486702847,CA
+3486702848,3487039487,US
3487039488,3487105023,CA
3487105024,3487175935,US
3487175936,3487176191,GB
-3487176192,3487181359,US
+3487176192,3487177983,US
+3487177984,3487178239,GB
+3487178240,3487181359,US
3487181360,3487181375,GB
-3487181376,3487216383,US
+3487181376,3487189247,US
+3487189248,3487189503,DK
+3487189504,3487197183,US
+3487197184,3487197439,DK
+3487197440,3487216383,US
3487216384,3487216639,SE
3487216640,3487236095,US
3487236096,3487301631,CA
-3487301632,3487703039,US
+3487301632,3487561471,US
+3487561472,3487561727,AU
+3487561728,3487703039,US
3487703040,3487703073,DE
3487703074,3487703074,US
3487703075,3487704849,DE
@@ -75557,10 +82706,15 @@
3487766528,3487768575,CA
3487768576,3487842303,US
3487842304,3487858687,CA
-3487858688,3487875071,BM
+3487858688,3487859199,KY
+3487859200,3487861759,BM
+3487861760,3487862015,KY
+3487862016,3487875071,BM
3487875072,3487891455,US
3487891456,3487907839,CA
-3487907840,3488014335,US
+3487907840,3487969791,US
+3487969792,3487970047,KW
+3487970048,3488014335,US
3488014336,3488022527,CA
3488022528,3488049151,US
3488051200,3488065535,US
@@ -75572,59 +82726,90 @@
3488088064,3488104447,IL
3488104448,3488112639,US
3488112640,3488120831,CA
-3488120832,3488290815,US
-3488290816,3488291839,IN
-3488291840,3488307199,US
-3488307200,3488308223,IN
+3488120832,3488307711,US
+3488307712,3488308223,IN
3488308224,3488350207,US
3488350208,3488415743,CA
-3488415744,3488909311,US
+3488415744,3488615935,US
+3488615936,3488616191,AU
+3488616192,3488901887,US
+3488901888,3488902143,CA
+3488902144,3488909311,US
3488911360,3488940031,US
3488940032,3488956415,CA
3488956416,3488989183,US
3488989184,3489005567,CA
3489005568,3489136639,US
3489136640,3489153535,MX
+3489153536,3489154047,HN
3489154048,3489155583,MX
-3489156608,3489160191,MX
+3489155584,3489156095,AR
+3489156608,3489157119,MX
+3489157632,3489158399,MX
+3489158400,3489158655,AR
+3489159168,3489160191,MX
+3489160192,3489161215,AR
3489161216,3489163775,MX
3489164288,3489166591,MX
3489166848,3489167615,MX
3489167872,3489168127,MX
+3489168384,3489169407,AR
3489169408,3489185791,MX
+3489185792,3489193983,CL
3489193984,3489267711,MX
3489267712,3489341439,US
3489341440,3489345535,CA
-3489345536,3489464319,US
+3489345536,3489398783,US
+3489398784,3489399039,IT
+3489399040,3489464319,US
3489464320,3489529855,CA
3489529856,3489562623,US
-3489562624,3489566719,JM
-3489566720,3489577215,US
+3489563136,3489563391,JM
+3489566720,3489575935,US
+3489575936,3489576959,CN
+3489576960,3489577215,US
3489577216,3489578239,CN
3489578240,3489685503,US
3489685504,3489687551,BB
-3489687552,3489718271,US
-3489718272,3489720319,AG
+3489687552,3489717759,US
+3489717760,3489718015,PR
+3489718016,3489718271,US
+3489718272,3489718527,DM
+3489718528,3489719039,LC
+3489719040,3489719551,AG
+3489719552,3489719807,VG
+3489719808,3489720063,DM
+3489720064,3489720319,LC
3489720320,3489738751,US
3489738752,3489740799,PH
3489740800,3489775103,US
3489775104,3489775359,BO
3489775360,3489969151,US
3489969152,3489969663,PR
-3489969664,3490263039,US
+3489969664,3490228735,US
+3490228736,3490229247,CO
+3490229248,3490263039,US
3490263040,3490265087,CO
3490265088,3490265343,EC
3490265344,3490267135,CO
3490267136,3490488319,US
3490488320,3490489343,PR
-3490489344,3491381247,US
-3491381248,3491381503,BM
-3491381504,3491381759,KY
-3491381760,3491389439,BM
-3491389440,3491477503,US
-3491477504,3491478527,VI
-3491478528,3491651583,US
-3491651584,3491659775,VI
+3490489344,3490703615,US
+3490703616,3490703871,PR
+3490703872,3490786047,US
+3490786048,3490786303,PR
+3490786304,3490879231,US
+3490879232,3490879487,PR
+3490879488,3491381247,US
+3491381248,3491389439,BM
+3491389440,3491476991,US
+3491476992,3491478527,VI
+3491478528,3491637247,US
+3491637248,3491637759,CO
+3491637760,3491651583,US
+3491651584,3491654655,VI
+3491654656,3491654911,US
+3491654912,3491659775,VI
3491659776,3491743743,US
3491743744,3491745791,CO
3491745792,3491969023,US
@@ -75633,59 +82818,63 @@
3492151296,3492167679,CA
3492167680,3492669951,US
3492669952,3492671487,PA
-3492671488,3492858111,US
-3492858112,3492858367,SA
-3492858368,3492867071,US
+3492671488,3492812759,US
+3492812760,3492812763,JP
+3492812764,3492845823,US
+3492845824,3492846079,CH
+3492846080,3492867071,US
3492867072,3492867327,FR
3492867328,3492868607,US
3492868608,3492868863,MX
3492868864,3492869631,US
3492869632,3492869887,BR
-3492869888,3492886527,US
+3492869888,3492877954,US
+3492877955,3492877955,CA
+3492877956,3492886527,US
3492886528,3492886559,GB
3492886560,3492886591,US
3492886592,3492886783,GB
3492886784,3492894975,US
3492894976,3492895231,BE
-3492895232,3492905983,US
-3492905984,3492906239,FR
-3492906240,3492908415,US
-3492908416,3492908543,CA
-3492908544,3492912127,US
+3492895232,3492912127,US
3492912128,3492912151,GB
3492912152,3492912159,US
3492912160,3492912383,GB
-3492912384,3492917247,US
+3492912384,3492913663,US
+3492913664,3492913919,CA
+3492913920,3492917247,US
3492917248,3492917503,VI
3492917504,3492923391,US
3492923392,3492923647,GB
3492923648,3492933375,US
-3492933376,3492933631,CH
+3492933376,3492933376,CA
+3492933377,3492933377,CH
+3492933378,3492933631,CA
3492933632,3492934111,US
3492934112,3492934143,GB
-3492934144,3492950783,US
-3492950784,3492950863,GB
+3492934144,3492939022,US
+3492939023,3492939023,DE
+3492939024,3492950863,US
3492950864,3492950879,DE
-3492950880,3492951039,GB
-3492951040,3492954879,US
-3492954880,3492955135,GB
+3492950880,3492954623,US
+3492954624,3492955135,GB
3492955136,3492960255,US
3492960256,3492960511,ES
3492960512,3492962815,US
3492962816,3492963071,GB
3492963072,3492968191,US
3492968192,3492968447,GB
-3492968448,3492969471,US
-3492969472,3492969727,VI
-3492969728,3492994815,US
+3492968448,3492969505,US
+3492969506,3492969506,VI
+3492969507,3492969535,US
+3492969536,3492969599,VI
+3492969600,3492994815,US
3492994816,3492995071,GB
3492995072,3492996127,US
3492996128,3492996136,GB
3492996137,3493011327,US
3493011328,3493011455,GB
-3493011456,3493013247,US
-3493013248,3493013503,MX
-3493013504,3493013759,US
+3493011456,3493013759,US
3493013760,3493014015,GB
3493014016,3493014627,US
3493014628,3493014628,GB
@@ -75693,22 +82882,28 @@
3493029342,3493029342,GB
3493029343,3493039359,US
3493039360,3493039615,AR
-3493039616,3493050367,US
-3493050368,3493050463,FR
-3493050464,3493050495,US
-3493050496,3493050623,FR
-3493050624,3493050879,GB
-3493050880,3493052031,US
-3493052032,3493052159,ES
-3493052160,3493061119,US
+3493039616,3493061119,US
3493061120,3493061375,BR
3493061376,3493062911,US
3493062912,3493063167,DE
-3493063168,3493081599,US
-3493081600,3493082367,PY
-3493082368,3493089023,US
+3493063168,3493073151,US
+3493073152,3493073407,BO
+3493073408,3493073663,US
+3493073664,3493073919,BO
+3493073920,3493081599,US
+3493081600,3493082623,PY
+3493082624,3493089023,US
3493089024,3493089279,CM
-3493089280,3493244927,US
+3493089280,3493136639,US
+3493136640,3493136895,GB
+3493136896,3493137663,US
+3493137664,3493137919,CH
+3493137920,3493139967,US
+3493139968,3493140223,JM
+3493140224,3493140479,DE
+3493140480,3493142271,US
+3493142272,3493142527,ID
+3493142528,3493244927,US
3493244928,3493249023,PR
3493249024,3493866495,US
3493866496,3493867519,VG
@@ -75718,7 +82913,9 @@
3493900372,3493900375,GB
3493900376,3493901023,US
3493901024,3493901031,HK
-3493901032,3493928959,US
+3493901032,3493901311,US
+3493901312,3493901567,AE
+3493901568,3493928959,US
3493931008,3493936127,US
3493936128,3493937151,CA
3493937152,3493939455,US
@@ -75811,7 +83008,9 @@
3494425600,3494432767,US
3494432768,3494433791,CA
3494433792,3494437887,US
-3494437888,3494438655,GP
+3494437888,3494438143,GP
+3494438144,3494438399,DM
+3494438400,3494438655,KN
3494438656,3494438911,DM
3494438912,3494455295,US
3494455296,3494456319,CA
@@ -75822,7 +83021,9 @@
3494465536,3494470655,US
3494471680,3494510591,US
3494510592,3494512639,CA
-3494512640,3494516735,US
+3494512640,3494512895,US
+3494512896,3494513151,NO
+3494513152,3494516735,US
3494516736,3494517759,CA
3494517760,3494540031,US
3494540032,3494540287,UG
@@ -75847,14 +83048,16 @@
3494668288,3494670335,CA
3494670336,3494700031,US
3494700032,3494701055,CA
-3494701056,3494727679,US
+3494701056,3494712319,US
+3494712320,3494712575,CA
+3494712576,3494727679,US
3494727680,3494729727,CA
3494729728,3494730751,US
3494730752,3494731775,CA
3494731776,3494743039,US
3494744064,3494747135,US
3494747136,3494748159,CA
-3494748160,3494749695,US
+3494748160,3494749439,US
3494750208,3494757375,US
3494757376,3494758399,CA
3494758400,3494776831,US
@@ -75871,11 +83074,13 @@
3494831104,3494852607,US
3494852608,3494854655,CA
3494854656,3494862847,US
-3494862848,3494863871,GP
+3494862848,3494863871,DM
3494863872,3494866943,US
3494866944,3494867967,CA
3494867968,3494868991,US
-3494870016,3494879231,US
+3494870016,3494874111,US
+3494874112,3494874367,ES
+3494874368,3494879743,US
3494881280,3494893567,US
3494893568,3494894591,CA
3494894592,3494917119,US
@@ -75884,7 +83089,9 @@
3494928384,3494930431,CA
3494930432,3494938623,US
3494938624,3494939647,CA
-3494939648,3494964223,US
+3494939648,3494950655,US
+3494950656,3494950911,PH
+3494950912,3494964223,US
3494964224,3494965247,PR
3494965248,3494968319,US
3494968320,3494972415,CA
@@ -75920,7 +83127,9 @@
3495123968,3495153663,US
3495153664,3495155711,CA
3495155712,3495157759,US
-3495159808,3495192575,US
+3495159808,3495187199,US
+3495187200,3495187455,IM
+3495187456,3495192575,US
3495192576,3495193599,CA
3495193600,3495215103,US
3495215104,3495217151,VI
@@ -75931,7 +83140,7 @@
3495254016,3495260159,US
3495260160,3495261183,CA
3495262208,3495271423,US
-3495272448,3495285759,US
+3495272192,3495285759,US
3495286784,3495288831,CA
3495288832,3495332863,US
3495332864,3495333887,CA
@@ -75941,7 +83150,9 @@
3495358464,3495359487,CA
3495359488,3495367679,US
3495367680,3495368703,CA
-3495368704,3495370751,US
+3495368704,3495370239,US
+3495370240,3495370495,RU
+3495370496,3495370751,US
3495370752,3495372799,BS
3495372800,3495375871,US
3495375872,3495376895,CA
@@ -75972,7 +83183,9 @@
3495526400,3495527423,CA
3495527424,3495544063,US
3495544064,3495544319,NG
-3495544320,3495551999,US
+3495544320,3495550207,US
+3495550208,3495550463,CA
+3495550464,3495551999,US
3495552000,3495553023,BM
3495553024,3495579647,US
3495579648,3495581695,CA
@@ -75986,12 +83199,13 @@
3495618560,3495619583,CA
3495619584,3495620607,US
3495620608,3495622655,CA
-3495622656,3495643135,US
-3495645184,3495647231,US
-3495648000,3495673855,US
+3495622656,3495647231,US
+3495648000,3495653887,US
+3495653888,3495654143,CA
+3495654144,3495673855,US
3495673856,3495674879,MF
-3495674880,3495675903,VG
-3495675904,3495688191,US
+3495674880,3495675391,VG
+3495675392,3495688191,US
3495688192,3495689215,CA
3495689216,3495694335,US
3495694336,3495696383,CA
@@ -76020,14 +83234,19 @@
3495847936,3495849983,CA
3495849984,3495862271,US
3495862272,3495864319,CA
-3495864320,3495865343,GP
+3495864320,3495864831,DM
+3495864832,3495865343,MF
3495865344,3495866367,US
-3495866368,3495866495,VC
-3495866496,3495866879,LC
-3495866880,3495868415,VC
+3495866368,3495866623,VC
+3495866624,3495866879,LC
+3495866880,3495867391,VC
+3495867392,3495867647,LC
+3495867648,3495868415,VC
3495868416,3495871487,US
3495871488,3495872511,CA
-3495872512,3495896063,US
+3495872512,3495881471,US
+3495881472,3495881727,PA
+3495881728,3495896063,US
3495896064,3495897087,PR
3495897088,3495916287,US
3495916288,3495916543,SL
@@ -76046,10 +83265,8 @@
3496189952,3496190519,US
3496190520,3496190527,CA
3496190528,3496190719,US
-3496190720,3496190735,CA
-3496190736,3496190751,US
-3496190752,3496190767,CA
-3496190768,3496296447,US
+3496190720,3496190975,CA
+3496190976,3496296447,US
3496296448,3496312831,CA
3496312832,3496468479,US
3496468480,3496476671,CA
@@ -76067,13 +83284,29 @@
3496947712,3496949759,JP
3496949760,3496951807,US
3496951808,3496959999,CA
-3496960000,3497066495,US
+3496960000,3497020415,US
+3497020416,3497020671,IL
+3497020672,3497066495,US
3497066496,3497082879,CA
-3497082880,3497163167,US
+3497082880,3497161735,US
+3497161736,3497161743,MT
+3497161744,3497161759,US
+3497161760,3497161767,PT
+3497161768,3497161775,MT
+3497161776,3497161895,US
+3497161896,3497161903,MT
+3497161904,3497161935,US
+3497161936,3497161943,MT
+3497161944,3497162495,US
+3497162496,3497162751,GB
+3497162752,3497163007,NL
+3497163008,3497163167,US
3497163168,3497163175,GB
3497163176,3497164799,US
3497164800,3497181183,CA
-3497181184,3497410559,US
+3497181184,3497233407,US
+3497233408,3497233663,CN
+3497233664,3497410559,US
3497410560,3497431039,CA
3497431040,3497447423,US
3497447424,3497451519,CA
@@ -76085,27 +83318,44 @@
3497778944,3497779199,CA
3497779200,3497820159,US
3497820160,3497852927,CA
-3497852928,3498287103,US
+3497852928,3498254591,US
+3498254592,3498254847,JM
+3498254848,3498287103,US
3498287104,3498295295,JM
3498295296,3498428415,US
3498428416,3498429439,CR
-3498429440,3498509055,US
-3498509056,3498510335,PR
-3498510336,3498587135,US
+3498429440,3498429951,US
+3498429952,3498430207,CR
+3498430208,3498509055,US
+3498509056,3498509311,PR
+3498509312,3498513151,US
+3498513152,3498513407,CL
+3498513408,3498513919,US
+3498513920,3498514431,CL
+3498514432,3498587135,US
3498587136,3498588159,NL
3498588160,3498599935,US
3498599936,3498600191,WS
3498600192,3498708991,US
3498708992,3498717183,JM
3498717184,3498760191,US
-3498760192,3498762239,PR
-3498762240,3499299327,US
+3498760192,3498761215,PR
+3498761216,3498761727,US
+3498761728,3498761983,PR
+3498761984,3498812415,US
+3498812416,3498812671,PF
+3498812672,3499299327,US
3499299328,3499299583,WS
-3499299584,3499450367,US
+3499299584,3499403263,US
+3499403264,3499403775,MW
+3499403776,3499436031,US
+3499436032,3499436287,DE
+3499436288,3499450367,US
3499450368,3499451391,IN
3499451392,3499705343,US
3499705344,3499705855,TZ
-3499705856,3499986943,US
+3499705856,3499706367,MG
+3499706368,3499986943,US
3499986944,3499988991,KY
3499988992,3500015615,US
3500015616,3500016383,AG
@@ -76118,7 +83368,10 @@
3500018944,3500019199,LC
3500019200,3500019455,AG
3500019456,3500019711,LC
-3500019712,3500351487,US
+3500019712,3500126207,US
+3500126208,3500126463,SE
+3500126464,3500126719,GB
+3500126720,3500351487,US
3500351488,3500359679,JM
3500359680,3500486655,US
3500486656,3500490751,CR
@@ -76126,13 +83379,30 @@
3500613632,3500614655,MZ
3500614656,3500664870,US
3500664871,3500664871,CA
-3500664872,3500707327,US
+3500664872,3500689407,US
+3500689408,3500689919,CL
+3500689920,3500707327,US
3500707328,3500707839,CA
-3500707840,3500728319,US
+3500707840,3500725247,US
+3500725248,3500725503,EC
+3500725504,3500725759,HT
+3500725760,3500726015,EC
+3500726016,3500726271,HT
+3500726272,3500728319,US
3500728320,3500736511,KY
3500736512,3500752895,US
3500752896,3500761087,KY
-3500761088,3501368831,US
+3500761088,3500807019,US
+3500807020,3500807023,GB
+3500807024,3500807195,US
+3500807196,3500807199,GB
+3500807200,3500807299,US
+3500807300,3500807303,GB
+3500807304,3500813219,US
+3500813220,3500813223,GB
+3500813224,3501183487,US
+3501183488,3501183743,GB
+3501183744,3501368831,US
3501368832,3501369087,NL
3501369088,3501376147,US
3501376148,3501376151,NL
@@ -76140,27 +83410,84 @@
3501378048,3501378303,DE
3501378304,3501522943,US
3501522944,3501588479,CA
-3501588480,3502470143,US
+3501588480,3502439167,US
+3502439168,3502439423,PK
+3502439424,3502470143,US
3502470144,3502471167,MX
-3502471168,3503738879,US
+3502471168,3502518783,US
+3502518784,3502519295,LK
+3502519296,3502541055,US
+3502541056,3502541311,CA
+3502541312,3502545663,US
+3502545664,3502545919,BS
+3502545920,3502683135,US
+3502683136,3502683391,MC
+3502683392,3502993407,US
+3502993408,3502993919,NL
+3502993920,3503206399,US
+3503206400,3503206911,CR
+3503206912,3503250431,US
+3503250432,3503250943,PK
+3503250944,3503323135,US
+3503323136,3503323647,KE
+3503323648,3503386111,US
+3503386112,3503386367,CH
+3503386368,3503454719,US
+3503454720,3503454975,AZ
+3503454976,3503478783,US
+3503478784,3503479039,DE
+3503479040,3503738879,US
3503738880,3503740927,CO
3503740928,3503890431,US
3503890432,3503894527,CO
3503894528,3503990783,US
3503990784,3503992831,AE
-3503992832,3504136191,US
+3503992832,3504086015,US
+3504086016,3504086527,LI
+3504086528,3504136191,US
3504136192,3504138239,AZ
-3504138240,3504928687,US
+3504138240,3504193535,US
+3504193536,3504194559,EC
+3504194560,3504207871,US
+3504207872,3504208127,CA
+3504208128,3504223743,US
+3504223744,3504223999,RO
+3504224000,3504521215,US
+3504521216,3504521727,GU
+3504521728,3504889343,US
+3504889344,3504889855,PK
+3504889856,3504922623,US
+3504922624,3504923391,PH
+3504923392,3504928687,US
3504928688,3504928695,IT
-3504928696,3505004543,US
+3504928696,3504932351,US
+3504932352,3504932863,BD
+3504932864,3505004543,US
3505004544,3505005823,PR
3505005824,3505006079,DO
3505006080,3505012735,PR
-3505012736,3505121023,US
+3505012736,3505112063,US
+3505112064,3505112319,EC
+3505112320,3505112575,US
+3505112576,3505112831,EC
+3505112832,3505119231,US
+3505119232,3505119487,PH
+3505119488,3505121023,US
3505121024,3505121279,PH
-3505121280,3505424383,US
+3505121280,3505270271,US
+3505270272,3505270527,JM
+3505270528,3505270783,HT
+3505270784,3505416703,US
+3505416704,3505417471,MX
+3505417472,3505424383,US
3505424384,3505425407,PK
-3505425408,3505818623,US
+3505425408,3505474559,US
+3505474560,3505474815,GU
+3505474816,3505511679,US
+3505511680,3505511935,RO
+3505511936,3505661951,US
+3505661952,3505662463,JM
+3505662464,3505818623,US
3505818624,3505819647,BS
3505819648,3506043135,US
3506043136,3506044927,PA
@@ -76196,15 +83523,177 @@
3507748864,3507749375,CA
3507749376,3507749631,US
3507749632,3507765247,CA
-3507765248,3508219903,US
+3507765248,3507809279,US
+3507809280,3507809535,BG
+3507809536,3508111359,US
+3508111360,3508111615,CA
+3508111616,3508114431,US
+3508114432,3508114687,ID
+3508114688,3508219903,US
3508220928,3508221951,KY
3508221952,3508222975,US
3508222976,3508223999,KY
-3508224000,3508338687,US
+3508224000,3508224255,BM
+3508224256,3508243967,US
+3508243968,3508244223,BM
+3508244224,3508273407,US
+3508273408,3508273663,MX
+3508273664,3508278527,US
+3508278528,3508278783,AU
+3508278784,3508279039,US
+3508279040,3508279295,VE
+3508279296,3508279807,US
+3508279808,3508280063,JP
+3508280064,3508280319,TH
+3508280320,3508280575,JP
+3508280576,3508280831,TW
+3508280832,3508281087,JP
+3508281088,3508281343,KR
+3508281344,3508281599,PH
+3508281600,3508281855,NZ
+3508281856,3508282111,US
+3508282112,3508282367,HK
+3508282368,3508282623,US
+3508282624,3508282879,AU
+3508282880,3508283135,US
+3508283136,3508283391,HK
+3508283392,3508283647,US
+3508283648,3508283903,AU
+3508283904,3508284159,MY
+3508284160,3508284415,SG
+3508284416,3508284671,AU
+3508284672,3508286207,US
+3508286208,3508286463,SE
+3508286464,3508286719,HK
+3508286720,3508288255,US
+3508288256,3508288511,JP
+3508288512,3508289023,US
+3508289024,3508289279,AU
+3508289280,3508289535,US
+3508289536,3508289791,CA
+3508289792,3508291327,US
+3508291328,3508292095,GB
+3508292096,3508292351,CH
+3508292352,3508292863,US
+3508292864,3508294143,DE
+3508294144,3508295679,US
+3508295680,3508295935,GB
+3508295936,3508296959,US
+3508296960,3508297215,CH
+3508297216,3508297471,US
+3508297472,3508297727,IT
+3508297728,3508298239,US
+3508298240,3508298495,DE
+3508298496,3508298751,US
+3508298752,3508299007,ES
+3508299008,3508299263,BE
+3508299264,3508299519,GB
+3508299520,3508299775,US
+3508299776,3508300031,SE
+3508300032,3508300287,DE
+3508300288,3508300543,US
+3508300544,3508300799,FR
+3508300800,3508303615,US
+3508303616,3508303871,DE
+3508303872,3508304383,US
+3508304384,3508304639,DE
+3508304640,3508306943,US
+3508306944,3508307199,CH
+3508307200,3508308991,US
+3508308992,3508309247,BE
+3508309248,3508310527,SE
+3508310528,3508310783,DE
+3508310784,3508311039,BE
+3508311040,3508311295,NL
+3508311296,3508311807,IE
+3508311808,3508312063,US
+3508312064,3508312319,NL
+3508312320,3508312575,CH
+3508312576,3508312831,US
+3508312832,3508313343,DE
+3508313344,3508313599,SE
+3508313600,3508313855,DK
+3508313856,3508314367,GB
+3508314368,3508314623,US
+3508314624,3508314879,DK
+3508314880,3508315135,US
+3508315136,3508315391,NO
+3508315392,3508315647,US
+3508315648,3508315903,FR
+3508315904,3508316159,US
+3508316160,3508316415,PT
+3508316416,3508316671,GB
+3508316672,3508316927,US
+3508316928,3508317183,SE
+3508317184,3508317439,US
+3508317440,3508317695,DE
+3508317696,3508317951,US
+3508317952,3508318463,FI
+3508318464,3508318719,LU
+3508318720,3508318975,IT
+3508318976,3508319487,IL
+3508319488,3508319743,RU
+3508319744,3508319999,CH
+3508320000,3508320255,SE
+3508320256,3508320767,US
+3508320768,3508321791,BE
+3508321792,3508322303,US
+3508322304,3508322559,GB
+3508322560,3508322815,FI
+3508322816,3508323071,NO
+3508323072,3508323327,US
+3508323328,3508323583,NO
+3508323584,3508323839,DE
+3508323840,3508324095,FI
+3508324096,3508324351,IT
+3508324352,3508324607,CH
+3508324608,3508324863,NO
+3508324864,3508325119,GB
+3508325120,3508325375,DE
+3508325376,3508325631,US
+3508325632,3508325887,ZA
+3508325888,3508326399,SE
+3508326400,3508326655,GB
+3508326656,3508326911,ZA
+3508326912,3508327167,IT
+3508327168,3508327679,ES
+3508327680,3508327935,US
+3508327936,3508328447,NE
+3508328448,3508328703,BE
+3508328704,3508329471,IL
+3508329472,3508329727,NL
+3508329728,3508329983,US
+3508329984,3508330495,SE
+3508330496,3508331263,GB
+3508331264,3508331519,BE
+3508331520,3508332031,US
+3508332032,3508332287,GB
+3508332288,3508332543,GR
+3508332544,3508332799,IE
+3508332800,3508333055,NO
+3508333056,3508333311,US
+3508333312,3508333823,CH
+3508333824,3508334591,US
+3508334592,3508334847,AU
+3508334848,3508335103,SG
+3508335104,3508335359,MY
+3508335360,3508335615,AU
+3508335616,3508336127,JP
+3508336128,3508336383,SG
+3508336384,3508336639,HK
+3508336640,3508336895,AU
+3508336896,3508337151,JP
+3508337152,3508337663,PH
+3508337664,3508337919,KR
+3508337920,3508338175,JP
+3508338176,3508338431,US
+3508338432,3508338687,KR
3508338688,3508404223,CA
3508404224,3508690943,US
3508690944,3508695039,CA
-3508695040,3509157887,US
+3508695040,3509144575,US
+3509144576,3509144831,BR
+3509144832,3509157887,US
3509157888,3509166079,CA
3509166080,3509215231,US
3509215232,3509223423,CA
@@ -76216,91 +83705,200 @@
3509350720,3509354495,CA
3509354496,3509387263,US
3509387264,3509420031,PE
-3509420032,3509522175,US
+3509420032,3509518847,US
+3509518848,3509519103,CA
+3509519104,3509519871,US
+3509519872,3509520127,CA
+3509520128,3509520895,US
+3509520896,3509521151,CA
+3509521152,3509521407,US
+3509521408,3509521663,CA
+3509521664,3509522175,US
3509522176,3509522431,CA
-3509522432,3509523679,US
+3509522432,3509522687,KW
+3509522688,3509522943,CA
+3509522944,3509523679,US
3509523680,3509523695,CA
-3509523696,3509524479,US
-3509524480,3509524735,CA
-3509524736,3509526015,US
+3509523696,3509524223,US
+3509524224,3509524735,CA
+3509524736,3509524991,US
+3509524992,3509525759,CA
+3509525760,3509526015,US
3509526016,3509526271,CA
-3509526272,3509529087,US
+3509526272,3509526527,US
+3509526528,3509526783,CA
+3509526784,3509527807,US
+3509527808,3509528063,CA
+3509528064,3509529087,US
3509529088,3509529215,CA
3509529216,3509530623,US
3509530624,3509532671,CA
-3509532672,3509533183,US
-3509533184,3509533439,CA
-3509533440,3509538047,US
-3509538048,3509538303,CA
+3509532672,3509532927,US
+3509532928,3509533439,CA
+3509533440,3509534719,US
+3509534720,3509535999,CA
+3509536000,3509536255,US
+3509536256,3509536767,CA
+3509536768,3509537279,US
+3509537280,3509538303,CA
3509538304,3509538559,US
3509538560,3509538815,CA
-3509538816,3509539583,US
+3509538816,3509539071,US
+3509539072,3509539327,CA
+3509539328,3509539583,US
3509539584,3509540095,CA
-3509540096,3509541375,US
-3509541376,3509541503,CA
+3509540096,3509540607,US
+3509540608,3509541503,CA
3509541504,3509541631,US
3509541632,3509541887,CA
-3509541888,3509546095,US
+3509541888,3509542911,US
+3509542912,3509543167,CA
+3509543168,3509543423,US
+3509543424,3509543935,CA
+3509543936,3509544191,US
+3509544192,3509544447,CA
+3509544448,3509544703,US
+3509544704,3509544959,CA
+3509544960,3509546095,US
3509546096,3509546111,CA
-3509546112,3509551359,US
-3509551360,3509551615,CA
-3509551616,3509553919,US
-3509553920,3509554431,CA
-3509554432,3509554943,US
-3509554944,3509554959,CA
-3509554960,3509555455,US
-3509555456,3509555711,CA
-3509555712,3509561599,US
-3509561600,3509561855,CA
-3509561856,3509562495,US
-3509562496,3509562559,CA
-3509562560,3509563903,US
-3509563904,3509564159,CA
-3509564160,3509564671,US
-3509564672,3509564927,CA
-3509564928,3509567999,US
-3509568000,3509568255,CA
-3509568256,3509570047,US
-3509570048,3509570303,CA
-3509570304,3509571071,US
-3509571072,3509571327,CA
-3509571328,3509573439,US
+3509546112,3509546495,US
+3509546496,3509547007,CA
+3509547008,3509551359,US
+3509551360,3509551871,CA
+3509551872,3509552127,US
+3509552128,3509552639,CA
+3509552640,3509553919,US
+3509553920,3509554959,CA
+3509554960,3509555199,US
+3509555200,3509556735,CA
+3509556736,3509557759,US
+3509557760,3509558015,CA
+3509558016,3509559039,US
+3509559040,3509559295,KW
+3509559296,3509559807,CA
+3509559808,3509560063,US
+3509560064,3509560319,CA
+3509560320,3509560831,US
+3509560832,3509561087,CA
+3509561088,3509561343,US
+3509561344,3509562623,CA
+3509562624,3509563391,US
+3509563392,3509564159,CA
+3509564160,3509564415,US
+3509564416,3509564927,CA
+3509564928,3509565183,US
+3509565184,3509566463,CA
+3509566464,3509567231,US
+3509567232,3509569023,CA
+3509569024,3509569535,US
+3509569536,3509569791,CA
+3509569792,3509570815,US
+3509570816,3509571583,CA
+3509571584,3509571839,US
+3509571840,3509572095,CA
+3509572096,3509572351,US
+3509572352,3509573375,CA
+3509573376,3509573439,US
3509573440,3509573455,CA
-3509573456,3509576959,US
+3509573456,3509573631,US
+3509573632,3509573887,CA
+3509573888,3509574143,US
+3509574144,3509575679,CA
+3509575680,3509575935,US
+3509575936,3509576191,CA
+3509576192,3509576447,US
+3509576448,3509576703,CA
+3509576704,3509576959,US
3509576960,3509577215,CA
-3509577216,3509580799,US
+3509577216,3509577983,US
+3509577984,3509578239,CA
+3509578240,3509578495,US
+3509578496,3509578751,CA
+3509578752,3509579007,US
+3509579008,3509579263,CA
+3509579264,3509579519,US
+3509579520,3509579775,CA
+3509579776,3509580031,US
+3509580032,3509580287,CA
+3509580288,3509580799,US
3509580800,3509581055,CA
-3509581056,3509731327,US
+3509581056,3509582335,US
+3509582336,3509582847,CA
+3509582848,3509583615,US
+3509583616,3509583871,CA
+3509583872,3509731327,US
3509731328,3509739519,CA
3509739520,3509846015,US
3509846016,3509977087,CA
3509977088,3509993471,US
3509993472,3509997567,CA
3509997568,3510005759,US
-3510005760,3510009855,CA
-3510009856,3510239231,US
-3510239232,3510246728,CA
-3510246729,3510246729,US
-3510246730,3510251519,CA
+3510005760,3510009343,CA
+3510009344,3510240743,US
+3510240744,3510240751,CA
+3510240752,3510242303,US
+3510242304,3510242559,OM
+3510242560,3510245375,US
+3510245376,3510245631,BD
+3510245632,3510249471,US
+3510249472,3510249983,QA
+3510249984,3510251519,US
3510251520,3510252799,DO
-3510252800,3510253953,CA
-3510253954,3510253954,US
-3510253955,3510269951,CA
+3510252800,3510253311,US
+3510253312,3510253567,NC
+3510253568,3510254079,US
+3510254080,3510254591,CA
+3510254592,3510257663,US
+3510257664,3510258175,CA
+3510258176,3510261503,US
+3510261504,3510261759,ZM
+3510261760,3510263295,US
+3510263296,3510263551,CA
+3510263552,3510264063,US
+3510264064,3510264319,UG
+3510264320,3510265087,US
+3510265088,3510265343,CA
+3510265344,3510268415,US
+3510268416,3510268671,CA
+3510268672,3510268927,SY
+3510268928,3510269951,US
3510269952,3510270719,LY
-3510270720,3510271999,CA
-3510272000,3510321151,US
-3510321152,3510328319,AG
+3510270720,3510270975,SY
+3510270976,3510321151,US
+3510321152,3510321663,VG
+3510321664,3510321919,AG
+3510321920,3510322175,KN
+3510322176,3510323199,AG
+3510323200,3510324223,KN
+3510324224,3510325247,AI
+3510325248,3510326271,AG
+3510326272,3510327295,VG
+3510327296,3510328319,AG
3510328320,3510328575,KN
-3510328576,3510329599,AG
+3510328576,3510328831,MS
+3510328832,3510329599,AG
3510329600,3510329855,MS
-3510329856,3510337535,AG
+3510329856,3510331391,AG
+3510331392,3510332415,DM
+3510332416,3510332927,KN
+3510332928,3510333183,LC
+3510333184,3510333439,MS
+3510333440,3510333951,KN
+3510333952,3510334975,AG
+3510334976,3510335231,KN
+3510335232,3510335743,AI
+3510335744,3510335999,VG
+3510336000,3510337279,AG
+3510337280,3510337535,LC
3510337536,3510470927,US
3510470928,3510470935,IL
3510470936,3510479791,US
3510479792,3510479799,IE
3510479800,3510788447,US
3510788448,3510788479,GB
-3510788480,3510935551,US
+3510788480,3510844415,US
+3510844416,3510844927,CA
+3510844928,3510935551,US
3510935552,3510943743,CA
3510943744,3511140351,US
3511140352,3511156735,CA
@@ -76309,9 +83907,15 @@
3511812096,3511844863,CA
3511844864,3512012095,US
3512012096,3512012159,GB
-3512012160,3512019135,US
+3512012160,3512017407,US
+3512017408,3512017663,BR
+3512017664,3512019135,US
3512019136,3512019151,MX
-3512019152,3512043519,US
+3512019152,3512021503,US
+3512021504,3512021759,GB
+3512021760,3512024319,US
+3512024320,3512024575,AU
+3512024576,3512043519,US
3512043520,3512043775,FI
3512043776,3512045055,US
3512045056,3512045311,IE
@@ -76329,40 +83933,74 @@
3512172544,3512176639,CA
3512176640,3512197119,US
3512197120,3512205311,CA
-3512205312,3512206335,US
+3512205312,3512205567,US
+3512205568,3512205823,CL
+3512205824,3512206079,AW
+3512206080,3512206335,CL
3512206336,3512207103,HN
3512207104,3512207359,US
3512207360,3512209407,CO
-3512209408,3512221695,US
+3512209408,3512210943,US
+3512210944,3512211199,CL
+3512211200,3512211455,AR
+3512211456,3512221695,US
3512221696,3512221759,AG
3512221760,3512221791,GP
-3512221792,3512222271,AG
+3512221792,3512221951,AG
+3512221952,3512222207,VG
+3512222208,3512222271,AG
3512222272,3512222335,KN
-3512222336,3512223743,AG
+3512222336,3512222463,AG
+3512222464,3512222975,AI
+3512222976,3512223743,AG
3512223744,3512225791,ZA
3512225792,3512227839,PR
3512227840,3512229887,ZW
-3512229888,3512233983,US
+3512229888,3512230143,VE
+3512230144,3512230911,US
+3512230912,3512231167,CL
+3512231168,3512231423,US
+3512231424,3512231679,CL
+3512231680,3512231935,VE
+3512231936,3512233215,US
+3512233216,3512233471,CL
+3512233472,3512233727,US
+3512233728,3512233983,HN
3512233984,3512236031,ZA
3512236032,3512236287,US
3512236288,3512237311,MR
-3512237312,3512238079,US
+3512237312,3512237823,US
+3512237824,3512238079,HN
3512238080,3512240127,AW
3512240128,3512241663,BS
-3512241664,3512242687,US
+3512241664,3512242175,CO
+3512242176,3512242431,CL
+3512242432,3512242687,VE
3512242688,3512244991,EG
3512244992,3512246015,IL
3512246016,3512246783,CL
-3512246784,3512249343,US
+3512246784,3512247039,US
+3512247040,3512247295,NG
+3512247296,3512248319,US
+3512248320,3512248831,CO
+3512248832,3512249087,CL
+3512249088,3512249343,CO
3512249344,3512256511,IL
3512256512,3512258559,CL
3512258560,3512260607,US
3512260608,3512261631,GU
-3512261632,3512262911,US
-3512262912,3512263679,GT
-3512263680,3512267263,US
+3512261632,3512262655,US
+3512262656,3512263679,GT
+3512263680,3512264703,VE
+3512264704,3512267263,US
3512267264,3512268031,TG
-3512268032,3512270847,US
+3512268032,3512268543,US
+3512268544,3512268799,PR
+3512268800,3512269055,US
+3512269056,3512269311,PR
+3512269312,3512269567,US
+3512269568,3512269823,HN
+3512269824,3512270847,US
3512270848,3512336383,CA
3512336384,3512369151,US
3512369152,3512385535,CA
@@ -76370,22 +84008,89 @@
3512397824,3512401919,CA
3512401920,3512418303,US
3512418304,3512451071,CA
-3512451072,3512467455,PR
-3512467456,3512581375,US
+3512451072,3512459519,PR
+3512459520,3512459775,US
+3512459776,3512460031,PR
+3512460032,3512460287,US
+3512460288,3512460543,PR
+3512460544,3512461055,US
+3512461056,3512463103,PR
+3512463104,3512463359,US
+3512463360,3512464639,PR
+3512464640,3512465151,US
+3512465152,3512465407,PR
+3512465408,3512465663,US
+3512465664,3512465919,PR
+3512465920,3512466175,US
+3512466176,3512466687,PR
+3512466688,3512466943,US
+3512466944,3512467455,PR
+3512467456,3512537599,US
+3512537600,3512537855,CA
+3512537856,3512551167,US
+3512551168,3512551423,DE
+3512551424,3512552191,US
+3512552192,3512552447,NL
+3512552448,3512553983,US
+3512553984,3512554751,GB
+3512554752,3512555775,US
+3512555776,3512556031,IE
+3512556032,3512556543,US
+3512556544,3512556799,FR
+3512556800,3512557055,US
+3512557056,3512557311,DE
+3512557312,3512557567,GB
+3512557568,3512561919,US
+3512561920,3512562175,JP
+3512562176,3512564223,US
+3512564224,3512564479,SG
+3512564480,3512565247,US
+3512565248,3512565503,PH
+3512565504,3512573951,US
+3512573952,3512574207,ID
+3512574208,3512574719,US
+3512574720,3512574975,SG
+3512574976,3512576255,US
+3512576256,3512576511,HK
+3512576512,3512580607,US
+3512580608,3512580863,HK
+3512580864,3512581375,US
3512581376,3512582143,CN
-3512582144,3512593151,US
+3512582144,3512583423,US
+3512583424,3512583679,BR
+3512583680,3512591103,US
+3512591104,3512591359,JP
+3512591360,3512592383,US
+3512592384,3512592895,GB
+3512592896,3512593151,PH
3512593152,3512593279,GB
3512593280,3512593663,US
3512593664,3512593791,JP
-3512593792,3512647679,US
+3512593792,3512594175,US
+3512594176,3512594431,MY
+3512594432,3512595199,US
+3512595200,3512595455,TW
+3512595456,3512596223,US
+3512596224,3512596479,JP
+3512596480,3512596991,US
+3512596992,3512597247,TH
+3512597248,3512597759,US
+3512597760,3512598015,JP
+3512598016,3512598271,US
+3512598272,3512598527,PH
+3512598528,3512647679,US
3512647680,3512655871,TT
3512655872,3512696831,US
-3512696832,3512703231,SE
+3512696832,3512701951,SE
+3512701952,3512702975,US
+3512702976,3512703231,SE
3512703232,3512703359,US
3512703360,3512705023,SE
3512705024,3512844287,US
3512844288,3512852479,CA
-3512852480,3512983551,US
+3512852480,3512931583,US
+3512931584,3512931839,CA
+3512931840,3512983551,US
3512983552,3512987647,AR
3512987648,3513188351,US
3513188352,3513204735,CA
@@ -76397,21 +84102,43 @@
3513368576,3513376767,CA
3513376768,3513475071,US
3513475072,3513483263,CA
-3513499648,3513778175,US
+3513499648,3513501183,US
+3513501184,3513501439,PH
+3513501440,3513506559,US
+3513506560,3513506815,CA
+3513506816,3513778175,US
3513778176,3513794559,CA
3513794560,3514007551,US
3514007552,3514040319,CA
3514040320,3514367999,US
3514368000,3514433535,CA
3514433536,3514580991,US
-3514580992,3514583511,GB
+3514580992,3514581503,GB
+3514581504,3514581759,US
+3514581760,3514582015,GB
+3514582016,3514582527,US
+3514582528,3514582783,GB
+3514582784,3514583295,US
+3514583296,3514583511,GB
3514583512,3514583535,US
-3514583536,3514589183,GB
-3514589184,3514590719,US
+3514583536,3514583807,GB
+3514583808,3514584063,US
+3514584064,3514584831,GB
+3514584832,3514585343,US
+3514585344,3514587135,GB
+3514587136,3514587391,US
+3514587392,3514589183,GB
+3514589184,3514589439,US
+3514589440,3514589695,GT
+3514589696,3514590207,SV
+3514590208,3514590719,NI
3514590720,3514591103,SV
-3514591104,3514592255,US
-3514592256,3514592767,SV
-3514592768,3514826751,US
+3514591104,3514591487,US
+3514591488,3514592255,NI
+3514592256,3514593279,SV
+3514593280,3514596863,US
+3514596864,3514597375,SV
+3514597376,3514826751,US
3514826752,3514843135,CA
3514843136,3514993919,US
3514993920,3514993983,GB
@@ -76431,7 +84158,9 @@
3515222272,3515224831,TR
3515224832,3515301887,US
3515301888,3515318271,CA
-3515318272,3515596799,US
+3515318272,3515358975,US
+3515358976,3515359231,MX
+3515359232,3515596799,US
3515596800,3515613183,CA
3515613184,3515711487,US
3515711488,3515731967,CA
@@ -76446,17 +84175,29 @@
3515990016,3516006399,CA
3516006400,3516039167,US
3516039168,3516071935,CA
-3516071936,3516170239,US
+3516071936,3516139007,US
+3516139008,3516139263,GB
+3516139264,3516170239,US
3516170240,3516203007,CA
3516203008,3516334079,US
3516334080,3516342271,CA
-3516342272,3516366847,US
+3516342272,3516357631,US
+3516357632,3516357887,MY
+3516357888,3516358143,CA
+3516358144,3516366847,US
3516366848,3516370943,CA
3516370944,3516514303,US
3516514304,3516530687,CA
3516530688,3516899839,US
3516899840,3516900095,NG
-3516900096,3516903423,US
+3516900096,3516900351,US
+3516900352,3516900607,NG
+3516900608,3516900863,US
+3516900864,3516901119,NG
+3516901120,3516902655,US
+3516902656,3516902911,NG
+3516902912,3516903167,US
+3516903168,3516903423,NG
3516903424,3516907519,CA
3516907520,3517019135,US
3517019136,3517019391,HN
@@ -76467,26 +84208,38 @@
3517054976,3517095935,US
3517095936,3517100031,CA
3517100032,3517112319,US
-3517112320,3517120511,CA
+3517112320,3517116159,CA
+3517116160,3517116415,US
+3517116416,3517120511,CA
3517120512,3517173759,US
3517173760,3517174783,IN
3517174784,3517233151,US
3517233152,3517235199,GU
-3517235200,3517383935,US
-3517383936,3517384191,CA
-3517384192,3517385215,US
-3517385216,3517385471,CA
-3517385472,3517389311,US
+3517235200,3517382655,US
+3517382656,3517383167,CA
+3517383168,3517383423,US
+3517383424,3517384703,CA
+3517384704,3517385215,US
+3517385216,3517387263,CA
+3517387264,3517387519,US
+3517387520,3517387775,CA
+3517387776,3517388287,US
+3517388288,3517388799,CA
+3517388800,3517389311,US
3517389312,3517389567,CA
-3517389568,3517390335,US
-3517390336,3517390591,CA
-3517390592,3517391103,US
-3517391104,3517391359,CA
-3517391360,3517392895,US
-3517392896,3517393151,CA
-3517393152,3517394175,US
-3517394176,3517394431,CA
-3517394432,3517395199,US
+3517389568,3517389823,US
+3517389824,3517390335,CA
+3517390336,3517390591,US
+3517390592,3517391359,CA
+3517391360,3517391871,US
+3517391872,3517392127,CA
+3517392128,3517392383,US
+3517392384,3517392639,CA
+3517392640,3517392895,US
+3517392896,3517393407,CA
+3517393408,3517394431,US
+3517394432,3517394943,CA
+3517394944,3517395199,US
3517395200,3517395455,CA
3517395456,3517396111,US
3517396112,3517396127,CA
@@ -76494,81 +84247,192 @@
3517396224,3517396479,CA
3517396480,3517396751,US
3517396752,3517396767,CA
-3517396768,3517397759,US
+3517396768,3517397247,US
+3517397248,3517397503,CA
+3517397504,3517397759,US
3517397760,3517398015,CA
-3517398016,3517399807,US
+3517398016,3517398527,US
+3517398528,3517399039,CA
+3517399040,3517399807,US
3517399808,3517399871,CA
-3517399872,3517400319,US
-3517400320,3517400575,CA
-3517400576,3517403903,US
-3517403904,3517404159,CA
-3517404160,3517411839,US
-3517411840,3517412095,CA
-3517412096,3517416191,US
+3517399872,3517400063,US
+3517400064,3517400575,CA
+3517400576,3517401855,US
+3517401856,3517402367,CA
+3517402368,3517402623,US
+3517402624,3517402879,CA
+3517402880,3517403647,US
+3517403648,3517404159,CA
+3517404160,3517404415,US
+3517404416,3517404927,CA
+3517404928,3517405183,US
+3517405184,3517405439,CA
+3517405440,3517405695,US
+3517405696,3517406719,CA
+3517406720,3517406975,US
+3517406976,3517407231,CA
+3517407232,3517407743,US
+3517407744,3517407999,CA
+3517408000,3517408255,US
+3517408256,3517408511,CA
+3517408512,3517409023,US
+3517409024,3517409279,CA
+3517409280,3517409791,US
+3517409792,3517411071,CA
+3517411072,3517411327,US
+3517411328,3517412351,CA
+3517412352,3517412607,US
+3517412608,3517412863,CA
+3517412864,3517413119,US
+3517413120,3517414399,CA
+3517414400,3517414911,US
+3517414912,3517415423,CA
+3517415424,3517416191,US
3517416192,3517416447,CA
3517416448,3517416703,US
-3517416704,3517416959,CA
-3517416960,3517420375,US
+3517416704,3517417471,CA
+3517417472,3517418495,US
+3517418496,3517419007,CA
+3517419008,3517419519,US
+3517419520,3517420031,CA
+3517420032,3517420375,US
3517420376,3517420383,CA
-3517420384,3517423423,US
+3517420384,3517420799,US
+3517420800,3517421567,CA
+3517421568,3517421823,US
+3517421824,3517422079,CA
+3517422080,3517422847,US
+3517422848,3517423359,CA
+3517423360,3517423423,US
3517423424,3517423455,CA
3517423456,3517423487,US
3517423488,3517423519,CA
-3517423520,3517424767,US
+3517423520,3517423871,US
+3517423872,3517424127,CA
+3517424128,3517424767,US
3517424768,3517424831,CA
-3517424832,3517426751,US
+3517424832,3517425407,US
+3517425408,3517425919,CA
+3517425920,3517426751,US
3517426752,3517426815,CA
-3517426816,3517430687,US
+3517426816,3517426943,US
+3517426944,3517427711,CA
+3517427712,3517428735,US
+3517428736,3517429503,CA
+3517429504,3517430271,US
+3517430272,3517430527,CA
+3517430528,3517430687,US
3517430688,3517430719,CA
-3517430720,3517431807,US
-3517431808,3517432063,CA
-3517432064,3517436927,US
-3517436928,3517437183,CA
-3517437184,3517438943,US
-3517438944,3517438975,CA
-3517438976,3517439743,US
-3517439744,3517439999,CA
-3517440000,3517441279,US
-3517441280,3517441535,CA
-3517441536,3517442175,US
+3517430720,3517432319,US
+3517432320,3517433343,CA
+3517433344,3517434111,US
+3517434112,3517434367,CA
+3517434368,3517435135,US
+3517435136,3517435391,CA
+3517435392,3517435647,US
+3517435648,3517436415,CA
+3517436416,3517436671,US
+3517436672,3517437439,CA
+3517437440,3517437695,US
+3517437696,3517437951,CA
+3517437952,3517438207,US
+3517438208,3517438463,CA
+3517438464,3517438943,US
+3517438944,3517439231,CA
+3517439232,3517439743,US
+3517439744,3517442047,CA
+3517442048,3517442175,US
3517442176,3517442207,CA
3517442208,3517442559,US
3517442560,3517442623,CA
-3517442624,3517447863,US
+3517442624,3517442815,US
+3517442816,3517443583,CA
+3517443584,3517444863,US
+3517444864,3517445119,CA
+3517445120,3517445631,US
+3517445632,3517445887,CA
+3517445888,3517446143,US
+3517446144,3517446655,CA
+3517446656,3517447167,US
+3517447168,3517447679,CA
+3517447680,3517447863,US
3517447864,3517447871,CA
-3517447872,3517546495,US
+3517447872,3517447935,US
+3517447936,3517448191,CA
+3517448192,3517546495,US
3517546496,3517562879,CA
3517562880,3517595647,US
3517595648,3517596671,SE
3517596672,3517596927,US
-3517596928,3517599359,SE
+3517596928,3517597183,IE
+3517597184,3517597695,US
+3517597696,3517597951,IE
+3517597952,3517598207,DE
+3517598208,3517598463,IE
+3517598464,3517599359,SE
3517599360,3517599615,US
-3517599616,3517602687,SE
+3517599616,3517600767,SE
+3517600768,3517601279,US
+3517601280,3517602047,SE
+3517602048,3517602303,DE
+3517602304,3517602559,US
+3517602560,3517602687,SE
3517602688,3517602815,US
-3517602816,3517603327,SE
-3517603328,3517603583,US
+3517602816,3517603071,SE
+3517603072,3517603583,US
3517603584,3517603647,SE
3517603648,3517603711,US
-3517603712,3517606207,SE
+3517603712,3517604095,SE
+3517604096,3517604351,US
+3517604352,3517605119,SE
+3517605120,3517605375,US
+3517605376,3517605887,SE
+3517605888,3517606143,US
+3517606144,3517606207,SE
3517606208,3517606399,US
-3517606400,3517608191,SE
+3517606400,3517607935,SE
+3517607936,3517608191,DE
3517608192,3517608447,US
-3517608448,3517608703,SE
+3517608448,3517608703,GB
3517608704,3517609727,US
-3517609728,3517612031,SE
+3517609728,3517610495,SE
+3517610496,3517611263,IE
+3517611264,3517612031,SE
3517612032,3517644799,US
3517644800,3517710335,CA
3517710336,3517718527,US
3517718528,3517726719,CA
-3517726720,3518056447,US
+3517726720,3517990911,US
+3517990912,3517991423,CA
+3517991424,3518056447,US
3518058496,3518062591,US
3518062592,3518066687,CA
-3518066688,3518392319,US
+3518066688,3518075647,US
+3518075648,3518075903,AU
+3518075904,3518076671,US
+3518076672,3518076927,PA
+3518076928,3518381055,US
+3518381056,3518381311,IN
+3518381312,3518392319,US
3518394368,3518431231,US
3518431232,3518439423,CA
3518439424,3518463999,US
3518464000,3518472191,CA
-3518472192,3519234047,US
+3518472192,3518762495,US
+3518762496,3518762751,GB
+3518762752,3518765311,US
+3518765312,3518765567,CA
+3518765568,3518905599,US
+3518905600,3518905855,GB
+3518905856,3518911743,US
+3518911744,3518911999,GB
+3518912000,3518912511,US
+3518912512,3518912767,IN
+3518912768,3518918143,US
+3518918144,3518918399,IN
+3518918400,3518919423,US
+3518919424,3518919679,IN
+3518919680,3519234047,US
3519234048,3519250431,CA
3519250432,3519340543,US
3519340544,3519344639,CA
@@ -76582,25 +84446,53 @@
3519381504,3519397887,CA
3519397888,3519467519,US
3519469568,3519475711,US
-3519475712,3519477759,DE
-3519477760,3519676415,US
+3519475712,3519476223,BH
+3519476224,3519477759,DE
+3519477760,3519578367,US
+3519578368,3519578623,NA
+3519578624,3519578879,US
+3519578880,3519579135,CA
+3519579136,3519586303,US
+3519586304,3519586559,GB
+3519586560,3519590655,US
+3519590656,3519590911,CA
+3519590912,3519676415,US
3519676416,3519709183,CA
-3519709184,3519741951,US
+3519709184,3519723519,US
+3519723520,3519724031,CA
+3519724032,3519741951,US
3519741952,3519758335,ZA
3519758336,3519873023,US
-3519873024,3519879807,CA
-3519879808,3519879815,US
-3519879816,3519901695,CA
+3519873024,3519874559,CA
+3519874560,3519875071,US
+3519875072,3519877119,CA
+3519877120,3519877167,US
+3519877168,3519877183,CA
+3519877184,3519877887,US
+3519877888,3519878143,CA
+3519878144,3519878271,US
+3519878272,3519878303,CA
+3519878304,3519879727,US
+3519879728,3519879735,CA
+3519879736,3519879935,US
+3519879936,3519880447,CA
+3519880448,3519881983,US
+3519881984,3519882495,CA
+3519882496,3519882751,US
+3519882752,3519884031,CA
+3519884032,3519884287,US
+3519884288,3519901695,CA
3519901696,3519930367,US
3519934464,3519938559,CA
3519938560,3520020479,US
3520020480,3520036863,CA
-3520036864,3520135167,US
+3520036864,3520086271,US
+3520086272,3520086527,CA
+3520086528,3520135167,US
3520167936,3520344063,US
3520348160,3520356351,US
3520356352,3520364543,ZA
-3520364544,3520397311,US
-3520401408,3520413439,US
+3520364544,3520413439,US
3520413440,3520413695,CA
3520413696,3520454655,US
3520454656,3520462847,CA
@@ -76610,19 +84502,36 @@
3520675840,3520692223,CA
3520692224,3520937983,US
3520937984,3520954367,CA
-3520954368,3520999423,US
+3520954368,3520994815,US
+3520994816,3520995071,GB
+3520995072,3520995327,ES
+3520995328,3520999423,US
3520999424,3521003519,CA
3521003520,3521028095,US
3521028096,3521032191,CA
3521032192,3521044479,US
3521044480,3521048575,CA
-3521048576,3521216511,US
-3521216512,3521232895,CA
+3521048576,3521086207,US
+3521086208,3521086463,AU
+3521086464,3521196287,US
+3521196288,3521196543,AR
+3521196544,3521216511,US
+3521216512,3521220351,CA
+3521220352,3521220607,US
+3521220608,3521222143,CA
+3521222144,3521222399,US
+3521222400,3521224959,CA
+3521224960,3521225215,US
+3521225216,3521232127,CA
+3521232128,3521232383,US
+3521232384,3521232895,CA
3521232896,3521249279,US
3521249280,3521314815,CA
3521314816,3521347583,US
3521347584,3521363967,CA
-3521363968,3521802239,US
+3521363968,3521366783,US
+3521366784,3521367039,CY
+3521367040,3521802239,US
3521806336,3521888483,US
3521888484,3521888484,KW
3521888485,3521896927,US
@@ -76637,7 +84546,25 @@
3521965056,3521966079,DE
3521966080,3522101247,US
3522101248,3522109439,CA
-3522109440,3522130253,US
+3522109440,3522118399,US
+3522118400,3522118655,GB
+3522118656,3522118911,US
+3522118912,3522119679,GB
+3522119680,3522119935,US
+3522119936,3522120191,LY
+3522120192,3522120447,US
+3522120448,3522120703,LY
+3522120704,3522120959,AE
+3522120960,3522121215,LY
+3522121216,3522121471,US
+3522121472,3522121727,LY
+3522121728,3522121983,AE
+3522121984,3522122239,AW
+3522122240,3522123519,US
+3522123520,3522123775,GB
+3522123776,3522125055,US
+3522125056,3522125311,GB
+3522125312,3522130253,US
3522130254,3522130254,UA
3522130255,3522174975,US
3522174976,3522179071,BM
@@ -76650,7 +84577,9 @@
3522902016,3522903039,CA
3522903040,3522937855,US
3522937856,3522938367,GB
-3522938368,3523215359,US
+3522938368,3522940415,US
+3522940416,3522940671,HK
+3522940672,3523215359,US
3523215360,3523223551,AU
3523223552,3523231743,KR
3523231744,3523248127,AU
@@ -76693,8 +84622,7 @@
3523601920,3523674111,HK
3523674112,3523682303,FJ
3523682304,3523686399,NZ
-3523686400,3523688447,AU
-3523688704,3523690239,AU
+3523686400,3523690495,AU
3523690496,3523698687,IN
3523698688,3523707903,JP
3523707904,3523708159,AU
@@ -76725,8 +84653,8 @@
3524730880,3524739071,CN
3524739072,3524743167,ID
3524743168,3524745727,MP
-3524745728,3524746239,GU
-3524746240,3524747263,MP
+3524745728,3524745983,GU
+3524745984,3524747263,MP
3524747264,3524755455,PH
3524755456,3524756223,AU
3524756224,3524756479,SG
@@ -76736,7 +84664,9 @@
3524758016,3524758271,SG
3524758272,3524758527,AU
3524758528,3524758783,SG
-3524758784,3524759551,AU
+3524758784,3524759039,AU
+3524759040,3524759295,SG
+3524759296,3524759551,AU
3524759552,3524760575,SG
3524760576,3524761343,AU
3524761344,3524761599,SG
@@ -76758,7 +84688,9 @@
3526557696,3526651135,CN
3526651136,3526651391,KP
3526651392,3526754303,CN
-3526754304,3526885375,NZ
+3526754304,3526845183,NZ
+3526845184,3526845439,AU
+3526845440,3526885375,NZ
3526885376,3526893567,PK
3526893568,3526897663,NZ
3526897664,3526901759,HK
@@ -76808,9 +84740,9 @@
3529089024,3529097215,KR
3529097216,3529113599,JP
3529113600,3531603967,KR
-3531603968,3533703167,JP
-3533703168,3533703423,HK
-3533703424,3534749695,JP
+3531603968,3533765631,JP
+3533765632,3533765887,CN
+3533765888,3534749695,JP
3534749696,3534758043,HK
3534758044,3534758143,AU
3534758144,3534758147,JP
@@ -76918,7 +84850,9 @@
3556999168,3557007359,RU
3557007360,3557015551,IT
3557015552,3557023743,DE
-3557023744,3557031935,GB
+3557023744,3557027327,GB
+3557027328,3557027583,NL
+3557027584,3557031935,GB
3557031936,3557040127,IT
3557040128,3557048319,NO
3557048320,3557056511,CH
@@ -76996,9 +84930,7 @@
3557654528,3557670911,KZ
3557670912,3557679103,GB
3557679104,3557687295,SI
-3557687296,3557701887,PL
-3557701888,3557702143,DE
-3557702144,3557703679,PL
+3557687296,3557703679,PL
3557703680,3557711871,DE
3557711872,3557720063,ES
3557720064,3557728255,IT
@@ -77021,11 +84953,11 @@
3557860832,3557860847,FI
3557860848,3557861983,SE
3557861984,3557862015,FI
-3557862016,3557864191,SE
-3557864192,3557864311,DK
+3557862016,3557863295,SE
+3557863296,3557863327,FI
+3557863328,3557864311,SE
3557864312,3557864319,FI
-3557864320,3557864447,DK
-3557864448,3557867519,SE
+3557864320,3557867519,SE
3557867520,3557875711,RU
3557875712,3557883903,DE
3557883904,3557892095,RU
@@ -77045,7 +84977,9 @@
3557982208,3557990399,NO
3557990400,3557998591,PT
3557998592,3558006783,DE
-3558006784,3558014975,GB
+3558006784,3558010879,GB
+3558010880,3558012927,FR
+3558012928,3558014975,GB
3558014976,3558023167,RU
3558023168,3558031359,DE
3558031360,3558039551,GB
@@ -77075,7 +85009,9 @@
3558203392,3558211583,ES
3558211584,3558219775,GB
3558219776,3558227967,ES
-3558227968,3558236159,RU
+3558227968,3558234623,RU
+3558234624,3558234879,UA
+3558234880,3558236159,RU
3558236160,3558244351,GB
3558244352,3558252543,IT
3558252544,3558260735,KE
@@ -77145,8 +85081,14 @@
3558711296,3558719487,NL
3558719488,3558735871,IL
3558735872,3558741503,GB
-3558741504,3558741759,GG
-3558741760,3558744063,GB
+3558741504,3558742015,GG
+3558742016,3558742527,GB
+3558742528,3558742783,GG
+3558742784,3558743039,GB
+3558743040,3558743295,GG
+3558743296,3558743551,GB
+3558743552,3558743807,GG
+3558743808,3558744063,GB
3558744064,3558752255,LB
3558752256,3558760447,SI
3558760448,3558768639,FR
@@ -77191,9 +85133,12 @@
3559090240,3559090303,BE
3559090304,3559093311,GB
3559093312,3559093319,BE
-3559093320,3559095455,GB
+3559093320,3559093503,GB
+3559093504,3559093759,BE
+3559093760,3559095455,GB
3559095456,3559095456,BE
-3559095457,3559096319,GB
+3559095457,3559096063,GB
+3559096064,3559096319,BE
3559096320,3559104511,RO
3559104512,3559112703,RU
3559112704,3559120895,IT
@@ -77215,9 +85160,7 @@
3559260160,3559268351,DE
3559268352,3559276543,IT
3559276544,3559284735,GB
-3559284736,3559288831,RU
-3559288832,3559289855,AZ
-3559289856,3559292927,RU
+3559284736,3559292927,RU
3559292928,3559301119,JO
3559301120,3559305215,GB
3559305216,3559305471,US
@@ -77289,7 +85232,9 @@
3559874560,3559882751,LT
3559882752,3559890943,AZ
3559890944,3559899135,CH
-3559899136,3559900223,UA
+3559899136,3559899903,UA
+3559899904,3559899967,EE
+3559899968,3559900223,UA
3559900224,3559900287,EE
3559900288,3559903231,UA
3559903232,3559907327,EE
@@ -77555,9 +85500,7 @@
3561472000,3561480191,DE
3561480192,3561488383,GB
3561488384,3561496575,OM
-3561496576,3561497087,GB
-3561497088,3561497343,NL
-3561497344,3561502719,GB
+3561496576,3561502719,GB
3561502720,3561503743,NL
3561503744,3561504767,GB
3561504768,3561512959,DE
@@ -77600,9 +85543,13 @@
3561775104,3561783295,IL
3561783296,3561799679,RU
3561799680,3561807871,DE
-3561807872,3561814015,BE
-3561814016,3561814527,LU
-3561814528,3561816063,BE
+3561807872,3561808895,BE
+3561808896,3561809151,LU
+3561809152,3561814271,BE
+3561814272,3561814527,LU
+3561814528,3561815039,BE
+3561815040,3561815295,LU
+3561815296,3561816063,BE
3561816064,3561824255,VA
3561824256,3561832447,LI
3561832448,3561840639,IT
@@ -77616,11 +85563,7 @@
3561897984,3561906175,GB
3561906176,3561914367,DE
3561914368,3561922559,ES
-3561922560,3561922927,GB
-3561922928,3561922943,NL
-3561922944,3561923583,GB
-3561923584,3561923839,NL
-3561923840,3561925023,GB
+3561922560,3561925023,GB
3561925024,3561925039,NL
3561925040,3561925343,GB
3561925344,3561925375,NL
@@ -77657,9 +85600,7 @@
3562059328,3562059335,CH
3562059336,3562059391,ES
3562059392,3562059519,CH
-3562059520,3562059647,ES
-3562059648,3562059775,CH
-3562059776,3562061823,ES
+3562059520,3562061823,ES
3562070016,3562078207,DE
3562078208,3562086399,SK
3562086400,3562087423,SE
@@ -77690,9 +85631,7 @@
3562283008,3562285055,IT
3562285056,3562287103,IE
3562287104,3562289151,IT
-3562289152,3562290175,FR
-3562290176,3562290431,GB
-3562290432,3562291199,FR
+3562289152,3562291199,FR
3562291200,3562307583,GB
3562307584,3562315775,NL
3562315776,3562323967,GB
@@ -77716,7 +85655,8 @@
3562487808,3562495999,GB
3562496000,3562504191,BE
3562504192,3562512383,DE
-3562512384,3562520575,UA
+3562512384,3562519551,UA
+3562519552,3562520575,BG
3562528768,3562536959,PL
3562536960,3562545151,AT
3562545152,3562553343,GB
@@ -77813,7 +85753,9 @@
3563323648,3563329791,GB
3563331584,3563339775,DE
3563339776,3563347967,NG
-3563347968,3563356159,GB
+3563347968,3563348991,GB
+3563348992,3563353087,FI
+3563353088,3563356159,GB
3563356160,3563364351,RU
3563364352,3563372543,BE
3563372544,3563380735,SA
@@ -77864,15 +85806,11 @@
3563814912,3563823103,SE
3563823104,3563831295,DE
3563831296,3563847679,RU
-3563847680,3563848447,GB
+3563847680,3563848447,NL
3563848448,3563848703,ES
-3563848704,3563848847,GB
+3563848704,3563848847,NL
3563848848,3563848855,ES
-3563848856,3563854207,GB
-3563854208,3563854215,NL
-3563854216,3563854263,GB
-3563854264,3563854271,NL
-3563854272,3563855871,GB
+3563848856,3563855871,NL
3563855872,3563864063,AT
3563864064,3563872255,GB
3563872256,3563880447,RU
@@ -77880,9 +85818,7 @@
3563884652,3563884652,TR
3563884653,3563888639,CY
3563888640,3563896831,DE
-3563896832,3563899903,HU
-3563899904,3563900159,SK
-3563900160,3563913215,HU
+3563896832,3563913215,HU
3563913216,3563921407,RU
3563921408,3563929599,UA
3563929600,3563937791,CH
@@ -77957,7 +85893,9 @@
3564571696,3564571703,DE
3564571704,3564572427,GB
3564572428,3564572431,ES
-3564572432,3564576767,GB
+3564572432,3564572527,GB
+3564572528,3564572531,DK
+3564572532,3564576767,GB
3564584960,3564593151,SA
3564593152,3564601343,RU
3564601344,3564609535,EE
@@ -77976,7 +85914,9 @@
3564733184,3564733215,DE
3564733216,3564734457,GB
3564734458,3564734458,DE
-3564734459,3564734743,GB
+3564734459,3564734741,GB
+3564734742,3564734742,DE
+3564734743,3564734743,GB
3564734744,3564734751,DE
3564734752,3564736535,GB
3564736536,3564736543,DE
@@ -77999,7 +85939,13 @@
3564847104,3564855295,IT
3564855296,3564863487,DE
3564863488,3564879871,NL
-3564879872,3564882015,GB
+3564879872,3564879935,GB
+3564879936,3564879999,NL
+3564880000,3564880651,GB
+3564880652,3564880655,NL
+3564880656,3564880945,GB
+3564880946,3564880946,NL
+3564880947,3564882015,GB
3564882016,3564882031,NL
3564882032,3564883071,GB
3564883072,3564883079,NL
@@ -78012,15 +85958,13 @@
3564889635,3564892735,GB
3564892736,3564892751,NL
3564892752,3564894207,GB
-3564894208,3564895487,NL
-3564895488,3564896255,GB
+3564894208,3564895743,NL
+3564895744,3564896255,GB
3564896256,3564904447,RU
3564904448,3564912639,DE
3564912640,3564920831,BG
3564920832,3564922111,DE
-3564922112,3564925951,US
-3564925952,3564926207,DE
-3564926208,3564929023,US
+3564922112,3564929023,US
3564929024,3564937215,AT
3564937216,3564945407,IT
3564945408,3564953599,GB
@@ -78028,7 +85972,9 @@
3564954880,3564955903,GB
3564955904,3564956671,AT
3564956672,3564956927,GB
-3564956928,3564961791,AT
+3564956928,3564960959,AT
+3564960960,3564960975,GB
+3564960976,3564961791,AT
3564961792,3564969983,TR
3564969984,3564978175,DE
3564978176,3564986367,GB
@@ -78037,7 +85983,9 @@
3565002752,3565027327,NO
3565027328,3565035519,PL
3565035520,3565036287,IE
-3565036288,3565038079,GB
+3565036288,3565037055,GB
+3565037056,3565037311,IE
+3565037312,3565038079,GB
3565038080,3565038335,IE
3565038336,3565038879,GB
3565038880,3565038895,IE
@@ -78074,11 +86022,7 @@
3565503488,3565518847,GB
3565518848,3565551615,TR
3565551616,3565682687,GB
-3565682688,3565684991,NL
-3565684992,3565684995,GB
-3565684996,3565684996,NL
-3565684997,3565685247,GB
-3565685248,3565748223,NL
+3565682688,3565748223,NL
3565748224,3565752839,GB
3565752856,3565752879,GB
3565752888,3565752983,GB
@@ -78145,7 +86089,11 @@
3565767272,3565767287,GB
3565767296,3565767351,GB
3565767360,3565767399,GB
-3565767408,3565767999,GB
+3565767408,3565767439,GB
+3565767456,3565767487,GB
+3565767504,3565767599,GB
+3565767616,3565767631,GB
+3565767680,3565767999,GB
3565768208,3565768271,GB
3565768280,3565768295,GB
3565768312,3565768335,GB
@@ -78252,21 +86200,19 @@
3567239168,3567241215,NL
3567241472,3567255551,NL
3567255552,3567321087,PL
-3567321088,3567324527,GB
-3567324528,3567324543,ES
-3567324544,3567324655,GB
-3567324656,3567324671,ES
-3567324672,3567353855,GB
+3567321088,3567353855,GB
3567353856,3567386623,CH
3567386624,3567388351,GB
3567388352,3567388383,DE
3567388384,3567388543,GB
3567388544,3567388607,DE
3567388608,3567389695,GB
-3567389696,3567390719,DE
-3567390720,3567391231,GB
+3567389696,3567390975,DE
+3567390976,3567391231,GB
3567391232,3567391487,DE
-3567391488,3567399167,GB
+3567391488,3567394815,GB
+3567394816,3567395071,FR
+3567395072,3567399167,GB
3567399168,3567399423,DE
3567399424,3567399935,GB
3567399936,3567401471,DE
@@ -78299,7 +86245,7 @@
3567584256,3567584383,AT
3567584400,3567584407,AT
3567584512,3567584639,AT
-3567585280,3567585295,TR
+3567585280,3567585311,TR
3567585792,3567586303,GB
3567586304,3567586815,TR
3567587328,3567591423,GB
@@ -78324,8 +86270,11 @@
3567681536,3567714303,ES
3567714304,3567715327,GB
3567715584,3567715839,GB
-3567716352,3567716607,GB
-3567718400,3567719423,US
+3567716352,3567717375,GB
+3567718400,3567718655,US
+3567718656,3567718911,GB
+3567718912,3567719423,US
+3567719424,3567719679,GB
3567779840,3567845375,DE
3567845376,3567861759,GB
3567861760,3567878143,NO
@@ -78341,7 +86290,9 @@
3568476160,3568484351,DK
3568484352,3568492543,NL
3568492544,3568500735,RS
-3568500736,3568566271,IL
+3568500736,3568520137,IL
+3568520138,3568520138,SY
+3568520139,3568566271,IL
3568566272,3568599039,FR
3568599040,3568631807,PL
3568631808,3568697343,SE
@@ -78411,7 +86362,9 @@
3571187712,3571253247,RU
3571253248,3571286015,BE
3571286016,3571318783,DE
-3571318784,3571384319,GB
+3571318784,3571321055,GB
+3571321056,3571321071,DE
+3571321072,3571384319,GB
3571384320,3571425695,DE
3571425696,3571425727,ES
3571425728,3571474431,DE
@@ -78456,9 +86409,7 @@
3572957184,3573003837,SE
3573003838,3573003838,NO
3573003839,3573022719,SE
-3573022720,3573039103,RU
-3573039104,3573039359,GB
-3573039360,3573055487,RU
+3573022720,3573055487,RU
3573055488,3573088255,GB
3573088256,3573153791,CH
3573153792,3573219327,GB
@@ -78500,10 +86451,8 @@
3574136832,3574169599,DE
3574169600,3574174839,GB
3574174840,3574174847,ES
-3574174848,3574182143,GB
-3574182144,3574182399,ES
-3574182400,3574186751,GB
-3574186752,3574188031,ES
+3574174848,3574187007,GB
+3574187008,3574188031,ES
3574188032,3574190591,GB
3574190592,3574190847,ES
3574190848,3574191615,GB
@@ -78523,18 +86472,21 @@
3574530048,3574594559,SE
3574594560,3574595583,GB
3574595584,3574595839,GF
-3574595840,3574597631,FR
-3574597632,3574598143,GP
+3574595840,3574597887,FR
+3574597888,3574598143,GP
3574598144,3574598399,MQ
3574598400,3574599423,FR
3574599424,3574599679,MQ
-3574599680,3574601215,FR
+3574599680,3574599935,GP
+3574599936,3574600191,FR
+3574600192,3574600447,MQ
+3574600448,3574601215,FR
3574601216,3574601471,GP
3574601472,3574602239,FR
3574602240,3574602495,GF
-3574602496,3574603263,FR
-3574603264,3574603519,GP
-3574603520,3574603775,FR
+3574602496,3574602751,FR
+3574602752,3574603007,RE
+3574603008,3574603775,FR
3574603776,3574611967,BG
3574611968,3574628351,HU
3574628352,3574661119,GR
@@ -78547,7 +86499,11 @@
3574831104,3574857727,GB
3574857728,3574923263,DE
3574923264,3574939647,RU
-3574939648,3574956031,SE
+3574939648,3574941375,SE
+3574941376,3574941439,NO
+3574941440,3574949743,SE
+3574949744,3574949759,NO
+3574949760,3574956031,SE
3574956032,3574972415,IT
3574972416,3574988799,LV
3574988800,3575054335,PT
@@ -78569,7 +86525,9 @@
3575590912,3575640063,BE
3575640064,3575644159,TR
3575644160,3575709695,DK
-3575709696,3575742463,AT
+3575709696,3575739391,AT
+3575739392,3575739647,FR
+3575739648,3575742463,AT
3575742464,3575775231,RU
3575775232,3575824383,NL
3575824384,3575832575,KW
@@ -78632,7 +86590,7 @@
3576056936,3576056943,GB
3576056952,3576056975,GB
3576056992,3576056999,GB
-3576057040,3576057055,GB
+3576057040,3576057047,GB
3576057632,3576057647,GB
3576057712,3576057743,GB
3576057824,3576057839,GB
@@ -78716,7 +86674,9 @@
3576089776,3576089791,GB
3576091408,3576091423,GB
3576091456,3576091479,GB
-3576091904,3576092159,GB
+3576091968,3576091983,GB
+3576092000,3576092031,GB
+3576092128,3576092159,GB
3576092864,3576092895,GB
3576093064,3576093071,GB
3576093184,3576093247,GB
@@ -78734,7 +86694,9 @@
3576242384,3576242391,FR
3576242392,3576245247,GB
3576245248,3576245503,FR
-3576245504,3576252415,GB
+3576245504,3576251135,GB
+3576251136,3576251391,FR
+3576251392,3576252415,GB
3576252416,3576252671,FR
3576252672,3576253807,GB
3576253808,3576253815,FR
@@ -78744,14 +86706,14 @@
3576254696,3576254703,FR
3576254704,3576254775,GB
3576254776,3576254783,FR
-3576254784,3576258047,GB
-3576258048,3576258303,FR
-3576258304,3576260607,GB
+3576254784,3576260607,GB
3576260608,3576260623,FR
3576260624,3576260863,GB
3576260864,3576261119,FR
-3576261120,3576263423,GB
-3576263424,3576263935,FR
+3576261120,3576263447,GB
+3576263448,3576263455,FR
+3576263456,3576263679,GB
+3576263680,3576263935,FR
3576263936,3576264255,GB
3576264256,3576264263,FR
3576264264,3576264351,GB
@@ -78760,7 +86722,9 @@
3576264376,3576264383,FR
3576264384,3576264679,GB
3576264680,3576264687,FR
-3576264688,3576266751,GB
+3576264688,3576264959,GB
+3576264960,3576265215,FR
+3576265216,3576266751,GB
3576266752,3576299519,FR
3576299520,3576365055,AE
3576365056,3576430591,TR
@@ -78773,42 +86737,28 @@
3576823808,3576889343,SE
3576889344,3576954879,NL
3576954880,3576987647,NO
-3576987648,3577003519,GB
-3577003520,3577003775,NL
-3577003776,3577020415,GB
+3576987648,3577020415,GB
3577020416,3577085951,NL
3577085952,3577151487,DE
-3577151488,3577151999,FR
-3577152000,3577152255,RE
-3577152256,3577152511,FR
-3577152512,3577152767,RE
+3577151488,3577152767,RE
3577152768,3577154047,FR
-3577154048,3577154815,RE
-3577154816,3577155071,FR
-3577155072,3577155583,RE
+3577154048,3577155583,RE
3577155584,3577155839,FR
3577155840,3577156351,RE
-3577156352,3577156863,FR
-3577156864,3577157119,RE
-3577157120,3577157631,FR
+3577156352,3577157631,FR
3577157632,3577158399,RE
3577158400,3577158911,FR
3577158912,3577159167,RE
-3577159168,3577159423,FR
-3577159424,3577159935,RE
+3577159168,3577159679,FR
+3577159680,3577159935,RE
3577159936,3577160959,FR
-3577160960,3577161215,YT
-3577161216,3577161471,RE
-3577161472,3577161727,FR
-3577161728,3577161983,RE
-3577161984,3577163263,FR
-3577163264,3577163519,RE
-3577163520,3577164287,FR
-3577164288,3577164543,RE
-3577164544,3577165567,FR
-3577165568,3577165823,RE
-3577165824,3577166847,FR
-3577166848,3577167103,RE
+3577160960,3577161023,YT
+3577161024,3577161087,FR
+3577161088,3577161215,YT
+3577161216,3577165567,FR
+3577165568,3577166079,RE
+3577166080,3577166591,FR
+3577166592,3577167103,RE
3577167104,3577167871,FR
3577167872,3577184255,ET
3577184256,3577217023,CH
@@ -78832,13 +86782,7 @@
3577669632,3577670655,BE
3577675776,3577741311,PT
3577741312,3578003455,SE
-3578003456,3578112255,DE
-3578112256,3578112511,GB
-3578112512,3578201599,DE
-3578201600,3578201729,BE
-3578201730,3578201730,DE
-3578201731,3578201855,BE
-3578201856,3578265599,DE
+3578003456,3578265599,DE
3578265600,3578331135,GB
3578331136,3578339327,PL
3578339328,3578347519,ES
@@ -78869,9 +86813,7 @@
3579197312,3579197439,US
3579197440,3579248639,GB
3579248640,3579346943,RU
-3579346944,3579361535,SE
-3579361536,3579361791,NO
-3579361792,3579445247,SE
+3579346944,3579445247,SE
3579445248,3579478015,AT
3579478016,3579527167,FR
3579527168,3579543551,BA
@@ -78882,9 +86824,7 @@
3579707392,3579723775,ES
3579723776,3579740159,AT
3579740160,3579772927,IE
-3579772928,3579790335,DE
-3579790336,3579790591,AT
-3579790592,3579838463,DE
+3579772928,3579838463,DE
3579838464,3580100607,ES
3580100608,3580103679,SE
3580103680,3580106751,LV
@@ -78897,10 +86837,8 @@
3580135532,3580135532,SE
3580135533,3580135935,EE
3580135936,3580136447,SE
-3580136448,3580136703,HR
-3580136704,3580136959,SE
-3580136960,3580139007,HR
-3580139008,3580150783,SE
+3580136448,3580138495,HR
+3580138496,3580150783,SE
3580150784,3580151039,NL
3580151040,3580162047,SE
3580162048,3580164095,EE
@@ -78950,7 +86888,8 @@
3580280832,3580329983,RU
3580329984,3580338175,NL
3580338176,3580338687,SE
-3580338688,3580339711,HR
+3580338688,3580339199,HR
+3580339200,3580339711,SE
3580339712,3580340223,EE
3580340224,3580344319,LT
3580344320,3580354559,SE
@@ -78968,9 +86907,8 @@
3580641280,3580643327,FR
3580643328,3580645375,UA
3580645376,3580647423,PL
-3580647424,3580647679,GB
-3580647680,3580649215,DE
-3580649216,3580649471,GB
+3580647424,3580647935,GB
+3580647936,3580649471,DE
3580649472,3580651519,SE
3580651520,3580653567,NL
3580653568,3580655615,PL
@@ -79039,8 +86977,7 @@
3582091264,3582099455,QA
3582099456,3582107647,GB
3582107648,3582115839,NL
-3582115840,3582116351,SE
-3582116352,3582116863,HR
+3582115840,3582116863,SE
3582116864,3582117887,EE
3582117888,3582120447,LT
3582120448,3582120959,SE
@@ -79082,8 +87019,8 @@
3582313872,3582320639,JE
3582320640,3582328831,CH
3582328832,3582337023,HU
-3582337024,3582341119,ES
-3582341120,3582343423,PT
+3582337024,3582343167,ES
+3582343168,3582343423,PT
3582343424,3582345215,ES
3582345216,3582353407,IT
3582353408,3582361599,SE
@@ -79187,9 +87124,7 @@
3583157760,3583160319,GB
3583160320,3583161343,DE
3583161344,3583162623,GB
-3583162624,3583162751,ZA
-3583162752,3583162815,GB
-3583162816,3583162879,ZA
+3583162624,3583162879,ZA
3583162880,3583164415,GB
3583164416,3583172607,PT
3583172608,3583188991,DE
@@ -79259,7 +87194,7 @@
3583721472,3583729663,DE
3583729664,3583737855,TR
3583742976,3583743487,PL
-3583743616,3583743743,GB
+3583743488,3583743743,GB
3583743744,3583743999,IE
3583744320,3583744447,GB
3583744512,3583744767,GB
@@ -79278,8 +87213,8 @@
3583827968,3583836159,CH
3583836160,3583844351,DE
3583844352,3583852543,KZ
-3583852544,3583854591,FI
-3583854592,3583854847,GB
+3583852544,3583854783,FI
+3583854784,3583854847,GB
3583854848,3583860735,FI
3583860736,3583868927,HU
3583868928,3583877119,AT
@@ -79309,13 +87244,9 @@
3584073728,3584081919,SK
3584081920,3584082007,NL
3584082008,3584082015,AT
-3584082016,3584093439,NL
-3584093440,3584093695,NO
-3584093696,3584094207,NL
-3584094208,3584094463,NO
-3584094464,3584096183,NL
-3584096184,3584096191,NO
-3584096192,3584098303,NL
+3584082016,3584090111,NL
+3584090112,3584096255,NO
+3584096256,3584098303,NL
3584098304,3584106495,SI
3584106496,3584114687,FI
3584114688,3584122879,GB
@@ -79367,7 +87298,9 @@
3584499712,3584507903,RU
3584507904,3584509231,GB
3584509232,3584509239,AW
-3584509240,3584516095,GB
+3584509240,3584509695,GB
+3584509696,3584509951,JE
+3584509952,3584516095,GB
3584516096,3584524287,NO
3584524288,3584532479,IS
3584532480,3584540671,DE
@@ -79511,9 +87444,7 @@
3585646592,3585654783,SA
3585654784,3585662975,NO
3585662976,3585671167,BY
-3585671168,3585674239,SE
-3585674240,3585674495,DK
-3585674496,3585679359,SE
+3585671168,3585679359,SE
3585679360,3585687551,FI
3585687552,3585695743,DE
3585695744,3585702527,GB
@@ -79539,12 +87470,13 @@
3585843200,3585851391,NO
3585851392,3585859583,SE
3585859584,3585860607,AF
-3585860608,3585862655,RU
-3585862656,3585863679,DE
+3585860608,3585861631,RU
+3585861632,3585863679,EE
3585863680,3585865471,NL
3585865472,3585865727,LB
-3585865728,3585867263,RU
-3585867264,3585867775,DE
+3585865728,3585866495,EE
+3585866496,3585866751,RU
+3585866752,3585867775,EE
3585867776,3585875967,NO
3585875968,3585884159,CH
3585884160,3585892351,IQ
@@ -79553,16 +87485,22 @@
3585906688,3585907711,CZ
3585907712,3585908735,NO
3585908736,3585908991,FR
-3585908992,3585909759,GF
+3585908992,3585909247,GF
+3585909248,3585909503,FR
+3585909504,3585909759,GF
3585909760,3585910271,FR
3585910272,3585910527,GP
-3585910528,3585914111,FR
-3585914112,3585914367,GP
-3585914368,3585914623,FR
+3585910528,3585912831,FR
+3585912832,3585913087,GP
+3585913088,3585913855,FR
+3585913856,3585914623,GP
3585914624,3585914879,GF
3585914880,3585915391,FR
-3585915392,3585916159,GP
-3585916160,3585916927,FR
+3585915392,3585915647,GP
+3585915648,3585915903,FR
+3585915904,3585916159,GP
+3585916160,3585916671,FR
+3585916672,3585916927,MQ
3585916928,3585925119,IT
3585925120,3585933311,CH
3585933312,3585941503,NL
@@ -79619,7 +87557,11 @@
3586476304,3586490367,HU
3586490368,3586506751,LT
3586506752,3586523135,NL
-3586523136,3586555903,DE
+3586523136,3586544267,DE
+3586544268,3586544271,DK
+3586544272,3586544383,DE
+3586544384,3586544511,DK
+3586544512,3586555903,DE
3586555904,3586572287,IT
3586572288,3586588671,RS
3586588672,3586596863,IT
@@ -79642,7 +87584,9 @@
3586677640,3586677643,GB
3586677644,3586677647,SG
3586677648,3586677655,US
-3586677656,3586680319,FR
+3586677656,3586679599,FR
+3586679600,3586679615,IT
+3586679616,3586680319,FR
3586680320,3586680575,ES
3586680576,3586681615,FR
3586681616,3586681631,CZ
@@ -79670,7 +87614,9 @@
3586912722,3586912722,FR
3586912723,3586916351,DE
3586916352,3586924543,IT
-3586924544,3586929663,AX
+3586924544,3586925823,AX
+3586925824,3586926079,FI
+3586926080,3586929663,AX
3586929664,3586930687,FI
3586930688,3586932735,AX
3586932736,3586949119,LB
@@ -79704,17 +87650,17 @@
3587219456,3587227647,RU
3587227648,3587231231,GB
3587231232,3587231263,NL
-3587231264,3587233279,GB
+3587231264,3587233087,GB
+3587233088,3587233095,NL
+3587233096,3587233279,GB
3587233280,3587233535,NL
-3587233536,3587234175,GB
-3587234176,3587234207,NL
-3587234208,3587237375,GB
-3587237376,3587237887,NL
+3587233536,3587234191,GB
+3587234192,3587234207,NL
+3587234208,3587237631,GB
+3587237632,3587237887,NL
3587237888,3587238487,GB
3587238488,3587238495,NL
-3587238496,3587238911,GB
-3587238912,3587239167,NL
-3587239168,3587239487,GB
+3587238496,3587239487,GB
3587239488,3587239495,NL
3587239496,3587239583,GB
3587239584,3587239599,NL
@@ -79726,12 +87672,7 @@
3587242672,3587242679,DE
3587242680,3587244031,GB
3587244032,3587260415,IT
-3587260416,3587278591,DE
-3587278592,3587279359,US
-3587279360,3587279615,DE
-3587279616,3587280383,US
-3587280384,3587281151,DE
-3587281152,3587284991,US
+3587260416,3587284991,DE
3587284992,3587291135,IT
3587291136,3587292159,FR
3587292160,3587309567,IT
@@ -79753,10 +87694,8 @@
3587440640,3587444900,SE
3587444901,3587444916,FI
3587444917,3587445759,SE
-3587445760,3587445823,FI
-3587445824,3587445983,SE
-3587445984,3587445999,FI
-3587446000,3587446071,SE
+3587445760,3587446015,FI
+3587446016,3587446071,SE
3587446072,3587446079,FI
3587446080,3587446143,SE
3587446144,3587446271,FI
@@ -79817,7 +87756,8 @@
3588153344,3588161535,RU
3588161536,3588173311,FR
3588173312,3588173567,RE
-3588173568,3588227071,FR
+3588173568,3588173823,YT
+3588173824,3588227071,FR
3588227072,3588292607,BE
3588292608,3588308991,AT
3588308992,3588325375,NO
@@ -79879,7 +87819,9 @@
3589021696,3589029887,SA
3589029888,3589030119,GB
3589030120,3589030127,NL
-3589030128,3589034239,GB
+3589030128,3589031055,GB
+3589031056,3589031056,NL
+3589031057,3589034239,GB
3589034240,3589034495,NL
3589034496,3589037055,GB
3589037056,3589037311,NL
@@ -79907,7 +87849,9 @@
3589431040,3589431295,ES
3589431296,3589432831,GB
3589432832,3589433087,CH
-3589433088,3589435759,GB
+3589433088,3589433855,GB
+3589433856,3589434111,IE
+3589434112,3589435759,GB
3589435760,3589435763,ES
3589435764,3589439487,GB
3589439488,3589455871,SE
@@ -79922,8 +87866,8 @@
3589570560,3589578751,GB
3589578752,3589579007,IN
3589579008,3589580543,GB
-3589580544,3589581055,NL
-3589581056,3589582975,GB
+3589580544,3589580799,NL
+3589580800,3589582975,GB
3589582976,3589583103,NL
3589583104,3589583871,GB
3589583872,3589584127,NL
@@ -79967,8 +87911,8 @@
3590127616,3590143999,GB
3590144000,3590156287,SI
3590156288,3590157311,HR
-3590157312,3590159359,RS
-3590159360,3590160383,SI
+3590157312,3590158335,RS
+3590158336,3590160383,SI
3590160384,3590176767,GB
3590176768,3590193151,HU
3590193152,3590201343,IT
@@ -80015,9 +87959,13 @@
3590312944,3590317951,GB
3590317952,3590318015,UA
3590318016,3590324223,GB
-3590324224,3623891695,US
-3623891696,3623891703,ZA
-3623891704,3624054783,US
+3590324224,3623890943,US
+3623890944,3623891199,ZA
+3623891200,3623891455,US
+3623891456,3623891711,ZA
+3623891712,3623891967,US
+3623891968,3623892479,ZA
+3623892480,3624054783,US
3624054784,3624056831,ZA
3624056832,3624181759,US
3624181760,3624182783,ZA
@@ -80026,21 +87974,44 @@
3624208384,3624255487,US
3624255488,3624257535,ZA
3624257536,3624271871,US
-3624271872,3624283135,CA
+3624271872,3624272383,SY
+3624272384,3624272639,CA
+3624272640,3624272895,DZ
+3624272896,3624275967,CA
+3624275968,3624276223,US
+3624276224,3624281087,CA
+3624281088,3624281343,HT
+3624281344,3624283135,CA
3624283136,3624284159,US
3624284160,3624286193,CA
3624286194,3624286194,ZA
3624286195,3624288255,CA
3624288256,3624290303,IN
-3624290304,3624297471,CA
+3624290304,3624292351,CA
+3624292352,3624292607,MF
+3624292608,3624292863,US
+3624292864,3624294143,CA
+3624294144,3624294399,US
+3624294400,3624294911,CA
+3624294912,3624295167,US
+3624295168,3624295935,CA
+3624295936,3624296191,LY
+3624296192,3624297215,CA
+3624297216,3624297471,US
3624297472,3624298495,CO
3624298496,3624299519,PH
-3624299520,3624302847,CA
+3624299520,3624300031,CA
+3624300032,3624300287,LY
+3624300288,3624302847,CA
3624302848,3624303103,MY
-3624303104,3624304639,CA
+3624303104,3624303359,CA
+3624303360,3624303615,US
+3624303616,3624304639,CA
3624304640,3624321023,US
3624321024,3624325119,CA
-3624325120,3624359679,US
+3624325120,3624357887,US
+3624357888,3624358143,KN
+3624358144,3624359679,US
3624359680,3624360703,CW
3624360704,3624374447,US
3624374448,3624374455,ES
@@ -80054,9 +88025,7 @@
3624376336,3624376343,AU
3624376344,3624376351,US
3624376352,3624376359,PT
-3624376360,3624376655,US
-3624376656,3624376679,GB
-3624376680,3624377863,US
+3624376360,3624377863,US
3624377864,3624377871,GB
3624377872,3624377879,US
3624377880,3624377887,GB
@@ -80065,21 +88034,20 @@
3624377912,3624386559,US
3624386560,3624394751,CA
3624394752,3624435711,US
-3624435712,3624441855,CA
-3624441856,3624442111,US
-3624442112,3624452095,CA
+3624435712,3624443391,CA
+3624443392,3624443903,US
+3624443904,3624452095,CA
3624452096,3624480767,US
3624480768,3624484863,CA
3624484864,3624534015,US
-3624534016,3624536063,CA
+3624534016,3624534271,PA
+3624534272,3624536063,CA
3624536064,3624587263,US
3624587264,3624591359,JM
3624594176,3624594431,US
3624595456,3624706047,US
-3624710144,3624714751,US
-3624714752,3624715775,SG
-3624715776,3624716287,US
-3624716288,3624717311,SG
+3624710144,3624714239,US
+3624714240,3624717311,SG
3624717312,3624718335,US
3624718336,3624720383,SG
3624720384,3624720895,US
@@ -80097,15 +88065,25 @@
3624984576,3624992767,CA
3624992768,3625058303,US
3625058304,3625091071,CA
-3625091072,3625140223,US
+3625091072,3625116927,US
+3625116928,3625117183,SE
+3625117184,3625140223,US
3625140224,3625148415,CA
3625148416,3625168895,US
3625168896,3625172991,CA
3625172992,3625259263,US
3625260032,3625287679,US
3625287680,3625295871,CA
-3625295872,3625418751,US
-3625418752,3625426943,CA
+3625295872,3625346047,US
+3625346048,3625346303,AR
+3625346304,3625377279,US
+3625377280,3625377535,TH
+3625377536,3625418751,US
+3625418752,3625420031,CA
+3625420032,3625420543,US
+3625420544,3625422591,CA
+3625422592,3625423103,US
+3625423104,3625426943,CA
3625426944,3625508863,US
3625508864,3625512959,CA
3625512960,3625631743,US
@@ -80114,7 +88092,9 @@
3625959424,3625961471,GB
3625961472,3625961983,US
3625961984,3625962239,GB
-3625962240,3626222653,US
+3625962240,3626091519,US
+3626091520,3626092031,AR
+3626092032,3626222653,US
3626222654,3626222654,CA
3626222655,3626270719,US
3626270720,3626287103,CA
@@ -80138,21 +88118,35 @@
3627065344,3627069439,CA
3627069440,3627299071,US
3627299072,3627299327,IN
-3627299328,3627507967,US
-3627507968,3627511807,CA
+3627299328,3627507711,US
+3627507712,3627511807,CA
3627511808,3627532287,US
3627532288,3627544575,CA
3627544576,3627659263,US
3627659264,3627663359,CA
3627663360,3627679743,US
3627679744,3627712511,CA
-3627712512,3627802623,US
+3627712512,3627753471,US
+3627753472,3627753727,AR
+3627753728,3627759359,US
+3627759360,3627759615,NL
+3627759616,3627802623,US
3627802624,3627810815,CA
-3627810816,3628179455,US
+3627810816,3627842047,US
+3627842048,3627842303,IS
+3627842304,3628145919,US
+3628145920,3628146175,AU
+3628146176,3628153087,US
+3628153088,3628153343,KW
+3628153344,3628155647,US
+3628155648,3628155903,CA
+3628155904,3628161023,US
+3628161024,3628161279,CA
+3628161280,3628179455,US
3628179456,3628187647,CA
-3628187648,3628225781,US
-3628225782,3628225782,GB
-3628225783,3628236799,US
+3628187648,3628225779,US
+3628225780,3628225783,GB
+3628225784,3628236799,US
3628236800,3628257279,CA
3628257280,3628598271,US
3628598272,3628599295,CO
@@ -80160,30 +88154,54 @@
3628603392,3628604415,US
3628604416,3628605439,GT
3628605440,3628608511,IL
-3628608512,3628608735,US
-3628608736,3628608767,VE
-3628608768,3628613631,US
+3628608512,3628609023,VE
+3628609024,3628613375,US
+3628613376,3628613631,HN
3628613632,3628614399,ID
-3628614400,3628618751,US
-3628618752,3628619775,HN
+3628614400,3628614911,CO
+3628614912,3628615167,US
+3628615168,3628615679,IL
+3628615680,3628616191,US
+3628616192,3628617215,PR
+3628617216,3628617471,HN
+3628617472,3628617727,US
+3628617728,3628618239,CO
+3628618240,3628619775,HN
3628619776,3628622847,US
3628622848,3628623871,PR
3628623872,3628625919,NG
-3628625920,3628626175,US
+3628625920,3628626175,PA
3628626176,3628626943,HN
-3628626944,3628627967,US
-3628627968,3628628991,SV
-3628628992,3628629759,US
-3628629760,3628631807,VE
-3628631808,3628634111,US
+3628626944,3628627199,CO
+3628627200,3628627455,IL
+3628627456,3628627711,HN
+3628627712,3628628991,SV
+3628628992,3628629247,GT
+3628629248,3628629503,US
+3628629504,3628631807,VE
+3628631808,3628634111,CO
3628634112,3628636159,AR
-3628636160,3628638207,US
+3628636160,3628636671,VE
+3628636672,3628636927,US
+3628636928,3628637183,VE
+3628637184,3628637695,CO
+3628637696,3628638207,US
3628638208,3628646399,CL
-3628646400,3628647679,US
-3628647680,3628649727,CO
-3628649728,3628655359,US
-3628655360,3628657407,CO
-3628657408,3628679167,US
+3628646400,3628646911,US
+3628646912,3628647423,HN
+3628647424,3628647679,SZ
+3628647680,3628648959,CO
+3628648960,3628649215,US
+3628649216,3628649727,CO
+3628649728,3628654079,US
+3628654080,3628654591,PA
+3628654592,3628654847,US
+3628654848,3628655103,CR
+3628655104,3628655359,VE
+3628655360,3628657663,CO
+3628657664,3628657919,VE
+3628657920,3628658175,BS
+3628658176,3628679167,US
3628679168,3628683263,CA
3628683264,3628834815,US
3628834816,3628843007,CA
@@ -80200,104 +88218,237 @@
3629201504,3629201507,US
3629201508,3629201919,CA
3629201920,3629202431,US
-3629202432,3629203455,CA
-3629203456,3629318143,US
+3629202432,3629203199,CA
+3629203200,3629318143,US
3629318144,3629326335,CA
3629326336,3629539327,US
3629539328,3629547519,CA
-3629547520,3630039039,US
+3629547520,3629662207,US
+3629662208,3629662463,GB
+3629662464,3629737215,US
+3629737216,3629737471,CA
+3629737472,3629767935,US
+3629767936,3629768191,CA
+3629768192,3629789439,US
+3629789440,3629789695,CA
+3629789696,3629789951,US
+3629789952,3629790207,CA
+3629790208,3629839103,US
+3629839104,3629839359,CA
+3629839360,3630039039,US
3630039040,3630039551,CA
-3630039552,3630040431,US
+3630039552,3630040063,US
+3630040064,3630040319,CA
+3630040320,3630040431,US
3630040432,3630040447,CA
-3630040448,3630049279,US
-3630049280,3630049599,CA
+3630040448,3630040575,US
+3630040576,3630040831,CA
+3630040832,3630041343,US
+3630041344,3630041855,CA
+3630041856,3630043135,US
+3630043136,3630043391,CA
+3630043392,3630044671,US
+3630044672,3630046207,CA
+3630046208,3630046719,US
+3630046720,3630047487,CA
+3630047488,3630047999,US
+3630048000,3630048255,CA
+3630048256,3630048511,US
+3630048512,3630049599,CA
3630049600,3630050047,US
3630050048,3630050303,CA
-3630050304,3630054143,US
-3630054144,3630054399,CA
-3630054400,3630055935,US
+3630050304,3630050559,US
+3630050560,3630050815,CA
+3630050816,3630051839,US
+3630051840,3630052607,CA
+3630052608,3630053887,US
+3630053888,3630054143,CA
+3630054144,3630054655,US
+3630054656,3630055167,CA
+3630055168,3630055935,US
3630055936,3630056959,CA
3630056960,3630057407,US
3630057408,3630057471,CA
-3630057472,3630059263,US
+3630057472,3630057727,US
+3630057728,3630057983,CA
+3630057984,3630058751,US
+3630058752,3630059007,CA
+3630059008,3630059263,US
3630059264,3630059519,CA
3630059520,3630060799,US
3630060800,3630061055,CA
3630061056,3630061567,US
-3630061568,3630061823,CA
-3630061824,3630063935,US
+3630061568,3630062079,CA
+3630062080,3630062335,US
+3630062336,3630062591,CA
+3630062592,3630062847,US
+3630062848,3630063871,CA
+3630063872,3630063935,US
3630063936,3630063951,CA
-3630063952,3630066943,US
-3630066944,3630067967,CA
-3630067968,3630072255,US
+3630063952,3630064895,US
+3630064896,3630065151,CA
+3630065152,3630066175,US
+3630066176,3630067967,CA
+3630067968,3630068479,US
+3630068480,3630068735,CA
+3630068736,3630068991,US
+3630068992,3630069247,CA
+3630069248,3630069503,US
+3630069504,3630069759,CA
+3630069760,3630070015,US
+3630070016,3630071039,CA
+3630071040,3630071295,US
+3630071296,3630071551,CA
+3630071552,3630072255,US
3630072256,3630072287,CA
-3630072288,3630075311,US
+3630072288,3630072575,US
+3630072576,3630074111,CA
+3630074112,3630074879,US
+3630074880,3630075135,CA
+3630075136,3630075311,US
3630075312,3630075327,CA
-3630075328,3630078975,US
+3630075328,3630075391,US
+3630075392,3630075647,CA
+3630075648,3630076927,US
+3630076928,3630077439,CA
+3630077440,3630078463,US
+3630078464,3630078719,CA
+3630078720,3630078975,US
3630078976,3630079039,CA
3630079040,3630079407,US
3630079408,3630079423,CA
3630079424,3630080575,US
3630080576,3630080639,CA
3630080640,3630081151,US
-3630081152,3630081279,CA
-3630081280,3630086375,US
+3630081152,3630081791,CA
+3630081792,3630082047,US
+3630082048,3630082559,CA
+3630082560,3630082815,US
+3630082816,3630083071,CA
+3630083072,3630084607,US
+3630084608,3630084863,CA
+3630084864,3630085119,US
+3630085120,3630085375,CA
+3630085376,3630085631,US
+3630085632,3630086143,CA
+3630086144,3630086375,US
3630086376,3630086383,CA
3630086384,3630087039,US
-3630087040,3630087167,CA
-3630087168,3630089983,US
-3630089984,3630090239,CA
-3630090240,3630098687,US
+3630087040,3630087935,CA
+3630087936,3630088447,US
+3630088448,3630088959,CA
+3630088960,3630089471,US
+3630089472,3630090239,CA
+3630090240,3630091007,US
+3630091008,3630092287,CA
+3630092288,3630093567,US
+3630093568,3630093823,CA
+3630093824,3630094591,US
+3630094592,3630094847,CA
+3630094848,3630096127,US
+3630096128,3630096639,CA
+3630096640,3630097151,US
+3630097152,3630097663,CA
+3630097664,3630098175,KW
+3630098176,3630098431,CA
+3630098432,3630098687,US
3630098688,3630100223,CA
-3630100224,3630102783,US
+3630100224,3630100479,KW
+3630100480,3630101247,US
+3630101248,3630101503,CA
+3630101504,3630102783,US
3630102784,3630103807,CA
-3630103808,3630108159,US
+3630103808,3630104063,US
+3630104064,3630104575,CA
+3630104576,3630108159,US
3630108160,3630108415,CA
-3630108416,3630126335,US
-3630126336,3630126591,CA
-3630126592,3630152959,US
-3630152960,3630153215,CA
-3630153216,3630158079,US
-3630158080,3630158335,CA
-3630158336,3630161407,US
-3630161408,3630161663,CA
-3630161664,3630164991,US
-3630164992,3630165247,CA
-3630165248,3630165503,US
-3630165504,3630165759,CA
-3630165760,3630167007,US
+3630108416,3630141951,US
+3630141952,3630142207,CA
+3630142208,3630142463,US
+3630142464,3630143487,CA
+3630143488,3630143743,US
+3630143744,3630145023,CA
+3630145024,3630145535,US
+3630145536,3630145791,CA
+3630145792,3630146047,US
+3630146048,3630146815,CA
+3630146816,3630147071,US
+3630147072,3630147583,CA
+3630147584,3630148095,US
+3630148096,3630148607,CA
+3630148608,3630148863,US
+3630148864,3630149119,CA
+3630149120,3630149631,US
+3630149632,3630150143,CA
+3630150144,3630150399,US
+3630150400,3630151423,CA
+3630151424,3630151679,US
+3630151680,3630153215,CA
+3630153216,3630153727,US
+3630153728,3630154239,CA
+3630154240,3630155007,US
+3630155008,3630155263,CA
+3630155264,3630155775,US
+3630155776,3630158079,CA
+3630158080,3630158295,US
+3630158296,3630158303,CA
+3630158304,3630159103,US
+3630159104,3630159359,CA
+3630159360,3630159615,US
+3630159616,3630159871,CA
+3630159872,3630160127,US
+3630160128,3630160383,CA
+3630160384,3630160639,US
+3630160640,3630160895,CA
+3630160896,3630161151,US
+3630161152,3630161919,CA
+3630161920,3630162431,US
+3630162432,3630162943,CA
+3630162944,3630163199,US
+3630163200,3630163455,CA
+3630163456,3630163967,US
+3630163968,3630164735,CA
+3630164736,3630164991,US
+3630164992,3630166527,CA
+3630166528,3630167007,US
3630167008,3630167023,CA
3630167024,3630168319,US
3630168320,3630169087,CA
-3630169088,3630309375,US
+3630169088,3630169855,US
+3630169856,3630170111,CA
+3630170112,3630309375,US
3630309376,3630317567,CA
3630317568,3630354431,US
3630358528,3630370815,US
-3630372864,3630374911,US
-3630374912,3630383103,CA
+3630372864,3630375423,US
+3630375424,3630383103,CA
3630383104,3630391295,US
3630391296,3630395391,CA
3630395392,3630718975,US
3630718976,3630727167,CA
-3630727168,3630745855,US
-3630745856,3630746111,UG
-3630746112,3630746367,US
-3630746368,3630746623,UG
-3630746624,3630780415,US
+3630727168,3630745599,US
+3630745600,3630747647,UG
+3630747648,3630780415,US
3630780416,3630784511,CA
3630784512,3630801919,US
3630804992,3630850047,US
3630850048,3630854143,CA
-3630854144,3630956543,US
+3630854144,3630895615,US
+3630895616,3630895871,CA
+3630895872,3630897407,US
+3630897408,3630897919,CA
+3630897920,3630956543,US
3630956544,3631005695,CA
-3631005696,3631017983,US
-3631022080,3631112191,US
-3631112192,3631112447,VC
-3631112448,3631116543,BB
+3631005696,3631039487,US
+3631039488,3631039743,CA
+3631039744,3631112191,US
+3631112192,3631112703,VC
+3631112704,3631116543,BB
3631116544,3631117567,GD
3631117568,3631117823,BB
3631117824,3631118079,GD
-3631118080,3631119615,BB
+3631118080,3631119103,VC
+3631119104,3631119615,BB
3631119616,3631120383,GD
3631120384,3631144959,US
3631144960,3631153151,CA
@@ -80305,7 +88456,9 @@
3631284224,3631316991,CA
3631316992,3631333375,US
3631333376,3631341567,CA
-3631341568,3631515647,US
+3631341568,3631435007,US
+3631435008,3631435263,GB
+3631435264,3631515647,US
3631517696,3631644671,US
3631644672,3631652863,CA
3631652864,3631665151,US
@@ -80328,7 +88481,9 @@
3632152576,3632168959,CA
3632168960,3632197631,US
3632197632,3632201727,CA
-3632201728,3632332799,US
+3632201728,3632244223,US
+3632244224,3632244479,CA
+3632244480,3632332799,US
3632332800,3632357375,CA
3632357376,3632381951,US
3632381952,3632390143,CA
@@ -80340,16 +88495,24 @@
3632451584,3632455679,CA
3632455680,3632467967,US
3632470016,3632857087,US
-3632857088,3632861183,BS
+3632857088,3632859229,BS
+3632859230,3632859230,US
+3632859231,3632861183,BS
3632861184,3632881663,US
3632881664,3632889855,CA
3632889856,3632898047,US
3632898048,3632902143,CA
3632902144,3632971775,US
3632971776,3632988159,CA
-3632988160,3633031935,US
+3632988160,3633029119,US
+3633029120,3633029631,PY
+3633029632,3633030143,NI
+3633030144,3633030655,US
+3633030656,3633030911,SN
+3633030912,3633031935,US
3633031936,3633032191,PG
-3633032192,3633036287,US
+3633032192,3633036031,US
+3633036032,3633036287,HT
3633036288,3633036543,TT
3633036544,3633336319,US
3633336320,3633340415,KY
@@ -80363,20 +88526,44 @@
3633456384,3633456639,AU
3633456640,3633479679,US
3633479680,3633483775,CA
-3633483776,3633547775,US
+3633483776,3633545215,US
+3633545216,3633545727,GA
+3633545728,3633546239,US
+3633546240,3633546751,GA
+3633546752,3633547263,US
+3633547264,3633547775,GA
3633547776,3633548287,NG
-3633548288,3633757439,US
+3633548288,3633548543,US
+3633548544,3633548799,GA
+3633548800,3633549567,US
+3633549568,3633549823,GA
+3633549824,3633550847,US
+3633550848,3633551359,GA
+3633551360,3633757439,US
3633757440,3633757695,IN
3633757696,3633785343,US
3633785600,3633786367,US
-3633786880,3633844223,US
+3633786880,3633815807,US
+3633815808,3633816063,CA
+3633816064,3633817087,US
+3633817088,3633817343,CA
+3633817344,3633818623,US
+3633818624,3633819135,CA
+3633819136,3633844223,US
3633848320,3633881087,US
3633881088,3633885183,CW
3633885184,3633889279,US
3633889280,3633893375,CA
-3633893376,3633971199,US
-3633971200,3634020351,CA
-3634020352,3634053119,US
+3633893376,3633915647,US
+3633915648,3633915903,IT
+3633915904,3633971199,US
+3633971200,3633974527,CA
+3633974528,3633975039,US
+3633975040,3634020351,CA
+3634020352,3634037247,US
+3634037248,3634037759,CA
+3634037760,3634052863,US
+3634052864,3634053119,CA
3634053120,3634061311,CL
3634061312,3634094079,US
3634094080,3634098175,SE
@@ -80386,7 +88573,9 @@
3634552832,3634556927,CA
3634556928,3634741247,US
3634741248,3634749439,CA
-3634749440,3634880511,US
+3634749440,3634759679,US
+3634759680,3634759935,CA
+3634759936,3634880511,US
3634880512,3634888703,CA
3634888704,3634913279,US
3634913280,3634915663,CA
@@ -80395,8 +88584,7 @@
3634921472,3634925567,US
3634925568,3634929663,CA
3634929664,3635044351,US
-3635049472,3635049727,US
-3635052544,3635109887,US
+3635048448,3635109887,US
3635109888,3635113983,CA
3635113984,3635142655,US
3635142656,3635146751,CA
@@ -80414,34 +88602,116 @@
3635533536,3635533551,IN
3635533552,3635643391,US
3635643392,3635644415,JP
-3635644416,3635650559,US
+3635644416,3635645183,TH
+3635645184,3635645439,JP
+3635645440,3635645951,HK
+3635645952,3635646463,TL
+3635646464,3635646975,US
+3635646976,3635647487,GB
+3635647488,3635647743,US
+3635647744,3635647999,CA
+3635648000,3635648255,TW
+3635648256,3635648511,ML
+3635648512,3635648767,US
+3635648768,3635649023,JP
+3635649024,3635650559,US
3635650560,3635652607,HK
3635652608,3635654655,US
-3635654656,3635655679,HK
-3635655680,3635656703,US
+3635654656,3635656447,HK
+3635656448,3635656703,US
3635656704,3635657727,JP
-3635657728,3635660799,US
+3635657728,3635659263,US
+3635659264,3635660287,ID
+3635660288,3635660799,US
3635660800,3635662847,HK
-3635662848,3635740671,US
+3635662848,3635670527,US
+3635670528,3635671039,TL
+3635671040,3635674623,US
+3635674624,3635675135,HK
+3635675136,3635740671,US
3635740672,3635740927,CA
3635740928,3635741439,US
3635741440,3635741695,CA
3635741696,3635741951,US
-3635741952,3635745535,CA
+3635741952,3635742463,CA
+3635742464,3635742719,US
+3635742720,3635743487,CA
+3635743488,3635744255,US
+3635744256,3635744511,CA
+3635744512,3635744767,US
+3635744768,3635745023,CA
+3635745024,3635745279,US
+3635745280,3635745535,CA
3635745536,3635746047,US
-3635746048,3635765759,CA
+3635746048,3635749375,CA
+3635749376,3635749631,US
+3635749632,3635750143,CA
+3635750144,3635750399,US
+3635750400,3635751679,CA
+3635751680,3635752191,US
+3635752192,3635752447,CA
+3635752448,3635752703,US
+3635752704,3635753215,CA
+3635753216,3635753471,US
+3635753472,3635754239,CA
+3635754240,3635755007,US
+3635755008,3635755519,CA
+3635755520,3635755775,US
+3635755776,3635756287,CA
+3635756288,3635756543,US
+3635756544,3635757311,CA
+3635757312,3635758079,US
+3635758080,3635758335,CA
+3635758336,3635758591,US
+3635758592,3635758847,CA
+3635758848,3635759103,US
+3635759104,3635760895,CA
+3635760896,3635761151,US
+3635761152,3635762687,CA
+3635762688,3635762943,US
+3635762944,3635763199,CA
+3635763200,3635763455,US
+3635763456,3635764735,CA
+3635764736,3635765247,US
+3635765248,3635765759,CA
3635765760,3635768575,US
-3635768576,3635771391,CA
-3635771392,3635771647,US
+3635768576,3635768831,CA
+3635768832,3635769087,US
+3635769088,3635771135,CA
+3635771136,3635771647,US
3635771648,3635771903,CA
3635771904,3635772415,US
3635772416,3635772671,CA
3635772672,3635772927,US
-3635772928,3635773951,CA
+3635772928,3635773439,CA
+3635773440,3635773695,US
+3635773696,3635773951,CA
3635773952,3635774207,US
-3635774208,3635781119,CA
+3635774208,3635774463,CA
+3635774464,3635774719,US
+3635774720,3635775231,CA
+3635775232,3635775487,US
+3635775488,3635775743,CA
+3635775744,3635775999,US
+3635776000,3635776511,CA
+3635776512,3635776767,US
+3635776768,3635777023,CA
+3635777024,3635777279,US
+3635777280,3635777791,CA
+3635777792,3635778047,US
+3635778048,3635778559,CA
+3635778560,3635778815,US
+3635778816,3635780607,CA
+3635780608,3635780863,US
+3635780864,3635781119,CA
3635781120,3635783167,US
-3635783168,3635799551,CA
+3635783168,3635789055,CA
+3635789056,3635789311,US
+3635789312,3635791359,CA
+3635791360,3635791615,US
+3635791616,3635793407,CA
+3635793408,3635794175,US
+3635794176,3635799551,CA
3635799552,3635800063,US
3635800064,3635804159,CA
3635804160,3635804671,US
@@ -80467,49 +88737,96 @@
3636019200,3636027391,CA
3636027392,3636027647,US
3636027648,3636029439,SG
-3636029440,3636032215,US
-3636032216,3636032223,SG
-3636032224,3636064255,US
+3636029440,3636029695,US
+3636029696,3636029951,SG
+3636029952,3636030207,US
+3636030208,3636031231,SG
+3636031232,3636031999,US
+3636032000,3636032511,SG
+3636032512,3636032767,US
+3636032768,3636033535,SG
+3636033536,3636033791,US
+3636033792,3636034303,SG
+3636034304,3636035327,US
+3636035328,3636035583,SG
+3636035584,3636064255,US
3636064256,3636068351,CA
3636068352,3636150783,US
3636150784,3636150799,CA
3636150800,3636151807,US
3636151808,3636152063,CA
-3636152064,3636152735,US
+3636152064,3636152319,US
+3636152320,3636152575,CA
+3636152576,3636152735,US
3636152736,3636152751,CA
3636152752,3636152783,US
3636152784,3636152791,CA
3636152792,3636152831,US
3636152832,3636152847,CA
-3636152848,3636155135,US
+3636152848,3636153855,US
+3636153856,3636154879,CA
+3636154880,3636155135,US
3636155136,3636155391,CA
-3636155392,3636157439,US
+3636155392,3636155647,US
+3636155648,3636156159,CA
+3636156160,3636157439,US
3636157440,3636157951,CA
3636157952,3636158063,US
3636158064,3636158071,CA
3636158072,3636158207,US
3636158208,3636158215,CA
-3636158216,3636158549,US
-3636158550,3636158550,CA
-3636158551,3636159231,US
-3636159232,3636159487,CA
-3636159488,3636164327,US
+3636158216,3636158463,US
+3636158464,3636158719,CA
+3636158720,3636158975,US
+3636158976,3636159743,CA
+3636159744,3636160511,US
+3636160512,3636160767,CA
+3636160768,3636161023,US
+3636161024,3636161279,CA
+3636161280,3636162047,US
+3636162048,3636162559,CA
+3636162560,3636163583,US
+3636163584,3636164095,CA
+3636164096,3636164327,US
3636164328,3636164335,CA
-3636164336,3636396031,US
+3636164336,3636165119,US
+3636165120,3636165375,CA
+3636165376,3636166399,US
+3636166400,3636166655,CA
+3636166656,3636206079,US
+3636206080,3636206335,AU
+3636206336,3636396031,US
3636396032,3636461567,CA
3636461568,3636609023,US
3636609024,3636621311,CA
3636621312,3636625407,US
3636625408,3636626431,AR
-3636626432,3636627455,US
+3636626432,3636626943,BR
+3636626944,3636627199,AR
+3636627200,3636627455,BR
3636627456,3636628479,MX
-3636628480,3636822015,US
+3636628480,3636628991,PE
+3636628992,3636822015,US
3636822016,3636854783,CA
3636854784,3636887551,US
3636887552,3636895743,CA
-3636895744,3637075967,US
+3636895744,3636905471,US
+3636905472,3636905727,CA
+3636905728,3636907775,US
+3636907776,3636908031,CA
+3636908032,3636909055,US
+3636909056,3636909311,CA
+3636909312,3636913919,US
+3636913920,3636914687,CA
+3636914688,3636918015,US
+3636918016,3636919039,CA
+3636919040,3637072895,US
+3637072896,3637073151,CY
+3637073152,3637075967,US
3637075968,3637080063,CA
-3637080064,3637510143,US
+3637080064,3637469439,US
+3637469440,3637469695,GE
+3637469696,3637510143,US
3637510144,3637641215,CA
3637641216,3637665791,US
3637665792,3637669887,CA
@@ -80517,13 +88834,25 @@
3637706752,3637739519,CA
3637739520,3638165503,US
3638165504,3638181887,CA
-3638181888,3638304767,US
+3638181888,3638214399,US
+3638214400,3638214655,GR
+3638214656,3638224639,US
+3638224640,3638224895,GR
+3638224896,3638226687,US
+3638226688,3638226943,NL
+3638226944,3638247935,US
+3638247936,3638248703,GB
+3638248704,3638249215,US
+3638249216,3638249471,GB
+3638249472,3638304767,US
3638304768,3638312959,CA
3638312960,3638349823,US
3638349824,3638350079,AU
3638350080,3638370303,US
3638370304,3638386687,CA
-3638386688,3638401087,US
+3638386688,3638399743,US
+3638399744,3638399999,CH
+3638400000,3638401087,US
3638401088,3638401119,CA
3638401120,3638509567,US
3638509568,3638534143,CA
@@ -80532,12 +88861,18 @@
3638706176,3638706687,US
3638706688,3638706943,NG
3638706944,3638738943,US
-3638740992,3638874111,US
+3638740992,3638746111,US
+3638746112,3638746367,MX
+3638746368,3638874111,US
3638874112,3638878207,CA
3638878208,3638984703,US
3638984704,3638992895,GT
3638992896,3638996991,US
-3639001088,3639083007,US
+3639001088,3639052031,US
+3639052032,3639052287,ES
+3639052288,3639069439,US
+3639069440,3639069695,HK
+3639069696,3639083007,US
3639083008,3639148543,CA
3639148544,3639222271,US
3639222272,3639230463,CA
@@ -80549,13 +88884,19 @@
3639279616,3639283711,CA
3639283712,3639390207,US
3639390208,3639394303,ZA
-3639394304,3639399679,US
+3639394304,3639397119,US
+3639397120,3639397375,IN
+3639397376,3639397631,US
+3639397632,3639397887,NG
+3639397888,3639399679,US
3639399680,3639399935,HN
3639399936,3639400447,US
3639400448,3639401471,RS
3639401472,3639401541,US
3639401542,3639401542,KE
-3639401543,3639513239,US
+3639401543,3639402239,US
+3639402240,3639402495,GH
+3639402496,3639513239,US
3639513240,3639513243,AE
3639513244,3639533567,US
3639533568,3639537663,CA
@@ -80580,11 +88921,15 @@
3639556016,3639556023,CO
3639556024,3639558143,US
3639558144,3639566335,CA
-3639566336,3639593983,US
+3639566336,3639566847,US
+3639566848,3639567103,HK
+3639567104,3639593983,US
3639593984,3639595007,GB
3639595008,3639607295,US
3639607296,3639611391,CA
-3639611392,3639656447,US
+3639611392,3639639807,US
+3639639808,3639640063,CA
+3639640064,3639656447,US
3639656448,3639660543,CA
3639660544,3639664639,US
3639664640,3639668735,CA
@@ -80615,11 +88960,19 @@
3640205312,3640209407,BM
3640209408,3640213503,CA
3640213504,3640287231,US
-3640291328,3640312831,US
+3640291328,3640312319,US
+3640312320,3640312575,NI
+3640312576,3640312831,US
3640312832,3640313087,TO
-3640313088,3640316927,US
+3640313088,3640315391,US
+3640315392,3640315647,TR
+3640315648,3640316927,US
3640316928,3640317183,MX
-3640317184,3640346879,US
+3640317184,3640318207,US
+3640318208,3640318975,NC
+3640318976,3640319231,US
+3640319232,3640319487,NG
+3640319488,3640346879,US
3640346880,3640347134,MX
3640347135,3640360959,US
3640360960,3640369151,CA
@@ -80707,7 +89060,9 @@
3641475072,3641479167,IT
3641479168,3641483263,GB
3641483264,3641491455,IT
-3641491456,3641499647,UA
+3641491456,3641493503,UA
+3641493504,3641494015,NL
+3641494016,3641499647,UA
3641499648,3641503743,SA
3641503744,3641507839,RU
3641507840,3641516031,NO
@@ -80842,7 +89197,7 @@
3642048512,3642056703,GB
3642056704,3642060799,RU
3642060800,3642064895,KE
-3642064896,3642068991,SE
+3642064896,3642068991,IT
3642068992,3642073087,AL
3642073088,3642077183,LV
3642077184,3642085375,NL
@@ -80939,7 +89294,8 @@
3642486784,3642490879,GB
3642490880,3642494975,IM
3642494976,3642499071,GB
-3642499072,3642503167,SE
+3642499072,3642501119,SE
+3642501120,3642503167,LU
3642503168,3642507263,LV
3642507264,3642509311,FR
3642509312,3642511359,RU
@@ -81111,7 +89467,9 @@
3645276160,3645280255,DE
3645280256,3645284351,IT
3645284352,3645288447,DE
-3645288448,3645292543,FR
+3645288448,3645288895,FR
+3645288896,3645288959,LU
+3645288960,3645292543,FR
3645292544,3645296639,DE
3645296640,3645300735,NL
3645300736,3645304831,BE
@@ -81312,9 +89670,7 @@
3647966208,3647967231,GB
3647967232,3647968255,BE
3647968256,3647969279,FR
-3647969280,3647970047,DE
-3647970048,3647970303,BE
-3647970304,3647971327,DE
+3647969280,3647971327,DE
3647971328,3647972351,GB
3647972352,3647973375,IT
3647973376,3647973615,DE
@@ -81323,8 +89679,8 @@
3647973712,3647973719,IT
3647973720,3647974055,DE
3647974056,3647974063,IT
-3647974064,3647975167,DE
-3647975168,3647976447,ES
+3647974064,3647975423,DE
+3647975424,3647976447,ES
3647976448,3647977471,DE
3647977472,3647978495,GB
3647978496,3647980223,DE
@@ -81333,11 +89689,13 @@
3647980384,3647980415,FR
3647980416,3647980543,DE
3647980544,3647981567,GB
-3647981568,3647982591,BE
+3647981568,3647981823,BE
+3647981824,3647982079,DK
+3647982080,3647982591,BE
3647982592,3647983615,IT
-3647983616,3647983871,DE
-3647983872,3647984127,NL
-3647984128,3647986431,DE
+3647983616,3647984031,DE
+3647984032,3647984047,NL
+3647984048,3647986431,DE
3647986432,3647986687,ES
3647986688,3647987647,DE
3647987648,3647987655,ES
@@ -81354,7 +89712,6 @@
3648024576,3648028671,NL
3648028672,3648032767,HU
3648032768,3648033023,IE
-3648033536,3648033791,IE
3648034888,3648034895,IE
3648036864,3648040959,CZ
3648040960,3648045055,BE
@@ -81365,15 +89722,17 @@
3648061440,3648069631,AM
3648069632,3648073727,DE
3648073728,3648077823,HU
-3648077824,3648078335,BE
-3648078336,3648078591,BF
+3648077824,3648078527,BE
+3648078528,3648078591,BF
3648078592,3648079103,BE
3648079104,3648079359,CG
3648079360,3648080511,BE
3648080512,3648080543,BF
3648080544,3648080639,BE
3648080640,3648080895,GA
-3648080896,3648081151,ZM
+3648080896,3648081023,ZM
+3648081024,3648081055,GA
+3648081056,3648081151,ZM
3648081152,3648082239,BE
3648082240,3648082311,NE
3648082312,3648082431,BE
@@ -81505,7 +89864,8 @@
3649847818,3649855487,DE
3649855488,3649856511,GB
3649856512,3649857535,US
-3649857536,3649858047,JP
+3649857536,3649857791,JP
+3649857792,3649858047,IN
3649858048,3649859071,GB
3649859072,3649859583,US
3649859584,3649863679,SE
@@ -81527,9 +89887,7 @@
3650150400,3650158591,NO
3650158592,3650162687,MT
3650162688,3650166783,RU
-3650166784,3650168319,BE
-3650168320,3650168575,FR
-3650168576,3650170879,BE
+3650166784,3650170879,BE
3650170880,3650174975,DK
3650174976,3650179071,GB
3650179072,3650183167,BG
@@ -81542,10 +89900,10 @@
3650211840,3650215935,LV
3650220032,3650224127,SA
3650224128,3650224383,TH
-3650224384,3650224639,AT
+3650224384,3650224639,ES
3650224640,3650224895,UA
3650224896,3650225151,FR
-3650225152,3650225407,US
+3650225152,3650225407,HU
3650225408,3650225663,BR
3650225664,3650226175,TR
3650226176,3650226431,RS
@@ -81557,9 +89915,12 @@
3650228224,3650228479,HK
3650228480,3650229503,AT
3650229504,3650229759,LU
-3650229760,3650231295,AT
+3650229760,3650230527,DE
+3650230528,3650231295,AT
3650231296,3650231551,AR
-3650231552,3650232319,AT
+3650231552,3650231807,GB
+3650231808,3650232063,DE
+3650232064,3650232319,SE
3650232320,3650236415,RU
3650236416,3650240511,CH
3650240512,3650244607,EE
@@ -81641,15 +90002,13 @@
3650510848,3650519039,GB
3650519040,3650523135,HU
3650523136,3650527231,DE
-3650527232,3650534911,SE
-3650534912,3650535167,NL
-3650535168,3650535423,SE
+3650527232,3650535423,SE
3650535424,3650539519,RU
3650539520,3650543615,ES
3650543616,3650551807,CH
3650551808,3650555903,FR
3650555904,3650559999,RU
-3650560000,3650564095,HK
+3650560000,3650564095,GB
3650564096,3650568191,SE
3650568192,3650572287,RU
3650572288,3650576383,DE
@@ -81662,10 +90021,12 @@
3650605056,3650609180,DE
3650609181,3650609181,LB
3650609182,3650610175,DE
-3650610176,3650611199,RU
-3650611200,3650611711,DE
-3650611712,3650611967,LB
-3650611968,3650617343,DE
+3650610176,3650611711,RU
+3650611712,3650611866,LB
+3650611867,3650611867,RU
+3650611868,3650611967,LB
+3650611968,3650613247,RU
+3650613248,3650617343,DE
3650617344,3650682879,FI
3650682880,3650748415,PL
3650748416,3650879487,GB
@@ -81692,14 +90053,16 @@
3650932976,3650939599,GB
3650939600,3650939607,FR
3650939608,3650939615,TR
-3650939616,3650944579,GB
-3650944580,3650944580,FR
-3650944581,3650945023,GB
+3650939616,3650944511,GB
+3650944512,3650944767,FR
+3650944768,3650945023,GB
3650945024,3651010559,DK
3651010560,3651076095,GB
3651076096,3651108863,DE
3651108864,3651141631,EE
-3651141632,3651207167,DE
+3651141632,3651152895,DE
+3651152896,3651153919,GB
+3651153920,3651207167,DE
3651207168,3651207199,GB
3651207224,3651207295,GB
3651207424,3651207615,GB
@@ -81778,9 +90141,7 @@
3651874816,3651878911,PL
3651878912,3651883007,IT
3651883008,3651884287,CD
-3651884288,3651884799,BE
-3651884800,3651885055,CD
-3651885056,3651885839,BE
+3651884288,3651885839,BE
3651885840,3651885843,CD
3651885844,3651887103,BE
3651887104,3651891199,GB
@@ -81802,8 +90163,7 @@
3651937024,3651938047,FR
3651938048,3651940351,DE
3651940352,3651941119,FR
-3651941120,3651943423,DE
-3651943424,3651944447,FR
+3651941120,3651944447,DE
3651944448,3651948543,ES
3651948544,3651952639,FO
3651952640,3651953663,IR
@@ -81850,13 +90210,16 @@
3652149248,3652153343,DE
3652153344,3652157439,SE
3652157440,3652165631,RU
-3652165632,3652170239,FR
-3652170240,3652170495,MQ
+3652165632,3652169471,FR
+3652169472,3652169727,GF
+3652169728,3652170495,MQ
3652170496,3652170751,FR
3652170752,3652171007,MQ
-3652171008,3652171519,FR
-3652171520,3652171775,MQ
-3652171776,3652173823,FR
+3652171008,3652172031,FR
+3652172032,3652172287,RE
+3652172288,3652172799,FR
+3652172800,3652173055,RE
+3652173056,3652173823,FR
3652173824,3652177919,AT
3652177920,3652182015,CY
3652182016,3652190207,DE
@@ -81886,11 +90249,9 @@
3653451776,3653464063,RU
3653464064,3653468159,NL
3653468160,3653472255,GR
-3653472256,3653472767,NL
-3653472768,3653473023,US
-3653473024,3653473279,NL
-3653473280,3653473535,US
-3653473536,3653476351,NL
+3653472256,3653472511,NL
+3653472512,3653472767,US
+3653472768,3653476351,NL
3653476352,3653480447,CZ
3653480448,3653484543,DK
3653484544,3653488639,TR
@@ -81956,13 +90317,9 @@
3653758976,3653763071,RU
3653763072,3654025215,IT
3654025216,3654287359,GB
-3654287360,3654608399,SE
-3654608400,3654608404,DE
+3654287360,3654608404,SE
3654608405,3654608405,NO
-3654608406,3654608407,DE
-3654608408,3654608447,SE
-3654608448,3654608479,GB
-3654608480,3654608639,SE
+3654608406,3654608639,SE
3654608640,3654608895,RU
3654608896,3654609919,NO
3654609920,3654614143,SE
@@ -81978,7 +90335,15 @@
3659628544,3659661311,JP
3659661312,3659792383,TW
3659792384,3660054527,KR
-3660054528,3660578815,JP
+3660054528,3660097535,JP
+3660097536,3660097791,US
+3660097792,3660099583,JP
+3660099584,3660099839,US
+3660099840,3660102143,JP
+3660102144,3660102399,US
+3660102400,3660102655,JP
+3660102656,3660102911,US
+3660102912,3660578815,JP
3660578816,3661103103,KR
3661103104,3663986687,CN
3663986688,3663987711,AU
@@ -82159,7 +90524,12 @@
3707209728,3707215871,CN
3707215872,3707217919,BD
3707217920,3707219967,ID
-3707219968,3707222015,AU
+3707219968,3707220479,NZ
+3707220480,3707220735,AU
+3707220736,3707220991,NZ
+3707220992,3707221247,AU
+3707221248,3707221759,NZ
+3707221760,3707222015,AU
3707222016,3707224063,JP
3707224064,3707240447,LK
3707240448,3707568127,CN
@@ -82267,7 +90637,9 @@
3743035392,3743039487,HK
3743039488,3743055871,TW
3743055872,3743088639,KR
-3743088640,3743096831,AU
+3743088640,3743093647,AU
+3743093648,3743093648,NZ
+3743093649,3743096831,AU
3743096832,3743105023,TW
3743105024,3743106047,AU
3743106048,3743109119,JP
@@ -82352,7 +90724,9 @@
3756003072,3757047807,IN
3757047808,3757834239,CN
3757834240,3757867007,AU
-3757867008,3757899775,CN
+3757867008,3757875519,CN
+3757875520,3757875583,HK
+3757875584,3757899775,CN
3757899776,3757965311,KR
3757965312,3758063615,CN
3758063616,3758079999,HK
diff --git a/src/config/geoip-manual b/src/config/geoip-manual
deleted file mode 100644
index 99c897ff4..000000000
--- a/src/config/geoip-manual
+++ /dev/null
@@ -1,116 +0,0 @@
-# This file contains manual overrides of A1 entries (and possibly others)
-# in MaxMind's GeoLite Country database. Use deanonymind.py in the same
-# directory to process this file when producing a new geoip file. See
-# README.geoip in the same directory for details.
-
-# Remove MaxMind entry 0.116.0.0-0.119.255.255 which MaxMind says is AT,
-# but which is part of reserved range 0.0.0.0/8. -KL 2012-06-13
-# Disabled, because MaxMind apparently removed this range from their
-# database. -KL 2013-02-08
-#"0.116.0.0","0.119.255.255","7602176","7864319","",""
-
-# NL, because previous MaxMind entry 31.171.128.0-31.171.133.255 is NL,
-# and RIR delegation files say 31.171.128.0-31.171.135.255 is NL.
-# -KL 2012-11-27
-"31.171.134.0","31.171.135.255","531334656","531335167","NL","Netherlands"
-
-# EU, because next MaxMind entry 37.139.64.1-37.139.64.9 is EU, because
-# RIR delegation files say 37.139.64.0-37.139.71.255 is EU, and because it
-# just makes more sense for the next entry to start at .0 and not .1.
-# -KL 2012-11-27
-"37.139.64.0","37.139.64.0","629882880","629882880","EU","Europe"
-
-# CH, because previous MaxMind entry 46.19.141.0-46.19.142.255 is CH, and
-# RIR delegation files say 46.19.136.0-46.19.143.255 is CH.
-# -KL 2012-11-27
-"46.19.143.0","46.19.143.255","773033728","773033983","CH","Switzerland"
-
-# GB, because next MaxMind entry 46.166.129.0-46.166.134.255 is GB, and
-# RIR delegation files say 46.166.128.0-46.166.191.255 is GB.
-# -KL 2012-11-27
-"46.166.128.0","46.166.128.255","782663680","782663935","GB","United Kingdom"
-
-# US, though could as well be CA. Previous MaxMind entry
-# 64.237.32.52-64.237.34.127 is US, next MaxMind entry
-# 64.237.34.144-64.237.34.151 is CA, and RIR delegation files say the
-# entire block 64.237.32.0-64.237.63.255 is US. -KL 2012-11-27
-"64.237.34.128","64.237.34.143","1089282688","1089282703","US","United States"
-
-# US, though could as well be UY. Previous MaxMind entry
-# 67.15.170.0-67.15.182.255 is US, next MaxMind entry
-# 67.15.183.128-67.15.183.159 is UY, and RIR delegation files say the
-# entire block 67.15.0.0-67.15.255.255 is US. -KL 2012-11-27
-"67.15.183.0","67.15.183.127","1125103360","1125103487","US","United States"
-
-# US, because next MaxMind entry 67.43.145.0-67.43.155.255 is US, and RIR
-# delegation files say 67.43.144.0-67.43.159.255 is US.
-# -KL 2012-11-27
-"67.43.144.0","67.43.144.255","1126928384","1126928639","US","United States"
-
-# US, because previous MaxMind entry 70.159.21.51-70.232.244.255 is US,
-# because next MaxMind entry 70.232.245.58-70.232.245.59 is A2 ("Satellite
-# Provider") which is a country information about as useless as A1, and
-# because RIR delegation files say 70.224.0.0-70.239.255.255 is US.
-# -KL 2012-11-27
-"70.232.245.0","70.232.245.57","1189672192","1189672249","US","United States"
-
-# US, because next MaxMind entry 70.232.246.0-70.240.141.255 is US,
-# because previous MaxMind entry 70.232.245.58-70.232.245.59 is A2
-# ("Satellite Provider") which is a country information about as useless
-# as A1, and because RIR delegation files say 70.224.0.0-70.239.255.255 is
-# US. -KL 2012-11-27
-"70.232.245.60","70.232.245.255","1189672252","1189672447","US","United States"
-
-# GB, despite neither previous (GE) nor next (LV) MaxMind entry being GB,
-# but because RIR delegation files agree with both previous and next
-# MaxMind entry and say GB for 91.228.0.0-91.228.3.255. -KL 2012-11-27
-"91.228.0.0","91.228.3.255","1541668864","1541669887","GB","United Kingdom"
-
-# GB, because next MaxMind entry 91.232.125.0-91.232.125.255 is GB, and
-# RIR delegation files say 91.232.124.0-91.232.125.255 is GB.
-# -KL 2012-11-27
-"91.232.124.0","91.232.124.255","1541962752","1541963007","GB","United Kingdom"
-
-# GB, despite neither previous (RU) nor next (PL) MaxMind entry being GB,
-# but because RIR delegation files agree with both previous and next
-# MaxMind entry and say GB for 91.238.214.0-91.238.215.255.
-# -KL 2012-11-27
-"91.238.214.0","91.238.215.255","1542379008","1542379519","GB","United Kingdom"
-
-# US, because next MaxMind entry 173.0.16.0-173.0.65.255 is US, and RIR
-# delegation files say 173.0.0.0-173.0.15.255 is US. -KL 2012-11-27
-"173.0.0.0","173.0.15.255","2902458368","2902462463","US","United States"
-
-# US, because next MaxMind entry 176.67.84.0-176.67.84.79 is US, and RIR
-# delegation files say 176.67.80.0-176.67.87.255 is US. -KL 2012-11-27
-"176.67.80.0","176.67.83.255","2957201408","2957202431","US","United States"
-
-# US, because previous MaxMind entry 176.67.84.192-176.67.85.255 is US,
-# and RIR delegation files say 176.67.80.0-176.67.87.255 is US.
-# -KL 2012-11-27
-"176.67.86.0","176.67.87.255","2957202944","2957203455","US","United States"
-
-# EU, despite neither previous (RU) nor next (UA) MaxMind entry being EU,
-# but because RIR delegation files agree with both previous and next
-# MaxMind entry and say EU for 193.200.150.0-193.200.150.255.
-# -KL 2012-11-27
-"193.200.150.0","193.200.150.255","3251148288","3251148543","EU","Europe"
-
-# US, because previous MaxMind entry 199.96.68.0-199.96.87.127 is US, and
-# RIR delegation files say 199.96.80.0-199.96.87.255 is US.
-# -KL 2012-11-27
-"199.96.87.128","199.96.87.255","3344979840","3344979967","US","United States"
-
-# US, because previous MaxMind entry 209.58.176.144-209.59.31.255 is US,
-# and RIR delegation files say 209.59.32.0-209.59.63.255 is US.
-# -KL 2012-11-27
-"209.59.32.0","209.59.63.255","3510312960","3510321151","US","United States"
-
-# FR, because previous MaxMind entry 217.15.166.0-217.15.166.255 is FR,
-# and RIR delegation files contain a block 217.15.160.0-217.15.175.255
-# which, however, is EU, not FR. But merging with next MaxMind entry
-# 217.15.176.0-217.15.191.255 which is KZ and which fully matches what
-# the RIR delegation files say seems unlikely to be correct.
-# -KL 2012-11-27
-"217.15.167.0","217.15.175.255","3641681664","3641683967","FR","France"
-
diff --git a/src/config/geoip6 b/src/config/geoip6
index 6dc637433..0804892d4 100644
--- a/src/config/geoip6
+++ b/src/config/geoip6
@@ -1,4 +1,7 @@
-# Last updated based on February 7 2014 Maxmind GeoLite2 Country
+# Last updated based on June 4 2014 Maxmind GeoLite2 Country
+# wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz
+# gunzip GeoLite2-Country.mmdb.gz
+# python mmdb-convert.py GeoLite2-Country.mmdb
2001:218::,2001:218:ffff:ffff:ffff:ffff:ffff:ffff,JP
2001:220::,2001:220:ffff:ffff:ffff:ffff:ffff:ffff,KR
2001:230::,2001:230:ffff:ffff:ffff:ffff:ffff:ffff,KR
@@ -265,6 +268,7 @@
2001:678:8c::,2001:678:8c:ffff:ffff:ffff:ffff:ffff,LT
2001:678:90::,2001:678:90:ffff:ffff:ffff:ffff:ffff,SK
2001:678:94::,2001:678:94:ffff:ffff:ffff:ffff:ffff,EE
+2001:678:98::,2001:678:98:ffff:ffff:ffff:ffff:ffff,KZ
2001:67c::,2001:67c::ffff:ffff:ffff:ffff:ffff,IE
2001:67c:4::,2001:67c:4:ffff:ffff:ffff:ffff:ffff,DE
2001:67c:8::,2001:67c:8:ffff:ffff:ffff:ffff:ffff,CH
@@ -339,7 +343,6 @@
2001:67c:138::,2001:67c:138:ffff:ffff:ffff:ffff:ffff,DE
2001:67c:13c::,2001:67c:13c:ffff:ffff:ffff:ffff:ffff,DE
2001:67c:140::,2001:67c:140:ffff:ffff:ffff:ffff:ffff,DE
-2001:67c:144::,2001:67c:144:ffff:ffff:ffff:ffff:ffff,GB
2001:67c:148::,2001:67c:148:ffff:ffff:ffff:ffff:ffff,AT
2001:67c:14c::,2001:67c:14d:ffff:ffff:ffff:ffff:ffff,DE
2001:67c:154::,2001:67c:154:ffff:ffff:ffff:ffff:ffff,RO
@@ -441,7 +444,6 @@
2001:67c:2e4::,2001:67c:2e4:ffff:ffff:ffff:ffff:ffff,NL
2001:67c:2e8::,2001:67c:2e8:ffff:ffff:ffff:ffff:ffff,NL
2001:67c:2ec::,2001:67c:2ec:ffff:ffff:ffff:ffff:ffff,NL
-2001:67c:2f0::,2001:67c:2f0:ffff:ffff:ffff:ffff:ffff,SI
2001:67c:2f4::,2001:67c:2f4:ffff:ffff:ffff:ffff:ffff,LU
2001:67c:2f8::,2001:67c:2f8:ffff:ffff:ffff:ffff:ffff,CH
2001:67c:2fc::,2001:67c:2fc:ffff:ffff:ffff:ffff:ffff,DE
@@ -507,6 +509,132 @@
2001:67c:3f8::,2001:67c:3f8:ffff:ffff:ffff:ffff:ffff,SI
2001:67c:3fc::,2001:67c:3fc:ffff:ffff:ffff:ffff:ffff,AT
2001:67c:400::,2001:67c:400:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:404::,2001:67c:404:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:408::,2001:67c:408:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:40c::,2001:67c:40c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:410::,2001:67c:410:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:414::,2001:67c:414:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:418::,2001:67c:418:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:41c::,2001:67c:41c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:420::,2001:67c:420:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:424::,2001:67c:424:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:428::,2001:67c:428:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:42c::,2001:67c:42c:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:430::,2001:67c:430:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:434::,2001:67c:434:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:438::,2001:67c:438:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:43c::,2001:67c:43c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:440::,2001:67c:440:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:444::,2001:67c:444:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:448::,2001:67c:448:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:44c::,2001:67c:44c:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:450::,2001:67c:450:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:454::,2001:67c:454:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:458::,2001:67c:458:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:45c::,2001:67c:45c:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:460::,2001:67c:460:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:464::,2001:67c:464:ffff:ffff:ffff:ffff:ffff,TR
+2001:67c:468::,2001:67c:468:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:46c::,2001:67c:46c:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:470::,2001:67c:470:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:474::,2001:67c:474:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:478::,2001:67c:478:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:47c::,2001:67c:47c:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:480::,2001:67c:480:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:484::,2001:67c:484:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:488::,2001:67c:488:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:48c::,2001:67c:48c:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:490::,2001:67c:490:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:494::,2001:67c:494:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:498::,2001:67c:498:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:49c::,2001:67c:49c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:4a0::,2001:67c:4a0:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:4a4::,2001:67c:4a4:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:4a8::,2001:67c:4a8:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:4ac::,2001:67c:4ac:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:4b0::,2001:67c:4b0:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:4b4::,2001:67c:4b4:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:4b8::,2001:67c:4b8:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:4bc::,2001:67c:4bc:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:4c0::,2001:67c:4c0:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:4c4::,2001:67c:4c4:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:4c8::,2001:67c:4c8:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:4cc::,2001:67c:4cc:ffff:ffff:ffff:ffff:ffff,IL
+2001:67c:4d0::,2001:67c:4d0:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:4d4::,2001:67c:4d4:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:4d8::,2001:67c:4d8:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:4dc::,2001:67c:4dc:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:4e0::,2001:67c:4e0:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:4e4::,2001:67c:4e4:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:4e8::,2001:67c:4e8:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:4ec::,2001:67c:4ec:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:4f0::,2001:67c:4f0:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:4f4::,2001:67c:4f4:ffff:ffff:ffff:ffff:ffff,TR
+2001:67c:4f8::,2001:67c:4f8:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:4fc::,2001:67c:4fc:ffff:ffff:ffff:ffff:ffff,BE
+2001:67c:500::,2001:67c:500:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:504::,2001:67c:504:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:508::,2001:67c:508:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:50c::,2001:67c:50c:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:510::,2001:67c:510:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:514::,2001:67c:514:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:518::,2001:67c:518:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:51c::,2001:67c:51c:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:520::,2001:67c:520:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:524::,2001:67c:524:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:528::,2001:67c:528:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:530::,2001:67c:530:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:534::,2001:67c:534:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:538::,2001:67c:538:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:53c::,2001:67c:53c:ffff:ffff:ffff:ffff:ffff,HR
+2001:67c:540::,2001:67c:540:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:544::,2001:67c:544:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:548::,2001:67c:548:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:54c::,2001:67c:54c:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:550::,2001:67c:550:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:554::,2001:67c:554:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:558::,2001:67c:558:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:55c::,2001:67c:55c:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:560::,2001:67c:560:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:564::,2001:67c:564:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:568::,2001:67c:568:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:56c::,2001:67c:56c:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:570::,2001:67c:570:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:574::,2001:67c:574:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:578::,2001:67c:578:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:57c::,2001:67c:57c:ffff:ffff:ffff:ffff:ffff,BY
+2001:67c:580::,2001:67c:580:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:584::,2001:67c:584:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:588::,2001:67c:588:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:58c::,2001:67c:58c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:590::,2001:67c:590:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:594::,2001:67c:594:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:598::,2001:67c:598:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:59c::,2001:67c:59c:ffff:ffff:ffff:ffff:ffff,HU
+2001:67c:5a0::,2001:67c:5a1:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:5a8::,2001:67c:5a8:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:5ac::,2001:67c:5ac:ffff:ffff:ffff:ffff:ffff,BY
+2001:67c:5b0::,2001:67c:5b0:ffff:ffff:ffff:ffff:ffff,LV
+2001:67c:5b4::,2001:67c:5b4:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:5b8::,2001:67c:5b8:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:5bc::,2001:67c:5bc:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:5c0::,2001:67c:5c0:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:5c4::,2001:67c:5c4:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:5c8::,2001:67c:5c8:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:5cc::,2001:67c:5cc:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:5d0::,2001:67c:5d0:ffff:ffff:ffff:ffff:ffff,LV
+2001:67c:5d4::,2001:67c:5d4:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:5d8::,2001:67c:5d8:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:5dc::,2001:67c:5dc:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:5e0::,2001:67c:5e0:ffff:ffff:ffff:ffff:ffff,TR
+2001:67c:5e4::,2001:67c:5e4:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:5e8::,2001:67c:5e8:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:5ec::,2001:67c:5ec:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:5f0::,2001:67c:5f0:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:5f4::,2001:67c:5f4:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:5f8::,2001:67c:5f8:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:5fc::,2001:67c:5fc:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:600::,2001:67c:600:ffff:ffff:ffff:ffff:ffff,PL
2001:67c:1000::,2001:67c:1001:ffff:ffff:ffff:ffff:ffff,SE
2001:67c:1008::,2001:67c:1009:ffff:ffff:ffff:ffff:ffff,RU
2001:67c:1010::,2001:67c:1011:ffff:ffff:ffff:ffff:ffff,SE
@@ -584,7 +712,6 @@
2001:67c:115c::,2001:67c:115c:ffff:ffff:ffff:ffff:ffff,RO
2001:67c:1160::,2001:67c:1160:ffff:ffff:ffff:ffff:ffff,RO
2001:67c:1164::,2001:67c:1164:ffff:ffff:ffff:ffff:ffff,UA
-2001:67c:1168::,2001:67c:1168:ffff:ffff:ffff:ffff:ffff,RU
2001:67c:116c::,2001:67c:116c:ffff:ffff:ffff:ffff:ffff,SE
2001:67c:1170::,2001:67c:1170:ffff:ffff:ffff:ffff:ffff,GB
2001:67c:1174::,2001:67c:1174:ffff:ffff:ffff:ffff:ffff,SE
@@ -643,7 +770,6 @@
2001:67c:1288::,2001:67c:1288:ffff:ffff:ffff:ffff:ffff,NL
2001:67c:128c::,2001:67c:128c:ffff:ffff:ffff:ffff:ffff,FR
2001:67c:1294::,2001:67c:1294:ffff:ffff:ffff:ffff:ffff,SE
-2001:67c:1298::,2001:67c:1298:ffff:ffff:ffff:ffff:ffff,NL
2001:67c:129c::,2001:67c:129c:ffff:ffff:ffff:ffff:ffff,AT
2001:67c:12a0::,2001:67c:12a0:ffff:ffff:ffff:ffff:ffff,DE
2001:67c:12a4::,2001:67c:12a4:ffff:ffff:ffff:ffff:ffff,TR
@@ -750,7 +876,6 @@
2001:67c:14b4::,2001:67c:14b4:ffff:ffff:ffff:ffff:ffff,RU
2001:67c:14b8::,2001:67c:14b8:ffff:ffff:ffff:ffff:ffff,DE
2001:67c:14bc::,2001:67c:14bc:ffff:ffff:ffff:ffff:ffff,AT
-2001:67c:14c0::,2001:67c:14c0:ffff:ffff:ffff:ffff:ffff,NL
2001:67c:14c4::,2001:67c:14c4:ffff:ffff:ffff:ffff:ffff,DE
2001:67c:14d0::,2001:67c:14d0:ffff:ffff:ffff:ffff:ffff,NO
2001:67c:14d4::,2001:67c:14d4:ffff:ffff:ffff:ffff:ffff,AT
@@ -786,7 +911,6 @@
2001:67c:157c::,2001:67c:157c:ffff:ffff:ffff:ffff:ffff,RO
2001:67c:1580::,2001:67c:1580:ffff:ffff:ffff:ffff:ffff,CH
2001:67c:1584::,2001:67c:1584:ffff:ffff:ffff:ffff:ffff,UA
-2001:67c:1588::,2001:67c:1588:ffff:ffff:ffff:ffff:ffff,PL
2001:67c:158c::,2001:67c:158c:ffff:ffff:ffff:ffff:ffff,DE
2001:67c:1590::,2001:67c:1591:ffff:ffff:ffff:ffff:ffff,CZ
2001:67c:1598::,2001:67c:1598:ffff:ffff:ffff:ffff:ffff,NL
@@ -1080,7 +1204,6 @@
2001:67c:2010::,2001:67c:2010:ffff:ffff:ffff:ffff:ffff,PL
2001:67c:2014::,2001:67c:2014:ffff:ffff:ffff:ffff:ffff,SI
2001:67c:2018::,2001:67c:2018:ffff:ffff:ffff:ffff:ffff,DE
-2001:67c:201c::,2001:67c:201c:ffff:ffff:ffff:ffff:ffff,PL
2001:67c:2020::,2001:67c:2020:ffff:ffff:ffff:ffff:ffff,NO
2001:67c:2024::,2001:67c:2024:ffff:ffff:ffff:ffff:ffff,GB
2001:67c:2028::,2001:67c:2028:ffff:ffff:ffff:ffff:ffff,SE
@@ -1200,7 +1323,6 @@
2001:67c:2224::,2001:67c:2224:ffff:ffff:ffff:ffff:ffff,UA
2001:67c:2228::,2001:67c:2228:ffff:ffff:ffff:ffff:ffff,SE
2001:67c:222c::,2001:67c:222c:ffff:ffff:ffff:ffff:ffff,SK
-2001:67c:2230::,2001:67c:2230:ffff:ffff:ffff:ffff:ffff,HR
2001:67c:2234::,2001:67c:2234:ffff:ffff:ffff:ffff:ffff,GB
2001:67c:2238::,2001:67c:2238:ffff:ffff:ffff:ffff:ffff,CH
2001:67c:223c::,2001:67c:223c:ffff:ffff:ffff:ffff:ffff,DE
@@ -1346,7 +1468,6 @@
2001:67c:24b4::,2001:67c:24b4:ffff:ffff:ffff:ffff:ffff,NL
2001:67c:24b8::,2001:67c:24b8:ffff:ffff:ffff:ffff:ffff,SE
2001:67c:24bc::,2001:67c:24bc:ffff:ffff:ffff:ffff:ffff,SE
-2001:67c:24c0::,2001:67c:24c0:ffff:ffff:ffff:ffff:ffff,DE
2001:67c:24c4::,2001:67c:24c4:ffff:ffff:ffff:ffff:ffff,RO
2001:67c:24c8::,2001:67c:24c8:ffff:ffff:ffff:ffff:ffff,RU
2001:67c:24cc::,2001:67c:24cc:ffff:ffff:ffff:ffff:ffff,PL
@@ -1407,7 +1528,6 @@
2001:67c:25d8::,2001:67c:25d8:ffff:ffff:ffff:ffff:ffff,SI
2001:67c:25dc::,2001:67c:25dc:ffff:ffff:ffff:ffff:ffff,UA
2001:67c:25e4::,2001:67c:25e4:ffff:ffff:ffff:ffff:ffff,FR
-2001:67c:25e8::,2001:67c:25e9:ffff:ffff:ffff:ffff:ffff,DE
2001:67c:25f4::,2001:67c:25f4:ffff:ffff:ffff:ffff:ffff,UA
2001:67c:25fc::,2001:67c:25fc:ffff:ffff:ffff:ffff:ffff,AT
2001:67c:2600::,2001:67c:2600:ffff:ffff:ffff:ffff:ffff,AT
@@ -1426,7 +1546,6 @@
2001:67c:263c::,2001:67c:263c:ffff:ffff:ffff:ffff:ffff,AT
2001:67c:2640::,2001:67c:2640:ffff:ffff:ffff:ffff:ffff,AE
2001:67c:2644::,2001:67c:2644:ffff:ffff:ffff:ffff:ffff,GB
-2001:67c:2648::,2001:67c:2648:ffff:ffff:ffff:ffff:ffff,NL
2001:67c:264c::,2001:67c:264c:ffff:ffff:ffff:ffff:ffff,AT
2001:67c:2650::,2001:67c:2650:ffff:ffff:ffff:ffff:ffff,SE
2001:67c:2654::,2001:67c:2654:ffff:ffff:ffff:ffff:ffff,AE
@@ -1439,7 +1558,6 @@
2001:67c:2674::,2001:67c:2674:ffff:ffff:ffff:ffff:ffff,DE
2001:67c:2678::,2001:67c:2678:ffff:ffff:ffff:ffff:ffff,SE
2001:67c:267c::,2001:67c:267c:ffff:ffff:ffff:ffff:ffff,PL
-2001:67c:2680::,2001:67c:2680:ffff:ffff:ffff:ffff:ffff,ES
2001:67c:2684::,2001:67c:2684:ffff:ffff:ffff:ffff:ffff,DK
2001:67c:2688::,2001:67c:2688:ffff:ffff:ffff:ffff:ffff,DE
2001:67c:268c::,2001:67c:268c:ffff:ffff:ffff:ffff:ffff,SE
@@ -1526,7 +1644,7 @@
2001:67c:2808::,2001:67c:2808:ffff:ffff:ffff:ffff:ffff,PL
2001:67c:280c::,2001:67c:280c:ffff:ffff:ffff:ffff:ffff,FR
2001:67c:2810::,2001:67c:2810:ffff:ffff:ffff:ffff:ffff,DK
-2001:67c:2814::,2001:67c:2814:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2814::,2001:67c:2814:ffff:ffff:ffff:ffff:ffff,LI
2001:67c:2818::,2001:67c:2818:ffff:ffff:ffff:ffff:ffff,DE
2001:67c:281c::,2001:67c:281c:ffff:ffff:ffff:ffff:ffff,NL
2001:67c:2820::,2001:67c:2820:ffff:ffff:ffff:ffff:ffff,AT
@@ -1543,7 +1661,6 @@
2001:67c:284c::,2001:67c:284c:ffff:ffff:ffff:ffff:ffff,NL
2001:67c:2850::,2001:67c:2850:ffff:ffff:ffff:ffff:ffff,NL
2001:67c:2854::,2001:67c:2854:ffff:ffff:ffff:ffff:ffff,NL
-2001:67c:2858::,2001:67c:2858:ffff:ffff:ffff:ffff:ffff,NL
2001:67c:285c::,2001:67c:285c:ffff:ffff:ffff:ffff:ffff,NL
2001:67c:2860::,2001:67c:2860:ffff:ffff:ffff:ffff:ffff,NL
2001:67c:2864::,2001:67c:2864:ffff:ffff:ffff:ffff:ffff,NL
@@ -1668,7 +1785,6 @@
2001:67c:2aec::,2001:67c:2aec:ffff:ffff:ffff:ffff:ffff,CH
2001:67c:2af0::,2001:67c:2af0:ffff:ffff:ffff:ffff:ffff,SE
2001:67c:2af4::,2001:67c:2af4:ffff:ffff:ffff:ffff:ffff,RU
-2001:67c:2af8::,2001:67c:2af8:ffff:ffff:ffff:ffff:ffff,RU
2001:67c:2afc::,2001:67c:2afc:ffff:ffff:ffff:ffff:ffff,SI
2001:67c:2b04::,2001:67c:2b04:ffff:ffff:ffff:ffff:ffff,AT
2001:67c:2b08::,2001:67c:2b08:ffff:ffff:ffff:ffff:ffff,SE
@@ -1745,251 +1861,10 @@
2001:6e8::,2001:6ef:ffff:ffff:ffff:ffff:ffff:ffff,FI
2001:6f0::,2001:6f7:ffff:ffff:ffff:ffff:ffff:ffff,SE
2001:6f8::,2001:6f8:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2001:700::,2001:700:ffff:ffff:ffff:ffff:ffff:ffff,NO
-2001:708::,2001:708:ffff:ffff:ffff:ffff:ffff:ffff,FI
-2001:710::,2001:710:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2001:718::,2001:718:ffff:ffff:ffff:ffff:ffff:ffff,CZ
-2001:720::,2001:720:ffff:ffff:ffff:ffff:ffff:ffff,ES
-2001:728::,2001:728:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2001:730::,2001:737:ffff:ffff:ffff:ffff:ffff:ffff,AT
-2001:738::,2001:738:ffff:ffff:ffff:ffff:ffff:ffff,HU
-2001:748::,2001:748:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:750::,2001:750:ffff:ffff:ffff:ffff:ffff:ffff,IT
-2001:758::,2001:758:ffff:ffff:ffff:ffff:ffff:ffff,FR
-2001:760::,2001:760:ffff:ffff:ffff:ffff:ffff:ffff,IT
-2001:768::,2001:768:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2001:770::,2001:770:ffff:ffff:ffff:ffff:ffff:ffff,IE
-2001:778::,2001:77f:ffff:ffff:ffff:ffff:ffff:ffff,LT
-2001:780::,2001:787:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:788::,2001:78f:ffff:ffff:ffff:ffff:ffff:ffff,CH
-2001:790::,2001:790:ffff:ffff:ffff:ffff:ffff:ffff,IR
-2001:798::,2001:798:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2001:7a0::,2001:7a0:ffff:ffff:ffff:ffff:ffff:ffff,SE
-2001:7a8::,2001:7a8:ffff:ffff:ffff:ffff:ffff:ffff,FR
-2001:7b0::,2001:7b0:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:7b8::,2001:7b8:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2001:7c0::,2001:7c7:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:7c8::,2001:7c8:ffff:ffff:ffff:ffff:ffff:ffff,IE
-2001:7d0::,2001:7d0:ffff:ffff:ffff:ffff:ffff:ffff,EE
-2001:7d8::,2001:7d8:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:7e0::,2001:7e0:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2001:7e8::,2001:7e8:ffff:ffff:ffff:ffff:ffff:ffff,LU
-2001:7f8::,2001:7f8::ffff:ffff:ffff:ffff:ffff,DE
-2001:7f8:1::,2001:7f8:1:ffff:ffff:ffff:ffff:ffff,NL
-2001:7f8:2::,2001:7f8:2:ffff:ffff:ffff:ffff:ffff,IT
-2001:7f8:3::,2001:7f8:5:ffff:ffff:ffff:ffff:ffff,GB
-2001:7f8:6::,2001:7f8:6:ffff:ffff:ffff:ffff:ffff,BG
-2001:7f8:7::,2001:7f8:7:ffff:ffff:ffff:ffff:ffff,FI
-2001:7f8:8::,2001:7f8:8:ffff:ffff:ffff:ffff:ffff,DE
-2001:7f8:9::,2001:7f8:9:ffff:ffff:ffff:ffff:ffff,GB
-2001:7f8:a::,2001:7f8:a:ffff:ffff:ffff:ffff:ffff,PT
-2001:7f8:b::,2001:7f8:b:ffff:ffff:ffff:ffff:ffff,IT
-2001:7f8:c::,2001:7f8:c:ffff:ffff:ffff:ffff:ffff,CH
-2001:7f8:d::,2001:7f8:d:ffff:ffff:ffff:ffff:ffff,SE
-2001:7f8:e::,2001:7f8:e:ffff:ffff:ffff:ffff:ffff,NL
-2001:7f8:f::,2001:7f8:f:ffff:ffff:ffff:ffff:ffff,ES
-2001:7f8:10::,2001:7f8:10:ffff:ffff:ffff:ffff:ffff,IT
-2001:7f8:12::,2001:7f8:12:ffff:ffff:ffff:ffff:ffff,NO
-2001:7f8:13::,2001:7f8:13:ffff:ffff:ffff:ffff:ffff,NL
-2001:7f8:14::,2001:7f8:14:ffff:ffff:ffff:ffff:ffff,CZ
-2001:7f8:15::,2001:7f8:15:ffff:ffff:ffff:ffff:ffff,EE
-2001:7f8:16::,2001:7f8:16:ffff:ffff:ffff:ffff:ffff,SE
-2001:7f8:17::,2001:7f8:17:ffff:ffff:ffff:ffff:ffff,GB
-2001:7f8:18::,2001:7f8:18:ffff:ffff:ffff:ffff:ffff,IE
-2001:7f8:19::,2001:7f8:19:ffff:ffff:ffff:ffff:ffff,DE
-2001:7f8:1b::,2001:7f8:1b:ffff:ffff:ffff:ffff:ffff,BE
-2001:7f8:1c::,2001:7f8:1c:ffff:ffff:ffff:ffff:ffff,CH
-2001:7f8:1d::,2001:7f8:1d:ffff:ffff:ffff:ffff:ffff,FI
-2001:7f8:1e::,2001:7f8:1e:ffff:ffff:ffff:ffff:ffff,RS
-2001:7f8:1f::,2001:7f8:1f:ffff:ffff:ffff:ffff:ffff,DK
-2001:7f8:20::,2001:7f8:20:ffff:ffff:ffff:ffff:ffff,RU
-2001:7f8:21::,2001:7f8:21:ffff:ffff:ffff:ffff:ffff,SE
-2001:7f8:23::,2001:7f8:23:ffff:ffff:ffff:ffff:ffff,IT
-2001:7f8:24::,2001:7f8:24:ffff:ffff:ffff:ffff:ffff,CH
-2001:7f8:25::,2001:7f8:25:ffff:ffff:ffff:ffff:ffff,GB
-2001:7f8:26::,2001:7f8:26:ffff:ffff:ffff:ffff:ffff,BE
-2001:7f8:27::,2001:7f8:27:ffff:ffff:ffff:ffff:ffff,PL
-2001:7f8:28::,2001:7f8:28:ffff:ffff:ffff:ffff:ffff,HR
-2001:7f8:29::,2001:7f8:29:ffff:ffff:ffff:ffff:ffff,DE
-2001:7f8:2a::,2001:7f8:2a:ffff:ffff:ffff:ffff:ffff,ES
-2001:7f8:2d::,2001:7f8:2d:ffff:ffff:ffff:ffff:ffff,FR
-2001:7f8:2e::,2001:7f8:2e:ffff:ffff:ffff:ffff:ffff,PT
-2001:7f8:2f::,2001:7f8:2f:ffff:ffff:ffff:ffff:ffff,SK
-2001:7f8:30::,2001:7f8:30:ffff:ffff:ffff:ffff:ffff,AT
-2001:7f8:31::,2001:7f8:31:ffff:ffff:ffff:ffff:ffff,NL
-2001:7f8:33::,2001:7f8:33:ffff:ffff:ffff:ffff:ffff,DE
-2001:7f8:34::,2001:7f8:34:ffff:ffff:ffff:ffff:ffff,GB
-2001:7f8:35::,2001:7f8:35:ffff:ffff:ffff:ffff:ffff,HU
-2001:7f8:37::,2001:7f8:38:ffff:ffff:ffff:ffff:ffff,SE
-2001:7f8:39::,2001:7f8:39:ffff:ffff:ffff:ffff:ffff,EE
-2001:7f8:3a::,2001:7f8:3a:ffff:ffff:ffff:ffff:ffff,DE
-2001:7f8:3b::,2001:7f8:3b:ffff:ffff:ffff:ffff:ffff,IL
-2001:7f8:3d::,2001:7f8:3d:ffff:ffff:ffff:ffff:ffff,DE
-2001:7f8:3e::,2001:7f8:3e:ffff:ffff:ffff:ffff:ffff,GB
-2001:7f8:3f::,2001:7f8:3f:ffff:ffff:ffff:ffff:ffff,SK
-2001:7f8:41::,2001:7f8:41:ffff:ffff:ffff:ffff:ffff,NO
-2001:7f8:42::,2001:7f8:42:ffff:ffff:ffff:ffff:ffff,PL
-2001:7f8:43::,2001:7f8:43:ffff:ffff:ffff:ffff:ffff,FR
-2001:7f8:44::,2001:7f8:44:ffff:ffff:ffff:ffff:ffff,DE
-2001:7f8:45::,2001:7f8:45:ffff:ffff:ffff:ffff:ffff,SE
-2001:7f8:46::,2001:7f8:46:ffff:ffff:ffff:ffff:ffff,SI
-2001:7f8:47::,2001:7f8:47:ffff:ffff:ffff:ffff:ffff,FR
-2001:7f8:48::,2001:7f8:48:ffff:ffff:ffff:ffff:ffff,IS
-2001:7f8:4a::,2001:7f8:4a:ffff:ffff:ffff:ffff:ffff,AT
-2001:7f8:4b::,2001:7f8:4b:ffff:ffff:ffff:ffff:ffff,PL
-2001:7f8:4c::,2001:7f8:4c:ffff:ffff:ffff:ffff:ffff,LU
-2001:7f8:4d::,2001:7f8:4d:ffff:ffff:ffff:ffff:ffff,IE
-2001:7f8:4e::,2001:7f8:4e:ffff:ffff:ffff:ffff:ffff,FR
-2001:7f8:4f::,2001:7f8:4f:ffff:ffff:ffff:ffff:ffff,BH
-2001:7f8:50::,2001:7f8:50:ffff:ffff:ffff:ffff:ffff,EE
-2001:7f8:51::,2001:7f8:51:ffff:ffff:ffff:ffff:ffff,UA
-2001:7f8:52::,2001:7f8:52:ffff:ffff:ffff:ffff:ffff,LB
-2001:7f8:53::,2001:7f8:53:ffff:ffff:ffff:ffff:ffff,SE
-2001:7f8:54::,2001:7f8:54:ffff:ffff:ffff:ffff:ffff,FR
-2001:7f8:55::,2001:7f8:55:ffff:ffff:ffff:ffff:ffff,UA
-2001:7f8:56::,2001:7f8:56:ffff:ffff:ffff:ffff:ffff,DE
-2001:7f8:58::,2001:7f8:58:ffff:ffff:ffff:ffff:ffff,BG
-2001:7f8:59::,2001:7f8:59:ffff:ffff:ffff:ffff:ffff,FR
-2001:7f8:5a::,2001:7f8:5a:ffff:ffff:ffff:ffff:ffff,BY
-2001:7f8:5b::,2001:7f8:5b:ffff:ffff:ffff:ffff:ffff,PL
-2001:7f8:5c::,2001:7f8:5c:ffff:ffff:ffff:ffff:ffff,SE
-2001:7f8:5d::,2001:7f8:5d:ffff:ffff:ffff:ffff:ffff,UA
-2001:7f8:5e::,2001:7f8:5e:ffff:ffff:ffff:ffff:ffff,CZ
-2001:7f8:5f::,2001:7f8:5f:ffff:ffff:ffff:ffff:ffff,IT
-2001:7f8:60::,2001:7f8:60:ffff:ffff:ffff:ffff:ffff,PL
-2001:7f8:61::,2001:7f8:61:ffff:ffff:ffff:ffff:ffff,NL
-2001:7f8:62::,2001:7f8:62:ffff:ffff:ffff:ffff:ffff,DE
-2001:7f8:63::,2001:7f8:63:ffff:ffff:ffff:ffff:ffff,UA
-2001:7f8:64::,2001:7f8:64:ffff:ffff:ffff:ffff:ffff,RO
-2001:7f8:66::,2001:7f8:66:ffff:ffff:ffff:ffff:ffff,AT
-2001:7f8:67::,2001:7f8:67:ffff:ffff:ffff:ffff:ffff,GB
-2001:7f8:68::,2001:7f8:68:ffff:ffff:ffff:ffff:ffff,FR
-2001:7f8:69::,2001:7f8:69:ffff:ffff:ffff:ffff:ffff,PL
-2001:7f8:6a::,2001:7f8:6a:ffff:ffff:ffff:ffff:ffff,MD
-2001:7f8:6b::,2001:7f8:6b:ffff:ffff:ffff:ffff:ffff,PL
-2001:7f8:6c::,2001:7f8:6c:ffff:ffff:ffff:ffff:ffff,UA
-2001:7f8:6d::,2001:7f8:6d:ffff:ffff:ffff:ffff:ffff,FR
-2001:7f8:6e::,2001:7f8:6e:ffff:ffff:ffff:ffff:ffff,GR
-2001:7f8:6f::,2001:7f8:70:ffff:ffff:ffff:ffff:ffff,RU
-2001:7f8:71::,2001:7f8:71:ffff:ffff:ffff:ffff:ffff,AT
-2001:7f8:72::,2001:7f8:72:ffff:ffff:ffff:ffff:ffff,PS
-2001:7f8:73::,2001:7f8:73:ffff:ffff:ffff:ffff:ffff,AE
-2001:7f8:74::,2001:7f8:75:ffff:ffff:ffff:ffff:ffff,PL
-2001:7f8:76::,2001:7f8:76:ffff:ffff:ffff:ffff:ffff,NO
-2001:7f8:77::,2001:7f8:78:ffff:ffff:ffff:ffff:ffff,RU
-2001:7f8:79::,2001:7f8:79:ffff:ffff:ffff:ffff:ffff,FR
-2001:7f8:7a::,2001:7f8:7a:ffff:ffff:ffff:ffff:ffff,AE
-2001:7f8:7b::,2001:7f8:7b:ffff:ffff:ffff:ffff:ffff,UA
-2001:7f8:7c::,2001:7f8:7c:ffff:ffff:ffff:ffff:ffff,PL
-2001:7f8:7d::,2001:7f8:7d:ffff:ffff:ffff:ffff:ffff,RU
-2001:7f8:7e::,2001:7f8:7e:ffff:ffff:ffff:ffff:ffff,ES
-2001:7f8:7f::,2001:7f8:7f:ffff:ffff:ffff:ffff:ffff,CZ
-2001:7f8:80::,2001:7f8:80:ffff:ffff:ffff:ffff:ffff,PL
-2001:7f8:81::,2001:7f8:81:ffff:ffff:ffff:ffff:ffff,FR
-2001:7fa:0:1::,2001:7fa::1:ffff:ffff:ffff:ffff,HK
-2001:7fa:0:2::,2001:7fa::2:ffff:ffff:ffff:ffff,KR
-2001:7fa:0:3::,2001:7fa::3:ffff:ffff:ffff:ffff,JP
-2001:7fa:1::,2001:7fa:1:ffff:ffff:ffff:ffff:ffff,TW
-2001:7fa:2::,2001:7fa:2:ffff:ffff:ffff:ffff:ffff,ID
-2001:7fa:3::,2001:7fa:4:ffff:ffff:ffff:ffff:ffff,NZ
-2001:7fa:5::,2001:7fa:5:ffff:ffff:ffff:ffff:ffff,CN
-2001:7fa:6::,2001:7fa:6:ffff:ffff:ffff:ffff:ffff,VN
-2001:7fa:7::,2001:7fa:7:ffff:ffff:ffff:ffff:ffff,JP
-2001:7fa:8::,2001:7fa:8:ffff:ffff:ffff:ffff:ffff,KR
-2001:7fa:9::,2001:7fa:e:ffff:ffff:ffff:ffff:ffff,AU
-2001:7fa:f::,2001:7fa:f:ffff:ffff:ffff:ffff:ffff,ID
-2001:7fa:10::,2001:7fa:10:ffff:ffff:ffff:ffff:ffff,CN
-2001:7fa:11::,2001:7fa:11:ffff:ffff:ffff:ffff:ffff,AU
-2001:7fe::,2001:7fe:ffff:ffff:ffff:ffff:ffff:ffff,SE
-2001:808::,2001:808:ffff:ffff:ffff:ffff:ffff:ffff,PL
-2001:810::,2001:810:ffff:ffff:ffff:ffff:ffff:ffff,FR
-2001:818::,2001:81f:ffff:ffff:ffff:ffff:ffff:ffff,PT
-2001:820::,2001:820:ffff:ffff:ffff:ffff:ffff:ffff,NO
-2001:828::,2001:828:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2001:830::,2001:830:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:838::,2001:83f:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2001:840::,2001:847:ffff:ffff:ffff:ffff:ffff:ffff,NO
-2001:848::,2001:848:ffff:ffff:ffff:ffff:ffff:ffff,IT
-2001:850::,2001:853:ffff:ffff:ffff:ffff:ffff:ffff,AT
-2001:858::,2001:858:ffff:ffff:ffff:ffff:ffff:ffff,AT
-2001:860::,2001:867:ffff:ffff:ffff:ffff:ffff:ffff,FR
-2001:868::,2001:86f:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:870::,2001:871:ffff:ffff:ffff:ffff:ffff:ffff,AT
-2001:878::,2001:87f:ffff:ffff:ffff:ffff:ffff:ffff,DK
-2001:880::,2001:880:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:888::,2001:88b:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2001:890::,2001:891:ffff:ffff:ffff:ffff:ffff:ffff,AT
-2001:898::,2001:89f:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2001:8a0::,2001:8a7:ffff:ffff:ffff:ffff:ffff:ffff,PT
-2001:8a8::,2001:8a8:ffff:ffff:ffff:ffff:ffff:ffff,CH
-2001:8b0::,2001:8b0:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2001:8b8::,2001:8bf:ffff:ffff:ffff:ffff:ffff:ffff,FI
-2001:8c0::,2001:8c0:ffff:ffff:ffff:ffff:ffff:ffff,NO
-2001:8c8::,2001:8c8:ffff:ffff:ffff:ffff:ffff:ffff,RS
-2001:8d0::,2001:8d0:ffff:ffff:ffff:ffff:ffff:ffff,IT
-2001:8d8::,2001:8d8:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:8e0::,2001:8e8:ffff:ffff:ffff:ffff:ffff:ffff,CH
-2001:8f0::,2001:8f3:ffff:ffff:ffff:ffff:ffff:ffff,CY
-2001:8f8::,2001:8ff:ffff:ffff:ffff:ffff:ffff:ffff,AE
-2001:900::,2001:900:ffff:ffff:ffff:ffff:ffff:ffff,FR
-2001:908::,2001:908:ffff:ffff:ffff:ffff:ffff:ffff,PL
-2001:910::,2001:917:ffff:ffff:ffff:ffff:ffff:ffff,FR
-2001:918::,2001:918:ffff:ffff:ffff:ffff:ffff:ffff,CH
-2001:920::,2001:927:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2001:928::,2001:928:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:930::,2001:930:ffff:ffff:ffff:ffff:ffff:ffff,TR
-2001:938::,2001:938:ffff:ffff:ffff:ffff:ffff:ffff,AT
-2001:940::,2001:940:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:948::,2001:948:ffff:ffff:ffff:ffff:ffff:ffff,SE
-2001:950::,2001:950:ffff:ffff:ffff:ffff:ffff:ffff,HU
-2001:958::,2001:958:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2001:960::,2001:960:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2001:968::,2001:968:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2001:978::,2001:978:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:980::,2001:983:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2001:988::,2001:988:ffff:ffff:ffff:ffff:ffff:ffff,FR
-2001:990::,2001:990:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2001:998::,2001:99b:ffff:ffff:ffff:ffff:ffff:ffff,FI
-2001:9a0::,2001:9a0:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2001:9a8::,2001:9a8:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2001:9b0::,2001:9b0:ffff:ffff:ffff:ffff:ffff:ffff,SE
-2001:9c0::,2001:9c0:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2001:9c8::,2001:9cf:ffff:ffff:ffff:ffff:ffff:ffff,SE
-2001:9d0::,2001:9d0:ffff:ffff:ffff:ffff:ffff:ffff,AT
-2001:9d8::,2001:9d8:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2001:9e0::,2001:9e0:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2001:9e8::,2001:9e8:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:9f0::,2001:9f0:ffff:ffff:ffff:ffff:ffff:ffff,FI
-2001:a00::,2001:a00:ffff:ffff:ffff:ffff:ffff:ffff,AT
-2001:a08::,2001:a08:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2001:a10::,2001:a10:ffff:ffff:ffff:ffff:ffff:ffff,PL
-2001:a18::,2001:a1f:ffff:ffff:ffff:ffff:ffff:ffff,LU
-2001:a20::,2001:a20:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:a30::,2001:a30:ffff:ffff:ffff:ffff:ffff:ffff,IT
-2001:a38::,2001:a38:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:a40::,2001:a40:ffff:ffff:ffff:ffff:ffff:ffff,PT
-2001:a48::,2001:a48:ffff:ffff:ffff:ffff:ffff:ffff,PL
-2001:a50::,2001:a50:ffff:ffff:ffff:ffff:ffff:ffff,ES
-2001:a58::,2001:a58:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2001:a60::,2001:a67:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:a68::,2001:a68:ffff:ffff:ffff:ffff:ffff:ffff,FI
-2001:a70::,2001:a70:ffff:ffff:ffff:ffff:ffff:ffff,FR
-2001:a78::,2001:a78:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:a80::,2001:a80:ffff:ffff:ffff:ffff:ffff:ffff,IT
-2001:a88::,2001:a88:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2001:a90::,2001:a90:ffff:ffff:ffff:ffff:ffff:ffff,NO
-2001:a98::,2001:a98:ffff:ffff:ffff:ffff:ffff:ffff,TR
-2001:aa0::,2001:aa0:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:aa8::,2001:aa8:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:ab0::,2001:ab0:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:ab8::,2001:ab8:ffff:ffff:ffff:ffff:ffff:ffff,FR
-2001:ac0::,2001:ac0:ffff:ffff:ffff:ffff:ffff:ffff,ES
-2001:ac8::,2001:ac8:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2001:ad0::,2001:ad0:ffff:ffff:ffff:ffff:ffff:ffff,EE
-2001:ad8::,2001:ae0:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:ae8::,2001:ae8:ffff:ffff:ffff:ffff:ffff:ffff,CZ
-2001:af0::,2001:af0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
-2001:af8::,2001:af8:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2001:700::,2001:7ff:ffff:ffff:ffff:ffff:ffff:ffff,LV
+2001:800::,2001:8ff:ffff:ffff:ffff:ffff:ffff:ffff,GD
+2001:900::,2001:9ff:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2001:a00::,2001:aff:ffff:ffff:ffff:ffff:ffff:ffff,DJ
2001:b00::,2001:b07:ffff:ffff:ffff:ffff:ffff:ffff,IT
2001:b08::,2001:b08:ffff:ffff:ffff:ffff:ffff:ffff,RU
2001:b10::,2001:b10:ffff:ffff:ffff:ffff:ffff:ffff,PL
@@ -2020,38 +1895,7 @@
2001:be8::,2001:be8:ffff:ffff:ffff:ffff:ffff:ffff,SE
2001:bf0::,2001:bf7:ffff:ffff:ffff:ffff:ffff:ffff,DE
2001:bf8::,2001:bf8:ffff:ffff:ffff:ffff:ffff:ffff,IL
-2001:c00::,2001:c00:ffff:ffff:ffff:ffff:ffff:ffff,TH
-2001:c08::,2001:c08:ffff:ffff:ffff:ffff:ffff:ffff,TW
-2001:c10::,2001:c10:ffff:ffff:ffff:ffff:ffff:ffff,SG
-2001:c18::,2001:c18:ffff:ffff:ffff:ffff:ffff:ffff,MY
-2001:c20::,2001:c20:ffff:ffff:ffff:ffff:ffff:ffff,SG
-2001:c28::,2001:c28:ffff:ffff:ffff:ffff:ffff:ffff,JP
-2001:c30::,2001:c30:ffff:ffff:ffff:ffff:ffff:ffff,JP
-2001:c38::,2001:c39:ffff:ffff:ffff:ffff:ffff:ffff,TH
-2001:c40::,2001:c40:ffff:ffff:ffff:ffff:ffff:ffff,JP
-2001:c48::,2001:c48:ffff:ffff:ffff:ffff:ffff:ffff,KR
-2001:c50::,2001:c50:ffff:ffff:ffff:ffff:ffff:ffff,TW
-2001:c58::,2001:c58:ffff:ffff:ffff:ffff:ffff:ffff,TW
-2001:c60::,2001:c60:ffff:ffff:ffff:ffff:ffff:ffff,PG
-2001:c68::,2001:c68:ffff:ffff:ffff:ffff:ffff:ffff,CN
-2001:c70::,2001:c70:ffff:ffff:ffff:ffff:ffff:ffff,JP
-2001:c78::,2001:c79:ffff:ffff:ffff:ffff:ffff:ffff,AU
-2001:c80::,2001:c80:ffff:ffff:ffff:ffff:ffff:ffff,JP
-2001:c88::,2001:c88:ffff:ffff:ffff:ffff:ffff:ffff,JP
-2001:c90::,2001:c90:ffff:ffff:ffff:ffff:ffff:ffff,JP
-2001:c98::,2001:c98:ffff:ffff:ffff:ffff:ffff:ffff,KR
-2001:ca0::,2001:ca0:ffff:ffff:ffff:ffff:ffff:ffff,TW
-2001:ca8::,2001:ca8:ffff:ffff:ffff:ffff:ffff:ffff,IN
-2001:cb0::,2001:cb0:ffff:ffff:ffff:ffff:ffff:ffff,SG
-2001:cb8::,2001:cb8:ffff:ffff:ffff:ffff:ffff:ffff,JP
-2001:cc0::,2001:cc0:ffff:ffff:ffff:ffff:ffff:ffff,CN
-2001:cc8::,2001:cc9:ffff:ffff:ffff:ffff:ffff:ffff,JP
-2001:cd0::,2001:cd0:ffff:ffff:ffff:ffff:ffff:ffff,JP
-2001:cd8::,2001:cd8:ffff:ffff:ffff:ffff:ffff:ffff,TW
-2001:ce0::,2001:ce0:ffff:ffff:ffff:ffff:ffff:ffff,HK
-2001:ce8::,2001:ce8:ffff:ffff:ffff:ffff:ffff:ffff,JP
-2001:cf0::,2001:cf0:ffff:ffff:ffff:ffff:ffff:ffff,KR
-2001:cf8::,2001:cf8:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2001:c00::,2001:cff:ffff:ffff:ffff:ffff:ffff:ffff,CO
2001:d00::,2001:d00:ffff:ffff:ffff:ffff:ffff:ffff,JP
2001:d08::,2001:d08:ffff:ffff:ffff:ffff:ffff:ffff,MY
2001:d10::,2001:d10:ffff:ffff:ffff:ffff:ffff:ffff,ID
@@ -2137,6 +1981,7 @@
2001:de8:1b::,2001:de8:1b:ffff:ffff:ffff:ffff:ffff,MY
2001:de8:1d::,2001:de8:1d:ffff:ffff:ffff:ffff:ffff,KH
2001:de8:1e::,2001:de8:1e:ffff:ffff:ffff:ffff:ffff,JP
+2001:de9::,2001:de9::ffff:ffff:ffff:ffff:ffff,LK
2001:dea::,2001:dea::ffff:ffff:ffff:ffff:ffff,AU
2001:dec::,2001:dec::ffff:ffff:ffff:ffff:ffff,VU
2001:dee::,2001:dee::ffff:ffff:ffff:ffff:ffff,HK
@@ -2446,6 +2291,7 @@
2001:df0:2fd::,2001:df0:2fd:ffff:ffff:ffff:ffff:ffff,IN
2001:df0:2fe::,2001:df0:2ff:ffff:ffff:ffff:ffff:ffff,AU
2001:df0:300::,2001:df0:311:ffff:ffff:ffff:ffff:ffff,SG
+2001:df0:314::,2001:df0:317:ffff:ffff:ffff:ffff:ffff,SG
2001:df0:400::,2001:df0:400:ffff:ffff:ffff:ffff:ffff,SG
2001:df0:401::,2001:df0:401:ffff:ffff:ffff:ffff:ffff,JP
2001:df0:402::,2001:df0:403:ffff:ffff:ffff:ffff:ffff,AU
@@ -2478,7 +2324,6 @@
2001:df0:425::,2001:df0:425:ffff:ffff:ffff:ffff:ffff,SG
2001:df0:426::,2001:df0:426:ffff:ffff:ffff:ffff:ffff,ID
2001:df0:427::,2001:df0:427:ffff:ffff:ffff:ffff:ffff,MY
-2001:df0:428::,2001:df0:42f:ffff:ffff:ffff:ffff:ffff,AU
2001:df0:430::,2001:df0:43f:ffff:ffff:ffff:ffff:ffff,NZ
2001:df0:440::,2001:df0:440:ffff:ffff:ffff:ffff:ffff,JP
2001:df0:441::,2001:df0:441:ffff:ffff:ffff:ffff:ffff,AU
@@ -2538,7 +2383,6 @@
2001:df0:7800::,2001:df0:7800:ffff:ffff:ffff:ffff:ffff,WS
2001:df0:8000::,2001:df0:8000:ffff:ffff:ffff:ffff:ffff,IN
2001:df0:8800::,2001:df0:8800:ffff:ffff:ffff:ffff:ffff,IN
-2001:df0:9000::,2001:df0:9000:ffff:ffff:ffff:ffff:ffff,CN
2001:df0:9800::,2001:df0:9800:ffff:ffff:ffff:ffff:ffff,IN
2001:df0:a000::,2001:df0:a000:ffff:ffff:ffff:ffff:ffff,AU
2001:df0:a800::,2001:df0:a800:ffff:ffff:ffff:ffff:ffff,AU
@@ -2603,66 +2447,122 @@
2001:df2:8000::,2001:df2:8000:ffff:ffff:ffff:ffff:ffff,BN
2001:df2:8800::,2001:df2:8800:ffff:ffff:ffff:ffff:ffff,IN
2001:df2:9000::,2001:df2:9000:ffff:ffff:ffff:ffff:ffff,AU
-2001:df2:9800::,2001:df2:9800:ffff:ffff:ffff:ffff:ffff,IN
+2001:df2:9800::,2001:df2:9803:ffff:ffff:ffff:ffff:ffff,IN
2001:df2:a000::,2001:df2:a000:ffff:ffff:ffff:ffff:ffff,ID
2001:df2:a800::,2001:df2:a800:ffff:ffff:ffff:ffff:ffff,IN
2001:df2:b000::,2001:df2:b000:ffff:ffff:ffff:ffff:ffff,IN
2001:df2:c000::,2001:df2:c000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df2:c800::,2001:df2:c800:ffff:ffff:ffff:ffff:ffff,AU
2001:df2:d000::,2001:df2:d000:ffff:ffff:ffff:ffff:ffff,HK
+2001:df2:d800::,2001:df2:d800:ffff:ffff:ffff:ffff:ffff,JP
2001:df2:e000::,2001:df2:e000:ffff:ffff:ffff:ffff:ffff,AU
+2001:df2:e800::,2001:df2:e800:ffff:ffff:ffff:ffff:ffff,IN
2001:df2:f000::,2001:df2:f000:ffff:ffff:ffff:ffff:ffff,VN
+2001:df2:f800::,2001:df2:f800:ffff:ffff:ffff:ffff:ffff,IN
2001:df3::,2001:df3::ffff:ffff:ffff:ffff:ffff,MY
+2001:df3:800::,2001:df3:80f:ffff:ffff:ffff:ffff:ffff,CN
2001:df3:1000::,2001:df3:1000:ffff:ffff:ffff:ffff:ffff,BD
+2001:df3:1800::,2001:df3:1800:ffff:ffff:ffff:ffff:ffff,ID
2001:df3:2000::,2001:df3:2000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df3:2800::,2001:df3:2800:ffff:ffff:ffff:ffff:ffff,IN
2001:df3:3000::,2001:df3:3000:ffff:ffff:ffff:ffff:ffff,IN
+2001:df3:3800::,2001:df3:3800:ffff:ffff:ffff:ffff:ffff,ID
2001:df3:4000::,2001:df3:4000:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df3:4800::,2001:df3:4800:ffff:ffff:ffff:ffff:ffff,IN
2001:df3:5000::,2001:df3:5000:ffff:ffff:ffff:ffff:ffff,IN
+2001:df3:5800::,2001:df3:5800:ffff:ffff:ffff:ffff:ffff,AU
2001:df3:6000::,2001:df3:6000:ffff:ffff:ffff:ffff:ffff,SG
+2001:df3:6800::,2001:df3:6800:ffff:ffff:ffff:ffff:ffff,AU
2001:df3:7000::,2001:df3:7000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df3:7800::,2001:df3:7800:ffff:ffff:ffff:ffff:ffff,SG
2001:df3:8000::,2001:df3:8000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df3:8800::,2001:df3:8800:ffff:ffff:ffff:ffff:ffff,IN
2001:df3:9000::,2001:df3:9000:ffff:ffff:ffff:ffff:ffff,HK
+2001:df3:9800::,2001:df3:9800:ffff:ffff:ffff:ffff:ffff,MY
2001:df3:a000::,2001:df3:a003:ffff:ffff:ffff:ffff:ffff,PH
+2001:df3:a800::,2001:df3:a800:ffff:ffff:ffff:ffff:ffff,MY
2001:df3:b000::,2001:df3:b000:ffff:ffff:ffff:ffff:ffff,TH
+2001:df3:b800::,2001:df3:b800:ffff:ffff:ffff:ffff:ffff,IN
2001:df3:c000::,2001:df3:c000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df3:c800::,2001:df3:c800:ffff:ffff:ffff:ffff:ffff,IN
2001:df3:d000::,2001:df3:d000:ffff:ffff:ffff:ffff:ffff,AU
+2001:df3:d800::,2001:df3:d800:ffff:ffff:ffff:ffff:ffff,SG
2001:df3:e000::,2001:df3:e000:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df3:e800::,2001:df3:e800:ffff:ffff:ffff:ffff:ffff,IN
2001:df3:f000::,2001:df3:f000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df3:f800::,2001:df3:f800:ffff:ffff:ffff:ffff:ffff,IN
2001:df4::,2001:df4::ffff:ffff:ffff:ffff:ffff,MY
+2001:df4:800::,2001:df4:800:ffff:ffff:ffff:ffff:ffff,AU
2001:df4:1000::,2001:df4:1000:ffff:ffff:ffff:ffff:ffff,HK
+2001:df4:1800::,2001:df4:1800:ffff:ffff:ffff:ffff:ffff,IN
2001:df4:2000::,2001:df4:2000:ffff:ffff:ffff:ffff:ffff,TH
+2001:df4:2800::,2001:df4:2800:ffff:ffff:ffff:ffff:ffff,HK
2001:df4:3000::,2001:df4:3000:ffff:ffff:ffff:ffff:ffff,TH
+2001:df4:3800::,2001:df4:3800:ffff:ffff:ffff:ffff:ffff,BD
2001:df4:4000::,2001:df4:400f:ffff:ffff:ffff:ffff:ffff,SG
+2001:df4:4800::,2001:df4:4800:ffff:ffff:ffff:ffff:ffff,AU
2001:df4:5000::,2001:df4:5000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df4:5800::,2001:df4:5800:ffff:ffff:ffff:ffff:ffff,AU
2001:df4:6000::,2001:df4:6000:ffff:ffff:ffff:ffff:ffff,MY
+2001:df4:6800::,2001:df4:6800:ffff:ffff:ffff:ffff:ffff,SG
2001:df4:7000::,2001:df4:7000:ffff:ffff:ffff:ffff:ffff,HK
+2001:df4:7800::,2001:df4:7800:ffff:ffff:ffff:ffff:ffff,IN
2001:df4:8000::,2001:df4:8000:ffff:ffff:ffff:ffff:ffff,MY
+2001:df4:8800::,2001:df4:8800:ffff:ffff:ffff:ffff:ffff,HK
2001:df4:9000::,2001:df4:9000:ffff:ffff:ffff:ffff:ffff,SG
+2001:df4:9800::,2001:df4:9800:ffff:ffff:ffff:ffff:ffff,ID
2001:df4:a000::,2001:df4:a000:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df4:a800::,2001:df4:a800:ffff:ffff:ffff:ffff:ffff,ID
2001:df4:b000::,2001:df4:b000:ffff:ffff:ffff:ffff:ffff,IN
+2001:df4:b800::,2001:df4:b800:ffff:ffff:ffff:ffff:ffff,AU
2001:df4:c000::,2001:df4:c000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df4:c800::,2001:df4:c800:ffff:ffff:ffff:ffff:ffff,SG
2001:df4:d000::,2001:df4:d000:ffff:ffff:ffff:ffff:ffff,IN
+2001:df4:d800::,2001:df4:d800:ffff:ffff:ffff:ffff:ffff,VN
2001:df4:e000::,2001:df4:e000:ffff:ffff:ffff:ffff:ffff,IN
+2001:df4:e800::,2001:df4:e800:ffff:ffff:ffff:ffff:ffff,MN
2001:df4:f000::,2001:df4:f000:ffff:ffff:ffff:ffff:ffff,IN
+2001:df4:f800::,2001:df4:f800:ffff:ffff:ffff:ffff:ffff,AU
2001:df5::,2001:df5::ffff:ffff:ffff:ffff:ffff,AU
+2001:df5:800::,2001:df5:800:ffff:ffff:ffff:ffff:ffff,HK
2001:df5:1000::,2001:df5:1000:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df5:1800::,2001:df5:1800:ffff:ffff:ffff:ffff:ffff,ID
2001:df5:2000::,2001:df5:2000:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df5:2800::,2001:df5:2800:ffff:ffff:ffff:ffff:ffff,IN
2001:df5:3000::,2001:df5:3000:ffff:ffff:ffff:ffff:ffff,AU
+2001:df5:3800::,2001:df5:3800:ffff:ffff:ffff:ffff:ffff,IN
2001:df5:4000::,2001:df5:4000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df5:4800::,2001:df5:4800:ffff:ffff:ffff:ffff:ffff,BN
2001:df5:5000::,2001:df5:5000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df5:5800::,2001:df5:5800:ffff:ffff:ffff:ffff:ffff,AU
2001:df5:6000::,2001:df5:6000:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df5:6800::,2001:df5:6800:ffff:ffff:ffff:ffff:ffff,KR
2001:df5:7000::,2001:df5:7000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df5:7800::,2001:df5:7800:ffff:ffff:ffff:ffff:ffff,CN
2001:df5:8000::,2001:df5:8000:ffff:ffff:ffff:ffff:ffff,SG
+2001:df5:8800::,2001:df5:8800:ffff:ffff:ffff:ffff:ffff,IN
2001:df5:9000::,2001:df5:9000:ffff:ffff:ffff:ffff:ffff,IN
+2001:df5:9800::,2001:df5:9800:ffff:ffff:ffff:ffff:ffff,SG
2001:df5:a000::,2001:df5:a000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df5:a800::,2001:df5:a800:ffff:ffff:ffff:ffff:ffff,AU
2001:df5:b000::,2001:df5:b000:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df5:b800::,2001:df5:b800:ffff:ffff:ffff:ffff:ffff,HK
+2001:df5:c800::,2001:df5:c800:ffff:ffff:ffff:ffff:ffff,AU
2001:df5:d000::,2001:df5:d000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df5:d800::,2001:df5:d800:ffff:ffff:ffff:ffff:ffff,SG
2001:df5:e000::,2001:df5:e000:ffff:ffff:ffff:ffff:ffff,MY
+2001:df5:e800::,2001:df5:e800:ffff:ffff:ffff:ffff:ffff,PH
2001:df5:f000::,2001:df5:f000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df5:f800::,2001:df5:f800:ffff:ffff:ffff:ffff:ffff,SG
2001:df6::,2001:df6:1:ffff:ffff:ffff:ffff:ffff,IN
+2001:df6:800::,2001:df6:80f:ffff:ffff:ffff:ffff:ffff,HK
2001:df6:1000::,2001:df6:1000:ffff:ffff:ffff:ffff:ffff,PH
+2001:df6:1800::,2001:df6:1800:ffff:ffff:ffff:ffff:ffff,ID
2001:df6:2000::,2001:df6:2001:ffff:ffff:ffff:ffff:ffff,HK
+2001:df6:2800::,2001:df6:2800:ffff:ffff:ffff:ffff:ffff,IN
2001:df6:3000::,2001:df6:3000:ffff:ffff:ffff:ffff:ffff,NZ
-2001:df6:4000::,2001:df6:4000:ffff:ffff:ffff:ffff:ffff,AU
+2001:df6:3800::,2001:df6:3800:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df6:4000::,2001:df6:4001:ffff:ffff:ffff:ffff:ffff,AU
2001:df6:5000::,2001:df6:5000:ffff:ffff:ffff:ffff:ffff,AU
2001:df6:6000::,2001:df6:6000:ffff:ffff:ffff:ffff:ffff,JP
2001:df6:7000::,2001:df6:7000:ffff:ffff:ffff:ffff:ffff,VN
@@ -2691,38 +2591,7 @@
2001:df7:f000::,2001:df7:f000:ffff:ffff:ffff:ffff:ffff,JP
2001:df8::,2001:df9:ffff:ffff:ffff:ffff:ffff:ffff,AU
2001:dfa::,2001:dfa:ffff:ffff:ffff:ffff:ffff:ffff,JP
-2001:e00::,2001:e01:ffff:ffff:ffff:ffff:ffff:ffff,ID
-2001:e08::,2001:e08:ffff:ffff:ffff:ffff:ffff:ffff,CN
-2001:e10::,2001:e10:ffff:ffff:ffff:ffff:ffff:ffff,TW
-2001:e18::,2001:e18:ffff:ffff:ffff:ffff:ffff:ffff,CN
-2001:e20::,2001:e20:ffff:ffff:ffff:ffff:ffff:ffff,NZ
-2001:e28::,2001:e28:ffff:ffff:ffff:ffff:ffff:ffff,AU
-2001:e30::,2001:e30:ffff:ffff:ffff:ffff:ffff:ffff,IN
-2001:e38::,2001:e38:ffff:ffff:ffff:ffff:ffff:ffff,JP
-2001:e40::,2001:e47:ffff:ffff:ffff:ffff:ffff:ffff,JP
-2001:e48::,2001:e48:ffff:ffff:ffff:ffff:ffff:ffff,IN
-2001:e50::,2001:e50:ffff:ffff:ffff:ffff:ffff:ffff,JP
-2001:e58::,2001:e58:ffff:ffff:ffff:ffff:ffff:ffff,JP
-2001:e60::,2001:e60:ffff:ffff:ffff:ffff:ffff:ffff,KR
-2001:e68::,2001:e68:ffff:ffff:ffff:ffff:ffff:ffff,MY
-2001:e70::,2001:e70:ffff:ffff:ffff:ffff:ffff:ffff,KR
-2001:e78::,2001:e78:ffff:ffff:ffff:ffff:ffff:ffff,KR
-2001:e80::,2001:e80:ffff:ffff:ffff:ffff:ffff:ffff,CN
-2001:e88::,2001:e88:ffff:ffff:ffff:ffff:ffff:ffff,CN
-2001:e90::,2001:e90:ffff:ffff:ffff:ffff:ffff:ffff,JP
-2001:e98::,2001:e98:ffff:ffff:ffff:ffff:ffff:ffff,KR
-2001:ea0::,2001:ea0:ffff:ffff:ffff:ffff:ffff:ffff,KR
-2001:ea8::,2001:ea8:ffff:ffff:ffff:ffff:ffff:ffff,KR
-2001:eb0::,2001:eb0:ffff:ffff:ffff:ffff:ffff:ffff,HK
-2001:eb8::,2001:eb8:ffff:ffff:ffff:ffff:ffff:ffff,KR
-2001:ec0::,2001:ec0:ffff:ffff:ffff:ffff:ffff:ffff,TH
-2001:ec8::,2001:ec8:ffff:ffff:ffff:ffff:ffff:ffff,PH
-2001:ed0::,2001:ed0:ffff:ffff:ffff:ffff:ffff:ffff,KR
-2001:ed8::,2001:ed8:ffff:ffff:ffff:ffff:ffff:ffff,TW
-2001:ee0::,2001:ee0:ffff:ffff:ffff:ffff:ffff:ffff,VN
-2001:ee8::,2001:ee8:ffff:ffff:ffff:ffff:ffff:ffff,KR
-2001:ef0::,2001:ef0:ffff:ffff:ffff:ffff:ffff:ffff,KR
-2001:ef8::,2001:ef8:ffff:ffff:ffff:ffff:ffff:ffff,KR
+2001:e00::,2001:eff:ffff:ffff:ffff:ffff:ffff:ffff,MZ
2001:f00::,2001:f00:ffff:ffff:ffff:ffff:ffff:ffff,TH
2001:f08::,2001:f08:ffff:ffff:ffff:ffff:ffff:ffff,JP
2001:f10::,2001:f10:ffff:ffff:ffff:ffff:ffff:ffff,TW
@@ -2988,44 +2857,14 @@
2001:19e8::,2001:19e8:ffff:ffff:ffff:ffff:ffff:ffff,US
2001:19f0::,2001:19f0:ffff:ffff:ffff:ffff:ffff:ffff,US
2001:19f8::,2001:19f8:ffff:ffff:ffff:ffff:ffff:ffff,US
-2001:1a08::,2001:1a08:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2001:1a10::,2001:1a10:ffff:ffff:ffff:ffff:ffff:ffff,QA
-2001:1a18::,2001:1a18:ffff:ffff:ffff:ffff:ffff:ffff,CY
-2001:1a20::,2001:1a20:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2001:1a28::,2001:1a28:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:1a30::,2001:1a30:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:1a38::,2001:1a38:ffff:ffff:ffff:ffff:ffff:ffff,IT
-2001:1a40::,2001:1a40:ffff:ffff:ffff:ffff:ffff:ffff,BH
-2001:1a48::,2001:1a48:ffff:ffff:ffff:ffff:ffff:ffff,CZ
-2001:1a50::,2001:1a50:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:1a58::,2001:1a58:ffff:ffff:ffff:ffff:ffff:ffff,ES
-2001:1a60::,2001:1a60:ffff:ffff:ffff:ffff:ffff:ffff,IT
-2001:1a68::,2001:1a68:ffff:ffff:ffff:ffff:ffff:ffff,PL
-2001:1a70::,2001:1a70:ffff:ffff:ffff:ffff:ffff:ffff,MT
-2001:1a78::,2001:1a78:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:1a80::,2001:1a80:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:1a88::,2001:1a8f:ffff:ffff:ffff:ffff:ffff:ffff,CH
-2001:1a90::,2001:1a90:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2001:1a98::,2001:1a9f:ffff:ffff:ffff:ffff:ffff:ffff,IS
-2001:1aa0::,2001:1aa7:ffff:ffff:ffff:ffff:ffff:ffff,HU
-2001:1aa8::,2001:1aa8:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2001:1ab0::,2001:1ab0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
-2001:1ab8::,2001:1abb:ffff:ffff:ffff:ffff:ffff:ffff,LT
-2001:1ac0::,2001:1ac0:ffff:ffff:ffff:ffff:ffff:ffff,IT
-2001:1ac8::,2001:1ac8:ffff:ffff:ffff:ffff:ffff:ffff,BG
-2001:1ad0::,2001:1ad0:ffff:ffff:ffff:ffff:ffff:ffff,AT
-2001:1ad8::,2001:1ad8:ffff:ffff:ffff:ffff:ffff:ffff,NO
-2001:1ae0::,2001:1ae0:ffff:ffff:ffff:ffff:ffff:ffff,BG
-2001:1ae8::,2001:1aef:ffff:ffff:ffff:ffff:ffff:ffff,CZ
-2001:1af0::,2001:1af7:ffff:ffff:ffff:ffff:ffff:ffff,HR
-2001:1af8::,2001:1af8:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2001:1a00::,2001:1aff:ffff:ffff:ffff:ffff:ffff:ffff,NO
2001:1b00::,2001:1b00:ffff:ffff:ffff:ffff:ffff:ffff,RU
2001:1b08::,2001:1b08:ffff:ffff:ffff:ffff:ffff:ffff,FR
2001:1b10::,2001:1b10:ffff:ffff:ffff:ffff:ffff:ffff,DE
2001:1b18::,2001:1b18:ffff:ffff:ffff:ffff:ffff:ffff,DE
2001:1b20::,2001:1b20:ffff:ffff:ffff:ffff:ffff:ffff,DE
2001:1b28::,2001:1b28:ffff:ffff:ffff:ffff:ffff:ffff,EE
-2001:1b30::,2001:1b30:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:1b30::,2001:1b37:ffff:ffff:ffff:ffff:ffff:ffff,DE
2001:1b38::,2001:1b38:ffff:ffff:ffff:ffff:ffff:ffff,FR
2001:1b40::,2001:1b40:ffff:ffff:ffff:ffff:ffff:ffff,GB
2001:1b48::,2001:1b48:ffff:ffff:ffff:ffff:ffff:ffff,FR
@@ -3049,7 +2888,7 @@
2001:1bd8::,2001:1bd8:ffff:ffff:ffff:ffff:ffff:ffff,IE
2001:1be0::,2001:1be0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2001:1be8::,2001:1be8:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2001:1bf0::,2001:1bf0:ffff:ffff:ffff:ffff:ffff:ffff,EE
+2001:1bf0::,2001:1bf7:ffff:ffff:ffff:ffff:ffff:ffff,EE
2001:1bf8::,2001:1bf8:ffff:ffff:ffff:ffff:ffff:ffff,LV
2001:1c00::,2001:1dff:ffff:ffff:ffff:ffff:ffff:ffff,NL
2001:4000::,2001:4000:ffff:ffff:ffff:ffff:ffff:ffff,FR
@@ -3143,7 +2982,7 @@
2001:4310::,2001:4310:ffff:ffff:ffff:ffff:ffff:ffff,MA
2001:4318::,2001:4318:ffff:ffff:ffff:ffff:ffff:ffff,CI
2001:4320::,2001:4320:ffff:ffff:ffff:ffff:ffff:ffff,BJ
-2001:4328::,2001:4328:ffff:ffff:ffff:ffff:ffff:ffff,RW
+2001:4328::,2001:4328:ffff:ffff:ffff:ffff:ffff:ffff,MU
2001:4330::,2001:4330:ffff:ffff:ffff:ffff:ffff:ffff,ZA
2001:4338::,2001:4338:ffff:ffff:ffff:ffff:ffff:ffff,SZ
2001:4340::,2001:4340:ffff:ffff:ffff:ffff:ffff:ffff,DZ
@@ -3157,7 +2996,7 @@
2001:43a0::,2001:43a0:ffff:ffff:ffff:ffff:ffff:ffff,TZ
2001:43a8::,2001:43a8:ffff:ffff:ffff:ffff:ffff:ffff,ZA
2001:43b0::,2001:43b0:ffff:ffff:ffff:ffff:ffff:ffff,NG
-2001:43b8::,2001:43b8:ffff:ffff:ffff:ffff:ffff:ffff,UG
+2001:43b8::,2001:43b8:ffff:ffff:ffff:ffff:ffff:ffff,MU
2001:43c0::,2001:43c0:ffff:ffff:ffff:ffff:ffff:ffff,GH
2001:43c8::,2001:43c8:ffff:ffff:ffff:ffff:ffff:ffff,EG
2001:43d0::,2001:43d0:ffff:ffff:ffff:ffff:ffff:ffff,KE
@@ -3165,7 +3004,7 @@
2001:43e0::,2001:43e0:ffff:ffff:ffff:ffff:ffff:ffff,GH
2001:43e8::,2001:43e8:ffff:ffff:ffff:ffff:ffff:ffff,ZA
2001:43f0::,2001:43f0:ffff:ffff:ffff:ffff:ffff:ffff,ZW
-2001:43f8::,2001:43f8::ffff:ffff:ffff:ffff:ffff,TZ
+2001:43f8::,2001:43f8:1:ffff:ffff:ffff:ffff:ffff,TZ
2001:43f8:10::,2001:43f8:10:ffff:ffff:ffff:ffff:ffff,KE
2001:43f8:20::,2001:43f8:20:ffff:ffff:ffff:ffff:ffff,ZA
2001:43f8:30::,2001:43f8:30:ffff:ffff:ffff:ffff:ffff,ZA
@@ -3177,6 +3016,7 @@
2001:43f8:a0::,2001:43f8:a0:ffff:ffff:ffff:ffff:ffff,ZA
2001:43f8:b0::,2001:43f8:b0:ffff:ffff:ffff:ffff:ffff,SL
2001:43f8:c0::,2001:43f8:c0:ffff:ffff:ffff:ffff:ffff,KE
+2001:43f8:d0::,2001:43f8:d0:ffff:ffff:ffff:ffff:ffff,MU
2001:43f8:e0::,2001:43f8:e0:ffff:ffff:ffff:ffff:ffff,TZ
2001:43f8:100::,2001:43f8:100:ffff:ffff:ffff:ffff:ffff,ZA
2001:43f8:110::,2001:43f8:110:ffff:ffff:ffff:ffff:ffff,MU
@@ -3195,6 +3035,7 @@
2001:43f8:1f0::,2001:43f8:1f5:ffff:ffff:ffff:ffff:ffff,ZA
2001:43f8:200::,2001:43f8:200:ffff:ffff:ffff:ffff:ffff,KE
2001:43f8:210::,2001:43f8:210:ffff:ffff:ffff:ffff:ffff,LS
+2001:43f8:220::,2001:43f8:220:ffff:ffff:ffff:ffff:ffff,MU
2001:43f8:230::,2001:43f8:230:ffff:ffff:ffff:ffff:ffff,ZA
2001:43f8:240::,2001:43f8:241:ffff:ffff:ffff:ffff:ffff,GH
2001:43f8:250::,2001:43f8:250:ffff:ffff:ffff:ffff:ffff,KE
@@ -3255,6 +3096,10 @@
2001:43f8:950::,2001:43f8:950:ffff:ffff:ffff:ffff:ffff,ZA
2001:43f8:960::,2001:43f8:960:ffff:ffff:ffff:ffff:ffff,ZA
2001:43f8:970::,2001:43f8:970:ffff:ffff:ffff:ffff:ffff,GM
+2001:43f8:980::,2001:43f8:981:ffff:ffff:ffff:ffff:ffff,NA
+2001:43f8:990::,2001:43f8:991:ffff:ffff:ffff:ffff:ffff,BI
+2001:43f8:9a0::,2001:43f8:9a0:ffff:ffff:ffff:ffff:ffff,BJ
+2001:43f8:9b0::,2001:43f8:9b1:ffff:ffff:ffff:ffff:ffff,SZ
2001:4400::,2001:4403:ffff:ffff:ffff:ffff:ffff:ffff,NZ
2001:4408::,2001:4408:ffff:ffff:ffff:ffff:ffff:ffff,IN
2001:4410::,2001:4410:ffff:ffff:ffff:ffff:ffff:ffff,NZ
@@ -3382,36 +3227,7 @@
2001:4be8::,2001:4be8:ffff:ffff:ffff:ffff:ffff:ffff,GB
2001:4bf0::,2001:4bf0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2001:4bf8::,2001:4bf8:ffff:ffff:ffff:ffff:ffff:ffff,CH
-2001:4c00::,2001:4c00:ffff:ffff:ffff:ffff:ffff:ffff,IT
-2001:4c08::,2001:4c08:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2001:4c10::,2001:4c10:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2001:4c20::,2001:4c20:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2001:4c28::,2001:4c28:ffff:ffff:ffff:ffff:ffff:ffff,NO
-2001:4c30::,2001:4c30:ffff:ffff:ffff:ffff:ffff:ffff,PL
-2001:4c38::,2001:4c3f:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2001:4c40::,2001:4c40:ffff:ffff:ffff:ffff:ffff:ffff,BE
-2001:4c48::,2001:4c4f:ffff:ffff:ffff:ffff:ffff:ffff,HU
-2001:4c50::,2001:4c57:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:4c58::,2001:4c5f:ffff:ffff:ffff:ffff:ffff:ffff,PL
-2001:4c60::,2001:4c60:ffff:ffff:ffff:ffff:ffff:ffff,ES
-2001:4c68::,2001:4c68:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:4c70::,2001:4c70:ffff:ffff:ffff:ffff:ffff:ffff,PL
-2001:4c78::,2001:4c78:ffff:ffff:ffff:ffff:ffff:ffff,CH
-2001:4c80::,2001:4c80:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:4c88::,2001:4c88:ffff:ffff:ffff:ffff:ffff:ffff,IR
-2001:4c90::,2001:4c97:ffff:ffff:ffff:ffff:ffff:ffff,IT
-2001:4c98::,2001:4c98:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:4ca0::,2001:4ca0:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:4ca8::,2001:4ca8:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:4cb0::,2001:4cb0:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2001:4cb8::,2001:4cb8:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2001:4cc0::,2001:4cc0:ffff:ffff:ffff:ffff:ffff:ffff,PT
-2001:4cc8::,2001:4cc8:ffff:ffff:ffff:ffff:ffff:ffff,CZ
-2001:4cd0::,2001:4cd0:ffff:ffff:ffff:ffff:ffff:ffff,IL
-2001:4cd8::,2001:4cd8:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:4ce0::,2001:4ce0:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:4ce8::,2001:4cf0:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:4cf8::,2001:4cf8:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:4c00::,2001:4cff:ffff:ffff:ffff:ffff:ffff:ffff,DJ
2001:4d00::,2001:4d00:ffff:ffff:ffff:ffff:ffff:ffff,AM
2001:4d08::,2001:4d08:ffff:ffff:ffff:ffff:ffff:ffff,DE
2001:4d10::,2001:4d10:ffff:ffff:ffff:ffff:ffff:ffff,ES
@@ -3451,7 +3267,6 @@
2400:1100::,2400:1100:ffff:ffff:ffff:ffff:ffff:ffff,HK
2400:1180::,2400:1180:ffff:ffff:ffff:ffff:ffff:ffff,HK
2400:1200::,2400:1200:ffff:ffff:ffff:ffff:ffff:ffff,NZ
-2400:1280::,2400:1280:ffff:ffff:ffff:ffff:ffff:ffff,HK
2400:1300::,2400:1300:ffff:ffff:ffff:ffff:ffff:ffff,TW
2400:1380::,2400:1380:ffff:ffff:ffff:ffff:ffff:ffff,CN
2400:1400::,2400:1400:ffff:ffff:ffff:ffff:ffff:ffff,ID
@@ -3680,112 +3495,225 @@
2400:9800::,2400:9800:ffff:ffff:ffff:ffff:ffff:ffff,ID
2400:9880::,2400:9880:ffff:ffff:ffff:ffff:ffff:ffff,AU
2400:9900::,2400:9900:ffff:ffff:ffff:ffff:ffff:ffff,NP
+2400:9980::,2400:9980:ffff:ffff:ffff:ffff:ffff:ffff,IN
2400:9a00::,2400:9a00:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2400:9a80::,2400:9a80:ffff:ffff:ffff:ffff:ffff:ffff,AU
2400:9b00::,2400:9b00:ffff:ffff:ffff:ffff:ffff:ffff,NP
+2400:9b80::,2400:9b80:ffff:ffff:ffff:ffff:ffff:ffff,AU
2400:9c00::,2400:9c00:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2400:9c80::,2400:9c80:ffff:ffff:ffff:ffff:ffff:ffff,ID
2400:9d00::,2400:9d00:ffff:ffff:ffff:ffff:ffff:ffff,PH
+2400:9d80::,2400:9d80:ffff:ffff:ffff:ffff:ffff:ffff,IN
2400:9e00::,2400:9e00:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2400:9e80::,2400:9e80:ffff:ffff:ffff:ffff:ffff:ffff,KR
+2400:9f80::,2400:9f80:ffff:ffff:ffff:ffff:ffff:ffff,KR
2400:a000::,2400:a000:ffff:ffff:ffff:ffff:ffff:ffff,IN
+2400:a080::,2400:a080:ffff:ffff:ffff:ffff:ffff:ffff,JP
2400:a100::,2400:a100:ffff:ffff:ffff:ffff:ffff:ffff,NP
+2400:a180::,2400:a180:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2400:a280::,2400:a280:ffff:ffff:ffff:ffff:ffff:ffff,AU
2400:a300::,2400:a300:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2400:a380::,2400:a380:ffff:ffff:ffff:ffff:ffff:ffff,CN
2400:a400::,2400:a400:ffff:ffff:ffff:ffff:ffff:ffff,NP
+2400:a480::,2400:a480:ffff:ffff:ffff:ffff:ffff:ffff,CN
2400:a500::,2400:a500:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2400:a580::,2400:a580:ffff:ffff:ffff:ffff:ffff:ffff,KR
2400:a600::,2400:a600:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2400:a680::,2400:a680:ffff:ffff:ffff:ffff:ffff:ffff,ID
2400:a700::,2400:a700:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2400:a780::,2400:a780:ffff:ffff:ffff:ffff:ffff:ffff,CN
2400:a800::,2400:a800:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2400:a880::,2400:a880:ffff:ffff:ffff:ffff:ffff:ffff,AU
2400:a900::,2400:a900:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2400:a980::,2400:a980:ffff:ffff:ffff:ffff:ffff:ffff,CN
2400:aa00::,2400:aa00:ffff:ffff:ffff:ffff:ffff:ffff,LA
+2400:aa80::,2400:aa80:ffff:ffff:ffff:ffff:ffff:ffff,TW
2400:ab00::,2400:ab00:ffff:ffff:ffff:ffff:ffff:ffff,KR
+2400:ab80::,2400:ab80:ffff:ffff:ffff:ffff:ffff:ffff,NZ
2400:ac00::,2400:ac00:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2400:ac80::,2400:ac80:ffff:ffff:ffff:ffff:ffff:ffff,SG
2400:ad00::,2400:ad00:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2400:ad80::,2400:ad80:ffff:ffff:ffff:ffff:ffff:ffff,NZ
2400:ae00::,2400:ae00:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2400:ae80::,2400:ae80:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2400:af80::,2400:af80:ffff:ffff:ffff:ffff:ffff:ffff,JP
2400:b000::,2400:b000:ffff:ffff:ffff:ffff:ffff:ffff,PH
+2400:b080::,2400:b080:ffff:ffff:ffff:ffff:ffff:ffff,ID
2400:b100::,2400:b100:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2400:b180::,2400:b180:ffff:ffff:ffff:ffff:ffff:ffff,ID
2400:b200::,2400:b200:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2400:b280::,2400:b280:ffff:ffff:ffff:ffff:ffff:ffff,AU
2400:b300::,2400:b300:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2400:b380::,2400:b380:ffff:ffff:ffff:ffff:ffff:ffff,TW
2400:b400::,2400:b400:ffff:ffff:ffff:ffff:ffff:ffff,NZ
+2400:b480::,2400:b480:ffff:ffff:ffff:ffff:ffff:ffff,TW
2400:b500::,2400:b500:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2400:b580::,2400:b580:ffff:ffff:ffff:ffff:ffff:ffff,IN
2400:b600::,2400:b600:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2400:b680::,2400:b680:ffff:ffff:ffff:ffff:ffff:ffff,JP
2400:b700::,2400:b700:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2400:b780::,2400:b780:ffff:ffff:ffff:ffff:ffff:ffff,AU
2400:b800::,2400:b800:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2400:b880::,2400:b880:ffff:ffff:ffff:ffff:ffff:ffff,AU
2400:b900::,2400:b900:ffff:ffff:ffff:ffff:ffff:ffff,PH
+2400:b980::,2400:b980:ffff:ffff:ffff:ffff:ffff:ffff,ID
2400:ba00::,2400:ba00:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2400:ba80::,2400:ba80:ffff:ffff:ffff:ffff:ffff:ffff,HK
2400:bb00::,2400:bb00:ffff:ffff:ffff:ffff:ffff:ffff,SG
+2400:bb80::,2400:bb80:ffff:ffff:ffff:ffff:ffff:ffff,AU
2400:bc00::,2400:bc00:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2400:bc80::,2400:bc80:ffff:ffff:ffff:ffff:ffff:ffff,VN
2400:bd00::,2400:bd00:ffff:ffff:ffff:ffff:ffff:ffff,NZ
+2400:bd80::,2400:bd80:ffff:ffff:ffff:ffff:ffff:ffff,HK
2400:be00::,2400:be00:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2400:be80::,2400:be80:ffff:ffff:ffff:ffff:ffff:ffff,HK
2400:bf00::,2400:bf00:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2400:bf80::,2400:bf80:ffff:ffff:ffff:ffff:ffff:ffff,ID
2400:c000::,2400:c000:ffff:ffff:ffff:ffff:ffff:ffff,NZ
+2400:c080::,2400:c080:ffff:ffff:ffff:ffff:ffff:ffff,ID
2400:c100::,2400:c100:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2400:c180::,2400:c180:ffff:ffff:ffff:ffff:ffff:ffff,LA
2400:c200::,2400:c200:ffff:ffff:ffff:ffff:ffff:ffff,CN
2400:c300::,2400:c300:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2400:c380::,2400:c380:ffff:ffff:ffff:ffff:ffff:ffff,CN
2400:c400::,2400:c400:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2400:c480::,2400:c480:ffff:ffff:ffff:ffff:ffff:ffff,HK
2400:c500::,2400:c500:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2400:c580::,2400:c580:ffff:ffff:ffff:ffff:ffff:ffff,NZ
2400:c600::,2400:c600:ffff:ffff:ffff:ffff:ffff:ffff,BD
+2400:c680::,2400:c680:ffff:ffff:ffff:ffff:ffff:ffff,HK
2400:c700::,2400:c700:ffff:ffff:ffff:ffff:ffff:ffff,IN
-2400:c800::,2400:c800:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2400:c780::,2400:c780:ffff:ffff:ffff:ffff:ffff:ffff,TW
+2400:c800::,2400:c807:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2400:c880::,2400:c880:ffff:ffff:ffff:ffff:ffff:ffff,IN
2400:c900::,2400:c900:ffff:ffff:ffff:ffff:ffff:ffff,ID
+2400:c980::,2400:c980:ffff:ffff:ffff:ffff:ffff:ffff,SG
2400:ca00::,2400:ca00:ffff:ffff:ffff:ffff:ffff:ffff,BD
+2400:ca80::,2400:ca80:ffff:ffff:ffff:ffff:ffff:ffff,AU
2400:cb00::,2400:cb00:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2400:cb80::,2400:cb80:ffff:ffff:ffff:ffff:ffff:ffff,CN
2400:cc00::,2400:cc00:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2400:cc80::,2400:cc80:ffff:ffff:ffff:ffff:ffff:ffff,CN
2400:cd00::,2400:cd00:ffff:ffff:ffff:ffff:ffff:ffff,TH
+2400:cd80::,2400:cd80:ffff:ffff:ffff:ffff:ffff:ffff,ID
2400:ce00::,2400:ce00:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2400:ce80::,2400:ce80:ffff:ffff:ffff:ffff:ffff:ffff,BD
2400:cf00::,2400:cf00:ffff:ffff:ffff:ffff:ffff:ffff,KR
+2400:cf80::,2400:cf80:ffff:ffff:ffff:ffff:ffff:ffff,CN
2400:d000::,2400:d000:ffff:ffff:ffff:ffff:ffff:ffff,PH
+2400:d080::,2400:d080:ffff:ffff:ffff:ffff:ffff:ffff,AU
2400:d100::,2400:d100:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2400:d180::,2400:d180:ffff:ffff:ffff:ffff:ffff:ffff,IN
2400:d200::,2400:d200:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2400:d280::,2400:d280:ffff:ffff:ffff:ffff:ffff:ffff,IN
2400:d300::,2400:d300:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2400:d380::,2400:d380:ffff:ffff:ffff:ffff:ffff:ffff,CN
2400:d400::,2400:d400:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2400:d480::,2400:d480:ffff:ffff:ffff:ffff:ffff:ffff,AU
2400:d500::,2400:d500:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2400:d580::,2400:d580:ffff:ffff:ffff:ffff:ffff:ffff,TW
2400:d600::,2400:d600:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2400:d680::,2400:d680:ffff:ffff:ffff:ffff:ffff:ffff,ID
2400:d700::,2400:d700:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2400:d780::,2400:d780:ffff:ffff:ffff:ffff:ffff:ffff,CN
2400:d800::,2400:d803:ffff:ffff:ffff:ffff:ffff:ffff,SG
+2400:d880::,2400:d880:ffff:ffff:ffff:ffff:ffff:ffff,HK
2400:d900::,2400:d900:ffff:ffff:ffff:ffff:ffff:ffff,LK
+2400:d980::,2400:d980:ffff:ffff:ffff:ffff:ffff:ffff,BD
2400:da00::,2400:da00:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2400:da80::,2400:da80:ffff:ffff:ffff:ffff:ffff:ffff,SG
2400:db00::,2400:db00:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2400:db80::,2400:db80:ffff:ffff:ffff:ffff:ffff:ffff,MN
2400:dc00::,2400:dc00:ffff:ffff:ffff:ffff:ffff:ffff,ID
+2400:dc80::,2400:dc80:ffff:ffff:ffff:ffff:ffff:ffff,BD
2400:dd00::,2400:dd0f:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2400:dd80::,2400:dd80:ffff:ffff:ffff:ffff:ffff:ffff,BD
2400:de00::,2400:de00:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2400:de80::,2400:de80:ffff:ffff:ffff:ffff:ffff:ffff,CN
2400:df00::,2400:df00:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2400:df80::,2400:df80:ffff:ffff:ffff:ffff:ffff:ffff,MY
2400:e000::,2400:e000:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2400:e080::,2400:e080:ffff:ffff:ffff:ffff:ffff:ffff,HK
2400:e100::,2400:e100:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2400:e180::,2400:e180:ffff:ffff:ffff:ffff:ffff:ffff,KR
2400:e200::,2400:e200:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2400:e280::,2400:e280:ffff:ffff:ffff:ffff:ffff:ffff,HK
2400:e300::,2400:e300:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2400:e380::,2400:e380:ffff:ffff:ffff:ffff:ffff:ffff,HK
2400:e400::,2400:e400:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2400:e480::,2400:e480:ffff:ffff:ffff:ffff:ffff:ffff,TW
2400:e500::,2400:e500:ffff:ffff:ffff:ffff:ffff:ffff,AF
+2400:e580::,2400:e580:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2400:e680::,2400:e680:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2400:e780::,2400:e780:ffff:ffff:ffff:ffff:ffff:ffff,NZ
+2400:e880::,2400:e880:ffff:ffff:ffff:ffff:ffff:ffff,CN
2400:e900::,2400:e900:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2400:e980::,2400:e980:ffff:ffff:ffff:ffff:ffff:ffff,IN
2400:ea00::,2400:ea00:ffff:ffff:ffff:ffff:ffff:ffff,TH
+2400:ea80::,2400:ea80:ffff:ffff:ffff:ffff:ffff:ffff,IN
2400:eb00::,2400:eb00:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2400:eb80::,2400:eb80:ffff:ffff:ffff:ffff:ffff:ffff,BD
2400:ec00::,2400:ec00:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2400:ec80::,2400:ec80:ffff:ffff:ffff:ffff:ffff:ffff,SG
2400:ed00::,2400:ed00:ffff:ffff:ffff:ffff:ffff:ffff,SG
+2400:ed80::,2400:ed80:ffff:ffff:ffff:ffff:ffff:ffff,AU
2400:ee00::,2400:ee00:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2400:ee80::,2400:ee80:ffff:ffff:ffff:ffff:ffff:ffff,NZ
2400:ef00::,2400:ef00:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2400:ef80::,2400:ef80:ffff:ffff:ffff:ffff:ffff:ffff,HK
2400:f000::,2400:f000:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2400:f080::,2400:f080:ffff:ffff:ffff:ffff:ffff:ffff,IN
2400:f100::,2400:f100:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2400:f180::,2400:f180:ffff:ffff:ffff:ffff:ffff:ffff,SG
2400:f200::,2400:f200:ffff:ffff:ffff:ffff:ffff:ffff,PH
+2400:f280::,2400:f280:ffff:ffff:ffff:ffff:ffff:ffff,AU
2400:f300::,2400:f300:ffff:ffff:ffff:ffff:ffff:ffff,IN
+2400:f380::,2400:f380:ffff:ffff:ffff:ffff:ffff:ffff,AU
2400:f400::,2400:f400:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2400:f480::,2400:f480:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2400:f580::,2400:f580:ffff:ffff:ffff:ffff:ffff:ffff,ID
2400:f600::,2400:f600:ffff:ffff:ffff:ffff:ffff:ffff,PH
+2400:f680::,2400:f680:ffff:ffff:ffff:ffff:ffff:ffff,IN
2400:f700::,2400:f700:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2400:f780::,2400:f780:ffff:ffff:ffff:ffff:ffff:ffff,IN
2400:f800::,2400:f800:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2400:f880::,2400:f880:ffff:ffff:ffff:ffff:ffff:ffff,HK
2400:f900::,2400:f900:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2400:f980::,2400:f980:ffff:ffff:ffff:ffff:ffff:ffff,CN
2400:fa00::,2400:fa00:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2400:fa80::,2400:fa80:ffff:ffff:ffff:ffff:ffff:ffff,AU
2400:fb00::,2400:fb00:ffff:ffff:ffff:ffff:ffff:ffff,ID
+2400:fb80::,2400:fb80:ffff:ffff:ffff:ffff:ffff:ffff,SG
2400:fc00::,2400:fc00:ffff:ffff:ffff:ffff:ffff:ffff,PK
+2400:fc80::,2400:fc80:ffff:ffff:ffff:ffff:ffff:ffff,TW
2400:fd00::,2400:fd00:ffff:ffff:ffff:ffff:ffff:ffff,BD
+2400:fd80::,2400:fd80:ffff:ffff:ffff:ffff:ffff:ffff,KR
2400:fe00::,2400:fe00:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2400:fe80::,2400:fe80:ffff:ffff:ffff:ffff:ffff:ffff,AU
2400:ff00::,2400:ff00:ffff:ffff:ffff:ffff:ffff:ffff,LK
+2400:ff80::,2400:ff80:ffff:ffff:ffff:ffff:ffff:ffff,AF
2401::,2401:1:ffff:ffff:ffff:ffff:ffff:ffff,PK
+2401:80::,2401:80:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:100::,2401:100:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:180::,2401:180:ffff:ffff:ffff:ffff:ffff:ffff,ID
2401:200::,2401:200:ffff:ffff:ffff:ffff:ffff:ffff,MY
+2401:280::,2401:280:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:300::,2401:300:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2401:380::,2401:380:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:400::,2401:400:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:480::,2401:480:ffff:ffff:ffff:ffff:ffff:ffff,PH
2401:500::,2401:500:ffff:ffff:ffff:ffff:ffff:ffff,TH
+2401:580::,2401:580:ffff:ffff:ffff:ffff:ffff:ffff,BD
2401:600::,2401:600:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2401:680::,2401:680:ffff:ffff:ffff:ffff:ffff:ffff,JP
2401:700::,2401:700:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:780::,2401:780:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:800::,2401:800:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:880::,2401:880:ffff:ffff:ffff:ffff:ffff:ffff,MY
2401:900::,2401:900:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2401:980::,2401:980:ffff:ffff:ffff:ffff:ffff:ffff,JP
2401:a00::,2401:a00:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:a80::,2401:a80:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:b00::,2401:b00:ffff:ffff:ffff:ffff:ffff:ffff,MY
2401:c00::,2401:c00:ffff:ffff:ffff:ffff:ffff:ffff,NC
2401:d00::,2401:d00:ffff:ffff:ffff:ffff:ffff:ffff,SG
@@ -3902,7 +3830,6 @@
2401:8d00::,2401:8d00:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:8e00::,2401:8e00:ffff:ffff:ffff:ffff:ffff:ffff,PK
2401:8f00::,2401:8f00:ffff:ffff:ffff:ffff:ffff:ffff,ID
-2401:9000::,2401:9000:ffff:ffff:ffff:ffff:ffff:ffff,ID
2401:9100::,2401:9100:ffff:ffff:ffff:ffff:ffff:ffff,MO
2401:9200::,2401:9200:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:9300::,2401:9300:ffff:ffff:ffff:ffff:ffff:ffff,AU
@@ -4115,7 +4042,7 @@
2402:6800::,2402:6800:ffff:ffff:ffff:ffff:ffff:ffff,JP
2402:6900::,2402:6900:ffff:ffff:ffff:ffff:ffff:ffff,AU
2402:6a00::,2402:6a00:ffff:ffff:ffff:ffff:ffff:ffff,CN
-2402:6b00::,2402:6b00:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2402:6b00::,2402:6bff:ffff:ffff:ffff:ffff:ffff:ffff,KE
2402:6c00::,2402:6c00:ffff:ffff:ffff:ffff:ffff:ffff,MY
2402:6d00::,2402:6d00:ffff:ffff:ffff:ffff:ffff:ffff,PF
2402:6e00::,2402:6e00:ffff:ffff:ffff:ffff:ffff:ffff,CN
@@ -4180,7 +4107,6 @@
2402:ad00::,2402:ad00:ffff:ffff:ffff:ffff:ffff:ffff,AU
2402:ae00::,2402:ae00:ffff:ffff:ffff:ffff:ffff:ffff,CN
2402:af00::,2402:af00:ffff:ffff:ffff:ffff:ffff:ffff,AU
-2402:b000::,2402:b000:ffff:ffff:ffff:ffff:ffff:ffff,JP
2402:b100::,2402:b100:ffff:ffff:ffff:ffff:ffff:ffff,AU
2402:b200::,2402:b200:ffff:ffff:ffff:ffff:ffff:ffff,CN
2402:b300::,2402:b300:ffff:ffff:ffff:ffff:ffff:ffff,JP
@@ -4248,7 +4174,7 @@
2402:f300::,2402:f300:ffff:ffff:ffff:ffff:ffff:ffff,NZ
2402:f400::,2402:f400:ffff:ffff:ffff:ffff:ffff:ffff,KR
2402:f500::,2402:f500:ffff:ffff:ffff:ffff:ffff:ffff,BD
-2402:f600::,2402:f600:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2402:f600::,2402:f600:ffff:ffff:ffff:ffff:ffff:ffff,NZ
2402:f700::,2402:f700:ffff:ffff:ffff:ffff:ffff:ffff,AU
2402:f800::,2402:f800:ffff:ffff:ffff:ffff:ffff:ffff,VN
2402:f900::,2402:f900:ffff:ffff:ffff:ffff:ffff:ffff,NZ
@@ -4300,7 +4226,6 @@
2403:2800::,2403:2801:ffff:ffff:ffff:ffff:ffff:ffff,TH
2403:2900::,2403:2900:ffff:ffff:ffff:ffff:ffff:ffff,IN
2403:2a00::,2403:2a00:ffff:ffff:ffff:ffff:ffff:ffff,CN
-2403:2b00::,2403:2b00:ffff:ffff:ffff:ffff:ffff:ffff,IN
2403:2c00::,2403:2c00:ffff:ffff:ffff:ffff:ffff:ffff,HK
2403:2d00::,2403:2d00:ffff:ffff:ffff:ffff:ffff:ffff,JP
2403:2e00::,2403:2e00:ffff:ffff:ffff:ffff:ffff:ffff,ID
@@ -4366,7 +4291,6 @@
2403:6c00::,2403:6c00:ffff:ffff:ffff:ffff:ffff:ffff,JP
2403:6d00::,2403:6d00:ffff:ffff:ffff:ffff:ffff:ffff,SG
2403:6e00::,2403:6e00:ffff:ffff:ffff:ffff:ffff:ffff,AU
-2403:6f00::,2403:6f00:ffff:ffff:ffff:ffff:ffff:ffff,MY
2403:7000::,2403:7000:ffff:ffff:ffff:ffff:ffff:ffff,NZ
2403:7100::,2403:7100:ffff:ffff:ffff:ffff:ffff:ffff,IN
2403:7200::,2403:7200:ffff:ffff:ffff:ffff:ffff:ffff,ID
@@ -4722,7 +4646,7 @@
2404:c500::,2404:c500:ffff:ffff:ffff:ffff:ffff:ffff,HK
2404:c600::,2404:c600:ffff:ffff:ffff:ffff:ffff:ffff,AU
2404:c700::,2404:c700:ffff:ffff:ffff:ffff:ffff:ffff,JP
-2404:c800::,2404:c800:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2404:c800::,2404:c807:ffff:ffff:ffff:ffff:ffff:ffff,HK
2404:c900::,2404:c900:ffff:ffff:ffff:ffff:ffff:ffff,BD
2404:ca00::,2404:ca00:ffff:ffff:ffff:ffff:ffff:ffff,JP
2404:cb00::,2404:cb00:ffff:ffff:ffff:ffff:ffff:ffff,JP
@@ -4754,7 +4678,7 @@
2404:e500::,2404:e500:ffff:ffff:ffff:ffff:ffff:ffff,ID
2404:e600::,2404:e600:ffff:ffff:ffff:ffff:ffff:ffff,SG
2404:e700::,2404:e700:ffff:ffff:ffff:ffff:ffff:ffff,ID
-2404:e800::,2404:e801:ffff:ffff:ffff:ffff:ffff:ffff,SG
+2404:e800::,2404:e8ff:ffff:ffff:ffff:ffff:ffff:ffff,SH
2404:e900::,2404:e900:ffff:ffff:ffff:ffff:ffff:ffff,ID
2404:ea00::,2404:ea00:ffff:ffff:ffff:ffff:ffff:ffff,AU
2404:eb00::,2404:eb00:ffff:ffff:ffff:ffff:ffff:ffff,ID
@@ -4815,7 +4739,6 @@
2405:2500::,2405:2500:ffff:ffff:ffff:ffff:ffff:ffff,TH
2405:2600::,2405:2600:ffff:ffff:ffff:ffff:ffff:ffff,NZ
2405:2700::,2405:2700:ffff:ffff:ffff:ffff:ffff:ffff,JP
-2405:2800::,2405:2800:ffff:ffff:ffff:ffff:ffff:ffff,JP
2405:2900::,2405:2900:ffff:ffff:ffff:ffff:ffff:ffff,MY
2405:2a00::,2405:2a00:ffff:ffff:ffff:ffff:ffff:ffff,JP
2405:2b00::,2405:2b00:ffff:ffff:ffff:ffff:ffff:ffff,AU
@@ -4869,6 +4792,7 @@
2405:5b00::,2405:5b00:ffff:ffff:ffff:ffff:ffff:ffff,CN
2405:5c00::,2405:5c00:ffff:ffff:ffff:ffff:ffff:ffff,HK
2405:5d00::,2405:5d00:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2405:5e00::,2405:5e00:ffff:ffff:ffff:ffff:ffff:ffff,HK
2405:5f00::,2405:5f00:ffff:ffff:ffff:ffff:ffff:ffff,KR
2405:6000::,2405:6000:ffff:ffff:ffff:ffff:ffff:ffff,NZ
2405:6100::,2405:6100:ffff:ffff:ffff:ffff:ffff:ffff,TW
@@ -4992,7 +4916,6 @@
2405:da00::,2405:da00:ffff:ffff:ffff:ffff:ffff:ffff,KH
2405:db00::,2405:db00:ffff:ffff:ffff:ffff:ffff:ffff,AU
2405:dc00::,2405:dc00:ffff:ffff:ffff:ffff:ffff:ffff,AU
-2405:df00::,2405:df00:ffff:ffff:ffff:ffff:ffff:ffff,BD
2405:e000::,2405:e000:ffff:ffff:ffff:ffff:ffff:ffff,CN
2405:e100::,2405:e100:ffff:ffff:ffff:ffff:ffff:ffff,IN
2405:e200::,2405:e200:ffff:ffff:ffff:ffff:ffff:ffff,IN
@@ -5142,11 +5065,9 @@
2406:7400::,2406:7400:ffff:ffff:ffff:ffff:ffff:ffff,IN
2406:7500::,2406:7500:ffff:ffff:ffff:ffff:ffff:ffff,AU
2406:7600::,2406:7600:ffff:ffff:ffff:ffff:ffff:ffff,AU
-2406:7700::,2406:7700:ffff:ffff:ffff:ffff:ffff:ffff,MY
2406:7800::,2406:7801:ffff:ffff:ffff:ffff:ffff:ffff,BN
2406:7900::,2406:7900:ffff:ffff:ffff:ffff:ffff:ffff,TH
2406:7a00::,2406:7a00:ffff:ffff:ffff:ffff:ffff:ffff,ID
-2406:7b00::,2406:7b00:ffff:ffff:ffff:ffff:ffff:ffff,TW
2406:7c00::,2406:7c00:ffff:ffff:ffff:ffff:ffff:ffff,AU
2406:7d00::,2406:7d00:ffff:ffff:ffff:ffff:ffff:ffff,CN
2406:7e00::,2406:7e00:ffff:ffff:ffff:ffff:ffff:ffff,ID
@@ -5154,7 +5075,6 @@
2406:8000::,2406:8000:ffff:ffff:ffff:ffff:ffff:ffff,JP
2406:8100::,2406:8100:ffff:ffff:ffff:ffff:ffff:ffff,HK
2406:8200::,2406:8200:ffff:ffff:ffff:ffff:ffff:ffff,NZ
-2406:8300::,2406:8300:ffff:ffff:ffff:ffff:ffff:ffff,SG
2406:8400::,2406:8400:ffff:ffff:ffff:ffff:ffff:ffff,PK
2406:8500::,2406:8500:ffff:ffff:ffff:ffff:ffff:ffff,CN
2406:8600::,2406:8600:ffff:ffff:ffff:ffff:ffff:ffff,IN
@@ -5175,7 +5095,6 @@
2406:9500::,2406:9500:ffff:ffff:ffff:ffff:ffff:ffff,IN
2406:9600::,2406:9600:ffff:ffff:ffff:ffff:ffff:ffff,ID
2406:9700::,2406:9700:ffff:ffff:ffff:ffff:ffff:ffff,AU
-2406:9800::,2406:9800:ffff:ffff:ffff:ffff:ffff:ffff,AU
2406:9900::,2406:9900:ffff:ffff:ffff:ffff:ffff:ffff,JP
2406:9a00::,2406:9a01:ffff:ffff:ffff:ffff:ffff:ffff,NZ
2406:9b00::,2406:9b00:ffff:ffff:ffff:ffff:ffff:ffff,BD
@@ -5245,7 +5164,7 @@
2406:dd00::,2406:dd00:ffff:ffff:ffff:ffff:ffff:ffff,CN
2406:de00::,2406:de00:ffff:ffff:ffff:ffff:ffff:ffff,IN
2406:df00::,2406:df00:ffff:ffff:ffff:ffff:ffff:ffff,BD
-2406:e000::,2406:e000:ffff:ffff:ffff:ffff:ffff:ffff,NZ
+2406:e000::,2406:e007:ffff:ffff:ffff:ffff:ffff:ffff,NZ
2406:e100::,2406:e100:ffff:ffff:ffff:ffff:ffff:ffff,PH
2406:e200::,2406:e200:ffff:ffff:ffff:ffff:ffff:ffff,HK
2406:e300::,2406:e300:ffff:ffff:ffff:ffff:ffff:ffff,HK
@@ -5303,7 +5222,6 @@
2407:1700::,2407:1700:ffff:ffff:ffff:ffff:ffff:ffff,AU
2407:1800::,2407:1800:ffff:ffff:ffff:ffff:ffff:ffff,PG
2407:1900::,2407:1900:ffff:ffff:ffff:ffff:ffff:ffff,CN
-2407:1a00::,2407:1a00:ffff:ffff:ffff:ffff:ffff:ffff,AU
2407:1b00::,2407:1b00:ffff:ffff:ffff:ffff:ffff:ffff,PK
2407:1c00::,2407:1c00:ffff:ffff:ffff:ffff:ffff:ffff,SG
2407:1d00::,2407:1d00:ffff:ffff:ffff:ffff:ffff:ffff,CN
@@ -5421,7 +5339,6 @@
2407:8f00::,2407:8f00:ffff:ffff:ffff:ffff:ffff:ffff,JP
2407:9000::,2407:9000:ffff:ffff:ffff:ffff:ffff:ffff,AU
2407:9100::,2407:9100:ffff:ffff:ffff:ffff:ffff:ffff,KR
-2407:9200::,2407:9200:ffff:ffff:ffff:ffff:ffff:ffff,PG
2407:9300::,2407:9300:ffff:ffff:ffff:ffff:ffff:ffff,IN
2407:9400::,2407:9400:ffff:ffff:ffff:ffff:ffff:ffff,MY
2407:9500::,2407:9500:ffff:ffff:ffff:ffff:ffff:ffff,NP
@@ -5529,16 +5446,18 @@
2407:ff00::,2407:ff00:ffff:ffff:ffff:ffff:ffff:ffff,IN
2408::,2408:3ff:ffff:ffff:ffff:ffff:ffff:ffff,JP
2408:8000::,2408:8fff:ffff:ffff:ffff:ffff:ffff:ffff,CN
-2409::,2409:3ff:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2409:10::,2409:1f:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2409:250::,2409:25f:ffff:ffff:ffff:ffff:ffff:ffff,JP
2409:8000::,2409:8fff:ffff:ffff:ffff:ffff:ffff:ffff,CN
240a::,240a:7f:ffff:ffff:ffff:ffff:ffff:ffff,JP
240a:8000::,240a:87ff:ffff:ffff:ffff:ffff:ffff:ffff,CN
-240b::,240b:3ff:ffff:ffff:ffff:ffff:ffff:ffff,JP
+240b::,240b:3f:ffff:ffff:ffff:ffff:ffff:ffff,JP
+240b:240::,240b:27f:ffff:ffff:ffff:ffff:ffff:ffff,JP
240b:8000::,240b:87ff:ffff:ffff:ffff:ffff:ffff:ffff,CN
240c::,240c:f:ffff:ffff:ffff:ffff:ffff:ffff,CN
240d::,240d:1f:ffff:ffff:ffff:ffff:ffff:ffff,JP
240e::,240e:fff:ffff:ffff:ffff:ffff:ffff:ffff,CN
-240f::,240f:ff:ffff:ffff:ffff:ffff:ffff:ffff,JP
+240f::,240f:ff:ffff:ffff:ffff:ffff:ffff:ffff,KE
2600::,2600:7:ffff:ffff:ffff:ffff:ffff:ffff,US
2600:100::,2600:10f:ffff:ffff:ffff:ffff:ffff:ffff,US
2600:200::,2600:20f:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -5549,7 +5468,12 @@
2600:b00::,2600:b0f:ffff:ffff:ffff:ffff:ffff:ffff,US
2600:c00::,2600:c14:ffff:ffff:ffff:ffff:ffff:ffff,US
2600:d00::,2600:d0f:ffff:ffff:ffff:ffff:ffff:ffff,CA
-2600:f00::,2600:1017:ffff:ffff:ffff:ffff:ffff:ffff,US
+2600:f00::,2600:fff:ffff:ffff:ffff:ffff:ffff:ffff,US
+2600:1000::,2600:1007:ffff:ffff:ffff:ffff:ffff:ffff,UY
+2600:1008::,2600:1009:ffff:ffff:ffff:ffff:ffff:ffff,ZA
+2600:100a::,2600:100b:ffff:ffff:ffff:ffff:ffff:ffff,US
+2600:100c::,2600:100d:ffff:ffff:ffff:ffff:ffff:ffff,EG
+2600:100e::,2600:1017:ffff:ffff:ffff:ffff:ffff:ffff,US
2600:1100::,2600:110f:ffff:ffff:ffff:ffff:ffff:ffff,US
2600:1200::,2600:130f:ffff:ffff:ffff:ffff:ffff:ffff,US
2600:1400::,2600:141f:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -5581,7 +5505,7 @@
2600:7400::,2600:740f:ffff:ffff:ffff:ffff:ffff:ffff,US
2600:8000::,2600:80ff:ffff:ffff:ffff:ffff:ffff:ffff,US
2600:e000::,2600:e00f:ffff:ffff:ffff:ffff:ffff:ffff,CA
-2601::,2601:f:ffff:ffff:ffff:ffff:ffff:ffff,US
+2601::,2601:ff:ffff:ffff:ffff:ffff:ffff:ffff,UY
2602::,2602:10f:ffff:ffff:ffff:ffff:ffff:ffff,US
2602:200::,2602:200:ffff:ffff:ffff:ffff:ffff:ffff,CA
2602:210::,2602:210:ffff:ffff:ffff:ffff:ffff:ffff,CA
@@ -5676,8 +5600,7 @@
2604:1e80::,2604:1e80:ffff:ffff:ffff:ffff:ffff:ffff,CA
2604:1f00::,2604:1f00:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:1f80::,2604:1f80:ffff:ffff:ffff:ffff:ffff:ffff,CA
-2604:2000::,2604:2000:ffff:ffff:ffff:ffff:ffff:ffff,US
-2604:2080::,2604:2080:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:2000::,2604:20ff:ffff:ffff:ffff:ffff:ffff:ffff,GH
2604:2100::,2604:2100:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:2180::,2604:2180:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:2200::,2604:2200:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -5804,8 +5727,7 @@
2604:5e80::,2604:5e80:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:5f00::,2604:5f00:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:5f80::,2604:5f80:ffff:ffff:ffff:ffff:ffff:ffff,US
-2604:6000::,2604:6000:ffff:ffff:ffff:ffff:ffff:ffff,US
-2604:6080::,2604:6080:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:6000::,2604:60ff:ffff:ffff:ffff:ffff:ffff:ffff,KE
2604:6100::,2604:6100:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:6180::,2604:6180:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:6200::,2604:6200:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -6199,7 +6121,7 @@
2605:5d00::,2605:5d00:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:5e00::,2605:5e00:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:5f00::,2605:5f00:ffff:ffff:ffff:ffff:ffff:ffff,US
-2605:6000::,2605:6000:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:6000::,2605:60ff:ffff:ffff:ffff:ffff:ffff:ffff,EG
2605:6100::,2605:6100:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:6200::,2605:6200:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:6300::,2605:6300:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -6263,13 +6185,13 @@
2605:9d00::,2605:9d00:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:9e00::,2605:9e00:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:9f00::,2605:9f00:ffff:ffff:ffff:ffff:ffff:ffff,US
-2605:a000::,2605:a000:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:a000::,2605:a0ff:ffff:ffff:ffff:ffff:ffff:ffff,ZW
2605:a100::,2605:a100:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:a200::,2605:a200:ffff:ffff:ffff:ffff:ffff:ffff,JM
2605:a300::,2605:a300:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:a400::,2605:a407:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:a500::,2605:a500:ffff:ffff:ffff:ffff:ffff:ffff,US
-2605:a600::,2605:a601:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:a600::,2605:a6ff:ffff:ffff:ffff:ffff:ffff:ffff,EG
2605:a700::,2605:a700:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:a800::,2605:a800:ffff:ffff:ffff:ffff:ffff:ffff,CA
2605:a900::,2605:a900:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -6327,7 +6249,7 @@
2605:dd00::,2605:dd00:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:de00::,2605:de00:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:df00::,2605:df00:ffff:ffff:ffff:ffff:ffff:ffff,US
-2605:e000::,2605:e000:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:e000::,2605:e0ff:ffff:ffff:ffff:ffff:ffff:ffff,ZA
2605:e100::,2605:e100:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:e200::,2605:e200:ffff:ffff:ffff:ffff:ffff:ffff,CA
2605:e300::,2605:e300:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -6454,7 +6376,7 @@
2606:5d00::,2606:5d00:ffff:ffff:ffff:ffff:ffff:ffff,US
2606:5e00::,2606:5e00:ffff:ffff:ffff:ffff:ffff:ffff,CA
2606:5f00::,2606:5f00:ffff:ffff:ffff:ffff:ffff:ffff,PR
-2606:6000::,2606:6000:ffff:ffff:ffff:ffff:ffff:ffff,US
+2606:6000::,2606:60ff:ffff:ffff:ffff:ffff:ffff:ffff,ZA
2606:6100::,2606:6100:ffff:ffff:ffff:ffff:ffff:ffff,US
2606:6200::,2606:6200:ffff:ffff:ffff:ffff:ffff:ffff,CA
2606:6300::,2606:6300:ffff:ffff:ffff:ffff:ffff:ffff,CA
@@ -6518,7 +6440,7 @@
2606:9d00::,2606:9d00:ffff:ffff:ffff:ffff:ffff:ffff,US
2606:9e00::,2606:9e00:ffff:ffff:ffff:ffff:ffff:ffff,BM
2606:9f00::,2606:9f00:ffff:ffff:ffff:ffff:ffff:ffff,US
-2606:a000::,2606:a000:ffff:ffff:ffff:ffff:ffff:ffff,US
+2606:a000::,2606:a0ff:ffff:ffff:ffff:ffff:ffff:ffff,ZA
2606:a100::,2606:a100:ffff:ffff:ffff:ffff:ffff:ffff,US
2606:a200::,2606:a200:ffff:ffff:ffff:ffff:ffff:ffff,US
2606:a300::,2606:a300:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -7153,98 +7075,9 @@
2607:f9e0::,2607:f9e0:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:f9f0::,2607:f9f1:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:f9f8::,2607:f9f8:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fa00::,2607:fa00:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fa08::,2607:fa08:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fa10::,2607:fa10:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fa18::,2607:fa18:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fa20::,2607:fa20:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fa28::,2607:fa28:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fa38::,2607:fa38:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fa40::,2607:fa40:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fa48::,2607:fa48:ffff:ffff:ffff:ffff:ffff:ffff,CA
-2607:fa58::,2607:fa58:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fa60::,2607:fa60:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fa68::,2607:fa68:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fa70::,2607:fa70:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fa78::,2607:fa78:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fa88::,2607:fa88:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fa90::,2607:fa90:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fa98::,2607:fa98:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:faa0::,2607:faa0:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:faa8::,2607:faa8:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fab0::,2607:fab0:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fab8::,2607:fab8:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fac0::,2607:fac0:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fac8::,2607:fac8:fff:ffff:ffff:ffff:ffff:ffff,US
-2607:fad0::,2607:fad0:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fad8::,2607:fad8:ffff:ffff:ffff:ffff:ffff:ffff,CA
-2607:fae0::,2607:fae0:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fae8::,2607:fae8:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:faf0::,2607:faf0:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:faf8::,2607:faf8:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fb00::,2607:fb00:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fb08::,2607:fb08:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fb10::,2607:fb10:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fb18::,2607:fb18:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fb20::,2607:fb20:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fb28::,2607:fb28:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fb30::,2607:fb30:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fb38::,2607:fb38:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fb40::,2607:fb40:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fb48::,2607:fb48:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fb50::,2607:fb50:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fb58::,2607:fb58:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fb60::,2607:fb60:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fb68::,2607:fb68:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fb70::,2607:fb70:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fb78::,2607:fb78:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fb80::,2607:fb80:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fb88::,2607:fb88:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fb90::,2607:fb90:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fb98::,2607:fb98:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fba0::,2607:fba0:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fba8::,2607:fba8:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fbb0::,2607:fbb0:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fbb8::,2607:fbb8:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fbc0::,2607:fbc0:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fbc8::,2607:fbc8:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fbd0::,2607:fbd0:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fbd8::,2607:fbd8:ffff:ffff:ffff:ffff:ffff:ffff,CA
-2607:fbe0::,2607:fbe0:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fbe8::,2607:fbe8:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fbf0::,2607:fbf0:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fbf8::,2607:fbf8:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fc00::,2607:fc00:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fc08::,2607:fc08:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fc10::,2607:fc10:ffff:ffff:ffff:ffff:ffff:ffff,CA
-2607:fc18::,2607:fc18:fff:ffff:ffff:ffff:ffff:ffff,US
-2607:fc20::,2607:fc20:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fc28::,2607:fc28:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fc30::,2607:fc30:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fc38::,2607:fc38:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fc40::,2607:fc40:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fc48::,2607:fc48:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fc50::,2607:fc50:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fc58::,2607:fc58:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fc60::,2607:fc60:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fc68::,2607:fc68:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fc70::,2607:fc70:ffff:ffff:ffff:ffff:ffff:ffff,CA
-2607:fc78::,2607:fc78:ffff:ffff:ffff:ffff:ffff:ffff,CA
-2607:fc80::,2607:fc80:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fc88::,2607:fc88:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fc90::,2607:fc90:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fc98::,2607:fc98:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fca0::,2607:fca0:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fca8::,2607:fca8:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fcb8::,2607:fcb8:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fcc0::,2607:fcc0:ffff:ffff:ffff:ffff:ffff:ffff,CA
-2607:fcc8::,2607:fcc8:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fcd0::,2607:fcd0:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fcd8::,2607:fcd8:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fce0::,2607:fce0:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fce8::,2607:fce8:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fcf0::,2607:fcf0:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fcf8::,2607:fcf8:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2607:fa00::,2607:faff:ffff:ffff:ffff:ffff:ffff:ffff,TN
+2607:fb00::,2607:fbff:ffff:ffff:ffff:ffff:ffff:ffff,UY
+2607:fc00::,2607:fcff:ffff:ffff:ffff:ffff:ffff:ffff,ZA
2607:fd00::,2607:fd00:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:fd08::,2607:fd08:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:fd10::,2607:fd10:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -8722,7 +8555,7 @@
2800:110::,2800:110:ffff:ffff:ffff:ffff:ffff:ffff,AR
2800:120::,2800:120:ffff:ffff:ffff:ffff:ffff:ffff,PE
2800:130::,2800:130:ffff:ffff:ffff:ffff:ffff:ffff,EC
-2800:140::,2800:140:ffff:ffff:ffff:ffff:ffff:ffff,VE
+2800:140::,2800:140:ffff:ffff:ffff:ffff:ffff:ffff,PA
2800:150::,2800:150:ffff:ffff:ffff:ffff:ffff:ffff,CL
2800:160::,2800:160:ffff:ffff:ffff:ffff:ffff:ffff,CL
2800:170::,2800:170:ffff:ffff:ffff:ffff:ffff:ffff,VE
@@ -8774,7 +8607,6 @@
2800:470::,2800:470:ffff:ffff:ffff:ffff:ffff:ffff,SX
2800:480::,2800:480:ffff:ffff:ffff:ffff:ffff:ffff,CO
2800:490::,2800:490:ffff:ffff:ffff:ffff:ffff:ffff,CO
-2800:4a0::,2800:4a0:ffff:ffff:ffff:ffff:ffff:ffff,CW
2800:4b0::,2800:4b0:ffff:ffff:ffff:ffff:ffff:ffff,PE
2800:4c0::,2800:4c0:ffff:ffff:ffff:ffff:ffff:ffff,CL
2800:4d0::,2800:4d0:ffff:ffff:ffff:ffff:ffff:ffff,CL
@@ -8866,7 +8698,6 @@
2800:b20::,2800:b23:ffff:ffff:ffff:ffff:ffff:ffff,SV
2800:b30::,2800:b31:ffff:ffff:ffff:ffff:ffff:ffff,EC
2800:b40::,2800:b40:ffff:ffff:ffff:ffff:ffff:ffff,CO
-2800:b50::,2800:b50:ffff:ffff:ffff:ffff:ffff:ffff,AR
2800:b60::,2800:b60:ffff:ffff:ffff:ffff:ffff:ffff,AR
2800:b70::,2800:b70:ffff:ffff:ffff:ffff:ffff:ffff,CO
2800:b80::,2800:b80:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -8981,62 +8812,78 @@
2801:1::,2801:1:ffff:ffff:ffff:ffff:ffff:ffff,CR
2801:2::,2801:2:ffff:ffff:ffff:ffff:ffff:ffff,CL
2801:10::,2801:10:7:ffff:ffff:ffff:ffff:ffff,AR
+2801:10:2000::,2801:10:2000:ffff:ffff:ffff:ffff:ffff,AR
2801:10:4000::,2801:10:4000:ffff:ffff:ffff:ffff:ffff,AR
2801:10:8000::,2801:10:8000:ffff:ffff:ffff:ffff:ffff,AR
2801:10:c000::,2801:10:c000:ffff:ffff:ffff:ffff:ffff,CO
2801:11::,2801:11::ffff:ffff:ffff:ffff:ffff,AR
+2801:11:2000::,2801:11:2000:ffff:ffff:ffff:ffff:ffff,AR
2801:11:4000::,2801:11:4000:ffff:ffff:ffff:ffff:ffff,CO
2801:11:8000::,2801:11:8000:ffff:ffff:ffff:ffff:ffff,CO
2801:11:c000::,2801:11:c000:ffff:ffff:ffff:ffff:ffff,AR
2801:12::,2801:12::ffff:ffff:ffff:ffff:ffff,PY
+2801:12:2000::,2801:12:2000:ffff:ffff:ffff:ffff:ffff,HN
2801:12:4000::,2801:12:4000:ffff:ffff:ffff:ffff:ffff,CO
2801:12:8000::,2801:12:8000:ffff:ffff:ffff:ffff:ffff,AR
2801:12:c000::,2801:12:c000:ffff:ffff:ffff:ffff:ffff,AR
2801:13::,2801:13::ffff:ffff:ffff:ffff:ffff,VE
2801:13:4000::,2801:13:4000:ffff:ffff:ffff:ffff:ffff,CL
2801:13:8000::,2801:13:8000:ffff:ffff:ffff:ffff:ffff,SV
+2801:13:c000::,2801:13:c000:ffff:ffff:ffff:ffff:ffff,TT
2801:14::,2801:14::ffff:ffff:ffff:ffff:ffff,CO
+2801:14:2000::,2801:14:2000:ffff:ffff:ffff:ffff:ffff,AR
2801:14:4000::,2801:14:4000:ffff:ffff:ffff:ffff:ffff,CO
2801:14:c000::,2801:14:c000:ffff:ffff:ffff:ffff:ffff,BO
2801:15::,2801:15::ffff:ffff:ffff:ffff:ffff,EC
2801:15:4000::,2801:15:4000:ffff:ffff:ffff:ffff:ffff,CO
2801:15:8000::,2801:15:8000:ffff:ffff:ffff:ffff:ffff,CR
+2801:15:c000::,2801:15:c000:ffff:ffff:ffff:ffff:ffff,GT
2801:16::,2801:16::ffff:ffff:ffff:ffff:ffff,CW
+2801:16:2000::,2801:16:2000:ffff:ffff:ffff:ffff:ffff,HN
2801:16:4000::,2801:16:4000:ffff:ffff:ffff:ffff:ffff,AR
2801:16:8000::,2801:16:8000:ffff:ffff:ffff:ffff:ffff,CO
2801:16:c000::,2801:16:c000:ffff:ffff:ffff:ffff:ffff,AR
2801:17::,2801:17::ffff:ffff:ffff:ffff:ffff,CL
2801:17:4000::,2801:17:4000:ffff:ffff:ffff:ffff:ffff,CO
2801:17:8000::,2801:17:8000:ffff:ffff:ffff:ffff:ffff,CR
+2801:17:c000::,2801:17:c000:ffff:ffff:ffff:ffff:ffff,PA
2801:18::,2801:18::ffff:ffff:ffff:ffff:ffff,CR
+2801:18:2000::,2801:18:2000:ffff:ffff:ffff:ffff:ffff,CO
2801:18:4000::,2801:18:4000:ffff:ffff:ffff:ffff:ffff,CO
2801:18:8000::,2801:18:8000:ffff:ffff:ffff:ffff:ffff,AR
2801:18:c000::,2801:18:c000:ffff:ffff:ffff:ffff:ffff,AR
2801:19::,2801:19::ffff:ffff:ffff:ffff:ffff,AR
+2801:19:2000::,2801:19:2000:ffff:ffff:ffff:ffff:ffff,CL
2801:19:4000::,2801:19:4000:ffff:ffff:ffff:ffff:ffff,PY
2801:19:8000::,2801:19:8000:ffff:ffff:ffff:ffff:ffff,EC
2801:19:c000::,2801:19:c000:ffff:ffff:ffff:ffff:ffff,AR
2801:1a::,2801:1a::ffff:ffff:ffff:ffff:ffff,CO
+2801:1a:2000::,2801:1a:2000:ffff:ffff:ffff:ffff:ffff,AR
2801:1a:4000::,2801:1a:4000:ffff:ffff:ffff:ffff:ffff,CO
2801:1a:8000::,2801:1a:8000:ffff:ffff:ffff:ffff:ffff,CL
2801:1a:c000::,2801:1a:c000:ffff:ffff:ffff:ffff:ffff,CO
2801:1b::,2801:1b::ffff:ffff:ffff:ffff:ffff,CR
2801:1b:4000::,2801:1b:4000:ffff:ffff:ffff:ffff:ffff,CL
2801:1b:8000::,2801:1b:8000:ffff:ffff:ffff:ffff:ffff,CL
+2801:1b:c000::,2801:1b:c000:ffff:ffff:ffff:ffff:ffff,PA
2801:1c::,2801:1c::ffff:ffff:ffff:ffff:ffff,PY
+2801:1c:2000::,2801:1c:2000:ffff:ffff:ffff:ffff:ffff,PE
2801:1c:4000::,2801:1c:4000:ffff:ffff:ffff:ffff:ffff,CO
2801:1c:8000::,2801:1c:8000:ffff:ffff:ffff:ffff:ffff,EC
2801:1c:c000::,2801:1c:c000:ffff:ffff:ffff:ffff:ffff,HN
2801:1d::,2801:1d::ffff:ffff:ffff:ffff:ffff,PY
2801:1d:4000::,2801:1d:4000:ffff:ffff:ffff:ffff:ffff,TT
2801:1d:8000::,2801:1d:8000:ffff:ffff:ffff:ffff:ffff,AR
+2801:1d:c000::,2801:1d:c000:ffff:ffff:ffff:ffff:ffff,AR
2801:1e::,2801:1e::ffff:ffff:ffff:ffff:ffff,EC
+2801:1e:2000::,2801:1e:2000:ffff:ffff:ffff:ffff:ffff,AR
2801:1e:4000::,2801:1e:4007:ffff:ffff:ffff:ffff:ffff,AR
2801:1e:8000::,2801:1e:8000:ffff:ffff:ffff:ffff:ffff,CR
2801:1e:c000::,2801:1e:c000:ffff:ffff:ffff:ffff:ffff,AR
2801:1f::,2801:1f::ffff:ffff:ffff:ffff:ffff,AR
2801:1f:4000::,2801:1f:4000:ffff:ffff:ffff:ffff:ffff,CR
2801:1f:8000::,2801:1f:8000:ffff:ffff:ffff:ffff:ffff,AR
+2801:1f:c000::,2801:1f:c000:ffff:ffff:ffff:ffff:ffff,CR
2801:80::,2801:80::ffff:ffff:ffff:ffff:ffff,BR
2801:80:10::,2801:80:10:ffff:ffff:ffff:ffff:ffff,BR
2801:80:20::,2801:80:30:ffff:ffff:ffff:ffff:ffff,BR
@@ -9158,7 +9005,7 @@
2801:80:790::,2801:80:790:ffff:ffff:ffff:ffff:ffff,BR
2801:80:7a0::,2801:80:7a0:ffff:ffff:ffff:ffff:ffff,BR
2801:80:7b0::,2801:80:7b0:ffff:ffff:ffff:ffff:ffff,BR
-2801:80:7c0::,2801:80:7c0:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:7c0::,2801:80:7c3:ffff:ffff:ffff:ffff:ffff,BR
2801:80:7d0::,2801:80:7d0:ffff:ffff:ffff:ffff:ffff,BR
2801:80:7e0::,2801:80:7e0:ffff:ffff:ffff:ffff:ffff,BR
2801:80:7f0::,2801:80:7f0:ffff:ffff:ffff:ffff:ffff,BR
@@ -9176,6 +9023,33 @@
2801:80:8b0::,2801:80:8b0:ffff:ffff:ffff:ffff:ffff,BR
2801:80:8c0::,2801:80:8c1:ffff:ffff:ffff:ffff:ffff,BR
2801:80:8d0::,2801:80:8d0:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:8e0::,2801:80:8e0:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:8f0::,2801:80:8f0:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:900::,2801:80:900:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:910::,2801:80:910:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:920::,2801:80:920:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:930::,2801:80:930:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:940::,2801:80:940:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:950::,2801:80:950:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:960::,2801:80:960:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:970::,2801:80:970:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:980::,2801:80:980:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:990::,2801:80:990:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:9a0::,2801:80:9a0:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:9b0::,2801:80:9b0:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:9c0::,2801:80:9c0:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:9d0::,2801:80:9d0:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:9e0::,2801:80:9e0:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:9f0::,2801:80:9f0:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:a00::,2801:80:a00:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:a10::,2801:80:a10:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:a20::,2801:80:a20:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:a30::,2801:80:a30:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:a40::,2801:80:a40:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:a50::,2801:80:a50:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:a60::,2801:80:a61:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:a70::,2801:80:a70:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:a80::,2801:80:a8f:ffff:ffff:ffff:ffff:ffff,BR
2801:82::,2801:82:ffff:ffff:ffff:ffff:ffff:ffff,BR
2801:84::,2801:84:ffff:ffff:ffff:ffff:ffff:ffff,BR
2801:86::,2801:86:ffff:ffff:ffff:ffff:ffff:ffff,BR
@@ -9218,7 +9092,7 @@
2801:c4:80::,2801:c4:80:ffff:ffff:ffff:ffff:ffff,MX
2801:c4:90::,2801:c4:90:ffff:ffff:ffff:ffff:ffff,MX
2801:c4:a0::,2801:c4:a0:ffff:ffff:ffff:ffff:ffff,MX
-2801:c4:b0::,2801:c4:b2:ffff:ffff:ffff:ffff:ffff,MX
+2801:c4:b0::,2801:c4:b3:ffff:ffff:ffff:ffff:ffff,MX
2801:d0::,2801:d0:ffff:ffff:ffff:ffff:ffff:ffff,MX
2801:f0::,2801:f0::ffff:ffff:ffff:ffff:ffff,MX
2801:f0:16::,2801:f0:16:ffff:ffff:ffff:ffff:ffff,MX
@@ -9241,6 +9115,7 @@
2803::,2803::ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:80::,2803:80:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:100::,2803:100:ffff:ffff:ffff:ffff:ffff:ffff,HN
+2803:180::,2803:180:ffff:ffff:ffff:ffff:ffff:ffff,NI
2803:200::,2803:200:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:280::,2803:280:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:300::,2803:300:ffff:ffff:ffff:ffff:ffff:ffff,DO
@@ -9248,40 +9123,49 @@
2803:480::,2803:480:ffff:ffff:ffff:ffff:ffff:ffff,EC
2803:500::,2803:500:ffff:ffff:ffff:ffff:ffff:ffff,PE
2803:600::,2803:600:ffff:ffff:ffff:ffff:ffff:ffff,PA
+2803:680::,2803:680:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:700::,2803:700:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:800::,2803:800:ffff:ffff:ffff:ffff:ffff:ffff,NI
2803:880::,2803:880:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:900::,2803:900:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:a00::,2803:a00:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:a80::,2803:a80:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:b00::,2803:b00:ffff:ffff:ffff:ffff:ffff:ffff,EC
2803:c00::,2803:c00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:c80::,2803:c80:ffff:ffff:ffff:ffff:ffff:ffff,PY
2803:d00::,2803:d00:ffff:ffff:ffff:ffff:ffff:ffff,GY
2803:e00::,2803:e00:ffff:ffff:ffff:ffff:ffff:ffff,CL
+2803:e80::,2803:e80:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:f00::,2803:f00:ffff:ffff:ffff:ffff:ffff:ffff,PE
2803:1000::,2803:1000:ffff:ffff:ffff:ffff:ffff:ffff,SV
2803:1080::,2803:1080:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:1100::,2803:1100:ffff:ffff:ffff:ffff:ffff:ffff,CW
+2803:1180::,2803:1180:ffff:ffff:ffff:ffff:ffff:ffff,BO
2803:1200::,2803:1200:ffff:ffff:ffff:ffff:ffff:ffff,CL
+2803:1280::,2803:1280:ffff:ffff:ffff:ffff:ffff:ffff,PE
2803:1300::,2803:1300:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:1400::,2803:1400:ffff:ffff:ffff:ffff:ffff:ffff,DO
2803:1480::,2803:1480:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:1500::,2803:1500:ffff:ffff:ffff:ffff:ffff:ffff,TT
2803:1600::,2803:1600:ffff:ffff:ffff:ffff:ffff:ffff,BQ
+2803:1680::,2803:1680:ffff:ffff:ffff:ffff:ffff:ffff,GF
2803:1700::,2803:1700:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:1800::,2803:1800:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:1880::,2803:1880:ffff:ffff:ffff:ffff:ffff:ffff,PE
2803:1900::,2803:1900:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:1a00::,2803:1a00:ffff:ffff:ffff:ffff:ffff:ffff,CO
+2803:1a80::,2803:1a80:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:1b00::,2803:1b00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:1c00::,2803:1c00:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:1c80::,2803:1c80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:1d00::,2803:1d00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:1e00::,2803:1e00:ffff:ffff:ffff:ffff:ffff:ffff,NI
+2803:1e80::,2803:1e80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:1f00::,2803:1f00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:2000::,2803:2000:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:2080::,2803:2080:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:2100::,2803:2100:ffff:ffff:ffff:ffff:ffff:ffff,PE
+2803:2180::,2803:2180:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:2200::,2803:2200:ffff:ffff:ffff:ffff:ffff:ffff,EC
2803:2280::,2803:2280:ffff:ffff:ffff:ffff:ffff:ffff,BZ
2803:2300::,2803:2300:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -9289,40 +9173,48 @@
2803:2480::,2803:2480:ffff:ffff:ffff:ffff:ffff:ffff,PE
2803:2500::,2803:2500:ffff:ffff:ffff:ffff:ffff:ffff,PE
2803:2600::,2803:2600:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:2680::,2803:2680:ffff:ffff:ffff:ffff:ffff:ffff,UY
2803:2700::,2803:2700:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:2800::,2803:2800:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:2880::,2803:2880:ffff:ffff:ffff:ffff:ffff:ffff,BO
2803:2900::,2803:2900:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:2a00::,2803:2a00:ffff:ffff:ffff:ffff:ffff:ffff,PY
+2803:2a80::,2803:2a80:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:2b00::,2803:2b00:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:2c00::,2803:2c00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:2c80::,2803:2c80:ffff:ffff:ffff:ffff:ffff:ffff,VE
2803:2d00::,2803:2d00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:2e00::,2803:2e00:ffff:ffff:ffff:ffff:ffff:ffff,EC
+2803:2e80::,2803:2e80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:2f00::,2803:2f00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:3000::,2803:3000:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:3080::,2803:3080:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:3100::,2803:3100:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:3200::,2803:3200:ffff:ffff:ffff:ffff:ffff:ffff,CR
+2803:3280::,2803:3280:ffff:ffff:ffff:ffff:ffff:ffff,GT
2803:3300::,2803:3300:ffff:ffff:ffff:ffff:ffff:ffff,PE
2803:3400::,2803:3400:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:3480::,2803:3480:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:3500::,2803:3500:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:3600::,2803:3600:ffff:ffff:ffff:ffff:ffff:ffff,CR
+2803:3680::,2803:3680:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:3700::,2803:3700:ffff:ffff:ffff:ffff:ffff:ffff,DO
2803:3800::,2803:3800:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:3880::,2803:3880:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:3900::,2803:3900:ffff:ffff:ffff:ffff:ffff:ffff,VE
2803:3a00::,2803:3a00:ffff:ffff:ffff:ffff:ffff:ffff,GT
+2803:3a80::,2803:3a80:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:3b00::,2803:3b00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:3c00::,2803:3c00:ffff:ffff:ffff:ffff:ffff:ffff,EC
2803:3c80::,2803:3c80:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:3d00::,2803:3d00:ffff:ffff:ffff:ffff:ffff:ffff,BZ
2803:3e00::,2803:3e00:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:3e80::,2803:3e80:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:3f00::,2803:3f00:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:4000::,2803:4000:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:4080::,2803:4080:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:4100::,2803:4100:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:4180::,2803:4180:ffff:ffff:ffff:ffff:ffff:ffff,EC
2803:4200::,2803:4200:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:4280::,2803:4280:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:4300::,2803:4300:ffff:ffff:ffff:ffff:ffff:ffff,PA
@@ -9330,40 +9222,47 @@
2803:4480::,2803:4480:ffff:ffff:ffff:ffff:ffff:ffff,PE
2803:4500::,2803:4500:ffff:ffff:ffff:ffff:ffff:ffff,CW
2803:4600::,2803:4600:ffff:ffff:ffff:ffff:ffff:ffff,HN
+2803:4680::,2803:4680:ffff:ffff:ffff:ffff:ffff:ffff,TT
2803:4700::,2803:4700:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:4800::,2803:4800:ffff:ffff:ffff:ffff:ffff:ffff,PE
2803:4880::,2803:4880:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:4900::,2803:4900:ffff:ffff:ffff:ffff:ffff:ffff,BQ
2803:4a00::,2803:4a00:ffff:ffff:ffff:ffff:ffff:ffff,CR
+2803:4a80::,2803:4a80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:4b00::,2803:4b00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:4c00::,2803:4c00:ffff:ffff:ffff:ffff:ffff:ffff,EC
2803:4c80::,2803:4c80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:4d00::,2803:4d00:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:4e00::,2803:4e00:ffff:ffff:ffff:ffff:ffff:ffff,UY
+2803:4e80::,2803:4e80:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:4f00::,2803:4f00:ffff:ffff:ffff:ffff:ffff:ffff,VE
2803:5000::,2803:5000:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:5080::,2803:5080:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:5100::,2803:5100:ffff:ffff:ffff:ffff:ffff:ffff,GT
2803:5200::,2803:5200:ffff:ffff:ffff:ffff:ffff:ffff,CL
+2803:5280::,2803:5280:ffff:ffff:ffff:ffff:ffff:ffff,DO
2803:5300::,2803:5300:ffff:ffff:ffff:ffff:ffff:ffff,GT
2803:5400::,2803:5400:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:5480::,2803:5480:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:5500::,2803:5500:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:5600::,2803:5600:ffff:ffff:ffff:ffff:ffff:ffff,HN
+2803:5680::,2803:5680:ffff:ffff:ffff:ffff:ffff:ffff,VE
2803:5700::,2803:5700:ffff:ffff:ffff:ffff:ffff:ffff,BO
-2803:5800::,2803:5800:ffff:ffff:ffff:ffff:ffff:ffff,PE
2803:5880::,2803:5880:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:5900::,2803:5900:ffff:ffff:ffff:ffff:ffff:ffff,GY
2803:5a00::,2803:5a00:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:5a80::,2803:5a80:ffff:ffff:ffff:ffff:ffff:ffff,DO
2803:5b00::,2803:5b00:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:5c00::,2803:5c00:ffff:ffff:ffff:ffff:ffff:ffff,BO
2803:5c80::,2803:5c80:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:5d00::,2803:5d00:ffff:ffff:ffff:ffff:ffff:ffff,SV
2803:5e00::,2803:5e00:ffff:ffff:ffff:ffff:ffff:ffff,BO
+2803:5e80::,2803:5e80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:5f00::,2803:5f00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:6000::,2803:6000:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:6080::,2803:6080:ffff:ffff:ffff:ffff:ffff:ffff,US
2803:6100::,2803:6100:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:6180::,2803:6180:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:6200::,2803:6200:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:6280::,2803:6280:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:6300::,2803:6300:ffff:ffff:ffff:ffff:ffff:ffff,GT
@@ -9371,40 +9270,48 @@
2803:6480::,2803:6480:ffff:ffff:ffff:ffff:ffff:ffff,BZ
2803:6500::,2803:6500:ffff:ffff:ffff:ffff:ffff:ffff,PE
2803:6600::,2803:6600:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:6680::,2803:6680:ffff:ffff:ffff:ffff:ffff:ffff,VE
2803:6700::,2803:6700:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:6800::,2803:6800:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:6880::,2803:6880:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:6900::,2803:6900:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:6a00::,2803:6a00:ffff:ffff:ffff:ffff:ffff:ffff,EC
+2803:6a80::,2803:6a80:ffff:ffff:ffff:ffff:ffff:ffff,NI
2803:6b00::,2803:6b00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:6c00::,2803:6c00:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:6c80::,2803:6c80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:6d00::,2803:6d00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:6e00::,2803:6e00:ffff:ffff:ffff:ffff:ffff:ffff,SR
+2803:6e80::,2803:6e80:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:6f00::,2803:6f00:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:7000::,2803:7000:ffff:ffff:ffff:ffff:ffff:ffff,GT
2803:7080::,2803:7080:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:7100::,2803:7100:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:7200::,2803:7200:ffff:ffff:ffff:ffff:ffff:ffff,HN
+2803:7280::,2803:7280:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:7300::,2803:7300:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:7400::,2803:7400:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:7480::,2803:7480:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:7500::,2803:7500:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:7600::,2803:7600:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:7680::,2803:7680:ffff:ffff:ffff:ffff:ffff:ffff,BO
2803:7700::,2803:7700:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:7800::,2803:7800:ffff:ffff:ffff:ffff:ffff:ffff,VE
2803:7880::,2803:7880:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:7900::,2803:7900:ffff:ffff:ffff:ffff:ffff:ffff,BZ
2803:7a00::,2803:7a00:ffff:ffff:ffff:ffff:ffff:ffff,CR
+2803:7a80::,2803:7a80:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:7b00::,2803:7b00:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:7c00::,2803:7c00:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:7c80::,2803:7c80:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:7d00::,2803:7d00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:7e00::,2803:7e00:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:7e80::,2803:7e80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:7f00::,2803:7f00:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:8000::,2803:8000:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:8080::,2803:8080:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:8100::,2803:8100:ffff:ffff:ffff:ffff:ffff:ffff,VE
+2803:8180::,2803:8180:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:8200::,2803:8200:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:8280::,2803:8280:ffff:ffff:ffff:ffff:ffff:ffff,VE
2803:8300::,2803:8300:ffff:ffff:ffff:ffff:ffff:ffff,EC
@@ -9412,40 +9319,49 @@
2803:8480::,2803:8480:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:8500::,2803:8500:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:8600::,2803:8600:ffff:ffff:ffff:ffff:ffff:ffff,HT
+2803:8680::,2803:8680:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:8700::,2803:8700:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:8800::,2803:8800:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:8880::,2803:8880:ffff:ffff:ffff:ffff:ffff:ffff,NI
2803:8900::,2803:8900:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:8a00::,2803:8a00:ffff:ffff:ffff:ffff:ffff:ffff,EC
+2803:8a80::,2803:8a80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:8b00::,2803:8b00:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:8c00::,2803:8c00:ffff:ffff:ffff:ffff:ffff:ffff,BZ
2803:8c80::,2803:8c80:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:8d00::,2803:8d00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:8e00::,2803:8e00:ffff:ffff:ffff:ffff:ffff:ffff,CL
+2803:8e80::,2803:8e80:ffff:ffff:ffff:ffff:ffff:ffff,PY
2803:8f00::,2803:8f00:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:9000::,2803:9000:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:9080::,2803:9080:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:9100::,2803:9100:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:9180::,2803:9180:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:9200::,2803:9200:ffff:ffff:ffff:ffff:ffff:ffff,SV
+2803:9280::,2803:9280:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:9300::,2803:9300:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:9400::,2803:9400:ffff:ffff:ffff:ffff:ffff:ffff,BO
2803:9480::,2803:9480:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:9500::,2803:9500:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:9600::,2803:9600:ffff:ffff:ffff:ffff:ffff:ffff,CW
+2803:9680::,2803:9680:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:9700::,2803:9700:ffff:ffff:ffff:ffff:ffff:ffff,EC
2803:9800::,2803:9800:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:9880::,2803:9880:ffff:ffff:ffff:ffff:ffff:ffff,BZ
2803:9900::,2803:9900:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:9a00::,2803:9a00:ffff:ffff:ffff:ffff:ffff:ffff,BZ
+2803:9a80::,2803:9a80:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:9b00::,2803:9b00:ffff:ffff:ffff:ffff:ffff:ffff,DO
2803:9c00::,2803:9c00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:9c80::,2803:9c80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:9d00::,2803:9d00:ffff:ffff:ffff:ffff:ffff:ffff,SV
2803:9e00::,2803:9e00:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:9e80::,2803:9e80:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:9f00::,2803:9f00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:a000::,2803:a000:ffff:ffff:ffff:ffff:ffff:ffff,BQ
2803:a080::,2803:a080:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:a100::,2803:a100:ffff:ffff:ffff:ffff:ffff:ffff,CL
+2803:a180::,2803:a180:ffff:ffff:ffff:ffff:ffff:ffff,DO
2803:a200::,2803:a200:ffff:ffff:ffff:ffff:ffff:ffff,SR
2803:a280::,2803:a280:ffff:ffff:ffff:ffff:ffff:ffff,DO
2803:a300::,2803:a300:ffff:ffff:ffff:ffff:ffff:ffff,BZ
@@ -9453,40 +9369,48 @@
2803:a480::,2803:a480:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:a500::,2803:a500:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:a600::,2803:a600:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:a680::,2803:a680:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:a700::,2803:a700:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:a800::,2803:a800:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:a880::,2803:a880:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:a900::,2803:a900:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:aa00::,2803:aa00:ffff:ffff:ffff:ffff:ffff:ffff,CL
+2803:aa80::,2803:aa80:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:ab00::,2803:ab00:ffff:ffff:ffff:ffff:ffff:ffff,DO
2803:ac00::,2803:ac00:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:ac80::,2803:ac80:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:ad00::,2803:ad00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:ae00::,2803:ae00:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:ae80::,2803:ae80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:af00::,2803:af00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:b000::,2803:b000:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:b080::,2803:b080:ffff:ffff:ffff:ffff:ffff:ffff,BZ
2803:b100::,2803:b100:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:b200::,2803:b200:ffff:ffff:ffff:ffff:ffff:ffff,UY
+2803:b280::,2803:b280:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:b300::,2803:b300:ffff:ffff:ffff:ffff:ffff:ffff,PY
2803:b400::,2803:b400:ffff:ffff:ffff:ffff:ffff:ffff,VE
2803:b480::,2803:b480:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:b500::,2803:b500:ffff:ffff:ffff:ffff:ffff:ffff,VE
2803:b600::,2803:b600:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:b680::,2803:b680:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:b700::,2803:b700:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:b800::,2803:b800:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:b880::,2803:b880:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:b900::,2803:b900:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:ba00::,2803:ba00:ffff:ffff:ffff:ffff:ffff:ffff,GT
+2803:ba80::,2803:ba80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:bb00::,2803:bb00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:bc00::,2803:bc00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:bc80::,2803:bc80:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:bd00::,2803:bd00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:be00::,2803:be00:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:be80::,2803:be80:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:bf00::,2803:bf00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:c000::,2803:c000:ffff:ffff:ffff:ffff:ffff:ffff,VE
2803:c080::,2803:c080:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:c100::,2803:c100:ffff:ffff:ffff:ffff:ffff:ffff,PY
+2803:c180::,2803:c180:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:c200::,2803:c200:ffff:ffff:ffff:ffff:ffff:ffff,PE
2803:c280::,2803:c280:ffff:ffff:ffff:ffff:ffff:ffff,EC
2803:c300::,2803:c300:ffff:ffff:ffff:ffff:ffff:ffff,GT
@@ -9494,40 +9418,48 @@
2803:c480::,2803:c480:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:c500::,2803:c500:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:c600::,2803:c600:ffff:ffff:ffff:ffff:ffff:ffff,CL
+2803:c680::,2803:c680:ffff:ffff:ffff:ffff:ffff:ffff,HT
2803:c700::,2803:c700:ffff:ffff:ffff:ffff:ffff:ffff,GF
2803:c800::,2803:c800:ffff:ffff:ffff:ffff:ffff:ffff,GT
2803:c880::,2803:c880:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:c900::,2803:c900:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:ca00::,2803:ca00:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:ca80::,2803:ca80:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:cb00::,2803:cb00:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:cc00::,2803:cc00:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:cc80::,2803:cc80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:cd00::,2803:cd00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:ce00::,2803:ce00:ffff:ffff:ffff:ffff:ffff:ffff,HN
+2803:ce80::,2803:ce80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:cf00::,2803:cf00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:d000::,2803:d000:ffff:ffff:ffff:ffff:ffff:ffff,BZ
2803:d080::,2803:d080:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:d100::,2803:d100:ffff:ffff:ffff:ffff:ffff:ffff,GT
2803:d200::,2803:d200:ffff:ffff:ffff:ffff:ffff:ffff,CR
+2803:d280::,2803:d280:ffff:ffff:ffff:ffff:ffff:ffff,PY
2803:d300::,2803:d300:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:d400::,2803:d400:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:d480::,2803:d480:ffff:ffff:ffff:ffff:ffff:ffff,VE
2803:d500::,2803:d500:ffff:ffff:ffff:ffff:ffff:ffff,BZ
2803:d600::,2803:d600:ffff:ffff:ffff:ffff:ffff:ffff,UY
+2803:d680::,2803:d680:ffff:ffff:ffff:ffff:ffff:ffff,PE
2803:d700::,2803:d700:ffff:ffff:ffff:ffff:ffff:ffff,VE
2803:d800::,2803:d800:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:d880::,2803:d880:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:d900::,2803:d900:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:da00::,2803:da00:ffff:ffff:ffff:ffff:ffff:ffff,GY
+2803:da80::,2803:da80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:db00::,2803:db00:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:dc00::,2803:dc00:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:dc80::,2803:dc80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:dd00::,2803:dd00:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:de00::,2803:de00:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:de80::,2803:de80:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:df00::,2803:df00:ffff:ffff:ffff:ffff:ffff:ffff,SV
2803:e000::,2803:e000:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:e080::,2803:e080:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:e100::,2803:e100:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:e180::,2803:e180:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:e200::,2803:e200:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:e280::,2803:e280:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:e300::,2803:e300:ffff:ffff:ffff:ffff:ffff:ffff,CR
@@ -9535,40 +9467,46 @@
2803:e480::,2803:e480:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:e500::,2803:e500:ffff:ffff:ffff:ffff:ffff:ffff,PE
2803:e600::,2803:e600:ffff:ffff:ffff:ffff:ffff:ffff,PA
+2803:e680::,2803:e680:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:e700::,2803:e700:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:e800::,2803:e800:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:e880::,2803:e880:ffff:ffff:ffff:ffff:ffff:ffff,GT
2803:e900::,2803:e900:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:ea00::,2803:ea00:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:ea80::,2803:ea80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:eb00::,2803:eb00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:ec00::,2803:ec00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:ec80::,2803:ec80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:ed00::,2803:ed00:ffff:ffff:ffff:ffff:ffff:ffff,PE
2803:ee00::,2803:ee00:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:ee80::,2803:ee80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:ef00::,2803:ef00:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:f000::,2803:f000:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:f080::,2803:f080:ffff:ffff:ffff:ffff:ffff:ffff,PE
2803:f100::,2803:f100:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:f200::,2803:f200:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:f280::,2803:f280:ffff:ffff:ffff:ffff:ffff:ffff,DO
2803:f300::,2803:f300:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:f400::,2803:f400:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:f480::,2803:f480:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:f500::,2803:f500:ffff:ffff:ffff:ffff:ffff:ffff,CW
2803:f600::,2803:f600:ffff:ffff:ffff:ffff:ffff:ffff,CR
+2803:f680::,2803:f680:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:f700::,2803:f700:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:f800::,2803:f800:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:f880::,2803:f880:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:f900::,2803:f900:ffff:ffff:ffff:ffff:ffff:ffff,BZ
2803:fa00::,2803:fa00:ffff:ffff:ffff:ffff:ffff:ffff,BO
+2803:fa80::,2803:fa80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:fb00::,2803:fb00:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:fc80::,2803:fc80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:fd00::,2803:fd00:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:fe00::,2803:fe00:ffff:ffff:ffff:ffff:ffff:ffff,CO
+2803:fe80::,2803:fe80:ffff:ffff:ffff:ffff:ffff:ffff,PE
2803:ff00::,2803:ff00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2804::,2804::ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:4::,2804:4:ffff:ffff:ffff:ffff:ffff:ffff,BR
-2804:8::,2804:9:ffff:ffff:ffff:ffff:ffff:ffff,BR
-2804:c::,2804:c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:8::,2804:c:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:10::,2804:10:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:14::,2804:14:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:18::,2804:18:ffff:ffff:ffff:ffff:ffff:ffff,BR
@@ -9769,7 +9707,6 @@
2804:340::,2804:340:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:344::,2804:344:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:348::,2804:348:ffff:ffff:ffff:ffff:ffff:ffff,BR
-2804:34c::,2804:34c:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:350::,2804:350:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:354::,2804:354:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:358::,2804:358:ffff:ffff:ffff:ffff:ffff:ffff,BR
@@ -10055,7 +9992,6 @@
2804:7cc::,2804:7cc:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:7d0::,2804:7d0:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:7d4::,2804:7d4:ffff:ffff:ffff:ffff:ffff:ffff,BR
-2804:7d8::,2804:7d8:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:7dc::,2804:7dc:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:7e0::,2804:7e0:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:7e4::,2804:7e4:ffff:ffff:ffff:ffff:ffff:ffff,BR
@@ -10125,7 +10061,6 @@
2804:8f4::,2804:8f4:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:8f8::,2804:8f8:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:8fc::,2804:8fc:ffff:ffff:ffff:ffff:ffff:ffff,BR
-2804:900::,2804:900:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:904::,2804:904:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:908::,2804:908:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:90c::,2804:90c:ffff:ffff:ffff:ffff:ffff:ffff,BR
@@ -10806,11 +10741,302 @@
2804:13bc::,2804:13bc:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:13c0::,2804:13c0:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:13c4::,2804:13c4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:13c8::,2804:13c8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:13cc::,2804:13cc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:13d0::,2804:13d0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:13d4::,2804:13d4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:13d8::,2804:13d8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:13dc::,2804:13dc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:13e0::,2804:13e0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:13e4::,2804:13e4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:13e8::,2804:13e8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:13ec::,2804:13ec:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:13f0::,2804:13f0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:13f4::,2804:13f4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:13f8::,2804:13f8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:13fc::,2804:13fc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1400::,2804:1400:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1404::,2804:1404:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1408::,2804:1408:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:140c::,2804:140c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1410::,2804:1410:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1414::,2804:1414:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1418::,2804:1418:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:141c::,2804:141c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1420::,2804:1420:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1424::,2804:1424:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1428::,2804:1428:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:142c::,2804:142c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1430::,2804:1430:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1434::,2804:1434:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1438::,2804:1438:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:143c::,2804:143c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1440::,2804:1440:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1444::,2804:1444:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1448::,2804:1448:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:144c::,2804:144c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1450::,2804:1450:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1454::,2804:1454:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1458::,2804:1458:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:145c::,2804:145c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1460::,2804:1460:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1464::,2804:1464:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1468::,2804:1468:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:146c::,2804:146c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1470::,2804:1470:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1474::,2804:1474:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1478::,2804:1478:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:147c::,2804:147c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1480::,2804:1480:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1484::,2804:1484:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1488::,2804:1488:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:148c::,2804:148c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1490::,2804:1490:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1494::,2804:1494:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1498::,2804:1498:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:149c::,2804:149c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:14a0::,2804:14a0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:14a4::,2804:14a4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:14a8::,2804:14a8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:14ac::,2804:14ac:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:14b0::,2804:14b0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:14b4::,2804:14b4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:14b8::,2804:14b8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:14bc::,2804:14bc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:14c0::,2804:14c0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:14c4::,2804:14c4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:14c8::,2804:14c8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:14cc::,2804:14cc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:14d0::,2804:14d0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:14d4::,2804:14d4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:14d8::,2804:14d8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:14dc::,2804:14dc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:14e0::,2804:14e0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:14e4::,2804:14e4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:14e8::,2804:14e8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:14ec::,2804:14ec:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:14f0::,2804:14f0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:14f4::,2804:14f4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:14f8::,2804:14f8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:14fc::,2804:14fc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1500::,2804:1500:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1504::,2804:1504:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1508::,2804:1508:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:150c::,2804:150c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1510::,2804:1510:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1514::,2804:1514:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1518::,2804:1518:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:151c::,2804:151c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1520::,2804:1520:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1524::,2804:1524:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1528::,2804:1528:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:152c::,2804:152c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1530::,2804:1530:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1534::,2804:1534:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1538::,2804:1538:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:153c::,2804:153c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1540::,2804:1540:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1544::,2804:1544:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1548::,2804:1548:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:154c::,2804:154c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1550::,2804:1550:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1554::,2804:1554:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1558::,2804:1558:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:155c::,2804:155c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1560::,2804:1560:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1564::,2804:1564:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1568::,2804:1568:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:156c::,2804:156c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1570::,2804:1570:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1574::,2804:1574:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1578::,2804:1578:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:157c::,2804:157c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1580::,2804:1580:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1584::,2804:1584:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1588::,2804:1588:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:158c::,2804:158c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1590::,2804:1590:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1594::,2804:1594:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1598::,2804:1598:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:159c::,2804:159c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:15a0::,2804:15a0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:15a4::,2804:15a4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:15a8::,2804:15a8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:15ac::,2804:15ac:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:15b0::,2804:15b0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:15b4::,2804:15b4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:15b8::,2804:15b8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:15bc::,2804:15bc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:15c0::,2804:15c0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:15c4::,2804:15c4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:15c8::,2804:15c8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:15cc::,2804:15cc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:15d0::,2804:15d0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:15d4::,2804:15d4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:15d8::,2804:15d8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:15dc::,2804:15dc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:15e0::,2804:15e0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:15e4::,2804:15e4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:15e8::,2804:15e8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:15ec::,2804:15ec:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:15f0::,2804:15f0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:15f4::,2804:15f4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:15f8::,2804:15f8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:15fc::,2804:15fc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1600::,2804:1600:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1604::,2804:1604:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1608::,2804:1608:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:160c::,2804:160c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1610::,2804:1610:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1614::,2804:1614:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1618::,2804:1618:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:161c::,2804:161c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1620::,2804:1620:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1624::,2804:1624:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1628::,2804:1628:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:162c::,2804:162c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1630::,2804:1630:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1634::,2804:1634:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1638::,2804:1638:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:163c::,2804:163c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1640::,2804:1640:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1644::,2804:1644:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1648::,2804:1648:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:164c::,2804:164c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1650::,2804:1650:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1654::,2804:1654:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1658::,2804:1658:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:165c::,2804:165c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1660::,2804:1660:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1664::,2804:1664:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1668::,2804:1668:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:166c::,2804:166c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1670::,2804:1670:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1674::,2804:1674:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1678::,2804:1678:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:167c::,2804:167c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1680::,2804:1680:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1684::,2804:1684:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1688::,2804:1688:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:168c::,2804:168c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1690::,2804:1690:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1694::,2804:1694:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1698::,2804:1698:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:169c::,2804:169c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:16a0::,2804:16a0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:16a4::,2804:16a4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:16a8::,2804:16a8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:16ac::,2804:16ac:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:16b0::,2804:16b0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:16b4::,2804:16b4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:16b8::,2804:16b8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:16bc::,2804:16bc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:16c0::,2804:16c0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:16c4::,2804:16c4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:16c8::,2804:16c8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:16cc::,2804:16cc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:16d0::,2804:16d0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:16d4::,2804:16d4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:16d8::,2804:16d8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:16dc::,2804:16dc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:16e0::,2804:16e0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:16e4::,2804:16e4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:16e8::,2804:16e8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:16ec::,2804:16ec:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:16f0::,2804:16f0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:16f4::,2804:16f4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:16f8::,2804:16f8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:16fc::,2804:16fc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1700::,2804:1700:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1704::,2804:1704:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1708::,2804:1708:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:170c::,2804:170c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1710::,2804:1710:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1714::,2804:1714:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1718::,2804:1718:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:171c::,2804:171c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1720::,2804:1720:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1724::,2804:1724:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1728::,2804:1728:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:172c::,2804:172c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1730::,2804:1730:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1734::,2804:1734:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1738::,2804:1738:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:173c::,2804:173c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1740::,2804:1740:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1744::,2804:1744:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1748::,2804:1748:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:174c::,2804:174c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1750::,2804:1750:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1754::,2804:1754:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1758::,2804:1758:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:175c::,2804:175c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1760::,2804:1760:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1764::,2804:1764:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1768::,2804:1768:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:176c::,2804:176c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1770::,2804:1770:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1774::,2804:1774:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1778::,2804:1778:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:177c::,2804:177c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1780::,2804:1780:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1784::,2804:1784:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1788::,2804:1788:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:178c::,2804:178c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1790::,2804:1790:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1794::,2804:1794:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1798::,2804:1798:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:179c::,2804:179c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:17a0::,2804:17a0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:17a4::,2804:17a4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:17a8::,2804:17a8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:17ac::,2804:17ac:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:17b0::,2804:17b0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:17b4::,2804:17b4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:17b8::,2804:17b8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:17bc::,2804:17bc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:17c0::,2804:17c0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:17c4::,2804:17c4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:17c8::,2804:17c8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:17cc::,2804:17cc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:17d0::,2804:17d0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:17d4::,2804:17d4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:17d8::,2804:17d8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:17dc::,2804:17dc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:17e0::,2804:17e0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:17e4::,2804:17e4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:17e8::,2804:17e8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:17ec::,2804:17ec:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:17f0::,2804:17f0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:17f4::,2804:17f4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:17f8::,2804:17f8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:17fc::,2804:17fc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1800::,2804:1800:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1804::,2804:1804:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1808::,2804:1808:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:180c::,2804:180c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1810::,2804:1810:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1814::,2804:1814:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1818::,2804:1818:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:181c::,2804:181c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1820::,2804:1820:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1824::,2804:1824:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1828::,2804:1828:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:182c::,2804:182c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1830::,2804:1830:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1834::,2804:1834:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1838::,2804:1838:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:183c::,2804:183c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1840::,2804:1840:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1844::,2804:1844:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1f00::,2804:1f00:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1f02::,2804:1f02:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1f04::,2804:1f04:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1f06::,2804:1f06:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1f08::,2804:1f08:ffff:ffff:ffff:ffff:ffff:ffff,BR
2806::,2806:f:ffff:ffff:ffff:ffff:ffff:ffff,MX
2806:200::,2806:200:ffff:ffff:ffff:ffff:ffff:ffff,MX
+2806:210::,2806:214:ffff:ffff:ffff:ffff:ffff:ffff,MX
2806:220::,2806:220:ffff:ffff:ffff:ffff:ffff:ffff,MX
2806:230::,2806:230:ffff:ffff:ffff:ffff:ffff:ffff,MX
2806:238::,2806:238::ffff:ffff:ffff:ffff:ffff,MX
@@ -10907,8 +11133,7 @@
2a00:e38::,2a00:e38:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a00:e40::,2a00:e40:ffff:ffff:ffff:ffff:ffff:ffff,BG
2a00:e48::,2a00:e48:ffff:ffff:ffff:ffff:ffff:ffff,NO
-2a00:e50::,2a00:e50:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a00:e58::,2a00:e58:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a00:e50::,2a00:e58:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:e60::,2a00:e60:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:e68::,2a00:e68:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:e70::,2a00:e70:ffff:ffff:ffff:ffff:ffff:ffff,ES
@@ -11089,7 +11314,6 @@
2a00:1420::,2a00:1420:ffff:ffff:ffff:ffff:ffff:ffff,SI
2a00:1428::,2a00:1428:ffff:ffff:ffff:ffff:ffff:ffff,LT
2a00:1430::,2a00:1430:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a00:1438::,2a00:1438:ffff:ffff:ffff:ffff:ffff:ffff,SI
2a00:1440::,2a00:1440:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a00:1448::,2a00:1448:ffff:ffff:ffff:ffff:ffff:ffff,SI
2a00:1450::,2a00:1457:ffff:ffff:ffff:ffff:ffff:ffff,IE
@@ -11150,7 +11374,7 @@
2a00:1618::,2a00:1618:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a00:1620::,2a00:1620:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a00:1628::,2a00:1628:ffff:ffff:ffff:ffff:ffff:ffff,AT
-2a00:1630::,2a00:1630:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a00:1630::,2a00:1637:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a00:1638::,2a00:1638:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a00:1640::,2a00:1640:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a00:1648::,2a00:1648:ffff:ffff:ffff:ffff:ffff:ffff,DE
@@ -11330,7 +11554,7 @@
2a00:1c00::,2a00:1c00:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a00:1c08::,2a00:1c08:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:1c10::,2a00:1c10:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a00:1c18::,2a00:1c18:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a00:1c18::,2a00:1c1f:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:1c20::,2a00:1c20:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a00:1c28::,2a00:1c28:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a00:1c30::,2a00:1c30:ffff:ffff:ffff:ffff:ffff:ffff,FI
@@ -11415,7 +11639,7 @@
2a00:1eb0::,2a00:1eb0:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a00:1eb8::,2a00:1eb8:ffff:ffff:ffff:ffff:ffff:ffff,LT
2a00:1ec0::,2a00:1ec0:ffff:ffff:ffff:ffff:ffff:ffff,CY
-2a00:1ec8::,2a00:1ec8:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a00:1ec8::,2a00:1ecf:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a00:1ed0::,2a00:1ed0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a00:1ed8::,2a00:1edf:ffff:ffff:ffff:ffff:ffff:ffff,IE
2a00:1ee0::,2a00:1ee0:ffff:ffff:ffff:ffff:ffff:ffff,GB
@@ -11516,7 +11740,7 @@
2a00:47a0::,2a00:47a0:ffff:ffff:ffff:ffff:ffff:ffff,KG
2a00:47c0::,2a00:47c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:47e0::,2a00:47e0:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a00:4800::,2a00:4800:ffff:ffff:ffff:ffff:ffff:ffff,BG
+2a00:4800::,2a00:4807:ffff:ffff:ffff:ffff:ffff:ffff,BG
2a00:4840::,2a00:4840:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:4860::,2a00:4860:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a00:4880::,2a00:4880:ffff:ffff:ffff:ffff:ffff:ffff,CZ
@@ -11539,7 +11763,6 @@
2a00:4ac0::,2a00:4ac0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a00:4ae0::,2a00:4ae0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:4b00::,2a00:4b00:ffff:ffff:ffff:ffff:ffff:ffff,FR
-2a00:4b20::,2a00:4b20:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a00:4b40::,2a00:4b40:ffff:ffff:ffff:ffff:ffff:ffff,SK
2a00:4b60::,2a00:4b60:ffff:ffff:ffff:ffff:ffff:ffff,CY
2a00:4b80::,2a00:4b80:ffff:ffff:ffff:ffff:ffff:ffff,ES
@@ -11552,7 +11775,7 @@
2a00:4c60::,2a00:4c60:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:4c80::,2a00:4c87:ffff:ffff:ffff:ffff:ffff:ffff,PT
2a00:4ca0::,2a00:4ca0:ffff:ffff:ffff:ffff:ffff:ffff,FR
-2a00:4cc0::,2a00:4cc0:ffff:ffff:ffff:ffff:ffff:ffff,FI
+2a00:4cc0::,2a00:4cc7:ffff:ffff:ffff:ffff:ffff:ffff,FI
2a00:4ce0::,2a00:4ce0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:4d00::,2a00:4d00:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a00:4d20::,2a00:4d20:ffff:ffff:ffff:ffff:ffff:ffff,RU
@@ -11664,7 +11887,7 @@
2a00:5b20::,2a00:5b20:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a00:5b40::,2a00:5b40:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a00:5b60::,2a00:5b60:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a00:5b80::,2a00:5b80:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a00:5b80::,2a00:5b87:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a00:5ba0::,2a00:5ba0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:5bc0::,2a00:5bc0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:5be0::,2a00:5be0:ffff:ffff:ffff:ffff:ffff:ffff,NL
@@ -11704,7 +11927,6 @@
2a00:6060::,2a00:6060:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a00:6080::,2a00:6080:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a00:60a0::,2a00:60a0:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a00:60c0::,2a00:60c0:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a00:60e0::,2a00:60e0:ffff:ffff:ffff:ffff:ffff:ffff,IE
2a00:6100::,2a00:6100:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:6120::,2a00:6120:ffff:ffff:ffff:ffff:ffff:ffff,FI
@@ -11810,7 +12032,6 @@
2a00:6e80::,2a00:6e80:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a00:6ea0::,2a00:6ea0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:6ec0::,2a00:6ec0:ffff:ffff:ffff:ffff:ffff:ffff,BE
-2a00:6ee0::,2a00:6ee0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a00:6f00::,2a00:6f00:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:6f20::,2a00:6f20:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a00:6f40::,2a00:6f40:ffff:ffff:ffff:ffff:ffff:ffff,BG
@@ -11841,7 +12062,6 @@
2a00:7260::,2a00:7260:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a00:7280::,2a00:7280:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:72a0::,2a00:72a0:ffff:ffff:ffff:ffff:ffff:ffff,IT
-2a00:72c0::,2a00:72c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:72e0::,2a00:72e0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a00:7300::,2a00:7300:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a00:7320::,2a00:7327:ffff:ffff:ffff:ffff:ffff:ffff,UA
@@ -12083,13 +12303,7 @@
2a00:92a0::,2a00:92a7:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a00:92c0::,2a00:92c0:ffff:ffff:ffff:ffff:ffff:ffff,IS
2a00:92e0::,2a00:92e0:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a00:9300::,2a00:9300:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a00:9320::,2a00:9320:ffff:ffff:ffff:ffff:ffff:ffff,PL
-2a00:9340::,2a00:9347:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a00:9380::,2a00:9380:ffff:ffff:ffff:ffff:ffff:ffff,FR
-2a00:93a0::,2a00:93a0:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a00:93c0::,2a00:93c0:ffff:ffff:ffff:ffff:ffff:ffff,ES
-2a00:93e0::,2a00:93e0:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a00:9300::,2a00:93ff:ffff:ffff:ffff:ffff:ffff:ffff,SX
2a00:9400::,2a00:9400:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:9420::,2a00:9420:ffff:ffff:ffff:ffff:ffff:ffff,HU
2a00:9440::,2a00:9440:ffff:ffff:ffff:ffff:ffff:ffff,ES
@@ -12131,7 +12345,6 @@
2a00:98e0::,2a00:98e0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a00:9900::,2a00:9900:ffff:ffff:ffff:ffff:ffff:ffff,MD
2a00:9920::,2a00:9920:ffff:ffff:ffff:ffff:ffff:ffff,PS
-2a00:9960::,2a00:9960:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a00:9980::,2a00:9980:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a00:99a0::,2a00:99a0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a00:99c0::,2a00:99c0:ffff:ffff:ffff:ffff:ffff:ffff,ES
@@ -12154,7 +12367,6 @@
2a00:9c00::,2a00:9c00:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a00:9c20::,2a00:9c20:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a00:9c40::,2a00:9c40:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a00:9c60::,2a00:9c60:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:9c80::,2a00:9c80:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a00:9ca0::,2a00:9ca0:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a00:9cc0::,2a00:9cc0:ffff:ffff:ffff:ffff:ffff:ffff,NL
@@ -12163,10 +12375,10 @@
2a00:9d20::,2a00:9d20:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a00:9d40::,2a00:9d40:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a00:9d60::,2a00:9d60:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a00:9d80::,2a00:9d80:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a00:9d80::,2a00:9d87:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:9dc0::,2a00:9dc0:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a00:9de0::,2a00:9de0:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a00:9e00::,2a00:9e00:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a00:9e00::,2a00:9e07:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:9e20::,2a00:9e20:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:9e40::,2a00:9e40:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:9e60::,2a00:9e60:ffff:ffff:ffff:ffff:ffff:ffff,IT
@@ -12335,7 +12547,7 @@
2a00:b3a0::,2a00:b3a0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:b3c0::,2a00:b3c0:ffff:ffff:ffff:ffff:ffff:ffff,IS
2a00:b3e0::,2a00:b3e0:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a00:b400::,2a00:b400:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a00:b400::,2a00:b407:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:b420::,2a00:b420:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a00:b440::,2a00:b440:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a00:b460::,2a00:b460:ffff:ffff:ffff:ffff:ffff:ffff,NL
@@ -12426,9 +12638,7 @@
2a00:bf80::,2a00:bf80:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a00:bfa0::,2a00:bfa0:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a00:bfc0::,2a00:bfc0:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a00:bfe0::,2a00:bfe0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:c000::,2a00:c000:ffff:ffff:ffff:ffff:ffff:ffff,FR
-2a00:c020::,2a00:c020:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a00:c040::,2a00:c040:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a00:c060::,2a00:c060:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:c080::,2a00:c080:ffff:ffff:ffff:ffff:ffff:ffff,NL
@@ -12508,7 +12718,7 @@
2a00:ca00::,2a00:ca00:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:ca20::,2a00:ca20:ffff:ffff:ffff:ffff:ffff:ffff,IE
2a00:ca40::,2a00:ca40:ffff:ffff:ffff:ffff:ffff:ffff,DK
-2a00:ca60::,2a00:ca60:ffff:ffff:ffff:ffff:ffff:ffff,LU
+2a00:ca60::,2a00:ca67:ffff:ffff:ffff:ffff:ffff:ffff,LU
2a00:ca80::,2a00:ca80:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a00:caa0::,2a00:caa0:ffff:ffff:ffff:ffff:ffff:ffff,JO
2a00:cac0::,2a00:cac0:ffff:ffff:ffff:ffff:ffff:ffff,AT
@@ -12544,7 +12754,7 @@
2a00:ce80::,2a00:ce80:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a00:cea0::,2a00:cea0:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a00:cec0::,2a00:cec0:ffff:ffff:ffff:ffff:ffff:ffff,UA
-2a00:cee0::,2a00:cee0:ffff:ffff:ffff:ffff:ffff:ffff,PS
+2a00:cee0::,2a00:cee7:ffff:ffff:ffff:ffff:ffff:ffff,PS
2a00:cf00::,2a00:cf00:ffff:ffff:ffff:ffff:ffff:ffff,RS
2a00:cf20::,2a00:cf20:ffff:ffff:ffff:ffff:ffff:ffff,SA
2a00:cf40::,2a00:cf40:ffff:ffff:ffff:ffff:ffff:ffff,DE
@@ -12596,7 +12806,7 @@
2a00:d560::,2a00:d567:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a00:d580::,2a00:d580:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:d5a0::,2a00:d5a0:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a00:d5c0::,2a00:d5c0:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a00:d5c0::,2a00:d5c7:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a00:d5e0::,2a00:d5e0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:d600::,2a00:d600:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:d620::,2a00:d620:ffff:ffff:ffff:ffff:ffff:ffff,IQ
@@ -12781,7 +12991,6 @@
2a00:ee20::,2a00:ee20:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a00:ee40::,2a00:ee40:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:ee60::,2a00:ee60:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a00:ee80::,2a00:ee80:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a00:eea0::,2a00:eea0:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a00:eec0::,2a00:eec0:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a00:eee0::,2a00:eee0:ffff:ffff:ffff:ffff:ffff:ffff,TR
@@ -12824,14 +13033,7 @@
2a00:f3a0::,2a00:f3a0:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a00:f3c0::,2a00:f3c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:f3e0::,2a00:f3e0:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a00:f400::,2a00:f400:ffff:ffff:ffff:ffff:ffff:ffff,LU
-2a00:f420::,2a00:f420:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a00:f440::,2a00:f440:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a00:f460::,2a00:f460:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a00:f480::,2a00:f480:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a00:f4a0::,2a00:f4a0:ffff:ffff:ffff:ffff:ffff:ffff,LV
-2a00:f4c0::,2a00:f4c0:ffff:ffff:ffff:ffff:ffff:ffff,SE
-2a00:f4e0::,2a00:f4e0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a00:f400::,2a00:f4ff:ffff:ffff:ffff:ffff:ffff:ffff,RW
2a00:f500::,2a00:f507:ffff:ffff:ffff:ffff:ffff:ffff,LT
2a00:f520::,2a00:f520:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:f540::,2a00:f540:ffff:ffff:ffff:ffff:ffff:ffff,GB
@@ -12848,7 +13050,7 @@
2a00:f6a0::,2a00:f6a0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a00:f6c0::,2a00:f6c0:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a00:f6e0::,2a00:f6e0:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a00:f700::,2a00:f700:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a00:f700::,2a00:f707:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:f720::,2a00:f720:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a00:f760::,2a00:f760:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a00:f780::,2a00:f780:ffff:ffff:ffff:ffff:ffff:ffff,TR
@@ -12995,7 +13197,7 @@
2a01:280::,2a01:287:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a01:288::,2a01:288:ffff:ffff:ffff:ffff:ffff:ffff,BG
2a01:290::,2a01:290:ffff:ffff:ffff:ffff:ffff:ffff,FR
-2a01:298::,2a01:298:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a01:298::,2a01:29f:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a01:2a0::,2a01:2a0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a01:2a8::,2a01:2af:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a01:2b0::,2a01:2b7:ffff:ffff:ffff:ffff:ffff:ffff,SE
@@ -13087,7 +13289,6 @@
2a01:5d0::,2a01:5d0:ffff:ffff:ffff:ffff:ffff:ffff,HU
2a01:5d8::,2a01:5df:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a01:5e0::,2a01:5e0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
-2a01:5e8::,2a01:5e8:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a01:5f0::,2a01:5f0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a01:5f8::,2a01:5f8:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a01:600::,2a01:600:ffff:ffff:ffff:ffff:ffff:ffff,NO
@@ -13154,7 +13355,7 @@
2a01:7f8::,2a01:7f8:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:800::,2a01:8ff:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:c00::,2a01:c3f:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a01:e00::,2a01:e3f:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a01:e00::,2a01:eff:ffff:ffff:ffff:ffff:ffff:ffff,SX
2a01:1000::,2a01:17ff:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a01:2000::,2a01:2fff:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a01:4000::,2a01:4000:ffff:ffff:ffff:ffff:ffff:ffff,AM
@@ -13349,7 +13550,7 @@
2a01:5940::,2a01:5940:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a01:5960::,2a01:5960:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a01:5980::,2a01:5980:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a01:59a0::,2a01:59a0:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a01:59a0::,2a01:59a7:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a01:59c0::,2a01:59c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:59e0::,2a01:59e0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:5a00::,2a01:5a00:ffff:ffff:ffff:ffff:ffff:ffff,BE
@@ -13484,7 +13685,7 @@
2a01:6a80::,2a01:6a80:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a01:6aa0::,2a01:6aa0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a01:6ac0::,2a01:6ac0:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a01:6ae0::,2a01:6ae0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:6ae0::,2a01:6ae7:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:6b00::,2a01:6b00:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a01:6b20::,2a01:6b20:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:6b40::,2a01:6b40:ffff:ffff:ffff:ffff:ffff:ffff,CZ
@@ -13716,222 +13917,431 @@
2a01:8840::,2a01:8840:ffff:ffff:ffff:ffff:ffff:ffff,IE
2a01:8860::,2a01:8860:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a01:8880::,2a01:8880:ffff:ffff:ffff:ffff:ffff:ffff,BG
+2a01:88a0::,2a01:88a0:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a01:88c0::,2a01:88c0:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a01:88e0::,2a01:88e0:ffff:ffff:ffff:ffff:ffff:ffff,GE
2a01:8900::,2a01:8900:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:8920::,2a01:8920:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a01:8940::,2a01:8940:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:8960::,2a01:8960:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a01:8980::,2a01:8980:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a01:89a0::,2a01:89a0:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a01:89c0::,2a01:89c0:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a01:89e0::,2a01:89e0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:8a00::,2a01:8a00:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a01:8a20::,2a01:8a20:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a01:8a40::,2a01:8a40:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a01:8a60::,2a01:8a60:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a01:8a80::,2a01:8a80:ffff:ffff:ffff:ffff:ffff:ffff,SK
+2a01:8aa0::,2a01:8aa0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:8ac0::,2a01:8ac0:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a01:8ae0::,2a01:8ae0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a01:8b00::,2a01:8b00:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a01:8b20::,2a01:8b20:ffff:ffff:ffff:ffff:ffff:ffff,PS
2a01:8b40::,2a01:8b40:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a01:8b60::,2a01:8b60:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a01:8b80::,2a01:8b80:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a01:8ba0::,2a01:8ba7:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a01:8bc0::,2a01:8bc0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:8be0::,2a01:8be0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a01:8c00::,2a01:8c00:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a01:8c20::,2a01:8c20:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a01:8c40::,2a01:8c40:ffff:ffff:ffff:ffff:ffff:ffff,GI
+2a01:8c60::,2a01:8c60:ffff:ffff:ffff:ffff:ffff:ffff,AZ
2a01:8c80::,2a01:8c80:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a01:8ca0::,2a01:8ca0:ffff:ffff:ffff:ffff:ffff:ffff,LV
2a01:8cc0::,2a01:8cc0:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a01:8ce0::,2a01:8ce0:ffff:ffff:ffff:ffff:ffff:ffff,KZ
2a01:8d00::,2a01:8d00:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a01:8d20::,2a01:8d20:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a01:8d40::,2a01:8d47:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a01:8d80::,2a01:8d80:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a01:8da0::,2a01:8da0:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a01:8dc0::,2a01:8dc0:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a01:8de0::,2a01:8de0:ffff:ffff:ffff:ffff:ffff:ffff,HU
2a01:8e00::,2a01:8e00:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a01:8e20::,2a01:8e20:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:8e40::,2a01:8e40:ffff:ffff:ffff:ffff:ffff:ffff,JO
+2a01:8e60::,2a01:8e60:ffff:ffff:ffff:ffff:ffff:ffff,US
2a01:8e80::,2a01:8e87:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a01:8ec0::,2a01:8ec0:ffff:ffff:ffff:ffff:ffff:ffff,DK
+2a01:8ee0::,2a01:8ee0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a01:8f00::,2a01:8f00:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a01:8f20::,2a01:8f20:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a01:8f40::,2a01:8f40:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a01:8f60::,2a01:8f60:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a01:8f80::,2a01:8f80:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a01:8fa0::,2a01:8fa0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:8fc0::,2a01:8fc0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a01:8fe0::,2a01:8fe0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:9000::,2a01:9000:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a01:9020::,2a01:9020:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a01:9040::,2a01:9040:ffff:ffff:ffff:ffff:ffff:ffff,SI
+2a01:9060::,2a01:9060:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a01:9080::,2a01:9080:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a01:90a0::,2a01:90a0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a01:90c0::,2a01:90c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:90e0::,2a01:90e0:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a01:9100::,2a01:9100:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a01:9120::,2a01:9120:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a01:9140::,2a01:9140:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a01:9160::,2a01:9160:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a01:9180::,2a01:9180:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a01:91a0::,2a01:91a0:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a01:91c0::,2a01:91c0:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a01:91e0::,2a01:91e0:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a01:9220::,2a01:9220:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a01:9240::,2a01:9240:ffff:ffff:ffff:ffff:ffff:ffff,AZ
+2a01:9260::,2a01:9260:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a01:9280::,2a01:9280:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a01:92a0::,2a01:92a0:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a01:92c0::,2a01:92c0:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a01:92e0::,2a01:92e0:ffff:ffff:ffff:ffff:ffff:ffff,IL
2a01:9300::,2a01:9300:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a01:9320::,2a01:9320:ffff:ffff:ffff:ffff:ffff:ffff,HU
2a01:9340::,2a01:9340:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a01:9360::,2a01:9360:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a01:9380::,2a01:9380:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a01:93a0::,2a01:93a0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:93c0::,2a01:93c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:93e0::,2a01:93e0:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a01:9400::,2a01:9400:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a01:9420::,2a01:9420:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a01:9440::,2a01:9440:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a01:9460::,2a01:9460:ffff:ffff:ffff:ffff:ffff:ffff,IS
2a01:9480::,2a01:9480:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a01:94a0::,2a01:94a0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:94c0::,2a01:94c0:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a01:94e0::,2a01:94e0:ffff:ffff:ffff:ffff:ffff:ffff,HU
2a01:9500::,2a01:9500:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a01:9520::,2a01:9520:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:9540::,2a01:9540:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:9560::,2a01:9560:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a01:9580::,2a01:9580:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a01:95a0::,2a01:95a0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a01:95c0::,2a01:95c0:ffff:ffff:ffff:ffff:ffff:ffff,HU
+2a01:95e0::,2a01:95e0:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a01:9600::,2a01:9600:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:9620::,2a01:9620:ffff:ffff:ffff:ffff:ffff:ffff,GE
2a01:9640::,2a01:9640:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a01:9660::,2a01:9660:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a01:9680::,2a01:9680:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a01:96a0::,2a01:96a0:ffff:ffff:ffff:ffff:ffff:ffff,KG
2a01:96c0::,2a01:96c0:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a01:96e0::,2a01:96e0:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a01:9700::,2a01:9700:ffff:ffff:ffff:ffff:ffff:ffff,JO
+2a01:9720::,2a01:9720:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a01:9740::,2a01:9740:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:9760::,2a01:9760:ffff:ffff:ffff:ffff:ffff:ffff,KY
2a01:9780::,2a01:9780:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a01:97a0::,2a01:97a0:ffff:ffff:ffff:ffff:ffff:ffff,EE
2a01:97c0::,2a01:97c0:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a01:97e0::,2a01:97e0:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a01:9800::,2a01:9800:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a01:9820::,2a01:9820:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:9840::,2a01:9840:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a01:9860::,2a01:9860:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a01:9880::,2a01:9880:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:98a0::,2a01:98a0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a01:98c0::,2a01:98c0:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a01:98e0::,2a01:98e0:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a01:9900::,2a01:9900:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a01:9920::,2a01:9920:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a01:9940::,2a01:9940:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a01:9960::,2a01:9960:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a01:9980::,2a01:9980:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a01:99a0::,2a01:99a0:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a01:99e0::,2a01:99e0:ffff:ffff:ffff:ffff:ffff:ffff,KZ
2a01:9a00::,2a01:9a00:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a01:9a20::,2a01:9a20:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a01:9a40::,2a01:9a40:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a01:9a60::,2a01:9a60:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:9a80::,2a01:9a80:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a01:9aa0::,2a01:9aa0:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a01:9ac0::,2a01:9ac0:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a01:9ae0::,2a01:9ae0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a01:9b00::,2a01:9b00:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a01:9b20::,2a01:9b20:ffff:ffff:ffff:ffff:ffff:ffff,KW
2a01:9b40::,2a01:9b40:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a01:9b60::,2a01:9b60:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:9b80::,2a01:9b80:ffff:ffff:ffff:ffff:ffff:ffff,HU
-2a01:9bc0::,2a01:9bc0:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a01:9ba0::,2a01:9ba0:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a01:9bc0::,2a01:9bc7:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a01:9be0::,2a01:9be0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:9c00::,2a01:9c00:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a01:9c20::,2a01:9c20:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a01:9c40::,2a01:9c41:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:9c60::,2a01:9c60:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a01:9c80::,2a01:9c80:ffff:ffff:ffff:ffff:ffff:ffff,GE
+2a01:9ca0::,2a01:9ca0:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a01:9cc0::,2a01:9cc0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:9ce0::,2a01:9ce0:ffff:ffff:ffff:ffff:ffff:ffff,SI
2a01:9d00::,2a01:9d00:ffff:ffff:ffff:ffff:ffff:ffff,KG
+2a01:9d20::,2a01:9d20:ffff:ffff:ffff:ffff:ffff:ffff,AL
2a01:9d40::,2a01:9d40:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a01:9d60::,2a01:9d60:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a01:9d80::,2a01:9d80:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a01:9da0::,2a01:9da0:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a01:9dc0::,2a01:9dc0:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a01:9e00::,2a01:9e00:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:9de0::,2a01:9de0:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a01:9e00::,2a01:9e07:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:9e20::,2a01:9e20:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:9e40::,2a01:9e40:ffff:ffff:ffff:ffff:ffff:ffff,BG
+2a01:9e60::,2a01:9e60:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:9e80::,2a01:9e80:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:9ea0::,2a01:9ea0:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a01:9ec0::,2a01:9ec7:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:9f00::,2a01:9f00:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a01:9f20::,2a01:9f20:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a01:9f40::,2a01:9f40:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a01:9f60::,2a01:9f60:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a01:9f80::,2a01:9f80:ffff:ffff:ffff:ffff:ffff:ffff,SK
+2a01:9fa0::,2a01:9fa0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:9fc0::,2a01:9fc0:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a01:9fe0::,2a01:9fe0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:a000::,2a01:a000:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:a020::,2a01:a020:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:a040::,2a01:a040:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a01:a060::,2a01:a060:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a01:a080::,2a01:a080:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a01:a0a0::,2a01:a0a0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:a0c0::,2a01:a0c0:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a01:a0e0::,2a01:a0e0:ffff:ffff:ffff:ffff:ffff:ffff,GE
2a01:a100::,2a01:a100:ffff:ffff:ffff:ffff:ffff:ffff,SE
-2a01:a140::,2a01:a140:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a01:a120::,2a01:a120:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a01:a160::,2a01:a160:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a01:a180::,2a01:a180:ffff:ffff:ffff:ffff:ffff:ffff,MK
+2a01:a1a0::,2a01:a1a0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a01:a1c0::,2a01:a1c0:ffff:ffff:ffff:ffff:ffff:ffff,LT
+2a01:a1e0::,2a01:a1e0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a01:a200::,2a01:a200:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:a220::,2a01:a220:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:a240::,2a01:a240:ffff:ffff:ffff:ffff:ffff:ffff,UA
+2a01:a260::,2a01:a260:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a01:a280::,2a01:a280:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a01:a2a0::,2a01:a2a0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a01:a2c0::,2a01:a2c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:a2e0::,2a01:a2e0:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a01:a300::,2a01:a300:ffff:ffff:ffff:ffff:ffff:ffff,UA
+2a01:a320::,2a01:a320:ffff:ffff:ffff:ffff:ffff:ffff,MD
2a01:a340::,2a01:a340:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a01:a360::,2a01:a360:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a01:a380::,2a01:a380:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a01:a3a0::,2a01:a3a0:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a01:a3c0::,2a01:a3c0:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a01:a3e0::,2a01:a3e0:ffff:ffff:ffff:ffff:ffff:ffff,EE
2a01:a400::,2a01:a400:ffff:ffff:ffff:ffff:ffff:ffff,JE
+2a01:a420::,2a01:a420:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a01:a440::,2a01:a440:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a01:a460::,2a01:a460:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a01:a480::,2a01:a480:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a01:a4a0::,2a01:a4a0:ffff:ffff:ffff:ffff:ffff:ffff,LU
2a01:a4c0::,2a01:a4c0:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a01:a4e0::,2a01:a4e0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a01:a500::,2a01:a500:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:a520::,2a01:a520:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a01:a540::,2a01:a540:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a01:a560::,2a01:a560:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a01:a580::,2a01:a580:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a01:a5a0::,2a01:a5a0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:a5c0::,2a01:a5c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:a5e0::,2a01:a5e0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a01:a600::,2a01:a600:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a01:a620::,2a01:a620:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a01:a640::,2a01:a640:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a01:a660::,2a01:a660:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a01:a680::,2a01:a680:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a01:a6a0::,2a01:a6a0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a01:a6c0::,2a01:a6c0:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a01:a6e0::,2a01:a6e0:ffff:ffff:ffff:ffff:ffff:ffff,BA
2a01:a700::,2a01:a707:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:a740::,2a01:a740:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a01:a760::,2a01:a760:ffff:ffff:ffff:ffff:ffff:ffff,HR
2a01:a780::,2a01:a780:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a01:a7a0::,2a01:a7a0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:a7c0::,2a01:a7c0:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a01:a7e0::,2a01:a7e0:ffff:ffff:ffff:ffff:ffff:ffff,FI
2a01:a800::,2a01:a800:ffff:ffff:ffff:ffff:ffff:ffff,FI
+2a01:a820::,2a01:a820:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a01:a840::,2a01:a840:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a01:a860::,2a01:a860:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:a880::,2a01:a880:ffff:ffff:ffff:ffff:ffff:ffff,LV
+2a01:a8a0::,2a01:a8a0:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a01:a8c0::,2a01:a8c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a01:a8e0::,2a01:a8e0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a01:a900::,2a01:a900:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a01:a920::,2a01:a920:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a01:a940::,2a01:a940:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a01:a960::,2a01:a960:ffff:ffff:ffff:ffff:ffff:ffff,AL
2a01:a980::,2a01:a980:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a01:a9a0::,2a01:a9a0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a01:a9c0::,2a01:a9c0:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a01:a9e0::,2a01:a9e0:ffff:ffff:ffff:ffff:ffff:ffff,US
2a01:aa00::,2a01:aa00:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a01:aa20::,2a01:aa20:ffff:ffff:ffff:ffff:ffff:ffff,IQ
2a01:aa40::,2a01:aa40:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a01:aa60::,2a01:aa60:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a01:aa80::,2a01:aa80:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a01:aaa0::,2a01:aaa0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a01:aac0::,2a01:aac0:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a01:aae0::,2a01:aae0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a01:ab00::,2a01:ab00:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a01:ab20::,2a01:ab20:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a01:ab40::,2a01:ab40:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a01:aba0::,2a01:aba0:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a01:abc0::,2a01:abc0:ffff:ffff:ffff:ffff:ffff:ffff,MT
+2a01:abe0::,2a01:abe0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:ac00::,2a01:ac00:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a01:ac20::,2a01:ac20:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a01:ac40::,2a01:ac40:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a01:ac60::,2a01:ac60:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a01:ac80::,2a01:ac80:ffff:ffff:ffff:ffff:ffff:ffff,RS
+2a01:aca0::,2a01:aca0:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a01:acc0::,2a01:acc0:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a01:ace0::,2a01:ace0:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a01:ad00::,2a01:ad00:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a01:ad20::,2a01:ad20:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a01:ad40::,2a01:ad40:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:ad60::,2a01:ad60:ffff:ffff:ffff:ffff:ffff:ffff,RS
2a01:ad80::,2a01:ad80:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a01:ada0::,2a01:ada0:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a01:adc0::,2a01:adc0:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a01:ade0::,2a01:ade0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a01:ae00::,2a01:ae00:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:ae20::,2a01:ae20:ffff:ffff:ffff:ffff:ffff:ffff,HU
2a01:ae40::,2a01:ae40:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a01:ae60::,2a01:ae60:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a01:ae80::,2a01:ae80:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a01:aea0::,2a01:aea0:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a01:aec0::,2a01:aec0:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a01:aee0::,2a01:aee0:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a01:af00::,2a01:af00:ffff:ffff:ffff:ffff:ffff:ffff,KZ
+2a01:af20::,2a01:af20:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a01:af40::,2a01:af40:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a01:af60::,2a01:af60:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a01:af80::,2a01:af80:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a01:afa0::,2a01:afa0:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a01:afc0::,2a01:afc0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a01:afe0::,2a01:afe0:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a01:b000::,2a01:b000:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:b020::,2a01:b020:ffff:ffff:ffff:ffff:ffff:ffff,PT
2a01:b040::,2a01:b040:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:b060::,2a01:b060:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a01:b080::,2a01:b080:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a01:b0a0::,2a01:b0a0:ffff:ffff:ffff:ffff:ffff:ffff,US
2a01:b0c0::,2a01:b0c0:ffff:ffff:ffff:ffff:ffff:ffff,KZ
+2a01:b0e0::,2a01:b0e0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a01:b100::,2a01:b100:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a01:b120::,2a01:b120:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a01:b140::,2a01:b140:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a01:b160::,2a01:b160:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:b180::,2a01:b180:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a01:b1a0::,2a01:b1a0:ffff:ffff:ffff:ffff:ffff:ffff,IE
2a01:b1c0::,2a01:b1c7:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:b200::,2a01:b200:ffff:ffff:ffff:ffff:ffff:ffff,SK
+2a01:b220::,2a01:b220:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a01:b240::,2a01:b240:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:b260::,2a01:b260:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a01:b280::,2a01:b280:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:b2a0::,2a01:b2a0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:b2c0::,2a01:b2c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:b2e0::,2a01:b2e0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a01:b300::,2a01:b307:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a01:b340::,2a01:b340:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a01:b360::,2a01:b360:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a01:b380::,2a01:b380:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a01:b3a0::,2a01:b3a0:ffff:ffff:ffff:ffff:ffff:ffff,AE
2a01:b3c0::,2a01:b3c0:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a01:b3e0::,2a01:b3e0:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a01:b400::,2a01:b400:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a01:b420::,2a01:b420:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a01:b440::,2a01:b440:ffff:ffff:ffff:ffff:ffff:ffff,BG
+2a01:b460::,2a01:b460:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:b480::,2a01:b480:ffff:ffff:ffff:ffff:ffff:ffff,UA
+2a01:b4a0::,2a01:b4a0:ffff:ffff:ffff:ffff:ffff:ffff,SI
2a01:b4c0::,2a01:b4c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a01:b4e0::,2a01:b4e0:ffff:ffff:ffff:ffff:ffff:ffff,SA
2a01:b500::,2a01:b500:ffff:ffff:ffff:ffff:ffff:ffff,GR
+2a01:b520::,2a01:b520:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a01:b540::,2a01:b547:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a01:b580::,2a01:b580:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a01:b5a0::,2a01:b5a0:ffff:ffff:ffff:ffff:ffff:ffff,FI
2a01:b5c0::,2a01:b5c0:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a01:b5e0::,2a01:b5e0:ffff:ffff:ffff:ffff:ffff:ffff,HU
2a01:b600::,2a01:b600:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a01:b620::,2a01:b620:ffff:ffff:ffff:ffff:ffff:ffff,GE
2a01:b640::,2a01:b640:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a01:b660::,2a01:b660:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:b680::,2a01:b680:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a01:b6a0::,2a01:b6a0:ffff:ffff:ffff:ffff:ffff:ffff,BG
2a01:b6c0::,2a01:b6c7:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a01:b700::,2a01:b700:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a01:b720::,2a01:b720:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:b740::,2a01:b740:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a01:b760::,2a01:b760:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:b780::,2a01:b780:ffff:ffff:ffff:ffff:ffff:ffff,MK
+2a01:b7a0::,2a01:b7a0:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a01:b7c0::,2a01:b7c0:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a01:b7e0::,2a01:b7e0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a01:b800::,2a01:b800:ffff:ffff:ffff:ffff:ffff:ffff,RS
+2a01:b820::,2a01:b820:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:b840::,2a01:b840:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:b860::,2a01:b860:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:b880::,2a01:b880:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a01:b8a0::,2a01:b8a0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a01:b8c0::,2a01:b8c0:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a01:b8e0::,2a01:b8e0:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a01:b900::,2a01:b900:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a01:b920::,2a01:b920:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a01:b940::,2a01:b940:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a01:b960::,2a01:b960:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a01:b980::,2a01:b980:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:b9a0::,2a01:b9a0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a01:b9c0::,2a01:b9c0:ffff:ffff:ffff:ffff:ffff:ffff,IS
+2a01:b9e0::,2a01:b9e0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a01:ba00::,2a01:ba00:ffff:ffff:ffff:ffff:ffff:ffff,FI
+2a01:ba20::,2a01:ba20:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:ba40::,2a01:ba40:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a01:ba60::,2a01:ba60:ffff:ffff:ffff:ffff:ffff:ffff,PS
2a01:ba80::,2a01:ba80:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a01:baa0::,2a01:baa0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a01:bac0::,2a01:bac0:ffff:ffff:ffff:ffff:ffff:ffff,HU
+2a01:bae0::,2a01:bae0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a01:bb20::,2a01:bb20:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:bb40::,2a01:bb40:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a01:bb60::,2a01:bb60:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a01:bb80::,2a01:bb80:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a01:bba0::,2a01:bba0:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a01:bbc0::,2a01:bbc0:ffff:ffff:ffff:ffff:ffff:ffff,AM
+2a01:bbe0::,2a01:bbe0:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a01:bc00::,2a01:bc07:ffff:ffff:ffff:ffff:ffff:ffff,IE
2a01:bc40::,2a01:bc40:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a01:bc60::,2a01:bc60:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a01:bca0::,2a01:bca0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:bcc0::,2a01:bcc0:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a01:bce0::,2a01:bce0:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a01:bd00::,2a01:bd00:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a01:bd20::,2a01:bd20:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a01:bd40::,2a01:bd40:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a01:bd60::,2a01:bd60:ffff:ffff:ffff:ffff:ffff:ffff,SY
2a01:bd80::,2a01:bd80:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a01:bda0::,2a01:bda0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a01:bdc0::,2a01:bdc0:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a01:bde0::,2a01:bde0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:be00::,2a01:be00:ffff:ffff:ffff:ffff:ffff:ffff,HU
2a01:be40::,2a01:be40:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a01:be60::,2a01:be60:ffff:ffff:ffff:ffff:ffff:ffff,IE
2a01:be80::,2a01:be80:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a01:bea0::,2a01:bea0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:bec0::,2a01:bec0:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a01:bf00::,2a01:bf00:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:bee0::,2a01:bee0:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a01:bf20::,2a01:bf20:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a01:bf40::,2a01:bf40:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a01:bf60::,2a01:bf60:ffff:ffff:ffff:ffff:ffff:ffff,US
2a01:bf80::,2a01:bf80:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a01:bfa0::,2a01:bfa0:ffff:ffff:ffff:ffff:ffff:ffff,KG
2a01:bfc0::,2a01:bfc0:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a01:bfe0::,2a01:bfe0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a01:c000::,2a01:dfff:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a02::,2a02::ffff:ffff:ffff:ffff:ffff:ffff,LU
2a02:10::,2a02:17:ffff:ffff:ffff:ffff:ffff:ffff,NL
@@ -14024,7 +14434,7 @@
2a02:2d8::,2a02:2d8:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:2e0::,2a02:2e0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:2e8::,2a02:2e8:ffff:ffff:ffff:ffff:ffff:ffff,IT
-2a02:2f0::,2a02:2f0:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:2f0::,2a02:2f7:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:2f8::,2a02:2f8:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:300::,2a02:300:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a02:308::,2a02:308:ffff:ffff:ffff:ffff:ffff:ffff,GB
@@ -14212,37 +14622,7 @@
2a02:8e8::,2a02:8e8:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a02:8f0::,2a02:8f0:ffff:ffff:ffff:ffff:ffff:ffff,PT
2a02:8f8::,2a02:8f8:ffff:ffff:ffff:ffff:ffff:ffff,PL
-2a02:900::,2a02:900:ffff:ffff:ffff:ffff:ffff:ffff,BG
-2a02:908::,2a02:908:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a02:910::,2a02:910:ffff:ffff:ffff:ffff:ffff:ffff,CZ
-2a02:918::,2a02:918:ffff:ffff:ffff:ffff:ffff:ffff,FR
-2a02:920::,2a02:920:ffff:ffff:ffff:ffff:ffff:ffff,SE
-2a02:928::,2a02:928:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a02:930::,2a02:930:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a02:938::,2a02:938:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a02:940::,2a02:940:ffff:ffff:ffff:ffff:ffff:ffff,AT
-2a02:950::,2a02:950:ffff:ffff:ffff:ffff:ffff:ffff,PL
-2a02:958::,2a02:958:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a02:960::,2a02:960:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a02:968::,2a02:968:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a02:970::,2a02:970:ffff:ffff:ffff:ffff:ffff:ffff,CZ
-2a02:978::,2a02:978:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a02:980::,2a02:980:ffff:ffff:ffff:ffff:ffff:ffff,DK
-2a02:988::,2a02:988:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a02:990::,2a02:990:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a02:998::,2a02:998:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a02:9a0::,2a02:9a0:ffff:ffff:ffff:ffff:ffff:ffff,SE
-2a02:9a8::,2a02:9a8:ffff:ffff:ffff:ffff:ffff:ffff,IT
-2a02:9b0::,2a02:9b0:ffff:ffff:ffff:ffff:ffff:ffff,SA
-2a02:9b8::,2a02:9b9:ffff:ffff:ffff:ffff:ffff:ffff,CZ
-2a02:9c0::,2a02:9c0:ffff:ffff:ffff:ffff:ffff:ffff,JO
-2a02:9c8::,2a02:9c8:ffff:ffff:ffff:ffff:ffff:ffff,NO
-2a02:9d0::,2a02:9d0:ffff:ffff:ffff:ffff:ffff:ffff,DK
-2a02:9d8::,2a02:9d8:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a02:9e0::,2a02:9e0:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a02:9e8::,2a02:9e8:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a02:9f0::,2a02:9f0:ffff:ffff:ffff:ffff:ffff:ffff,IS
-2a02:9f8::,2a02:9f8:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:900::,2a02:9ff:ffff:ffff:ffff:ffff:ffff:ffff,DJ
2a02:a00::,2a02:a00:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:a08::,2a02:a08:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:a10::,2a02:a10:ffff:ffff:ffff:ffff:ffff:ffff,NL
@@ -14384,7 +14764,7 @@
2a02:e88::,2a02:e88:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a02:e90::,2a02:e90:ffff:ffff:ffff:ffff:ffff:ffff,FO
2a02:e98::,2a02:e98:ffff:ffff:ffff:ffff:ffff:ffff,CZ
-2a02:ea0::,2a02:ea0:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:ea0::,2a02:ea7:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:ea8::,2a02:ea8:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a02:eb0::,2a02:eb0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:eb8::,2a02:eb8:ffff:ffff:ffff:ffff:ffff:ffff,SE
@@ -14428,7 +14808,7 @@
2a02:ff0::,2a02:ff0:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a02:ff8::,2a02:ff8:ffff:ffff:ffff:ffff:ffff:ffff,IR
2a02:1000::,2a02:103f:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a02:1200::,2a02:121f:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a02:1200::,2a02:12ff:ffff:ffff:ffff:ffff:ffff:ffff,CI
2a02:1300::,2a02:1300:ffff:ffff:ffff:ffff:ffff:ffff,IS
2a02:1308::,2a02:1308:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:1310::,2a02:1310:ffff:ffff:ffff:ffff:ffff:ffff,GB
@@ -14523,39 +14903,8 @@
2a02:17e8::,2a02:17e8:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:17f0::,2a02:17f0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:17f8::,2a02:17f8:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a02:1800::,2a02:18ff:ffff:ffff:ffff:ffff:ffff:ffff,BE
-2a02:2000::,2a02:2000:ffff:ffff:ffff:ffff:ffff:ffff,UA
-2a02:2008::,2a02:2008:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a02:2010::,2a02:2010:ffff:ffff:ffff:ffff:ffff:ffff,TR
-2a02:2018::,2a02:2018:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a02:2020::,2a02:2020:ffff:ffff:ffff:ffff:ffff:ffff,TR
-2a02:2028::,2a02:2028:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a02:2030::,2a02:2030:ffff:ffff:ffff:ffff:ffff:ffff,BA
-2a02:2038::,2a02:2038:ffff:ffff:ffff:ffff:ffff:ffff,FR
-2a02:2040::,2a02:2040:ffff:ffff:ffff:ffff:ffff:ffff,IT
-2a02:2048::,2a02:2048:ffff:ffff:ffff:ffff:ffff:ffff,FI
-2a02:2050::,2a02:2050:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a02:2058::,2a02:2058:ffff:ffff:ffff:ffff:ffff:ffff,IT
-2a02:2060::,2a02:2060:ffff:ffff:ffff:ffff:ffff:ffff,FR
-2a02:2068::,2a02:2068:ffff:ffff:ffff:ffff:ffff:ffff,ES
-2a02:2070::,2a02:2070:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a02:2078::,2a02:2078:ffff:ffff:ffff:ffff:ffff:ffff,IE
-2a02:2080::,2a02:2080:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a02:2088::,2a02:2088:ffff:ffff:ffff:ffff:ffff:ffff,CZ
-2a02:2090::,2a02:2090:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a02:2098::,2a02:2098:ffff:ffff:ffff:ffff:ffff:ffff,FR
-2a02:20a0::,2a02:20a0:ffff:ffff:ffff:ffff:ffff:ffff,NO
-2a02:20a8::,2a02:20a8:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a02:20b0::,2a02:20b0:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a02:20b8::,2a02:20b8:ffff:ffff:ffff:ffff:ffff:ffff,HR
-2a02:20c0::,2a02:20c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a02:20c8::,2a02:20c8:ffff:ffff:ffff:ffff:ffff:ffff,NO
-2a02:20d0::,2a02:20d0:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a02:20d8::,2a02:20d8:ffff:ffff:ffff:ffff:ffff:ffff,IT
-2a02:20e0::,2a02:20e0:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a02:20e8::,2a02:20e8:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a02:20f0::,2a02:20f0:ffff:ffff:ffff:ffff:ffff:ffff,FR
-2a02:20f8::,2a02:20f8:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a02:1800::,2a02:18ff:ffff:ffff:ffff:ffff:ffff:ffff,BF
+2a02:2000::,2a02:20ff:ffff:ffff:ffff:ffff:ffff:ffff,DJ
2a02:2100::,2a02:2100:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:2108::,2a02:2108:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a02:2110::,2a02:2110:ffff:ffff:ffff:ffff:ffff:ffff,GB
@@ -14691,7 +15040,6 @@
2a02:2558::,2a02:2558:ffff:ffff:ffff:ffff:ffff:ffff,JO
2a02:2560::,2a02:2560:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:2568::,2a02:2568:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a02:2570::,2a02:2577:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a02:2578::,2a02:2578:ffff:ffff:ffff:ffff:ffff:ffff,BH
2a02:2580::,2a02:2587:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a02:2588::,2a02:2588:ffff:ffff:ffff:ffff:ffff:ffff,CZ
@@ -14743,7 +15091,7 @@
2a02:2700::,2a02:2700:ffff:ffff:ffff:ffff:ffff:ffff,IQ
2a02:2708::,2a02:2708:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:2710::,2a02:2710:ffff:ffff:ffff:ffff:ffff:ffff,UA
-2a02:2718::,2a02:2718:ffff:ffff:ffff:ffff:ffff:ffff,YE
+2a02:2718::,2a02:271f:ffff:ffff:ffff:ffff:ffff:ffff,YE
2a02:2720::,2a02:2720:ffff:ffff:ffff:ffff:ffff:ffff,RO
2a02:2728::,2a02:2728:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a02:2730::,2a02:2730:ffff:ffff:ffff:ffff:ffff:ffff,CZ
@@ -14751,7 +15099,6 @@
2a02:2740::,2a02:2740:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a02:2748::,2a02:2748:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:2750::,2a02:2750:ffff:ffff:ffff:ffff:ffff:ffff,AT
-2a02:2758::,2a02:2758:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a02:2760::,2a02:2760:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:2768::,2a02:2768:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:2770::,2a02:2770:ffff:ffff:ffff:ffff:ffff:ffff,NL
@@ -14825,15 +15172,14 @@
2a02:2990::,2a02:2990:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:2998::,2a02:2998:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:29a0::,2a02:29a0:ffff:ffff:ffff:ffff:ffff:ffff,IT
-2a02:29a8::,2a02:29a8:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a02:29b0::,2a02:29b0:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a02:29a8::,2a02:29b0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:29b8::,2a02:29b8:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a02:29c0::,2a02:29c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a02:29c8::,2a02:29c8:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:29d0::,2a02:29d0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:29d8::,2a02:29d8:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:29e0::,2a02:29e0:ffff:ffff:ffff:ffff:ffff:ffff,IT
-2a02:29e8::,2a02:29e8:ffff:ffff:ffff:ffff:ffff:ffff,EE
+2a02:29e8::,2a02:29ef:ffff:ffff:ffff:ffff:ffff:ffff,EE
2a02:29f0::,2a02:29f0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:29f8::,2a02:29f8:ffff:ffff:ffff:ffff:ffff:ffff,AM
2a02:2a00::,2a02:2a00:ffff:ffff:ffff:ffff:ffff:ffff,RO
@@ -14889,187 +15235,370 @@
2a02:2bb0::,2a02:2bb0:ffff:ffff:ffff:ffff:ffff:ffff,IE
2a02:2bb8::,2a02:2bb8:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:2bc0::,2a02:2bc0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:2be0::,2a02:2be0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:2c00::,2a02:2c07:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a02:2c40::,2a02:2c40:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a02:2c60::,2a02:2c60:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:2c80::,2a02:2c80:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a02:2ca0::,2a02:2ca0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:2cc0::,2a02:2cc0:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a02:2ce0::,2a02:2ce0:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:2d00::,2a02:2d00:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a02:2d20::,2a02:2d20:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a02:2d40::,2a02:2d40:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:2d60::,2a02:2d60:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a02:2d80::,2a02:2d80:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:2da0::,2a02:2da0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:2dc0::,2a02:2dc0:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:2de0::,2a02:2de0:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a02:2e00::,2a02:2e1f:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a02:2f00::,2a02:2f0f:ffff:ffff:ffff:ffff:ffff:ffff,RO
2a02:2f80::,2a02:2f80:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a02:2fa0::,2a02:2fa0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:2fc0::,2a02:2fc0:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:2fe0::,2a02:2fe0:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:3000::,2a02:31ff:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:4000::,2a02:4000:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a02:4020::,2a02:4020:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a02:4040::,2a02:4040:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:4060::,2a02:4060:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a02:4080::,2a02:4080:ffff:ffff:ffff:ffff:ffff:ffff,LB
+2a02:40a0::,2a02:40a0:ffff:ffff:ffff:ffff:ffff:ffff,IL
2a02:40c0::,2a02:40c0:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a02:40e0::,2a02:40e0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a02:4100::,2a02:4100:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a02:4120::,2a02:4120:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:4140::,2a02:4140:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a02:4160::,2a02:4160:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a02:4180::,2a02:4180:ffff:ffff:ffff:ffff:ffff:ffff,LB
+2a02:41a0::,2a02:41a0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:41c0::,2a02:41c0:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a02:41e0::,2a02:41e0:ffff:ffff:ffff:ffff:ffff:ffff,IL
2a02:4200::,2a02:4200:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a02:4220::,2a02:4220:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a02:4240::,2a02:4240:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a02:4260::,2a02:4260:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a02:4280::,2a02:4280:ffff:ffff:ffff:ffff:ffff:ffff,ME
+2a02:42a0::,2a02:42a0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a02:42c0::,2a02:42c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:42e0::,2a02:42e0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:4300::,2a02:4300:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a02:4320::,2a02:4320:ffff:ffff:ffff:ffff:ffff:ffff,BG
2a02:4340::,2a02:4340:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:4360::,2a02:4360:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a02:43a0::,2a02:43a0:ffff:ffff:ffff:ffff:ffff:ffff,IQ
2a02:43c0::,2a02:43c0:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:43e0::,2a02:43e0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:4420::,2a02:4420:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a02:4440::,2a02:4440:ffff:ffff:ffff:ffff:ffff:ffff,QA
+2a02:4460::,2a02:4460:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a02:4480::,2a02:4480:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:44a0::,2a02:44a0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:44c0::,2a02:44c0:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a02:44e0::,2a02:44e0:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:4500::,2a02:4500:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:4520::,2a02:4520:ffff:ffff:ffff:ffff:ffff:ffff,SY
2a02:4540::,2a02:4540:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a02:4560::,2a02:4560:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:45a0::,2a02:45a0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:45c0::,2a02:45c0:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:45e0::,2a02:45e0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:4600::,2a02:4600:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a02:4620::,2a02:4620:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a02:4640::,2a02:4640:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a02:4660::,2a02:4660:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:4680::,2a02:4680:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a02:46a0::,2a02:46a0:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a02:46c0::,2a02:46c0:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a02:46e0::,2a02:46e0:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:4700::,2a02:4700:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a02:4720::,2a02:4720:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:4740::,2a02:4740:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a02:4760::,2a02:4760:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:4780::,2a02:4780:ffff:ffff:ffff:ffff:ffff:ffff,LT
+2a02:47a0::,2a02:47a0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:47c0::,2a02:47c0:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a02:47e0::,2a02:47e0:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a02:4800::,2a02:4800:ffff:ffff:ffff:ffff:ffff:ffff,RO
+2a02:4820::,2a02:4820:ffff:ffff:ffff:ffff:ffff:ffff,FI
2a02:4840::,2a02:4840:ffff:ffff:ffff:ffff:ffff:ffff,LV
+2a02:4860::,2a02:4860:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:4880::,2a02:4880:ffff:ffff:ffff:ffff:ffff:ffff,FI
+2a02:48a0::,2a02:48a0:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a02:48e0::,2a02:48e0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:4900::,2a02:4907:ffff:ffff:ffff:ffff:ffff:ffff,GR
2a02:4940::,2a02:4940:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a02:4960::,2a02:4960:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a02:4980::,2a02:4980:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a02:49a0::,2a02:49a0:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a02:49c0::,2a02:49c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:49e0::,2a02:49e0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:4a00::,2a02:4a00:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a02:4a20::,2a02:4a20:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:4a40::,2a02:4a40:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a02:4a60::,2a02:4a60:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a02:4aa0::,2a02:4aa0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:4ac0::,2a02:4ac0:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a02:4ae0::,2a02:4ae0:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:4b00::,2a02:4b07:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a02:4b40::,2a02:4b40:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:4b60::,2a02:4b60:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:4b80::,2a02:4b80:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:4ba0::,2a02:4ba0:ffff:ffff:ffff:ffff:ffff:ffff,BG
2a02:4bc0::,2a02:4bc0:ffff:ffff:ffff:ffff:ffff:ffff,DK
+2a02:4be0::,2a02:4be0:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a02:4c00::,2a02:4c00:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:4c20::,2a02:4c20:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:4c40::,2a02:4c47:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:4c80::,2a02:4c80:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a02:4ca0::,2a02:4ca0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:4cc0::,2a02:4cc0:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:4ce0::,2a02:4ce0:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:4d00::,2a02:4d00:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:4d20::,2a02:4d20:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:4d40::,2a02:4d40:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:4d60::,2a02:4d60:ffff:ffff:ffff:ffff:ffff:ffff,IQ
2a02:4d80::,2a02:4d80:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a02:4da0::,2a02:4da0:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a02:4dc0::,2a02:4dc0:ffff:ffff:ffff:ffff:ffff:ffff,BG
+2a02:4de0::,2a02:4de0:ffff:ffff:ffff:ffff:ffff:ffff,DK
+2a02:4e20::,2a02:4e20:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:4e40::,2a02:4e40:ffff:ffff:ffff:ffff:ffff:ffff,UA
+2a02:4e60::,2a02:4e60:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a02:4ea0::,2a02:4ea0:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a02:4ec0::,2a02:4ec0:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a02:4ee0::,2a02:4ee0:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:4f00::,2a02:4f00:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a02:4f20::,2a02:4f20:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:4f40::,2a02:4f40:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a02:4f60::,2a02:4f60:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:4f80::,2a02:4f80:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a02:4fa0::,2a02:4fa0:ffff:ffff:ffff:ffff:ffff:ffff,IS
2a02:4fc0::,2a02:4fc0:ffff:ffff:ffff:ffff:ffff:ffff,GR
+2a02:4fe0::,2a02:4fe0:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a02:5000::,2a02:5000:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a02:5020::,2a02:5020:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:5040::,2a02:5040:ffff:ffff:ffff:ffff:ffff:ffff,GR
+2a02:5060::,2a02:5060:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:5080::,2a02:5080:ffff:ffff:ffff:ffff:ffff:ffff,IL
+2a02:50a0::,2a02:50a0:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a02:50c0::,2a02:50c0:ffff:ffff:ffff:ffff:ffff:ffff,KZ
+2a02:50e0::,2a02:50e0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:5100::,2a02:5100:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a02:5120::,2a02:5120:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a02:5140::,2a02:5140:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:5160::,2a02:5160:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:5180::,2a02:5180:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a02:51a0::,2a02:51a0:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:51c0::,2a02:51c0:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a02:51e0::,2a02:51e0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:5200::,2a02:5200:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a02:5220::,2a02:5220:ffff:ffff:ffff:ffff:ffff:ffff,BG
+2a02:5260::,2a02:5260:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:5280::,2a02:5280:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a02:52c0::,2a02:52c0:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a02:52a0::,2a02:52a0:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a02:52e0::,2a02:52e0:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a02:5300::,2a02:5300:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:5320::,2a02:5320:ffff:ffff:ffff:ffff:ffff:ffff,MT
2a02:5340::,2a02:5340:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a02:5360::,2a02:5360:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a02:5380::,2a02:5380:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a02:53a0::,2a02:53a0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a02:53c0::,2a02:53c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a02:53e0::,2a02:53e0:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:5400::,2a02:5400:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:5420::,2a02:5420:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a02:5440::,2a02:5440:ffff:ffff:ffff:ffff:ffff:ffff,GR
+2a02:5460::,2a02:5460:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a02:5480::,2a02:5480:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a02:54a0::,2a02:54a0:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:54c0::,2a02:54c0:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a02:54e0::,2a02:54e0:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a02:5500::,2a02:5500:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a02:5520::,2a02:5520:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a02:5540::,2a02:5540:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a02:5560::,2a02:5560:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a02:5580::,2a02:5580:ffff:ffff:ffff:ffff:ffff:ffff,MK
+2a02:55a0::,2a02:55a0:ffff:ffff:ffff:ffff:ffff:ffff,SA
2a02:55c0::,2a02:55c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:55e0::,2a02:55e0:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a02:5600::,2a02:5600:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a02:5620::,2a02:5620:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:5640::,2a02:5640:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a02:5660::,2a02:5660:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a02:5680::,2a02:5680:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:56a0::,2a02:56a0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a02:56c0::,2a02:56c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:56e0::,2a02:56e0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:5720::,2a02:5720:ffff:ffff:ffff:ffff:ffff:ffff,MK
2a02:5740::,2a02:5740:ffff:ffff:ffff:ffff:ffff:ffff,EE
+2a02:5760::,2a02:5760:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:5780::,2a02:5780:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:57a0::,2a02:57a0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a02:57c0::,2a02:57c0:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a02:57e0::,2a02:57e0:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a02:5800::,2a02:5800:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a02:5820::,2a02:5820:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a02:5840::,2a02:5840:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a02:5860::,2a02:5860:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:5880::,2a02:5880:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a02:58a0::,2a02:58a0:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a02:58c0::,2a02:58c0:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a02:58e0::,2a02:58e0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:5900::,2a02:5900:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a02:5920::,2a02:5920:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a02:5940::,2a02:5940:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a02:5960::,2a02:5960:ffff:ffff:ffff:ffff:ffff:ffff,AM
2a02:5980::,2a02:5980:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a02:59a0::,2a02:59a0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:59c0::,2a02:59c0:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a02:59e0::,2a02:59e0:ffff:ffff:ffff:ffff:ffff:ffff,RO
+2a02:5a20::,2a02:5a20:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:5a40::,2a02:5a40:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a02:5a60::,2a02:5a60:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:5a80::,2a02:5a87:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:5aa0::,2a02:5aa0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:5ac0::,2a02:5ac0:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a02:5ae0::,2a02:5ae0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a02:5b00::,2a02:5b00:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a02:5b20::,2a02:5b20:ffff:ffff:ffff:ffff:ffff:ffff,IE
2a02:5b40::,2a02:5b40:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a02:5b60::,2a02:5b60:ffff:ffff:ffff:ffff:ffff:ffff,JO
2a02:5b80::,2a02:5b80:ffff:ffff:ffff:ffff:ffff:ffff,SK
+2a02:5ba0::,2a02:5ba0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:5bc0::,2a02:5bc0:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a02:5be0::,2a02:5be0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:5c20::,2a02:5c20:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a02:5c40::,2a02:5c40:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a02:5c80::,2a02:5c80:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a02:5c60::,2a02:5c60:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a02:5ca0::,2a02:5ca0:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:5cc0::,2a02:5cc0:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a02:5ce0::,2a02:5ce0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:5d00::,2a02:5d00:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a02:5d20::,2a02:5d20:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a02:5d40::,2a02:5d40:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a02:5d60::,2a02:5d60:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:5d80::,2a02:5d80:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:5da0::,2a02:5da0:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a02:5dc0::,2a02:5dc0:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a02:5de0::,2a02:5de0:ffff:ffff:ffff:ffff:ffff:ffff,FI
2a02:5e00::,2a02:5e00:ffff:ffff:ffff:ffff:ffff:ffff,IE
2a02:5e40::,2a02:5e40:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:5e60::,2a02:5e60:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:5e80::,2a02:5e80:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a02:5ea0::,2a02:5ea0:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a02:5ec0::,2a02:5ec0:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a02:5ee0::,2a02:5ee0:ffff:ffff:ffff:ffff:ffff:ffff,IQ
2a02:5f00::,2a02:5f00:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:5f20::,2a02:5f20:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a02:5f40::,2a02:5f40:ffff:ffff:ffff:ffff:ffff:ffff,HR
+2a02:5f60::,2a02:5f60:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:5f80::,2a02:5f80:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a02:5fa0::,2a02:5fa0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a02:5fc0::,2a02:5fc0:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a02:5fe0::,2a02:5fe0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a02:6000::,2a02:6000:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a02:6020::,2a02:6020:ffff:ffff:ffff:ffff:ffff:ffff,BA
2a02:6040::,2a02:6040:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a02:6060::,2a02:6060:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a02:60a0::,2a02:60a0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:60c0::,2a02:60c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:60e0::,2a02:60e0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a02:6100::,2a02:6100:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a02:6120::,2a02:6120:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:6140::,2a02:6140:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a02:6160::,2a02:6160:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:6180::,2a02:6180:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a02:61a0::,2a02:61a0:ffff:ffff:ffff:ffff:ffff:ffff,RS
2a02:61c0::,2a02:61c0:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a02:61e0::,2a02:61e0:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a02:6200::,2a02:6207:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a02:6240::,2a02:6240:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a02:6260::,2a02:6260:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a02:6280::,2a02:6280:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a02:62a0::,2a02:62a0:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a02:62c0::,2a02:62c0:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a02:62e0::,2a02:62e0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a02:6300::,2a02:6300:ffff:ffff:ffff:ffff:ffff:ffff,SK
+2a02:6320::,2a02:6320:ffff:ffff:ffff:ffff:ffff:ffff,HR
2a02:6340::,2a02:6340:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a02:6360::,2a02:6360:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a02:6380::,2a02:6380:ffff:ffff:ffff:ffff:ffff:ffff,SK
+2a02:63a0::,2a02:63a0:ffff:ffff:ffff:ffff:ffff:ffff,SK
2a02:63c0::,2a02:63c0:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a02:63e0::,2a02:63e0:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:6400::,2a02:6400:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a02:6420::,2a02:6420:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a02:6440::,2a02:6440:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a02:6460::,2a02:6460:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:6480::,2a02:6480:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a02:64a0::,2a02:64a0:ffff:ffff:ffff:ffff:ffff:ffff,SI
2a02:64c0::,2a02:64c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:64e0::,2a02:64e0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:6500::,2a02:6500:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a02:6520::,2a02:6520:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a02:6540::,2a02:6540:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:6560::,2a02:6560:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a02:6580::,2a02:6580:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a02:65a0::,2a02:65a0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:65c0::,2a02:65c0:ffff:ffff:ffff:ffff:ffff:ffff,LB
+2a02:65e0::,2a02:65e0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a02:6600::,2a02:6600:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a02:6620::,2a02:6620:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:6640::,2a02:6640:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a02:6660::,2a02:6660:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:6680::,2a02:6680:ffff:ffff:ffff:ffff:ffff:ffff,IL
+2a02:66a0::,2a02:66a0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a02:66c0::,2a02:66c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:66e0::,2a02:66e0:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a02:6700::,2a02:6700:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a02:6720::,2a02:6720:ffff:ffff:ffff:ffff:ffff:ffff,SK
2a02:6740::,2a02:6740:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a02:6760::,2a02:6760:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:6780::,2a02:6780:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a02:67a0::,2a02:67a0:ffff:ffff:ffff:ffff:ffff:ffff,AZ
2a02:67c0::,2a02:67c0:ffff:ffff:ffff:ffff:ffff:ffff,SY
+2a02:67e0::,2a02:67e0:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a02:6800::,2a02:6800:ffff:ffff:ffff:ffff:ffff:ffff,BG
+2a02:6820::,2a02:6820:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:6840::,2a02:6840:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a02:6860::,2a02:6860:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a02:6880::,2a02:6880:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a02:68a0::,2a02:68a0:ffff:ffff:ffff:ffff:ffff:ffff,EE
2a02:68c0::,2a02:68c0:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a02:68e0::,2a02:68e0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a02:6900::,2a02:6900:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a02:6920::,2a02:6920:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:6940::,2a02:6940:ffff:ffff:ffff:ffff:ffff:ffff,DK
+2a02:6960::,2a02:6960:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:6980::,2a02:6980:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a02:69a0::,2a02:69a0:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a02:69c0::,2a02:69c0:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a02:69e0::,2a02:69e0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:6a00::,2a02:6a00:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:6a20::,2a02:6a20:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:6a40::,2a02:6a40:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a02:6a60::,2a02:6a60:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:6a80::,2a02:6a80:ffff:ffff:ffff:ffff:ffff:ffff,BG
+2a02:6aa0::,2a02:6aa0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:6ac0::,2a02:6ac0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:6ae0::,2a02:6ae0:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a02:6b00::,2a02:6b00:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:6b20::,2a02:6b20:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a02:6b40::,2a02:6b40:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a02:6b60::,2a02:6b60:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:6b80::,2a02:6b80:ffff:ffff:ffff:ffff:ffff:ffff,IS
+2a02:6ba0::,2a02:6ba0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:6bc0::,2a02:6bc0:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a02:6be0::,2a02:6be0:ffff:ffff:ffff:ffff:ffff:ffff,LT
2a02:6c00::,2a02:6c00:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:6c20::,2a02:6c20:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a02:6c40::,2a02:6c40:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a02:6c60::,2a02:6c60:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a02:6c80::,2a02:6c80:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a02:6ca0::,2a02:6ca0:ffff:ffff:ffff:ffff:ffff:ffff,SK
2a02:6cc0::,2a02:6cc0:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a02:6ce0::,2a02:6ce0:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:6d00::,2a02:6d00:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:6d40::,2a02:6d40:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:6d80::,2a02:6d80:ffff:ffff:ffff:ffff:ffff:ffff,RU
@@ -15081,7 +15610,7 @@
2a02:6f40::,2a02:6f40:ffff:ffff:ffff:ffff:ffff:ffff,HU
2a02:6f80::,2a02:6f80:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:6fc0::,2a02:6fc0:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a02:7000::,2a02:7000:ffff:ffff:ffff:ffff:ffff:ffff,SI
+2a02:7000::,2a02:7007:ffff:ffff:ffff:ffff:ffff:ffff,SI
2a02:7040::,2a02:7040:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a02:7080::,2a02:7080:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:70c0::,2a02:70c0:ffff:ffff:ffff:ffff:ffff:ffff,LU
@@ -15097,7 +15626,6 @@
2a02:7340::,2a02:7340:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a02:7380::,2a02:7380:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:73c0::,2a02:73c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a02:7400::,2a02:7400:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:7440::,2a02:7440:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:7480::,2a02:7480:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:74c0::,2a02:74c0:ffff:ffff:ffff:ffff:ffff:ffff,CH
@@ -15143,22 +15671,14 @@
2a02:7f40::,2a02:7f40:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:7f80::,2a02:7f80:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:7fc0::,2a02:7fc0:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a02:8010::,2a02:8017:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a02:8020::,2a02:8023:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a02:8040::,2a02:8043:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a02:8060::,2a02:8061:ffff:ffff:ffff:ffff:ffff:ffff,AD
-2a02:8070::,2a02:8071:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a02:8080::,2a02:8087:ffff:ffff:ffff:ffff:ffff:ffff,IE
-2a02:80c0::,2a02:80c3:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a02:80e0::,2a02:80e3:ffff:ffff:ffff:ffff:ffff:ffff,BG
-2a02:8100::,2a02:811f:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:8000::,2a02:81ff:ffff:ffff:ffff:ffff:ffff:ffff,DJ
2a02:8200::,2a02:821f:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:8300::,2a02:830f:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a02:8380::,2a02:838f:ffff:ffff:ffff:ffff:ffff:ffff,AT
-2a02:8400::,2a02:847f:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a02:8400::,2a02:84ff:ffff:ffff:ffff:ffff:ffff:ffff,SX
2a02:8800::,2a02:88ff:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:9000::,2a02:91ff:ffff:ffff:ffff:ffff:ffff:ffff,ES
-2a02:a000::,2a02:a03f:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a02:a000::,2a02:a0ff:ffff:ffff:ffff:ffff:ffff:ffff,BF
2a02:a200::,2a02:a21f:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:a300::,2a02:a31f:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a02:a400::,2a02:a47f:ffff:ffff:ffff:ffff:ffff:ffff,NL
@@ -15741,7 +16261,7 @@
2a03:4b40::,2a03:4b40:ffff:ffff:ffff:ffff:ffff:ffff,IQ
2a03:4b80::,2a03:4b80:ffff:ffff:ffff:ffff:ffff:ffff,AL
2a03:4bc0::,2a03:4bc0:ffff:ffff:ffff:ffff:ffff:ffff,SE
-2a03:4c00::,2a03:4c00:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a03:4c00::,2a03:4c07:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a03:4c40::,2a03:4c40:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a03:4c80::,2a03:4c80:ffff:ffff:ffff:ffff:ffff:ffff,LI
2a03:4cc0::,2a03:4cc0:ffff:ffff:ffff:ffff:ffff:ffff,GB
@@ -15806,7 +16326,7 @@
2a03:5c40::,2a03:5c40:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a03:5c80::,2a03:5c80:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:5cc0::,2a03:5cc0:ffff:ffff:ffff:ffff:ffff:ffff,BA
-2a03:5d00::,2a03:5d00:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a03:5d00::,2a03:5d07:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a03:5d40::,2a03:5d40:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a03:5d80::,2a03:5d80:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a03:5dc0::,2a03:5dc0:ffff:ffff:ffff:ffff:ffff:ffff,UA
@@ -16107,7 +16627,7 @@
2a03:ab00::,2a03:ab00:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a03:ab40::,2a03:ab40:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a03:ab80::,2a03:ab80:ffff:ffff:ffff:ffff:ffff:ffff,ES
-2a03:abc0::,2a03:abc0:ffff:ffff:ffff:ffff:ffff:ffff,UA
+2a03:abc0::,2a03:abc7:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a03:ac00::,2a03:ac00:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a03:ac40::,2a03:ac40:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a03:ac80::,2a03:ac80:ffff:ffff:ffff:ffff:ffff:ffff,SE
@@ -16280,7 +16800,7 @@
2a03:d700::,2a03:d700:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:d740::,2a03:d740:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a03:d780::,2a03:d780:ffff:ffff:ffff:ffff:ffff:ffff,SE
-2a03:d7c0::,2a03:d7c0:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a03:d7c0::,2a03:d7c7:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a03:d800::,2a03:d800:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a03:d840::,2a03:d840:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a03:d880::,2a03:d880:ffff:ffff:ffff:ffff:ffff:ffff,GB
@@ -16580,7 +17100,6 @@
2a04:2300::,2a04:2307:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a04:2340::,2a04:2347:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a04:2380::,2a04:2387:ffff:ffff:ffff:ffff:ffff:ffff,HU
-2a04:23c0::,2a04:23c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a04:2400::,2a04:241f:ffff:ffff:ffff:ffff:ffff:ffff,RO
2a04:2500::,2a04:2507:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a04:2540::,2a04:2547:ffff:ffff:ffff:ffff:ffff:ffff,PL
@@ -16737,7 +17256,6 @@
2a04:4a00::,2a04:4a07:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a04:4a40::,2a04:4a47:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a04:4a80::,2a04:4a87:ffff:ffff:ffff:ffff:ffff:ffff,FI
-2a04:4ac0::,2a04:4ac7:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a04:4b00::,2a04:4b07:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a04:4b40::,2a04:4b47:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a04:4b80::,2a04:4b87:ffff:ffff:ffff:ffff:ffff:ffff,AZ
@@ -16817,9 +17335,7 @@
2a04:6080::,2a04:6087:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a04:60c0::,2a04:60c7:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a04:6100::,2a04:6107:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a04:6140::,2a04:6147:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a04:6180::,2a04:6187:ffff:ffff:ffff:ffff:ffff:ffff,BE
-2a04:61c0::,2a04:61c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a04:6200::,2a04:6207:ffff:ffff:ffff:ffff:ffff:ffff,JO
2a04:6240::,2a04:6247:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a04:6280::,2a04:6287:ffff:ffff:ffff:ffff:ffff:ffff,NL
@@ -17072,7 +17588,6 @@
2a04:9f00::,2a04:9f07:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a04:9f40::,2a04:9f47:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a04:9f80::,2a04:9f87:ffff:ffff:ffff:ffff:ffff:ffff,BE
-2a04:9fc0::,2a04:9fc7:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a04:a000::,2a04:a007:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a04:a040::,2a04:a047:ffff:ffff:ffff:ffff:ffff:ffff,IQ
2a04:a080::,2a04:a087:ffff:ffff:ffff:ffff:ffff:ffff,DE
@@ -17091,6 +17606,9 @@
2a04:a3c0::,2a04:a3c7:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a04:a400::,2a04:a407:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a04:a440::,2a04:a440:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a04:a450::,2a04:a451:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a04:a460::,2a04:a461:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a04:a470::,2a04:a471:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a04:a480::,2a04:a487:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a04:a4c0::,2a04:a4c7:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a04:a500::,2a04:a507:ffff:ffff:ffff:ffff:ffff:ffff,NL
@@ -17115,6 +17633,230 @@
2a04:a9c0::,2a04:a9c7:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a04:aa00::,2a04:aa07:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a04:aa40::,2a04:aa47:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a04:aa80::,2a04:aa87:ffff:ffff:ffff:ffff:ffff:ffff,SA
+2a04:aac0::,2a04:aac7:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a04:ab00::,2a04:ab07:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a04:ab40::,2a04:ab47:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a04:ab80::,2a04:ab87:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a04:abc0::,2a04:abc7:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a04:ac00::,2a04:ac07:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a04:ac40::,2a04:ac47:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a04:ac80::,2a04:ac87:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a04:acc0::,2a04:acc7:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a04:ad00::,2a04:ad07:ffff:ffff:ffff:ffff:ffff:ffff,IQ
+2a04:ad40::,2a04:ad47:ffff:ffff:ffff:ffff:ffff:ffff,FI
+2a04:ad80::,2a04:ad87:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a04:adc0::,2a04:adc7:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a04:ae00::,2a04:ae3f:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a04:b000::,2a04:b007:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a04:b040::,2a04:b047:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a04:b080::,2a04:b087:ffff:ffff:ffff:ffff:ffff:ffff,FI
+2a04:b0c0::,2a04:b0c7:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a04:b100::,2a04:b107:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a04:b140::,2a04:b147:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a04:b180::,2a04:b187:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a04:b1c0::,2a04:b1c7:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a04:b200::,2a04:b207:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a04:b240::,2a04:b247:ffff:ffff:ffff:ffff:ffff:ffff,IM
+2a04:b280::,2a04:b287:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a04:b2c0::,2a04:b2c7:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a04:b300::,2a04:b307:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a04:b340::,2a04:b347:ffff:ffff:ffff:ffff:ffff:ffff,KG
+2a04:b380::,2a04:b387:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a04:b3c0::,2a04:b3c7:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a04:b400::,2a04:b407:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a04:b440::,2a04:b447:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a04:b480::,2a04:b487:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a04:b4c0::,2a04:b4c7:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a04:b500::,2a04:b507:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a04:b540::,2a04:b547:ffff:ffff:ffff:ffff:ffff:ffff,SK
+2a04:b580::,2a04:b587:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a04:b5c0::,2a04:b5c7:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a04:b600::,2a04:b607:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a04:b640::,2a04:b647:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a04:b680::,2a04:b687:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a04:b6c0::,2a04:b6c7:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a04:b700::,2a04:b707:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a04:b740::,2a04:b747:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a04:b780::,2a04:b787:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a04:b7c0::,2a04:b7c7:ffff:ffff:ffff:ffff:ffff:ffff,BG
+2a04:b800::,2a04:b807:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a04:b840::,2a04:b847:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a04:b880::,2a04:b887:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a04:b8c0::,2a04:b8c7:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a04:b900::,2a04:b907:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a04:b940::,2a04:b947:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a04:b980::,2a04:b987:ffff:ffff:ffff:ffff:ffff:ffff,HR
+2a04:b9c0::,2a04:b9c7:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a04:ba00::,2a04:ba07:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a04:ba40::,2a04:ba47:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a04:ba80::,2a04:ba87:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a04:bac0::,2a04:bac7:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a04:bb00::,2a04:bb07:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a04:bb40::,2a04:bb47:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a04:bb80::,2a04:bb87:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a04:bbc0::,2a04:bbc7:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a04:bc00::,2a04:bc07:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a04:bc40::,2a04:bc47:ffff:ffff:ffff:ffff:ffff:ffff,UA
+2a04:bc80::,2a04:bc87:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a04:bcc0::,2a04:bcc7:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a04:bd00::,2a04:bd07:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a04:bd40::,2a04:bd47:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a04:bd80::,2a04:bd87:ffff:ffff:ffff:ffff:ffff:ffff,FI
+2a04:bdc0::,2a04:bdc7:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a04:be00::,2a04:be03:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a04:be20::,2a04:be23:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a04:be40::,2a04:be47:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a04:be80::,2a04:be87:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a04:bec0::,2a04:bec7:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a04:bf00::,2a04:bf07:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a04:bf40::,2a04:bf47:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a04:bf80::,2a04:bf87:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a04:bfc0::,2a04:bfc7:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a04:c000::,2a04:c007:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a04:c040::,2a04:c047:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a04:c080::,2a04:c087:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a04:c0c0::,2a04:c0c7:ffff:ffff:ffff:ffff:ffff:ffff,FI
+2a04:c100::,2a04:c107:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a04:c140::,2a04:c147:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a04:c180::,2a04:c187:ffff:ffff:ffff:ffff:ffff:ffff,SA
+2a04:c1c0::,2a04:c1c7:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a04:c200::,2a04:c207:ffff:ffff:ffff:ffff:ffff:ffff,GE
+2a04:c240::,2a04:c247:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a04:c280::,2a04:c287:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a04:c2c0::,2a04:c2c7:ffff:ffff:ffff:ffff:ffff:ffff,SA
+2a04:c300::,2a04:c307:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a04:c340::,2a04:c347:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a04:c380::,2a04:c387:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a04:c3c0::,2a04:c3c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a04:c400::,2a04:c407:ffff:ffff:ffff:ffff:ffff:ffff,OM
+2a04:c440::,2a04:c447:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a04:c480::,2a04:c487:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a04:c4c0::,2a04:c4c7:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a04:c500::,2a04:c507:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a04:c540::,2a04:c547:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a04:c580::,2a04:c587:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a04:c5c0::,2a04:c5c7:ffff:ffff:ffff:ffff:ffff:ffff,US
+2a04:c600::,2a04:c607:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a04:c640::,2a04:c647:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a04:c680::,2a04:c687:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a04:c6c0::,2a04:c6c7:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a04:c740::,2a04:c747:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a04:c780::,2a04:c787:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a04:c800::,2a04:c807:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a04:c840::,2a04:c847:ffff:ffff:ffff:ffff:ffff:ffff,AZ
+2a04:c880::,2a04:c887:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a04:c8c0::,2a04:c8c7:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a04:c900::,2a04:c907:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a04:c940::,2a04:c947:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a04:c980::,2a04:c987:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a04:c9c0::,2a04:c9c7:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a04:ca00::,2a04:ca07:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a04:ca40::,2a04:ca47:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a04:ca80::,2a04:ca87:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a04:cac0::,2a04:cac7:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a04:cb00::,2a04:cb07:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a04:cb40::,2a04:cb47:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a04:cb80::,2a04:cb87:ffff:ffff:ffff:ffff:ffff:ffff,AE
+2a04:cbc0::,2a04:cbc7:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a04:cc00::,2a04:cc07:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a04:cc40::,2a04:cc47:ffff:ffff:ffff:ffff:ffff:ffff,BY
+2a04:cc80::,2a04:cc87:ffff:ffff:ffff:ffff:ffff:ffff,FI
+2a04:ccc0::,2a04:ccc7:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a04:cd00::,2a04:cd07:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a04:cd40::,2a04:cd47:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a04:cd80::,2a04:cd87:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a04:cdc0::,2a04:cdc7:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a04:ce00::,2a04:ce07:ffff:ffff:ffff:ffff:ffff:ffff,LT
+2a04:ce40::,2a04:ce47:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a04:ce80::,2a04:ce87:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a04:cec0::,2a04:cec7:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a04:cf00::,2a04:cf07:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a04:cf40::,2a04:cf47:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a04:cf80::,2a04:cf87:ffff:ffff:ffff:ffff:ffff:ffff,SA
+2a04:cfc0::,2a04:cfc7:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a04:d000::,2a04:d007:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a04:d040::,2a04:d047:ffff:ffff:ffff:ffff:ffff:ffff,GE
+2a04:d080::,2a04:d087:ffff:ffff:ffff:ffff:ffff:ffff,RS
+2a04:d0c0::,2a04:d0c7:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a04:d100::,2a04:d107:ffff:ffff:ffff:ffff:ffff:ffff,IQ
+2a04:d140::,2a04:d147:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a04:d180::,2a04:d187:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a04:d1c0::,2a04:d1c7:ffff:ffff:ffff:ffff:ffff:ffff,LB
+2a04:d200::,2a04:d207:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a04:d240::,2a04:d247:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a04:d280::,2a04:d287:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a04:d2c0::,2a04:d2c7:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a04:d300::,2a04:d307:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a04:d340::,2a04:d347:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a04:d380::,2a04:d387:ffff:ffff:ffff:ffff:ffff:ffff,AZ
+2a04:d3c0::,2a04:d3c7:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a04:d400::,2a04:d407:ffff:ffff:ffff:ffff:ffff:ffff,EE
+2a04:d440::,2a04:d447:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a04:d480::,2a04:d487:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a04:d4c0::,2a04:d4c7:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a04:d500::,2a04:d507:ffff:ffff:ffff:ffff:ffff:ffff,FI
+2a04:d540::,2a04:d547:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a04:d580::,2a04:d587:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a04:d5c0::,2a04:d5c7:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a04:d600::,2a04:d607:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a04:d640::,2a04:d647:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a04:d680::,2a04:d687:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a04:d6c0::,2a04:d6c7:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a04:d700::,2a04:d707:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a04:d740::,2a04:d747:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a04:d780::,2a04:d787:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a04:d7c0::,2a04:d7c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a04:d800::,2a04:d807:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a04:d840::,2a04:d847:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a04:d880::,2a04:d887:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a04:d8c0::,2a04:d8c7:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a04:d900::,2a04:d907:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a04:d940::,2a04:d947:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a04:d980::,2a04:d987:ffff:ffff:ffff:ffff:ffff:ffff,IL
+2a04:d9c0::,2a04:d9c7:ffff:ffff:ffff:ffff:ffff:ffff,RO
+2a04:da00::,2a04:da07:ffff:ffff:ffff:ffff:ffff:ffff,AE
+2a04:da40::,2a04:da47:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a04:da80::,2a04:da87:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a04:dac0::,2a04:dac7:ffff:ffff:ffff:ffff:ffff:ffff,DK
+2a04:db00::,2a04:db07:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a04:db40::,2a04:db47:ffff:ffff:ffff:ffff:ffff:ffff,SI
+2a04:db80::,2a04:db87:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a04:dbc0::,2a04:dbc3:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a04:dc00::,2a04:dc07:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a04:dc40::,2a04:dc47:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a04:dc80::,2a04:dc87:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a04:dcc0::,2a04:dcc7:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a04:dd00::,2a04:dd07:ffff:ffff:ffff:ffff:ffff:ffff,AE
+2a04:dd40::,2a04:dd47:ffff:ffff:ffff:ffff:ffff:ffff,SI
+2a04:dd80::,2a04:dd87:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a04:ddc0::,2a04:ddc7:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a04:de00::,2a04:de07:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a04:de40::,2a04:de47:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a04:de80::,2a04:de87:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a04:dec0::,2a04:dec7:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a04:df00::,2a04:df07:ffff:ffff:ffff:ffff:ffff:ffff,BG
+2a04:df40::,2a04:df47:ffff:ffff:ffff:ffff:ffff:ffff,LT
+2a04:df80::,2a04:df87:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a04:dfc0::,2a04:dfc7:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a04:e040::,2a04:e047:ffff:ffff:ffff:ffff:ffff:ffff,PT
+2a04:e080::,2a04:e087:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a04:e0c0::,2a04:e0c7:ffff:ffff:ffff:ffff:ffff:ffff,SA
+2a04:e100::,2a04:e107:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a04:e140::,2a04:e147:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a04:e180::,2a04:e187:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a04:e1c0::,2a04:e1c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a04:e200::,2a04:e207:ffff:ffff:ffff:ffff:ffff:ffff,DK
+2a04:e240::,2a04:e247:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a04:e280::,2a04:e287:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a04:e2c0::,2a04:e2c7:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a04:e300::,2a04:e307:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a04:e340::,2a04:e347:ffff:ffff:ffff:ffff:ffff:ffff,AE
+2a04:e380::,2a04:e387:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a04:e3c0::,2a04:e3c7:ffff:ffff:ffff:ffff:ffff:ffff,DK
+2a04:e400::,2a04:e407:ffff:ffff:ffff:ffff:ffff:ffff,BG
+2a04:e440::,2a04:e447:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a04:e480::,2a04:e487:ffff:ffff:ffff:ffff:ffff:ffff,IT
2c0e::,2c0e:fff:ffff:ffff:ffff:ffff:ffff:ffff,EG
2c0e:2000::,2c0e:200f:ffff:ffff:ffff:ffff:ffff:ffff,ZA
2c0f:f600::,2c0f:f600:ffff:ffff:ffff:ffff:ffff:ffff,GN
@@ -17138,6 +17880,19 @@
2c0f:f690::,2c0f:f690:ffff:ffff:ffff:ffff:ffff:ffff,SS
2c0f:f698::,2c0f:f698:ffff:ffff:ffff:ffff:ffff:ffff,TN
2c0f:f6a0::,2c0f:f6a0:ffff:ffff:ffff:ffff:ffff:ffff,CM
+2c0f:f6a8::,2c0f:f6a8:ffff:ffff:ffff:ffff:ffff:ffff,BI
+2c0f:f6b0::,2c0f:f6b0:ffff:ffff:ffff:ffff:ffff:ffff,TZ
+2c0f:f6b8::,2c0f:f6b8:ffff:ffff:ffff:ffff:ffff:ffff,SO
+2c0f:f6c0::,2c0f:f6c0:ffff:ffff:ffff:ffff:ffff:ffff,CG
+2c0f:f6c8::,2c0f:f6c8:ffff:ffff:ffff:ffff:ffff:ffff,CM
+2c0f:f6d0::,2c0f:f6d0:ffff:ffff:ffff:ffff:ffff:ffff,UG
+2c0f:f6d8::,2c0f:f6d8:ffff:ffff:ffff:ffff:ffff:ffff,ZA
+2c0f:f6e0::,2c0f:f6e0:ffff:ffff:ffff:ffff:ffff:ffff,ZA
+2c0f:f6e8::,2c0f:f6e8:ffff:ffff:ffff:ffff:ffff:ffff,ZA
+2c0f:f6f0::,2c0f:f6f0:ffff:ffff:ffff:ffff:ffff:ffff,ZA
+2c0f:f6f8::,2c0f:f6f8:ffff:ffff:ffff:ffff:ffff:ffff,ZA
+2c0f:f700::,2c0f:f700:ffff:ffff:ffff:ffff:ffff:ffff,ZA
+2c0f:f708::,2c0f:f708:ffff:ffff:ffff:ffff:ffff:ffff,ZA
2c0f:f800::,2c0f:f80f:ffff:ffff:ffff:ffff:ffff:ffff,ZA
2c0f:f810::,2c0f:f810:ffff:ffff:ffff:ffff:ffff:ffff,AO
2c0f:f818::,2c0f:f818:ffff:ffff:ffff:ffff:ffff:ffff,BJ
@@ -17316,9 +18071,9 @@
2c0f:fe18::,2c0f:fe18:ffff:ffff:ffff:ffff:ffff:ffff,ZA
2c0f:fe20::,2c0f:fe20:ffff:ffff:ffff:ffff:ffff:ffff,ZA
2c0f:fe28::,2c0f:fe28:ffff:ffff:ffff:ffff:ffff:ffff,ZA
-2c0f:fe30::,2c0f:fe30:ffff:ffff:ffff:ffff:ffff:ffff,RW
+2c0f:fe30::,2c0f:fe30:ffff:ffff:ffff:ffff:ffff:ffff,MU
2c0f:fe38::,2c0f:fe38:ffff:ffff:ffff:ffff:ffff:ffff,KE
-2c0f:fe40::,2c0f:fe40:ffff:ffff:ffff:ffff:ffff:ffff,KE
+2c0f:fe40::,2c0f:fe40:ffff:ffff:ffff:ffff:ffff:ffff,MU
2c0f:fe48::,2c0f:fe48:ffff:ffff:ffff:ffff:ffff:ffff,ZA
2c0f:fe50::,2c0f:fe50:ffff:ffff:ffff:ffff:ffff:ffff,DZ
2c0f:fe58::,2c0f:fe58:ffff:ffff:ffff:ffff:ffff:ffff,LS
diff --git a/src/config/mmdb-convert.py b/src/config/mmdb-convert.py
new file mode 100644
index 000000000..cbe9acdc5
--- /dev/null
+++ b/src/config/mmdb-convert.py
@@ -0,0 +1,466 @@
+#!/usr/bin/python3
+
+# This software has been dedicated to the public domain under the CC0
+# public domain dedication.
+#
+# To the extent possible under law, the person who associated CC0
+# with mmdb-convert.py has waived all copyright and related or
+# neighboring rights to mmdb-convert.py.
+#
+# You should have received a copy of the CC0 legalcode along with this
+# work in doc/cc0.txt. If not, see
+# <http://creativecommons.org/publicdomain/zero/1.0/>.
+
+# Nick Mathewson is responsible for this kludge, but takes no
+# responsibility for it.
+
+"""This kludge is meant to
+ parse mmdb files in sufficient detail to dump out the old format
+ that Tor expects. It's also meant to be pure-python.
+
+ When given a simplicity/speed tradeoff, it opts for simplicity.
+
+ You will not understand the code without undestanding the MaxMind-DB
+ file format. It is specified at:
+ https://github.com/maxmind/MaxMind-DB/blob/master/MaxMind-DB-spec.md.
+
+ This isn't so much tested. When it breaks, you get to keep both
+ pieces.
+"""
+
+import struct
+import bisect
+import socket
+import binascii
+import sys
+import time
+
+METADATA_MARKER = b'\xab\xcd\xefMaxMind.com'
+
+# Here's some python2/python3 junk. Better solutions wanted.
+try:
+ ord(b"1"[0])
+except TypeError:
+ def byte_to_int(b):
+ "convert a single element of a bytestring to an integer."
+ return b
+else:
+ byte_to_int = ord
+
+# Here's some more python2/python3 junk. Better solutions wanted.
+try:
+ str(b"a", "utf8")
+except TypeError:
+ bytesToStr = str
+else:
+ def bytesToStr(b):
+ "convert a bytestring in utf8 to a string."
+ return str(b, 'utf8')
+
+def to_int(s):
+ "Parse a big-endian integer from bytestring s."
+ result = 0
+ for c in s:
+ result *= 256
+ result += byte_to_int(c)
+ return result
+
+def to_int24(s):
+ "Parse a pair of big-endian 24-bit integers from bytestring s."
+ a, b, c = struct.unpack("!HHH", s)
+ return ((a <<8)+(b>>8)), (((b&0xff)<<16)+c)
+
+def to_int32(s):
+ "Parse a pair of big-endian 32-bit integers from bytestring s."
+ a, b = struct.unpack("!LL", s)
+ return a, b
+
+def to_int28(s):
+ "Parse a pair of big-endian 28-bit integers from bytestring s."
+ a, b = unpack("!LL", s + b'\x00')
+ return (((a & 0xf0) << 20) + (a >> 8)), ((a & 0x0f) << 24) + (b >> 8)
+
+class Tree(object):
+ "Holds a node in the tree"
+ def __init__(self, left, right):
+ self.left = left
+ self.right = right
+
+def resolve_tree(tree, data):
+ """Fill in the left_item and right_item fields for all values in the tree
+ so that they point to another Tree, or to a Datum, or to None."""
+ d = Datum(None, None, None, None)
+ def resolve_item(item):
+ "Helper: resolve a single index."
+ if item < len(tree):
+ return tree[item]
+ elif item == len(tree):
+ return None
+ else:
+ d.pos = (item - len(tree) - 16)
+ p = bisect.bisect_left(data, d)
+ assert data[p].pos == d.pos
+ return data[p]
+
+ for t in tree:
+ t.left_item = resolve_item(t.left)
+ t.right_item = resolve_item(t.right)
+
+def parse_search_tree(s, record_size):
+ """Given a bytestring and a record size in bits, parse the tree.
+ Return a list of nodes."""
+ record_bytes = (record_size*2) // 8
+ nodes = []
+ p = 0
+ try:
+ to_leftright = { 24: to_int24,
+ 28: to_int28,
+ 32: to_int32 }[ record_size ]
+ except KeyError:
+ raise NotImplementedError("Unsupported record size in bits: %d" %
+ record_size)
+ while p < len(s):
+ left, right = to_leftright(s[p:p+record_bytes])
+ p += record_bytes
+
+ nodes.append( Tree(left, right ) )
+
+ return nodes
+
+class Datum(object):
+ """Holds a single entry from the Data section"""
+ def __init__(self, pos, kind, ln, data):
+ self.pos = pos # Position of this record within data section
+ self.kind = kind # Type of this record. one of TP_*
+ self.ln = ln # Length field, which might be overloaded.
+ self.data = data # Raw bytes data.
+ self.children = None # Used for arrays and maps.
+
+ def __repr__(self):
+ return "Datum(%r,%r,%r,%r)" % (self.pos, self.kind, self.ln, self.data)
+
+ # Comparison functions used for bsearch
+ def __lt__(self, other):
+ return self.pos < other.pos
+
+ def __gt__(self, other):
+ return self.pos > other.pos
+
+ def __eq__(self, other):
+ return self.pos == other.pos
+
+ def build_maps(self):
+ """If this is a map or array, fill in its 'map' field if it's a map,
+ and the 'map' field of all its children."""
+
+ if not hasattr(self, 'nChildren'):
+ return
+
+ if self.kind == TP_ARRAY:
+ del self.nChildren
+ for c in self.children:
+ c.build_maps()
+
+ elif self.kind == TP_MAP:
+ del self.nChildren
+ self.map = {}
+ for i in range(0, len(self.children), 2):
+ k = self.children[i].deref()
+ v = self.children[i+1].deref()
+ v.build_maps()
+ if k.kind != TP_UTF8:
+ raise ValueError("Bad dictionary key type %d"% k.kind)
+ self.map[bytesToStr(k.data)] = v
+
+ def int_val(self):
+ """If this is an integer type, return its value"""
+ assert self.kind in (TP_UINT16, TP_UINT32, TP_UINT64,
+ TP_UINT128, TP_SINT32)
+ i = to_int(self.data)
+ if self.kind == TP_SINT32:
+ if i & 0x80000000:
+ i = i - 0x100000000
+ return i
+
+ def deref(self):
+ """If this value is a pointer, return its pointed-to-value. Chase
+ through multiple layers of pointers if need be. If this isn't
+ a pointer, return it."""
+ n = 0
+ s = self
+ while s.kind == TP_PTR:
+ s = s.ptr
+ n += 1
+ assert n < 100
+ return s
+
+def resolve_pointers(data):
+ """Fill in the ptr field of every pointer in data."""
+ search = Datum(None, None, None, None)
+ for d in data:
+ if d.kind == TP_PTR:
+ search.pos = d.ln
+ p = bisect.bisect_left(data, search)
+ assert data[p].pos == d.ln
+ d.ptr = data[p]
+
+TP_PTR = 1
+TP_UTF8 = 2
+TP_DBL = 3
+TP_BYTES = 4
+TP_UINT16 = 5
+TP_UINT32 = 6
+TP_MAP = 7
+TP_SINT32 = 8
+TP_UINT64 = 9
+TP_UINT128 = 10
+TP_ARRAY = 11
+TP_DCACHE = 12
+TP_END = 13
+TP_BOOL = 14
+TP_FLOAT = 15
+
+def get_type_and_len(s):
+ """Data parsing helper: decode the type value and much-overloaded 'length'
+ field for the value starting at s. Return a 3-tuple of type, length,
+ and number of bytes used to encode type-plus-length."""
+ c = byte_to_int(s[0])
+ tp = c >> 5
+ skip = 1
+ if tp == 0:
+ tp = byte_to_int(s[1])+7
+ skip = 2
+ ln = c & 31
+
+ # I'm sure I don't know what they were thinking here...
+ if tp == TP_PTR:
+ len_len = (ln >> 3) + 1
+ if len_len < 4:
+ ln &= 7
+ ln <<= len_len * 8
+ else:
+ ln = 0
+ ln += to_int(s[skip:skip+len_len])
+ ln += (0, 0, 2048, 526336, 0)[len_len]
+ skip += len_len
+ elif ln >= 29:
+ len_len = ln - 28
+ ln = to_int(s[skip:skip+len_len])
+ ln += (0, 29, 285, 65821)[len_len]
+ skip += len_len
+
+ return tp, ln, skip
+
+# Set of types for which 'length' doesn't mean length.
+IGNORE_LEN_TYPES = set([
+ TP_MAP, # Length is number of key-value pairs that follow.
+ TP_ARRAY, # Length is number of members that follow.
+ TP_PTR, # Length is index to pointed-to data element.
+ TP_BOOL, # Length is 0 or 1.
+ TP_DCACHE, # Length isnumber of members that follow
+])
+
+def parse_data_section(s):
+ """Given a data section encoded in a bytestring, return a list of
+ Datum items."""
+
+ # Stack of possibly nested containers. We use the 'nChildren' member of
+ # the last one to tell how many moreitems nest directly inside.
+ stack = []
+
+ # List of all items, including nested ones.
+ data = []
+
+ # Byte index within the data section.
+ pos = 0
+
+ while s:
+ tp, ln, skip = get_type_and_len(s)
+ if tp in IGNORE_LEN_TYPES:
+ real_len = 0
+ else:
+ real_len = ln
+
+ d = Datum(pos, tp, ln, s[skip:skip+real_len])
+ data.append(d)
+ pos += skip+real_len
+ s = s[skip+real_len:]
+
+ if stack:
+ stack[-1].children.append(d)
+ stack[-1].nChildren -= 1
+ if stack[-1].nChildren == 0:
+ del stack[-1]
+
+ if d.kind == TP_ARRAY:
+ d.nChildren = d.ln
+ d.children = []
+ stack.append(d)
+ elif d.kind == TP_MAP:
+ d.nChildren = d.ln * 2
+ d.children = []
+ stack.append(d)
+
+ return data
+
+def parse_mm_file(s):
+ """Parse a MaxMind-DB file."""
+ try:
+ metadata_ptr = s.rindex(METADATA_MARKER)
+ except ValueError:
+ raise ValueError("No metadata!")
+
+ metadata = parse_data_section(s[metadata_ptr+len(METADATA_MARKER):])
+
+ if metadata[0].kind != TP_MAP:
+ raise ValueError("Bad map")
+
+ metadata[0].build_maps()
+ mm = metadata[0].map
+
+ tree_size = (((mm['record_size'].int_val() * 2) // 8 ) *
+ mm['node_count'].int_val())
+
+ if s[tree_size:tree_size+16] != b'\x00'*16:
+ raise ValueError("Missing section separator!")
+
+ tree = parse_search_tree(s[:tree_size], mm['record_size'].int_val())
+
+ data = parse_data_section(s[tree_size+16:metadata_ptr])
+
+ resolve_pointers(data)
+ resolve_tree(tree, data)
+
+ for d in data:
+ d.build_maps()
+
+ return metadata, tree, data
+
+def format_datum(datum):
+ """Given a Datum at a leaf of the tree, return the string that we should
+ write as its value.
+
+ We first try country->iso_code which is the two-character ISO 3166-1
+ country code of the country where MaxMind believes the end user is
+ located. If there's no such key, we try registered_country->iso_code
+ which is the country in which the ISP has registered the IP address.
+ Without falling back to registered_country, we'd leave out all ranges
+ that MaxMind thinks belong to anonymous proxies, because those ranges
+ don't contain country but only registered_country. In short: let's
+ fill all A1 entries with what ARIN et. al think.
+ """
+ try:
+ return bytesToStr(datum.map['country'].map['iso_code'].data)
+ except KeyError:
+ pass
+ try:
+ return bytesToStr(datum.map['registered_country'].map['iso_code'].data)
+ except KeyError:
+ pass
+ return None
+
+IPV4_PREFIX = "0"*96
+
+def dump_item_ipv4(entries, prefix, val):
+ """Dump the information for an IPv4 address to entries, where 'prefix'
+ is a string holding a binary prefix for the address, and 'val' is the
+ value to dump. If the prefix is not an IPv4 address (it does not start
+ with 96 bits of 0), then print nothing.
+ """
+ if not prefix.startswith(IPV4_PREFIX):
+ return
+ prefix = prefix[96:]
+ v = int(prefix, 2)
+ shift = 32 - len(prefix)
+ lo = v << shift
+ hi = ((v+1) << shift) - 1
+ entries.append((lo, hi, val))
+
+def fmt_item_ipv4(entry):
+ """Format an IPv4 range with lo and hi addresses in decimal form."""
+ return "%d,%d,%s\n"%(entry[0], entry[1], entry[2])
+
+def fmt_ipv6_addr(v):
+ """Given a 128-bit integer representing an ipv6 address, return a
+ string for that ipv6 address."""
+ return socket.inet_ntop(socket.AF_INET6, binascii.unhexlify("%032x"%v))
+
+def fmt_item_ipv6(entry):
+ """Format an IPv6 range with lo and hi addresses in hex form."""
+ return "%s,%s,%s\n"%(fmt_ipv6_addr(entry[0]),
+ fmt_ipv6_addr(entry[1]),
+ entry[2])
+
+IPV4_MAPPED_IPV6_PREFIX = "0"*80 + "1"*16
+IPV6_6TO4_PREFIX = "0010000000000010"
+TEREDO_IPV6_PREFIX = "0010000000000001" + "0"*16
+
+def dump_item_ipv6(entries, prefix, val):
+ """Dump the information for an IPv6 address prefix to entries, where
+ 'prefix' is a string holding a binary prefix for the address,
+ and 'val' is the value to dump. If the prefix is an IPv4 address
+ (starts with 96 bits of 0), is an IPv4-mapped IPv6 address
+ (::ffff:0:0/96), or is in the 6to4 mapping subnet (2002::/16), then
+ print nothing.
+ """
+ if prefix.startswith(IPV4_PREFIX) or \
+ prefix.startswith(IPV4_MAPPED_IPV6_PREFIX) or \
+ prefix.startswith(IPV6_6TO4_PREFIX) or \
+ prefix.startswith(TEREDO_IPV6_PREFIX):
+ return
+ v = int(prefix, 2)
+ shift = 128 - len(prefix)
+ lo = v << shift
+ hi = ((v+1) << shift) - 1
+ entries.append((lo, hi, val))
+
+def dump_tree(entries, node, dump_item, prefix=""):
+ """Walk the tree rooted at 'node', and call dump_item on the
+ format_datum output of every leaf of the tree."""
+
+ if isinstance(node, Tree):
+ dump_tree(entries, node.left_item, dump_item, prefix+"0")
+ dump_tree(entries, node.right_item, dump_item, prefix+"1")
+ elif isinstance(node, Datum):
+ assert node.kind == TP_MAP
+ code = format_datum(node)
+ if code:
+ dump_item(entries, prefix, code)
+ else:
+ assert node == None
+
+GEOIP_FILE_HEADER = """\
+# Last updated based on %s Maxmind GeoLite2 Country
+# wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz
+# gunzip GeoLite2-Country.mmdb.gz
+# python mmdb-convert.py GeoLite2-Country.mmdb
+"""
+
+def write_geoip_file(filename, metadata, the_tree, dump_item, fmt_item):
+ """Write the entries in the_tree to filename."""
+ entries = []
+ dump_tree(entries, the_tree[0], dump_item)
+ fobj = open(filename, 'w')
+
+ build_epoch = metadata[0].map['build_epoch'].int_val()
+ fobj.write(GEOIP_FILE_HEADER %
+ time.strftime('%B %-d %Y', time.gmtime(build_epoch)))
+
+ unwritten = None
+ for entry in entries:
+ if not unwritten:
+ unwritten = entry
+ elif unwritten[1] + 1 == entry[0] and unwritten[2] == entry[2]:
+ unwritten = (unwritten[0], entry[1], unwritten[2])
+ else:
+ fobj.write(fmt_item(unwritten))
+ unwritten = entry
+ if unwritten:
+ fobj.write(fmt_item(unwritten))
+ fobj.close()
+
+content = open(sys.argv[1], 'rb').read()
+metadata, the_tree, _ = parse_mm_file(content)
+
+write_geoip_file('geoip', metadata, the_tree, dump_item_ipv4, fmt_item_ipv4)
+write_geoip_file('geoip6', metadata, the_tree, dump_item_ipv6, fmt_item_ipv6)
diff --git a/src/config/torrc.sample.in b/src/config/torrc.sample.in
index c667efc5c..d842fbcaf 100644
--- a/src/config/torrc.sample.in
+++ b/src/config/torrc.sample.in
@@ -1,5 +1,5 @@
## Configuration file for a typical Tor user
-## Last updated 12 September 2012 for Tor 0.2.4.3-alpha.
+## Last updated 9 October 2013 for Tor 0.2.5.2-alpha.
## (may or may not work for much older or much newer versions of Tor.)
##
## Lines that begin with "## " try to explain what's going on. Lines
@@ -120,9 +120,12 @@
## is per month)
#AccountingStart month 3 15:00
-## Contact info to be published in the directory, so we can contact you
-## if your relay is misconfigured or something else goes wrong. Google
-## indexes this, so spammers might also collect it.
+## Administrative contact information for this relay or bridge. This line
+## can be used to contact you if your relay or bridge is misconfigured or
+## something else goes wrong. Note that we archive and publish all
+## descriptors containing these lines and that Google indexes them, so
+## spammers might also collect them. You may want to obscure the fact that
+## it's an email address and/or generate a new address for this purpose.
#ContactInfo Random Person <nobody AT example dot com>
## You might also include your PGP or GPG fingerprint if you have one:
#ContactInfo 0xFFFFFFFF Random Person <nobody AT example dot com>
diff --git a/src/ext/README b/src/ext/README
index 58ba7f699..5d5a6e151 100644
--- a/src/ext/README
+++ b/src/ext/README
@@ -42,3 +42,10 @@ curve25519_donna/*.c
A copy of Adam Langley's curve25519-donna mostly-portable
implementations of curve25519.
+
+csiphash.c
+siphash.h
+
+ Marek Majkowski's implementation of siphash 2-4, a secure keyed
+ hash algorithm to avoid collision-based DoS attacks against hash
+ tables.
diff --git a/src/ext/csiphash.c b/src/ext/csiphash.c
new file mode 100644
index 000000000..c24788603
--- /dev/null
+++ b/src/ext/csiphash.c
@@ -0,0 +1,166 @@
+/* <MIT License>
+ Copyright (c) 2013 Marek Majkowski <marek@popcount.org>
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+ </MIT License>
+
+ Original location:
+ https://github.com/majek/csiphash/
+
+ Solution inspired by code from:
+ Samuel Neves (supercop/crypto_auth/siphash24/little)
+ djb (supercop/crypto_auth/siphash24/little2)
+ Jean-Philippe Aumasson (https://131002.net/siphash/siphash24.c)
+*/
+
+#include "torint.h"
+#include "siphash.h"
+/* for tor_assert */
+#include "util.h"
+/* for memcpy */
+#include <string.h>
+
+#if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \
+ __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+# define _le64toh(x) ((uint64_t)(x))
+#elif defined(_WIN32)
+/* Windows is always little endian, unless you're on xbox360
+ http://msdn.microsoft.com/en-us/library/b0084kay(v=vs.80).aspx */
+# define _le64toh(x) ((uint64_t)(x))
+#elif defined(__APPLE__)
+# include <libkern/OSByteOrder.h>
+# define _le64toh(x) OSSwapLittleToHostInt64(x)
+#elif defined(sun) || defined(__sun)
+# include <sys/byteorder.h>
+# define _le64toh(x) LE_64(x)
+
+#else
+
+/* See: http://sourceforge.net/p/predef/wiki/Endianness/ */
+# if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
+# include <sys/endian.h>
+# else
+# include <endian.h>
+# endif
+# if defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && \
+ __BYTE_ORDER == __LITTLE_ENDIAN
+# define _le64toh(x) ((uint64_t)(x))
+# else
+# if defined(__OpenBSD__)
+# define _le64toh(x) letoh64(x)
+# else
+# define _le64toh(x) le64toh(x)
+# endif
+# endif
+
+#endif
+
+#define ROTATE(x, b) (uint64_t)( ((x) << (b)) | ( (x) >> (64 - (b))) )
+
+#define HALF_ROUND(a,b,c,d,s,t) \
+ a += b; c += d; \
+ b = ROTATE(b, s) ^ a; \
+ d = ROTATE(d, t) ^ c; \
+ a = ROTATE(a, 32);
+
+#define DOUBLE_ROUND(v0,v1,v2,v3) \
+ HALF_ROUND(v0,v1,v2,v3,13,16); \
+ HALF_ROUND(v2,v1,v0,v3,17,21); \
+ HALF_ROUND(v0,v1,v2,v3,13,16); \
+ HALF_ROUND(v2,v1,v0,v3,17,21);
+
+#if 0
+/* This does not seem to save very much runtime in the fast case, and it's
+ * potentially a big loss in the slow case where we're misaligned and we cross
+ * a cache line. */
+#if (defined(__i386) || defined(__i386__) || defined(_M_IX86) || \
+ defined(__x86_64) || defined(__x86_64__) || \
+ defined(_M_AMD64) || defined(_M_X64) || defined(__INTEL__))
+# define UNALIGNED_OK 1
+#endif
+#endif
+
+uint64_t siphash24(const void *src, unsigned long src_sz, const struct sipkey *key) {
+ uint64_t k0 = key->k0;
+ uint64_t k1 = key->k1;
+ uint64_t b = (uint64_t)src_sz << 56;
+ const uint64_t *in = (uint64_t*)src;
+
+ uint64_t t;
+ uint8_t *pt, *m;
+
+ uint64_t v0 = k0 ^ 0x736f6d6570736575ULL;
+ uint64_t v1 = k1 ^ 0x646f72616e646f6dULL;
+ uint64_t v2 = k0 ^ 0x6c7967656e657261ULL;
+ uint64_t v3 = k1 ^ 0x7465646279746573ULL;
+
+ while (src_sz >= 8) {
+#ifdef UNALIGNED_OK
+ uint64_t mi = _le64toh(*in);
+#else
+ uint64_t mi;
+ memcpy(&mi, in, 8);
+ mi = _le64toh(mi);
+#endif
+ in += 1; src_sz -= 8;
+ v3 ^= mi;
+ DOUBLE_ROUND(v0,v1,v2,v3);
+ v0 ^= mi;
+ }
+
+ t = 0; pt = (uint8_t*)&t; m = (uint8_t*)in;
+ switch (src_sz) {
+ case 7: pt[6] = m[6];
+ case 6: pt[5] = m[5];
+ case 5: pt[4] = m[4];
+#ifdef UNALIGNED_OK
+ case 4: *((uint32_t*)&pt[0]) = *((uint32_t*)&m[0]); break;
+#else
+ case 4: pt[3] = m[3];
+#endif
+ case 3: pt[2] = m[2];
+ case 2: pt[1] = m[1];
+ case 1: pt[0] = m[0];
+ }
+ b |= _le64toh(t);
+
+ v3 ^= b;
+ DOUBLE_ROUND(v0,v1,v2,v3);
+ v0 ^= b; v2 ^= 0xff;
+ DOUBLE_ROUND(v0,v1,v2,v3);
+ DOUBLE_ROUND(v0,v1,v2,v3);
+ return (v0 ^ v1) ^ (v2 ^ v3);
+}
+
+
+static int the_siphash_key_is_set = 0;
+static struct sipkey the_siphash_key;
+
+uint64_t siphash24g(const void *src, unsigned long src_sz) {
+ tor_assert(the_siphash_key_is_set);
+ return siphash24(src, src_sz, &the_siphash_key);
+}
+
+void siphash_set_global_key(const struct sipkey *key)
+{
+ tor_assert(! the_siphash_key_is_set);
+ the_siphash_key.k0 = key->k0;
+ the_siphash_key.k1 = key->k1;
+ the_siphash_key_is_set = 1;
+}
diff --git a/src/ext/eventdns.c b/src/ext/eventdns.c
index 66280cccd..2b2988f1e 100644
--- a/src/ext/eventdns.c
+++ b/src/ext/eventdns.c
@@ -842,10 +842,11 @@ name_parse(u8 *packet, int length, int *idx, char *name_out, size_t name_out_len
}
if (label_len > 63) return -1;
if (cp != name_out) {
- if (cp + 1 >= end) return -1;
+ if (cp >= name_out + name_out_len - 1) return -1;
*cp++ = '.';
}
- if (cp + label_len >= end) return -1;
+ if (label_len > name_out_len ||
+ cp >= name_out + name_out_len - label_len) return -1;
memcpy(cp, packet + j, label_len);
cp += label_len;
j += label_len;
@@ -2298,6 +2299,10 @@ _evdns_nameserver_add_impl(const struct sockaddr *address,
evtimer_set(&ns->timeout_event, nameserver_prod_callback, ns);
+#if 1
+ ns->socket = tor_open_socket_nonblocking(address->sa_family, SOCK_DGRAM, 0);
+ if (!SOCKET_OK(ns->socket)) { err = 1; goto out1; }
+#else
ns->socket = tor_open_socket(address->sa_family, SOCK_DGRAM, 0);
if (ns->socket < 0) { err = 1; goto out1; }
#ifdef _WIN32
@@ -2314,6 +2319,7 @@ _evdns_nameserver_add_impl(const struct sockaddr *address,
}
#endif
+#endif /* 1 */
if (global_bind_addr_is_set &&
!sockaddr_is_loopback((struct sockaddr*)&global_bind_address)) {
if (bind(ns->socket, (struct sockaddr *)&global_bind_address,
@@ -3009,7 +3015,8 @@ resolv_conf_parse_line(char *const start, int flags) {
if (!strcmp(first_token, "nameserver") && (flags & DNS_OPTION_NAMESERVERS)) {
const char *const nameserver = NEXT_TOKEN;
- evdns_nameserver_ip_add(nameserver);
+ if (nameserver)
+ evdns_nameserver_ip_add(nameserver);
} else if (!strcmp(first_token, "domain") && (flags & DNS_OPTION_SEARCH)) {
const char *const domain = NEXT_TOKEN;
if (domain) {
@@ -3473,8 +3480,12 @@ main(int c, char **v) {
if (servertest) {
int sock;
struct sockaddr_in my_addr;
+#if 1
+ sock = tor_open_socket_nonblocking(PF_INET, SOCK_DGRAM, 0)
+#else
sock = tor_open_socket(PF_INET, SOCK_DGRAM, 0);
fcntl(sock, F_SETFL, O_NONBLOCK);
+#endif
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(10053);
my_addr.sin_addr.s_addr = INADDR_ANY;
diff --git a/src/ext/ht.h b/src/ext/ht.h
index 62c458ad0..871f5bbd2 100644
--- a/src/ext/ht.h
+++ b/src/ext/ht.h
@@ -58,6 +58,7 @@
#define HT_NEXT_RMV(name, head, elm) name##_HT_NEXT_RMV((head), (elm))
#define HT_CLEAR(name, head) name##_HT_CLEAR(head)
#define HT_INIT(name, head) name##_HT_INIT(head)
+#define HT_REP_IS_BAD_(name, head) name##_HT_REP_IS_BAD_(head)
/* Helper: */
static INLINE unsigned
ht_improve_hash(unsigned h)
@@ -86,6 +87,7 @@ ht_string_hash(const char *s)
}
#endif
+#if 0
/** Basic string hash function, from Python's str.__hash__() */
static INLINE unsigned
ht_string_hash(const char *s)
@@ -100,6 +102,7 @@ ht_string_hash(const char *s)
h ^= (unsigned)(cp-(const unsigned char*)s);
return h;
}
+#endif
#ifndef HT_NO_CACHE_HASH_VALUES
#define HT_SET_HASH_(elm, field, hashfn) \
@@ -301,14 +304,16 @@ ht_string_hash(const char *s)
#define HT_GENERATE(name, type, field, hashfn, eqfn, load, mallocfn, \
reallocfn, freefn) \
+ /* Primes that aren't too far from powers of two. We stop at */ \
+ /* P=402653189 because P*sizeof(void*) is less than SSIZE_MAX */ \
+ /* even on a 32-bit platform. */ \
static unsigned name##_PRIMES[] = { \
53, 97, 193, 389, \
769, 1543, 3079, 6151, \
12289, 24593, 49157, 98317, \
196613, 393241, 786433, 1572869, \
3145739, 6291469, 12582917, 25165843, \
- 50331653, 100663319, 201326611, 402653189, \
- 805306457, 1610612741 \
+ 50331653, 100663319, 201326611, 402653189 \
}; \
static unsigned name##_N_PRIMES = \
(unsigned)(sizeof(name##_PRIMES)/sizeof(name##_PRIMES[0])); \
diff --git a/src/ext/include.am b/src/ext/include.am
index ea7e58e79..26e194e88 100644
--- a/src/ext/include.am
+++ b/src/ext/include.am
@@ -10,7 +10,8 @@ EXTHEADERS = \
src/ext/strlcat.c \
src/ext/strlcpy.c \
src/ext/tinytest_macros.h \
- src/ext/tor_queue.h
+ src/ext/tor_queue.h \
+ src/ext/siphash.h
noinst_HEADERS+= $(EXTHEADERS)
diff --git a/src/ext/siphash.h b/src/ext/siphash.h
new file mode 100644
index 000000000..d9b34b898
--- /dev/null
+++ b/src/ext/siphash.h
@@ -0,0 +1,13 @@
+#ifndef SIPHASH_H
+#define SIPHASH_H
+
+struct sipkey {
+ uint64_t k0;
+ uint64_t k1;
+};
+uint64_t siphash24(const void *src, unsigned long src_sz, const struct sipkey *key);
+
+void siphash_set_global_key(const struct sipkey *key);
+uint64_t siphash24g(const void *src, unsigned long src_sz);
+
+#endif
diff --git a/src/ext/tinytest.c b/src/ext/tinytest.c
index 4d9afacce..cc054ad34 100644
--- a/src/ext/tinytest.c
+++ b/src/ext/tinytest.c
@@ -31,6 +31,8 @@
#include <string.h>
#include <assert.h>
+#ifndef NO_FORKING
+
#ifdef _WIN32
#include <windows.h>
#else
@@ -39,6 +41,17 @@
#include <unistd.h>
#endif
+#if defined(__APPLE__) && defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__)
+#if (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1060 && \
+ __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070)
+/* Workaround for a stupid bug in OSX 10.6 */
+#define FORK_BREAKS_GCOV
+#include <vproc.h>
+#endif
+#endif
+
+#endif /* !NO_FORKING */
+
#ifndef __GNUC__
#define __attribute__(x)
#endif
@@ -58,6 +71,8 @@ static int opt_nofork = 0; /**< Suppress calls to fork() for debugging. */
static int opt_verbosity = 1; /**< -==quiet,0==terse,1==normal,2==verbose */
const char *verbosity_flag = "";
+const struct testlist_alias_t *cfg_aliases=NULL;
+
enum outcome { SKIP=2, OK=1, FAIL=0 };
static enum outcome cur_test_outcome = 0;
const char *cur_test_prefix = NULL; /**< prefix of the current test group */
@@ -71,6 +86,7 @@ static char commandname[MAX_PATH+1];
static void usage(struct testgroup_t *groups, int list_groups)
__attribute__((noreturn));
+static int process_test_option(struct testgroup_t *groups, const char *test);
static enum outcome
testcase_run_bare_(const struct testcase_t *testcase)
@@ -99,6 +115,8 @@ testcase_run_bare_(const struct testcase_t *testcase)
#define MAGIC_EXITCODE 42
+#ifndef NO_FORKING
+
static enum outcome
testcase_run_forked_(const struct testgroup_t *group,
const struct testcase_t *testcase)
@@ -160,6 +178,9 @@ testcase_run_forked_(const struct testgroup_t *group,
if (opt_verbosity>0)
printf("[forking] ");
pid = fork();
+#ifdef FORK_BREAKS_GCOV
+ vproc_transaction_begin(0);
+#endif
if (!pid) {
/* child. */
int test_r, write_r;
@@ -196,16 +217,19 @@ testcase_run_forked_(const struct testgroup_t *group,
#endif
}
+#endif /* !NO_FORKING */
+
int
testcase_run_one(const struct testgroup_t *group,
const struct testcase_t *testcase)
{
enum outcome outcome;
- if (testcase->flags & TT_SKIP) {
+ if (testcase->flags & (TT_SKIP|TT_OFF_BY_DEFAULT)) {
if (opt_verbosity>0)
- printf("%s%s: SKIPPED\n",
- group->prefix, testcase->name);
+ printf("%s%s: %s\n",
+ group->prefix, testcase->name,
+ (testcase->flags & TT_SKIP) ? "SKIPPED" : "DISABLED");
++n_skipped;
return SKIP;
}
@@ -218,9 +242,13 @@ testcase_run_one(const struct testgroup_t *group,
cur_test_name = testcase->name;
}
+#ifndef NO_FORKING
if ((testcase->flags & TT_FORK) && !(opt_forked||opt_nofork)) {
outcome = testcase_run_forked_(group, testcase);
} else {
+#else
+ {
+#endif
outcome = testcase_run_bare_(testcase);
}
@@ -247,7 +275,7 @@ testcase_run_one(const struct testgroup_t *group,
}
int
-tinytest_set_flag_(struct testgroup_t *groups, const char *arg, unsigned long flag)
+tinytest_set_flag_(struct testgroup_t *groups, const char *arg, int set, unsigned long flag)
{
int i, j;
size_t length = LONGEST_TEST_NAME;
@@ -257,12 +285,23 @@ tinytest_set_flag_(struct testgroup_t *groups, const char *arg, unsigned long fl
length = strstr(arg,"..")-arg;
for (i=0; groups[i].prefix; ++i) {
for (j=0; groups[i].cases[j].name; ++j) {
+ struct testcase_t *testcase = &groups[i].cases[j];
snprintf(fullname, sizeof(fullname), "%s%s",
- groups[i].prefix, groups[i].cases[j].name);
- if (!flag) /* Hack! */
- printf(" %s\n", fullname);
+ groups[i].prefix, testcase->name);
+ if (!flag) { /* Hack! */
+ printf(" %s", fullname);
+ if (testcase->flags & TT_OFF_BY_DEFAULT)
+ puts(" (Off by default)");
+ else if (testcase->flags & TT_SKIP)
+ puts(" (DISABLED)");
+ else
+ puts("");
+ }
if (!strncmp(fullname, arg, length)) {
- groups[i].cases[j].flags |= flag;
+ if (set)
+ testcase->flags |= flag;
+ else
+ testcase->flags &= ~flag;
++found;
}
}
@@ -275,15 +314,69 @@ usage(struct testgroup_t *groups, int list_groups)
{
puts("Options are: [--verbose|--quiet|--terse] [--no-fork]");
puts(" Specify tests by name, or using a prefix ending with '..'");
- puts(" To skip a test, list give its name prefixed with a colon.");
+ puts(" To skip a test, prefix its name with a colon.");
+ puts(" To enable a disabled test, prefix its name with a plus.");
puts(" Use --list-tests for a list of tests.");
if (list_groups) {
puts("Known tests are:");
- tinytest_set_flag_(groups, "..", 0);
+ tinytest_set_flag_(groups, "..", 1, 0);
}
exit(0);
}
+static int
+process_test_alias(struct testgroup_t *groups, const char *test)
+{
+ int i, j, n, r;
+ for (i=0; cfg_aliases && cfg_aliases[i].name; ++i) {
+ if (!strcmp(cfg_aliases[i].name, test)) {
+ n = 0;
+ for (j = 0; cfg_aliases[i].tests[j]; ++j) {
+ r = process_test_option(groups, cfg_aliases[i].tests[j]);
+ if (r<0)
+ return -1;
+ n += r;
+ }
+ return n;
+ }
+ }
+ printf("No such test alias as @%s!",test);
+ return -1;
+}
+
+static int
+process_test_option(struct testgroup_t *groups, const char *test)
+{
+ int flag = TT_ENABLED_;
+ int n = 0;
+ if (test[0] == '@') {
+ return process_test_alias(groups, test + 1);
+ } else if (test[0] == ':') {
+ ++test;
+ flag = TT_SKIP;
+ } else if (test[0] == '+') {
+ ++test;
+ ++n;
+ if (!tinytest_set_flag_(groups, test, 0, TT_OFF_BY_DEFAULT)) {
+ printf("No such test as %s!\n", test);
+ return -1;
+ }
+ } else {
+ ++n;
+ }
+ if (!tinytest_set_flag_(groups, test, 1, flag)) {
+ printf("No such test as %s!\n", test);
+ return -1;
+ }
+ return n;
+}
+
+void
+tinytest_set_aliases(const struct testlist_alias_t *aliases)
+{
+ cfg_aliases = aliases;
+}
+
int
tinytest_main(int c, const char **v, struct testgroup_t *groups)
{
@@ -321,24 +414,18 @@ tinytest_main(int c, const char **v, struct testgroup_t *groups)
return -1;
}
} else {
- const char *test = v[i];
- int flag = TT_ENABLED_;
- if (test[0] == ':') {
- ++test;
- flag = TT_SKIP;
- } else {
- ++n;
- }
- if (!tinytest_set_flag_(groups, test, flag)) {
- printf("No such test as %s!\n", v[i]);
+ int r = process_test_option(groups, v[i]);
+ if (r<0)
return -1;
- }
+ n += r;
}
}
if (!n)
- tinytest_set_flag_(groups, "..", TT_ENABLED_);
+ tinytest_set_flag_(groups, "..", 1, TT_ENABLED_);
+#ifdef _IONBF
setvbuf(stdout, NULL, _IONBF, 0);
+#endif
++in_tinytest_main;
for (i=0; groups[i].prefix; ++i)
@@ -385,3 +472,29 @@ tinytest_set_test_skipped_(void)
cur_test_outcome = SKIP;
}
+char *
+tinytest_format_hex_(const void *val_, unsigned long len)
+{
+ const unsigned char *val = val_;
+ char *result, *cp;
+ size_t i;
+ int ellipses = 0;
+
+ if (!val)
+ return strdup("null");
+ if (len > 1024) {
+ ellipses = 3;
+ len = 1024;
+ }
+ if (!(result = malloc(len*2+4)))
+ return strdup("<allocation failure>");
+ cp = result;
+ for (i=0;i<len;++i) {
+ *cp++ = "0123456789ABCDEF"[val[i] >> 4];
+ *cp++ = "0123456789ABCDEF"[val[i] & 0x0f];
+ }
+ while (ellipses--)
+ *cp++ = '.';
+ *cp = 0;
+ return result;
+}
diff --git a/src/ext/tinytest.h b/src/ext/tinytest.h
index bcac9f079..ed07b26bc 100644
--- a/src/ext/tinytest.h
+++ b/src/ext/tinytest.h
@@ -32,8 +32,10 @@
#define TT_SKIP (1<<1)
/** Internal runtime flag for a test we've decided to run. */
#define TT_ENABLED_ (1<<2)
+/** Flag for a test that's off by default. */
+#define TT_OFF_BY_DEFAULT (1<<3)
/** If you add your own flags, make them start at this point. */
-#define TT_FIRST_USER_FLAG (1<<3)
+#define TT_FIRST_USER_FLAG (1<<4)
typedef void (*testcase_fn)(void *);
@@ -64,6 +66,12 @@ struct testgroup_t {
};
#define END_OF_GROUPS { NULL, NULL}
+struct testlist_alias_t {
+ const char *name;
+ const char **tests;
+};
+#define END_OF_ALIASES { NULL, NULL }
+
/** Implementation: called from a test to indicate failure, before logging. */
void tinytest_set_test_failed_(void);
/** Implementation: called from a test to indicate that we're skipping. */
@@ -72,14 +80,19 @@ void tinytest_set_test_skipped_(void);
int tinytest_get_verbosity_(void);
/** Implementation: Set a flag on tests matching a name; returns number
* of tests that matched. */
-int tinytest_set_flag_(struct testgroup_t *, const char *, unsigned long);
+int tinytest_set_flag_(struct testgroup_t *, const char *, int set, unsigned long);
+/** Implementation: Put a chunk of memory into hex. */
+char *tinytest_format_hex_(const void *, unsigned long);
/** Set all tests in 'groups' matching the name 'named' to be skipped. */
#define tinytest_skip(groups, named) \
- tinytest_set_flag_(groups, named, TT_SKIP)
+ tinytest_set_flag_(groups, named, 1, TT_SKIP)
/** Run a single testcase in a single group. */
int testcase_run_one(const struct testgroup_t *,const struct testcase_t *);
+
+void tinytest_set_aliases(const struct testlist_alias_t *aliases);
+
/** Run a set of testcases from an END_OF_GROUPS-terminated array of groups,
as selected from the command line. */
int tinytest_main(int argc, const char **argv, struct testgroup_t *groups);
diff --git a/src/ext/tinytest_demo.c b/src/ext/tinytest_demo.c
index be95ce4c1..634e112cb 100644
--- a/src/ext/tinytest_demo.c
+++ b/src/ext/tinytest_demo.c
@@ -35,6 +35,13 @@
#include <stdlib.h>
#include <string.h>
#include <errno.h>
+#include <time.h>
+
+#ifdef _WIN32
+#include <windows.h>
+#else
+#include <unistd.h>
+#endif
/* ============================================================ */
@@ -148,6 +155,10 @@ test_memcpy(void *ptr)
memcpy(db->buffer2, db->buffer1, sizeof(db->buffer1));
tt_str_op(db->buffer1, ==, db->buffer2);
+ /* tt_mem_op() does a memcmp, as opposed to the strcmp in tt_str_op() */
+ db->buffer2[100] = 3; /* Make the buffers unequal */
+ tt_mem_op(db->buffer1, <, db->buffer2, sizeof(db->buffer1));
+
/* Now we've allocated memory that's referenced by a local variable.
The end block of the function will clean it up. */
mem = strdup("Hello world.");
@@ -162,6 +173,27 @@ test_memcpy(void *ptr)
free(mem);
}
+void
+test_timeout(void *ptr)
+{
+ time_t t1, t2;
+ (void)ptr;
+ t1 = time(NULL);
+#ifdef _WIN32
+ Sleep(5000);
+#else
+ sleep(5);
+#endif
+ t2 = time(NULL);
+
+ tt_int_op(t2-t1, >=, 4);
+
+ tt_int_op(t2-t1, <=, 6);
+
+ end:
+ ;
+}
+
/* ============================================================ */
/* Now we need to make sure that our tests get invoked. First, you take
@@ -178,6 +210,10 @@ struct testcase_t demo_tests[] = {
its environment. */
{ "memcpy", test_memcpy, TT_FORK, &data_buffer_setup },
+ /* This flag is off-by-default, since it takes a while to run. You
+ * can enable it manually by passing +demo/timeout at the command line.*/
+ { "timeout", test_timeout, TT_OFF_BY_DEFAULT },
+
/* The array has to end with END_OF_TESTCASES. */
END_OF_TESTCASES
};
@@ -192,6 +228,18 @@ struct testgroup_t groups[] = {
END_OF_GROUPS
};
+/* We can also define test aliases. These can be used for types of tests that
+ * cut across groups. */
+const char *alltests[] = { "+..", NULL };
+const char *slowtests[] = { "+demo/timeout", NULL };
+struct testlist_alias_t aliases[] = {
+
+ { "ALL", alltests },
+ { "SLOW", slowtests },
+
+ END_OF_ALIASES
+};
+
int
main(int c, const char **v)
@@ -211,5 +259,6 @@ main(int c, const char **v)
"tinytest-demo" and "tinytest-demo .." mean the same thing.
*/
+ tinytest_set_aliases(aliases);
return tinytest_main(c, v, groups);
}
diff --git a/src/ext/tinytest_macros.h b/src/ext/tinytest_macros.h
index 9ff69b1d5..c3728d1fd 100644
--- a/src/ext/tinytest_macros.h
+++ b/src/ext/tinytest_macros.h
@@ -113,8 +113,8 @@
#define tt_assert_test_fmt_type(a,b,str_test,type,test,printf_type,printf_fmt, \
setup_block,cleanup_block,die_on_fail) \
TT_STMT_BEGIN \
- type val1_ = (type)(a); \
- type val2_ = (type)(b); \
+ type val1_ = (a); \
+ type val2_ = (b); \
int tt_status_ = (test); \
if (!tt_status_ || tinytest_get_verbosity_()>1) { \
printf_type print_; \
@@ -144,6 +144,10 @@
tt_assert_test_fmt_type(a,b,str_test,type,test,type,fmt, \
{print_=value_;},{},die_on_fail)
+#define tt_assert_test_type_opt(a,b,str_test,type,test,fmt,die_on_fail) \
+ tt_assert_test_fmt_type(a,b,str_test,type,test,type,fmt, \
+ {print_=value_?value_:"<NULL>";},{},die_on_fail)
+
/* Helper: assert that a op b, when cast to type. Format the values with
* printf format fmt on failure. */
#define tt_assert_op_type(a,op,b,type,fmt) \
@@ -159,12 +163,23 @@
(val1_ op val2_),"%lu",TT_EXIT_TEST_FUNCTION)
#define tt_ptr_op(a,op,b) \
- tt_assert_test_type(a,b,#a" "#op" "#b,void*, \
+ tt_assert_test_type(a,b,#a" "#op" "#b,const void*, \
(val1_ op val2_),"%p",TT_EXIT_TEST_FUNCTION)
#define tt_str_op(a,op,b) \
- tt_assert_test_type(a,b,#a" "#op" "#b,const char *, \
- (strcmp(val1_,val2_) op 0),"<%s>",TT_EXIT_TEST_FUNCTION)
+ tt_assert_test_type_opt(a,b,#a" "#op" "#b,const char *, \
+ (val1_ && val2_ && strcmp(val1_,val2_) op 0),"<%s>", \
+ TT_EXIT_TEST_FUNCTION)
+
+#define tt_mem_op(expr1, op, expr2, len) \
+ tt_assert_test_fmt_type(expr1,expr2,#expr1" "#op" "#expr2, \
+ const void *, \
+ (val1_ && val2_ && memcmp(val1_, val2_, len) op 0), \
+ char *, "%s", \
+ { print_ = tinytest_format_hex_(value_, (len)); }, \
+ { if (print_) free(print_); }, \
+ TT_EXIT_TEST_FUNCTION \
+ );
#define tt_want_int_op(a,op,b) \
tt_assert_test_type(a,b,#a" "#op" "#b,long,(val1_ op val2_),"%ld",(void)0)
@@ -174,7 +189,7 @@
(val1_ op val2_),"%lu",(void)0)
#define tt_want_ptr_op(a,op,b) \
- tt_assert_test_type(a,b,#a" "#op" "#b,void*, \
+ tt_assert_test_type(a,b,#a" "#op" "#b,const void*, \
(val1_ op val2_),"%p",(void)0)
#define tt_want_str_op(a,op,b) \
diff --git a/src/or/addressmap.c b/src/or/addressmap.c
index 79e4b7c5e..998770a3d 100644
--- a/src/or/addressmap.c
+++ b/src/or/addressmap.c
@@ -45,7 +45,7 @@
typedef struct {
char *new_address;
time_t expires;
- ENUM_BF(addressmap_entry_source_t) source:3;
+ addressmap_entry_source_bitfield_t source:3;
unsigned src_wildcard:1;
unsigned dst_wildcard:1;
short num_resolve_failures;
@@ -798,7 +798,7 @@ address_is_in_virtual_range(const char *address)
/** Return a random address conforming to the virtual address configuration
* in <b>conf</b>.
*/
-/* private */ void
+STATIC void
get_random_virtual_addr(const virtual_addr_conf_t *conf, tor_addr_t *addr_out)
{
uint8_t tmp[4];
diff --git a/src/or/addressmap.h b/src/or/addressmap.h
index 40210ee99..417832b31 100644
--- a/src/or/addressmap.h
+++ b/src/or/addressmap.h
@@ -7,6 +7,8 @@
#ifndef TOR_ADDRESSMAP_H
#define TOR_ADDRESSMAP_H
+#include "testsupport.h"
+
void addressmap_init(void);
void addressmap_clear_excluded_trackexithosts(const or_options_t *options);
void addressmap_clear_invalid_automaps(const or_options_t *options);
@@ -52,8 +54,8 @@ typedef struct virtual_addr_conf_t {
maskbits_t bits;
} virtual_addr_conf_t;
-void get_random_virtual_addr(const virtual_addr_conf_t *conf,
- tor_addr_t *addr_out);
+STATIC void get_random_virtual_addr(const virtual_addr_conf_t *conf,
+ tor_addr_t *addr_out);
#endif
#endif
diff --git a/src/or/buffers.c b/src/or/buffers.c
index c4c847ec8..033f86288 100644
--- a/src/or/buffers.c
+++ b/src/or/buffers.c
@@ -19,6 +19,7 @@
#include "connection_or.h"
#include "control.h"
#include "reasons.h"
+#include "ext_orport.h"
#include "../common/util.h"
#include "../common/torlog.h"
#ifdef HAVE_UNISTD_H
@@ -63,16 +64,6 @@ static int parse_socks_client(const uint8_t *data, size_t datalen,
/* Chunk manipulation functions */
-/** A single chunk on a buffer or in a freelist. */
-typedef struct chunk_t {
- struct chunk_t *next; /**< The next chunk on the buffer or freelist. */
- size_t datalen; /**< The number of bytes stored in this chunk */
- size_t memlen; /**< The number of usable bytes of storage in <b>mem</b>. */
- char *data; /**< A pointer to the first byte of data stored in <b>mem</b>. */
- char mem[FLEXIBLE_ARRAY_MEMBER]; /**< The actual memory used for storage in
- * this chunk. */
-} chunk_t;
-
#define CHUNK_HEADER_LEN STRUCT_OFFSET(chunk_t, mem[0])
/** Return the number of bytes needed to allocate a chunk to hold
@@ -109,6 +100,9 @@ chunk_repack(chunk_t *chunk)
chunk->data = &chunk->mem[0];
}
+/** Keep track of total size of allocated chunks for consistency asserts */
+static size_t total_bytes_allocated_in_chunks = 0;
+
#if defined(ENABLE_BUF_FREELISTS) || defined(RUNNING_DOXYGEN)
/** A freelist of chunks. */
typedef struct chunk_freelist_t {
@@ -173,6 +167,11 @@ chunk_free_unchecked(chunk_t *chunk)
} else {
if (freelist)
++freelist->n_free;
+#ifdef DEBUG_CHUNK_ALLOC
+ tor_assert(alloc == chunk->DBG_alloc);
+#endif
+ tor_assert(total_bytes_allocated_in_chunks >= alloc);
+ total_bytes_allocated_in_chunks -= alloc;
tor_free(chunk);
}
}
@@ -199,6 +198,10 @@ chunk_new_with_alloc_size(size_t alloc)
else
++n_freelist_miss;
ch = tor_malloc(alloc);
+#ifdef DEBUG_CHUNK_ALLOC
+ ch->DBG_alloc = alloc;
+#endif
+ total_bytes_allocated_in_chunks += alloc;
}
ch->next = NULL;
ch->datalen = 0;
@@ -210,6 +213,14 @@ chunk_new_with_alloc_size(size_t alloc)
static void
chunk_free_unchecked(chunk_t *chunk)
{
+ if (!chunk)
+ return;
+#ifdef DEBUG_CHUNK_ALLOC
+ tor_assert(CHUNK_ALLOC_SIZE(chunk->memlen) == chunk->DBG_alloc);
+#endif
+ tor_assert(total_bytes_allocated_in_chunks >=
+ CHUNK_ALLOC_SIZE(chunk->memlen));
+ total_bytes_allocated_in_chunks -= CHUNK_ALLOC_SIZE(chunk->memlen);
tor_free(chunk);
}
static INLINE chunk_t *
@@ -219,7 +230,11 @@ chunk_new_with_alloc_size(size_t alloc)
ch = tor_malloc(alloc);
ch->next = NULL;
ch->datalen = 0;
+#ifdef DEBUG_CHUNK_ALLOC
+ ch->DBG_alloc = alloc;
+#endif
ch->memlen = CHUNK_SIZE_WITH_ALLOC(alloc);
+ total_bytes_allocated_in_chunks += alloc;
ch->data = &ch->mem[0];
return ch;
}
@@ -231,11 +246,18 @@ static INLINE chunk_t *
chunk_grow(chunk_t *chunk, size_t sz)
{
off_t offset;
+ size_t memlen_orig = chunk->memlen;
tor_assert(sz > chunk->memlen);
offset = chunk->data - chunk->mem;
chunk = tor_realloc(chunk, CHUNK_ALLOC_SIZE(sz));
chunk->memlen = sz;
chunk->data = chunk->mem + offset;
+#ifdef DEBUG_CHUNK_ALLOC
+ tor_assert(chunk->DBG_alloc == CHUNK_ALLOC_SIZE(memlen_orig));
+ chunk->DBG_alloc = CHUNK_ALLOC_SIZE(sz);
+#endif
+ total_bytes_allocated_in_chunks +=
+ CHUNK_ALLOC_SIZE(sz) - CHUNK_ALLOC_SIZE(memlen_orig);
return chunk;
}
@@ -260,12 +282,14 @@ preferred_chunk_size(size_t target)
}
/** Remove from the freelists most chunks that have not been used since the
- * last call to buf_shrink_freelists(). */
-void
+ * last call to buf_shrink_freelists(). Return the amount of memory
+ * freed. */
+size_t
buf_shrink_freelists(int free_all)
{
#ifdef ENABLE_BUF_FREELISTS
int i;
+ size_t total_freed = 0;
disable_control_logging();
for (i = 0; freelists[i].alloc_size; ++i) {
int slack = freelists[i].slack;
@@ -281,7 +305,7 @@ buf_shrink_freelists(int free_all)
chunk_t **chp = &freelists[i].head;
chunk_t *chunk;
while (n_to_skip) {
- if (! (*chp)->next) {
+ if (!(*chp) || ! (*chp)->next) {
log_warn(LD_BUG, "I wanted to skip %d chunks in the freelist for "
"%d-byte chunks, but only found %d. (Length %d)",
orig_n_to_skip, (int)freelists[i].alloc_size,
@@ -297,6 +321,13 @@ buf_shrink_freelists(int free_all)
*chp = NULL;
while (chunk) {
chunk_t *next = chunk->next;
+#ifdef DEBUG_CHUNK_ALLOC
+ tor_assert(chunk->DBG_alloc == CHUNK_ALLOC_SIZE(chunk->memlen));
+#endif
+ tor_assert(total_bytes_allocated_in_chunks >=
+ CHUNK_ALLOC_SIZE(chunk->memlen));
+ total_bytes_allocated_in_chunks -= CHUNK_ALLOC_SIZE(chunk->memlen);
+ total_freed += CHUNK_ALLOC_SIZE(chunk->memlen);
tor_free(chunk);
chunk = next;
--n_to_free;
@@ -314,18 +345,21 @@ buf_shrink_freelists(int free_all)
}
// tor_assert(!n_to_free);
freelists[i].cur_length = new_length;
+ tor_assert(orig_n_to_skip == new_length);
log_info(LD_MM, "Cleaned freelist for %d-byte chunks: original "
- "length %d, kept %d, dropped %d.",
+ "length %d, kept %d, dropped %d. New length is %d",
(int)freelists[i].alloc_size, orig_length,
- orig_n_to_skip, orig_n_to_free);
+ orig_n_to_skip, orig_n_to_free, new_length);
}
freelists[i].lowest_length = freelists[i].cur_length;
assert_freelist_ok(&freelists[i]);
}
done:
enable_control_logging();
+ return total_freed;
#else
(void) free_all;
+ return 0;
#endif
}
@@ -356,28 +390,16 @@ buf_dump_freelist_sizes(int severity)
#endif
}
-/** Magic value for buf_t.magic, to catch pointer errors. */
-#define BUFFER_MAGIC 0xB0FFF312u
-/** A resizeable buffer, optimized for reading and writing. */
-struct buf_t {
- uint32_t magic; /**< Magic cookie for debugging: Must be set to
- * BUFFER_MAGIC. */
- size_t datalen; /**< How many bytes is this buffer holding right now? */
- size_t default_chunk_size; /**< Don't allocate any chunks smaller than
- * this for this buffer. */
- chunk_t *head; /**< First chunk in the list, or NULL for none. */
- chunk_t *tail; /**< Last chunk in the list, or NULL for none. */
-};
-
/** Collapse data from the first N chunks from <b>buf</b> into buf->head,
* growing it as necessary, until buf->head has the first <b>bytes</b> bytes
* of data from the buffer, or until buf->head has all the data in <b>buf</b>.
*
* If <b>nulterminate</b> is true, ensure that there is a 0 byte in
* buf->head->mem right after all the data. */
-static void
+STATIC void
buf_pullup(buf_t *buf, size_t bytes, int nulterminate)
{
+ /* XXXX nothing uses nulterminate; remove it. */
chunk_t *dest, *src;
size_t capacity;
if (!buf->head)
@@ -449,6 +471,20 @@ buf_pullup(buf_t *buf, size_t bytes, int nulterminate)
check();
}
+#ifdef TOR_UNIT_TESTS
+void
+buf_get_first_chunk_data(const buf_t *buf, const char **cp, size_t *sz)
+{
+ if (!buf || !buf->head) {
+ *cp = NULL;
+ *sz = 0;
+ } else {
+ *cp = buf->head->data;
+ *sz = buf->head->datalen;
+ }
+}
+#endif
+
/** Resize buf so it won't hold extra memory that we haven't been
* using lately.
*/
@@ -503,6 +539,12 @@ buf_new(void)
return buf;
}
+size_t
+buf_get_default_chunk_size(const buf_t *buf)
+{
+ return buf->default_chunk_size;
+}
+
/** Remove all data from <b>buf</b>. */
void
buf_clear(buf_t *buf)
@@ -530,7 +572,7 @@ buf_allocation(const buf_t *buf)
size_t total = 0;
const chunk_t *chunk;
for (chunk = buf->head; chunk; chunk = chunk->next) {
- total += chunk->memlen;
+ total += CHUNK_ALLOC_SIZE(chunk->memlen);
}
return total;
}
@@ -563,6 +605,10 @@ static chunk_t *
chunk_copy(const chunk_t *in_chunk)
{
chunk_t *newch = tor_memdup(in_chunk, CHUNK_ALLOC_SIZE(in_chunk->memlen));
+ total_bytes_allocated_in_chunks += CHUNK_ALLOC_SIZE(in_chunk->memlen);
+#ifdef DEBUG_CHUNK_ALLOC
+ newch->DBG_alloc = CHUNK_ALLOC_SIZE(in_chunk->memlen);
+#endif
newch->next = NULL;
if (in_chunk->data) {
off_t offset = in_chunk->data - in_chunk->mem;
@@ -598,6 +644,7 @@ static chunk_t *
buf_add_chunk_with_capacity(buf_t *buf, size_t capacity, int capped)
{
chunk_t *chunk;
+ struct timeval now;
if (CHUNK_ALLOC_SIZE(capacity) < buf->default_chunk_size) {
chunk = chunk_new_with_alloc_size(buf->default_chunk_size);
} else if (capped && CHUNK_ALLOC_SIZE(capacity) > MAX_CHUNK_ALLOC) {
@@ -605,6 +652,10 @@ buf_add_chunk_with_capacity(buf_t *buf, size_t capacity, int capped)
} else {
chunk = chunk_new_with_alloc_size(preferred_chunk_size(capacity));
}
+
+ tor_gettimeofday_cached_monotonic(&now);
+ chunk->inserted_time = (uint32_t)tv_to_msec(&now);
+
if (buf->tail) {
tor_assert(buf->head);
buf->tail->next = chunk;
@@ -617,6 +668,26 @@ buf_add_chunk_with_capacity(buf_t *buf, size_t capacity, int capped)
return chunk;
}
+/** Return the age of the oldest chunk in the buffer <b>buf</b>, in
+ * milliseconds. Requires the current time, in truncated milliseconds since
+ * the epoch, as its input <b>now</b>.
+ */
+uint32_t
+buf_get_oldest_chunk_timestamp(const buf_t *buf, uint32_t now)
+{
+ if (buf->head) {
+ return now - buf->head->inserted_time;
+ } else {
+ return 0;
+ }
+}
+
+size_t
+buf_get_total_allocation(void)
+{
+ return total_bytes_allocated_in_chunks;
+}
+
/** Read up to <b>at_most</b> bytes from the socket <b>fd</b> into
* <b>chunk</b> (which must be on <b>buf</b>). If we get an EOF, set
* *<b>reached_eof</b> to 1. Return -1 on error, 0 on eof or blocking,
@@ -1294,7 +1365,7 @@ buf_matches_at_pos(const buf_pos_t *pos, const char *s, size_t n)
/** Return the first position in <b>buf</b> at which the <b>n</b>-character
* string <b>s</b> occurs, or -1 if it does not occur. */
-/*private*/ int
+STATIC int
buf_find_string_offset(const buf_t *buf, const char *s, size_t n)
{
buf_pos_t pos;
@@ -1702,6 +1773,64 @@ fetch_from_evbuffer_socks(struct evbuffer *buf, socks_request_t *req,
}
#endif
+/** The size of the header of an Extended ORPort message: 2 bytes for
+ * COMMAND, 2 bytes for BODYLEN */
+#define EXT_OR_CMD_HEADER_SIZE 4
+
+/** Read <b>buf</b>, which should contain an Extended ORPort message
+ * from a transport proxy. If well-formed, create and populate
+ * <b>out</b> with the Extended ORport message. Return 0 if the
+ * buffer was incomplete, 1 if it was well-formed and -1 if we
+ * encountered an error while parsing it. */
+int
+fetch_ext_or_command_from_buf(buf_t *buf, ext_or_cmd_t **out)
+{
+ char hdr[EXT_OR_CMD_HEADER_SIZE];
+ uint16_t len;
+
+ check();
+ if (buf->datalen < EXT_OR_CMD_HEADER_SIZE)
+ return 0;
+ peek_from_buf(hdr, sizeof(hdr), buf);
+ len = ntohs(get_uint16(hdr+2));
+ if (buf->datalen < (unsigned)len + EXT_OR_CMD_HEADER_SIZE)
+ return 0;
+ *out = ext_or_cmd_new(len);
+ (*out)->cmd = ntohs(get_uint16(hdr));
+ (*out)->len = len;
+ buf_remove_from_front(buf, EXT_OR_CMD_HEADER_SIZE);
+ fetch_from_buf((*out)->body, len, buf);
+ return 1;
+}
+
+#ifdef USE_BUFFEREVENTS
+/** Read <b>buf</b>, which should contain an Extended ORPort message
+ * from a transport proxy. If well-formed, create and populate
+ * <b>out</b> with the Extended ORport message. Return 0 if the
+ * buffer was incomplete, 1 if it was well-formed and -1 if we
+ * encountered an error while parsing it. */
+int
+fetch_ext_or_command_from_evbuffer(struct evbuffer *buf, ext_or_cmd_t **out)
+{
+ char hdr[EXT_OR_CMD_HEADER_SIZE];
+ uint16_t len;
+ size_t buf_len = evbuffer_get_length(buf);
+
+ if (buf_len < EXT_OR_CMD_HEADER_SIZE)
+ return 0;
+ evbuffer_copyout(buf, hdr, EXT_OR_CMD_HEADER_SIZE);
+ len = ntohs(get_uint16(hdr+2));
+ if (buf_len < (unsigned)len + EXT_OR_CMD_HEADER_SIZE)
+ return 0;
+ *out = ext_or_cmd_new(len);
+ (*out)->cmd = ntohs(get_uint16(hdr));
+ (*out)->len = len;
+ evbuffer_drain(buf, EXT_OR_CMD_HEADER_SIZE);
+ evbuffer_remove(buf, (*out)->body, len);
+ return 1;
+}
+#endif
+
/** Implementation helper to implement fetch_from_*_socks. Instead of looking
* at a buffer's contents, we look at the <b>datalen</b> bytes of data in
* <b>data</b>. Instead of removing data from the buffer, we set
@@ -2348,6 +2477,7 @@ write_to_buf_zlib(buf_t *buf, tor_zlib_state_t *state,
char *next;
size_t old_avail, avail;
int over = 0;
+
do {
int need_new_chunk = 0;
if (!buf->tail || ! CHUNK_REMAINING_CAPACITY(buf->tail)) {
diff --git a/src/or/buffers.h b/src/or/buffers.h
index c947f0ba9..c90e14750 100644
--- a/src/or/buffers.h
+++ b/src/or/buffers.h
@@ -12,19 +12,25 @@
#ifndef TOR_BUFFERS_H
#define TOR_BUFFERS_H
+#include "testsupport.h"
+
buf_t *buf_new(void);
buf_t *buf_new_with_capacity(size_t size);
+size_t buf_get_default_chunk_size(const buf_t *buf);
void buf_free(buf_t *buf);
void buf_clear(buf_t *buf);
buf_t *buf_copy(const buf_t *buf);
void buf_shrink(buf_t *buf);
-void buf_shrink_freelists(int free_all);
+size_t buf_shrink_freelists(int free_all);
void buf_dump_freelist_sizes(int severity);
size_t buf_datalen(const buf_t *buf);
size_t buf_allocation(const buf_t *buf);
size_t buf_slack(const buf_t *buf);
+uint32_t buf_get_oldest_chunk_timestamp(const buf_t *buf, uint32_t now);
+size_t buf_get_total_allocation(void);
+
int read_to_buf(tor_socket_t s, size_t at_most, buf_t *buf, int *reached_eof,
int *socket_error);
int read_to_buf_tls(tor_tls_t *tls, size_t at_most, buf_t *buf);
@@ -51,6 +57,8 @@ int fetch_from_buf_line(buf_t *buf, char *data_out, size_t *data_len);
int peek_buf_has_control0_command(buf_t *buf);
+int fetch_ext_or_command_from_buf(buf_t *buf, ext_or_cmd_t **out);
+
#ifdef USE_BUFFEREVENTS
int fetch_var_cell_from_evbuffer(struct evbuffer *buf, var_cell_t **out,
int linkproto);
@@ -66,6 +74,8 @@ int peek_evbuffer_has_control0_command(struct evbuffer *buf);
int write_to_evbuffer_zlib(struct evbuffer *buf, tor_zlib_state_t *state,
const char *data, size_t data_len,
int done);
+int fetch_ext_or_command_from_evbuffer(struct evbuffer *buf,
+ ext_or_cmd_t **out);
#endif
#ifdef USE_BUFFEREVENTS
@@ -75,6 +85,8 @@ int write_to_evbuffer_zlib(struct evbuffer *buf, tor_zlib_state_t *state,
#define generic_buffer_get(b,buf,buflen) evbuffer_remove((b),(buf),(buflen))
#define generic_buffer_clear(b) evbuffer_drain((b), evbuffer_get_length((b)))
#define generic_buffer_free(b) evbuffer_free((b))
+#define generic_buffer_fetch_ext_or_cmd(b, out) \
+ fetch_ext_or_command_from_evbuffer((b), (out))
#else
#define generic_buffer_new() buf_new()
#define generic_buffer_len(b) buf_datalen((b))
@@ -82,6 +94,8 @@ int write_to_evbuffer_zlib(struct evbuffer *buf, tor_zlib_state_t *state,
#define generic_buffer_get(b,buf,buflen) fetch_from_buf((buf),(buflen),(b))
#define generic_buffer_clear(b) buf_clear((b))
#define generic_buffer_free(b) buf_free((b))
+#define generic_buffer_fetch_ext_or_cmd(b, out) \
+ fetch_ext_or_command_from_buf((b), (out))
#endif
int generic_buffer_set_to_copy(generic_buffer_t **output,
const generic_buffer_t *input);
@@ -89,7 +103,38 @@ int generic_buffer_set_to_copy(generic_buffer_t **output,
void assert_buf_ok(buf_t *buf);
#ifdef BUFFERS_PRIVATE
-int buf_find_string_offset(const buf_t *buf, const char *s, size_t n);
+STATIC int buf_find_string_offset(const buf_t *buf, const char *s, size_t n);
+STATIC void buf_pullup(buf_t *buf, size_t bytes, int nulterminate);
+void buf_get_first_chunk_data(const buf_t *buf, const char **cp, size_t *sz);
+
+#define DEBUG_CHUNK_ALLOC
+/** A single chunk on a buffer or in a freelist. */
+typedef struct chunk_t {
+ struct chunk_t *next; /**< The next chunk on the buffer or freelist. */
+ size_t datalen; /**< The number of bytes stored in this chunk */
+ size_t memlen; /**< The number of usable bytes of storage in <b>mem</b>. */
+#ifdef DEBUG_CHUNK_ALLOC
+ size_t DBG_alloc;
+#endif
+ char *data; /**< A pointer to the first byte of data stored in <b>mem</b>. */
+ uint32_t inserted_time; /**< Timestamp in truncated ms since epoch
+ * when this chunk was inserted. */
+ char mem[FLEXIBLE_ARRAY_MEMBER]; /**< The actual memory used for storage in
+ * this chunk. */
+} chunk_t;
+
+/** Magic value for buf_t.magic, to catch pointer errors. */
+#define BUFFER_MAGIC 0xB0FFF312u
+/** A resizeable buffer, optimized for reading and writing. */
+struct buf_t {
+ uint32_t magic; /**< Magic cookie for debugging: Must be set to
+ * BUFFER_MAGIC. */
+ size_t datalen; /**< How many bytes is this buffer holding right now? */
+ size_t default_chunk_size; /**< Don't allocate any chunks smaller than
+ * this for this buffer. */
+ chunk_t *head; /**< First chunk in the list, or NULL for none. */
+ chunk_t *tail; /**< Last chunk in the list, or NULL for none. */
+};
#endif
#endif
diff --git a/src/or/channel.c b/src/or/channel.c
index ce2d01201..1cc786487 100644
--- a/src/or/channel.c
+++ b/src/or/channel.c
@@ -95,12 +95,7 @@ typedef struct channel_idmap_entry_s {
static INLINE unsigned
channel_idmap_hash(const channel_idmap_entry_t *ent)
{
- const unsigned *a = (const unsigned *)ent->digest;
-#if SIZEOF_INT == 4
- return a[0] ^ a[1] ^ a[2] ^ a[3] ^ a[4];
-#elif SIZEOF_INT == 8
- return a[0] ^ a[1];
-#endif
+ return (unsigned) siphash24g(ent->digest, DIGEST_LEN);
}
static INLINE int
@@ -124,6 +119,8 @@ static cell_queue_entry_t *
cell_queue_entry_new_fixed(cell_t *cell);
static cell_queue_entry_t *
cell_queue_entry_new_var(var_cell_t *var_cell);
+static int is_destroy_cell(channel_t *chan,
+ const cell_queue_entry_t *q, circid_t *circid_out);
/* Functions to maintain the digest map */
static void channel_add_to_digest_map(channel_t *chan);
@@ -733,8 +730,8 @@ channel_init(channel_t *chan)
/* Init timestamp */
chan->timestamp_last_had_circuits = time(NULL);
- /* Init next_circ_id */
- chan->next_circ_id = crypto_rand_int(1 << 15);
+ /* Warn about exhausted circuit IDs no more than hourly. */
+ chan->last_warned_circ_ids_exhausted.rate = 3600;
/* Initialize queues. */
TOR_SIMPLEQ_INIT(&chan->incoming_queue);
@@ -805,7 +802,8 @@ channel_free(channel_t *chan)
/* Get rid of cmux */
if (chan->cmux) {
- circuitmux_detach_all_circuits(chan->cmux);
+ circuitmux_detach_all_circuits(chan->cmux, NULL);
+ circuitmux_mark_destroyed_circids_usable(chan->cmux, chan);
circuitmux_free(chan->cmux);
chan->cmux = NULL;
}
@@ -1687,6 +1685,13 @@ channel_write_cell_queue_entry(channel_t *chan, cell_queue_entry_t *q)
chan->state == CHANNEL_STATE_OPEN ||
chan->state == CHANNEL_STATE_MAINT);
+ {
+ circid_t circ_id;
+ if (is_destroy_cell(chan, q, &circ_id)) {
+ channel_note_destroy_not_pending(chan, circ_id);
+ }
+ }
+
/* Can we send it right out? If so, try */
if (TOR_SIMPLEQ_EMPTY(&chan->outgoing_queue) &&
chan->state == CHANNEL_STATE_OPEN) {
@@ -2354,7 +2359,7 @@ channel_do_open_actions(channel_t *chan)
started_here = channel_is_outgoing(chan);
if (started_here) {
- circuit_build_times_network_is_live(&circ_times);
+ circuit_build_times_network_is_live(get_circuit_build_times_mutable());
rep_hist_note_connect_succeeded(chan->identity_digest, now);
if (entry_guard_register_connect_status(
chan->identity_digest, 1, 0, now) < 0) {
@@ -2372,8 +2377,14 @@ channel_do_open_actions(channel_t *chan)
/* only report it to the geoip module if it's not a known router */
if (!router_get_by_id_digest(chan->identity_digest)) {
if (channel_get_addr_if_possible(chan, &remote_addr)) {
- geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &remote_addr,
+ char *transport_name = NULL;
+ if (chan->get_transport_name(chan, &transport_name) < 0)
+ transport_name = NULL;
+
+ geoip_note_client_seen(GEOIP_CLIENT_CONNECT,
+ &remote_addr, transport_name,
now);
+ tor_free(transport_name);
}
/* Otherwise the underlying transport can't tell us this, so skip it */
}
@@ -2610,6 +2621,54 @@ channel_queue_var_cell(channel_t *chan, var_cell_t *var_cell)
}
}
+/** If <b>packed_cell</b> on <b>chan</b> is a destroy cell, then set
+ * *<b>circid_out</b> to its circuit ID, and return true. Otherwise, return
+ * false. */
+/* XXXX Move this function. */
+int
+packed_cell_is_destroy(channel_t *chan,
+ const packed_cell_t *packed_cell,
+ circid_t *circid_out)
+{
+ if (chan->wide_circ_ids) {
+ if (packed_cell->body[4] == CELL_DESTROY) {
+ *circid_out = ntohl(get_uint32(packed_cell->body));
+ return 1;
+ }
+ } else {
+ if (packed_cell->body[2] == CELL_DESTROY) {
+ *circid_out = ntohs(get_uint16(packed_cell->body));
+ return 1;
+ }
+ }
+ return 0;
+}
+
+/** DOCDOC */
+static int
+is_destroy_cell(channel_t *chan,
+ const cell_queue_entry_t *q, circid_t *circid_out)
+{
+ *circid_out = 0;
+ switch (q->type) {
+ case CELL_QUEUE_FIXED:
+ if (q->u.fixed.cell->command == CELL_DESTROY) {
+ *circid_out = q->u.fixed.cell->circ_id;
+ return 1;
+ }
+ break;
+ case CELL_QUEUE_VAR:
+ if (q->u.var.var_cell->command == CELL_DESTROY) {
+ *circid_out = q->u.var.var_cell->circ_id;
+ return 1;
+ }
+ break;
+ case CELL_QUEUE_PACKED:
+ return packed_cell_is_destroy(chan, q->u.packed.packed_cell, circid_out);
+ }
+ return 0;
+}
+
/**
* Send destroy cell on a channel
*
@@ -2621,25 +2680,20 @@ channel_queue_var_cell(channel_t *chan, var_cell_t *var_cell)
int
channel_send_destroy(circid_t circ_id, channel_t *chan, int reason)
{
- cell_t cell;
-
tor_assert(chan);
/* Check to make sure we can send on this channel first */
if (!(chan->state == CHANNEL_STATE_CLOSING ||
chan->state == CHANNEL_STATE_CLOSED ||
- chan->state == CHANNEL_STATE_ERROR)) {
- memset(&cell, 0, sizeof(cell_t));
- cell.circ_id = circ_id;
- cell.command = CELL_DESTROY;
- cell.payload[0] = (uint8_t) reason;
+ chan->state == CHANNEL_STATE_ERROR) &&
+ chan->cmux) {
+ channel_note_destroy_pending(chan, circ_id);
+ circuitmux_append_destroy_cell(chan, chan->cmux, circ_id, reason);
log_debug(LD_OR,
"Sending destroy (circID %u) on channel %p "
"(global ID " U64_FORMAT ")",
(unsigned)circ_id, chan,
U64_PRINTF_ARG(chan->global_identifier));
-
- channel_write_cell(chan, &cell);
} else {
log_warn(LD_BUG,
"Someone called channel_send_destroy() for circID %u "
@@ -2805,7 +2859,7 @@ channel_free_list(smartlist_t *channels, int mark_for_close)
channel_state_to_string(curr->state), curr->state);
/* Detach circuits early so they can find the channel */
if (curr->cmux) {
- circuitmux_detach_all_circuits(curr->cmux);
+ circuitmux_detach_all_circuits(curr->cmux, NULL);
}
channel_unregister(curr);
if (mark_for_close) {
diff --git a/src/or/channel.h b/src/or/channel.h
index be40a30cc..3e164c689 100644
--- a/src/or/channel.h
+++ b/src/or/channel.h
@@ -10,7 +10,6 @@
#define TOR_CHANNEL_H
#include "or.h"
-#include "tor_queue.h"
#include "circuitmux.h"
/* Channel handler function pointer typedefs */
@@ -22,7 +21,7 @@ struct cell_queue_entry_s;
TOR_SIMPLEQ_HEAD(chan_cell_queue, cell_queue_entry_s) incoming_queue;
typedef struct chan_cell_queue chan_cell_queue_t;
-/*
+/**
* Channel struct; see the channel_t typedef in or.h. A channel is an
* abstract interface for the OR-to-OR connection, similar to connection_or_t,
* but without the strong coupling to the underlying TLS implementation. They
@@ -32,18 +31,18 @@ typedef struct chan_cell_queue chan_cell_queue_t;
*/
struct channel_s {
- /* Magic number for type-checking cast macros */
+ /** Magic number for type-checking cast macros */
uint32_t magic;
- /* Current channel state */
+ /** Current channel state */
channel_state_t state;
- /* Globally unique ID number for a channel over the lifetime of a Tor
+ /** Globally unique ID number for a channel over the lifetime of a Tor
* process.
*/
uint64_t global_identifier;
- /* Should we expect to see this channel in the channel lists? */
+ /** Should we expect to see this channel in the channel lists? */
unsigned char registered:1;
/** has this channel ever been open? */
@@ -58,28 +57,28 @@ struct channel_s {
CHANNEL_CLOSE_FOR_ERROR
} reason_for_closing;
- /* Timestamps for both cell channels and listeners */
+ /** Timestamps for both cell channels and listeners */
time_t timestamp_created; /* Channel created */
time_t timestamp_active; /* Any activity */
/* Methods implemented by the lower layer */
- /* Free a channel */
+ /** Free a channel */
void (*free)(channel_t *);
- /* Close an open channel */
+ /** Close an open channel */
void (*close)(channel_t *);
- /* Describe the transport subclass for this channel */
+ /** Describe the transport subclass for this channel */
const char * (*describe_transport)(channel_t *);
- /* Optional method to dump transport-specific statistics on the channel */
+ /** Optional method to dump transport-specific statistics on the channel */
void (*dumpstats)(channel_t *, int);
- /* Registered handlers for incoming cells */
+ /** Registered handlers for incoming cells */
channel_cell_handler_fn_ptr cell_handler;
channel_var_cell_handler_fn_ptr var_cell_handler;
/* Methods implemented by the lower layer */
- /*
+ /**
* Ask the underlying transport what the remote endpoint address is, in
* a tor_addr_t. This is optional and subclasses may leave this NULL.
* If they implement it, they should write the address out to the
@@ -87,77 +86,74 @@ struct channel_s {
* available.
*/
int (*get_remote_addr)(channel_t *, tor_addr_t *);
+ int (*get_transport_name)(channel_t *chan, char **transport_out);
+
#define GRD_FLAG_ORIGINAL 1
#define GRD_FLAG_ADDR_ONLY 2
- /*
+ /**
* Get a text description of the remote endpoint; canonicalized if the flag
* GRD_FLAG_ORIGINAL is not set, or the one we originally connected
* to/received from if it is. If GRD_FLAG_ADDR_ONLY is set, we return only
* the original address.
*/
const char * (*get_remote_descr)(channel_t *, int);
- /* Check if the lower layer has queued writes */
+ /** Check if the lower layer has queued writes */
int (*has_queued_writes)(channel_t *);
- /*
+ /**
* If the second param is zero, ask the lower layer if this is
* 'canonical', for a transport-specific definition of canonical; if
* it is 1, ask if the answer to the preceding query is safe to rely
* on.
*/
int (*is_canonical)(channel_t *, int);
- /* Check if this channel matches a specified extend_info_t */
+ /** Check if this channel matches a specified extend_info_t */
int (*matches_extend_info)(channel_t *, extend_info_t *);
- /* Check if this channel matches a target address when extending */
+ /** Check if this channel matches a target address when extending */
int (*matches_target)(channel_t *, const tor_addr_t *);
- /* Write a cell to an open channel */
+ /** Write a cell to an open channel */
int (*write_cell)(channel_t *, cell_t *);
- /* Write a packed cell to an open channel */
+ /** Write a packed cell to an open channel */
int (*write_packed_cell)(channel_t *, packed_cell_t *);
- /* Write a variable-length cell to an open channel */
+ /** Write a variable-length cell to an open channel */
int (*write_var_cell)(channel_t *, var_cell_t *);
- /*
+ /**
* Hash of the public RSA key for the other side's identity key, or
* zeroes if the other side hasn't shown us a valid identity key.
*/
char identity_digest[DIGEST_LEN];
- /* Nickname of the OR on the other side, or NULL if none. */
+ /** Nickname of the OR on the other side, or NULL if none. */
char *nickname;
- /*
+ /**
* Linked list of channels with the same identity digest, for the
* digest->channel map
*/
TOR_LIST_ENTRY(channel_s) next_with_same_id;
- /* List of incoming cells to handle */
+ /** List of incoming cells to handle */
chan_cell_queue_t incoming_queue;
- /* List of queued outgoing cells */
+ /** List of queued outgoing cells */
chan_cell_queue_t outgoing_queue;
- /* Circuit mux for circuits sending on this channel */
+ /** Circuit mux for circuits sending on this channel */
circuitmux_t *cmux;
- /* Circuit ID generation stuff for use by circuitbuild.c */
+ /** Circuit ID generation stuff for use by circuitbuild.c */
- /*
+ /**
* When we send CREATE cells along this connection, which half of the
* space should we use?
*/
- ENUM_BF(circ_id_type_t) circ_id_type:2;
+ circ_id_type_bitfield_t circ_id_type:2;
/** DOCDOC*/
unsigned wide_circ_ids:1;
- /*
- * Which circ_id do we try to use next on this connection? This is
- * always in the range 0..1<<15-1.
- */
- circid_t next_circ_id;
- /* For how many circuits are we n_chan? What about p_chan? */
+ /** For how many circuits are we n_chan? What about p_chan? */
unsigned int num_n_circuits, num_p_circuits;
- /*
+ /**
* True iff this channel shouldn't get any new circs attached to it,
* because the connection is too old, or because there's a better one.
* More generally, this flag is used to note an unhealthy connection;
@@ -181,6 +177,10 @@ struct channel_s {
*/
unsigned int is_local:1;
+ /** Have we logged a warning about circID exhaustion on this channel?
+ * If so, when? */
+ ratelim_t last_warned_circ_ids_exhausted;
+
/** Channel timestamps for cell channels */
time_t timestamp_client; /* Client used this, according to relay.c */
time_t timestamp_drained; /* Output queue empty */
@@ -211,7 +211,7 @@ struct channel_listener_s {
*/
uint64_t global_identifier;
- /* Should we expect to see this channel in the channel lists? */
+ /** Should we expect to see this channel in the channel lists? */
unsigned char registered:1;
/** Why did we close?
@@ -223,31 +223,31 @@ struct channel_listener_s {
CHANNEL_LISTENER_CLOSE_FOR_ERROR
} reason_for_closing;
- /* Timestamps for both cell channels and listeners */
+ /** Timestamps for both cell channels and listeners */
time_t timestamp_created; /* Channel created */
time_t timestamp_active; /* Any activity */
/* Methods implemented by the lower layer */
- /* Free a channel */
+ /** Free a channel */
void (*free)(channel_listener_t *);
- /* Close an open channel */
+ /** Close an open channel */
void (*close)(channel_listener_t *);
- /* Describe the transport subclass for this channel */
+ /** Describe the transport subclass for this channel */
const char * (*describe_transport)(channel_listener_t *);
- /* Optional method to dump transport-specific statistics on the channel */
+ /** Optional method to dump transport-specific statistics on the channel */
void (*dumpstats)(channel_listener_t *, int);
- /* Registered listen handler to call on incoming connection */
+ /** Registered listen handler to call on incoming connection */
channel_listener_fn_ptr listener;
- /* List of pending incoming connections */
+ /** List of pending incoming connections */
smartlist_t *incoming_list;
- /* Timestamps for listeners */
+ /** Timestamps for listeners */
time_t timestamp_accepted;
- /* Counters for listeners */
+ /** Counters for listeners */
uint64_t n_accepted;
};
@@ -482,5 +482,9 @@ uint64_t channel_count_xmitted(channel_t *chan);
uint64_t channel_listener_count_accepted(channel_listener_t *chan_l);
+int packed_cell_is_destroy(channel_t *chan,
+ const packed_cell_t *packed_cell,
+ circid_t *circid_out);
+
#endif
diff --git a/src/or/channeltls.c b/src/or/channeltls.c
index 92e51b21a..632bc328b 100644
--- a/src/or/channeltls.c
+++ b/src/or/channeltls.c
@@ -56,6 +56,8 @@ static const char * channel_tls_describe_transport_method(channel_t *chan);
static void channel_tls_free_method(channel_t *chan);
static int
channel_tls_get_remote_addr_method(channel_t *chan, tor_addr_t *addr_out);
+static int
+channel_tls_get_transport_name_method(channel_t *chan, char **transport_out);
static const char *
channel_tls_get_remote_descr_method(channel_t *chan, int flags);
static int channel_tls_has_queued_writes_method(channel_t *chan);
@@ -116,6 +118,7 @@ channel_tls_common_init(channel_tls_t *tlschan)
chan->free = channel_tls_free_method;
chan->get_remote_addr = channel_tls_get_remote_addr_method;
chan->get_remote_descr = channel_tls_get_remote_descr_method;
+ chan->get_transport_name = channel_tls_get_transport_name_method;
chan->has_queued_writes = channel_tls_has_queued_writes_method;
chan->is_canonical = channel_tls_is_canonical_method;
chan->matches_extend_info = channel_tls_matches_extend_info_method;
@@ -286,8 +289,8 @@ channel_tls_handle_incoming(or_connection_t *orconn)
if (is_local_addr(&(TO_CONN(orconn)->addr))) channel_mark_local(chan);
channel_mark_incoming(chan);
- /* If we got one, we should register it */
- if (chan) channel_register(chan);
+ /* Register it */
+ channel_register(chan);
return chan;
}
@@ -435,6 +438,30 @@ channel_tls_get_remote_addr_method(channel_t *chan, tor_addr_t *addr_out)
}
/**
+ * Get the name of the pluggable transport used by a channel_tls_t.
+ *
+ * This implements the get_transport_name for channel_tls_t. If the
+ * channel uses a pluggable transport, copy its name to
+ * <b>transport_out</b> and return 0. If the channel did not use a
+ * pluggable transport, return -1. */
+
+static int
+channel_tls_get_transport_name_method(channel_t *chan, char **transport_out)
+{
+ channel_tls_t *tlschan = BASE_CHAN_TO_TLS(chan);
+
+ tor_assert(tlschan);
+ tor_assert(transport_out);
+ tor_assert(tlschan->conn);
+
+ if (!tlschan->conn->ext_or_transport)
+ return -1;
+
+ *transport_out = tor_strdup(tlschan->conn->ext_or_transport);
+ return 0;
+}
+
+/**
* Get endpoint description of a channel_tls_t
*
* This implements the get_remote_descr method for channel_tls_t; it returns
@@ -1255,13 +1282,20 @@ static void
channel_tls_process_versions_cell(var_cell_t *cell, channel_tls_t *chan)
{
int highest_supported_version = 0;
- const uint8_t *cp, *end;
int started_here = 0;
tor_assert(cell);
tor_assert(chan);
tor_assert(chan->conn);
+ if ((cell->payload_len % 2) == 1) {
+ log_fn(LOG_PROTOCOL_WARN, LD_OR,
+ "Received a VERSION cell with odd payload length %d; "
+ "closing connection.",cell->payload_len);
+ connection_or_close_for_error(chan->conn, 0);
+ return;
+ }
+
started_here = connection_or_nonopen_was_started_here(chan->conn);
if (chan->conn->link_proto != 0 ||
@@ -1287,11 +1321,15 @@ channel_tls_process_versions_cell(var_cell_t *cell, channel_tls_t *chan)
}
tor_assert(chan->conn->handshake_state);
- end = cell->payload + cell->payload_len;
- for (cp = cell->payload; cp+1 < end; cp += 2) {
- uint16_t v = ntohs(get_uint16(cp));
- if (is_or_protocol_version_known(v) && v > highest_supported_version)
- highest_supported_version = v;
+
+ {
+ int i;
+ const uint8_t *cp = cell->payload;
+ for (i = 0; i < cell->payload_len / 2; ++i, cp += 2) {
+ uint16_t v = ntohs(get_uint16(cp));
+ if (is_or_protocol_version_known(v) && v > highest_supported_version)
+ highest_supported_version = v;
+ }
}
if (!highest_supported_version) {
log_fn(LOG_PROTOCOL_WARN, LD_OR,
@@ -1489,12 +1527,14 @@ channel_tls_process_netinfo_cell(cell_t *cell, channel_tls_t *chan)
my_addr_ptr = (uint8_t*) cell->payload + 6;
end = cell->payload + CELL_PAYLOAD_SIZE;
cp = cell->payload + 6 + my_addr_len;
- if (cp >= end) {
- log_fn(LOG_PROTOCOL_WARN, LD_OR,
- "Addresses too long in netinfo cell; closing connection.");
- connection_or_close_for_error(chan->conn, 0);
- return;
- } else if (my_addr_type == RESOLVED_TYPE_IPV4 && my_addr_len == 4) {
+
+ /* We used to check:
+ * if (my_addr_len >= CELL_PAYLOAD_SIZE - 6) {
+ *
+ * This is actually never going to happen, since my_addr_len is at most 255,
+ * and CELL_PAYLOAD_LEN - 6 is 503. So we know that cp is < end. */
+
+ if (my_addr_type == RESOLVED_TYPE_IPV4 && my_addr_len == 4) {
tor_addr_from_ipv4n(&my_apparent_addr, get_uint32(my_addr_ptr));
} else if (my_addr_type == RESOLVED_TYPE_IPV6 && my_addr_len == 16) {
tor_addr_from_ipv6_bytes(&my_apparent_addr, (const char *) my_addr_ptr);
@@ -1648,12 +1688,16 @@ channel_tls_process_certs_cell(var_cell_t *cell, channel_tls_t *chan)
for (i = 0; i < n_certs; ++i) {
uint8_t cert_type;
uint16_t cert_len;
- if (ptr + 3 > cell->payload + cell->payload_len) {
+ if (cell->payload_len < 3)
+ goto truncated;
+ if (ptr > cell->payload + cell->payload_len - 3) {
goto truncated;
}
cert_type = *ptr;
cert_len = ntohs(get_uint16(ptr+1));
- if (ptr + 3 + cert_len > cell->payload + cell->payload_len) {
+ if (cell->payload_len < 3 + cert_len)
+ goto truncated;
+ if (ptr > cell->payload + cell->payload_len - cert_len - 3) {
goto truncated;
}
if (cert_type == OR_CERT_TYPE_TLS_LINK ||
diff --git a/src/or/circpathbias.c b/src/or/circpathbias.c
new file mode 100644
index 000000000..51a75cf50
--- /dev/null
+++ b/src/or/circpathbias.c
@@ -0,0 +1,1538 @@
+/* Copyright (c) 2001 Matej Pfajfar.
+ * Copyright (c) 2001-2004, Roger Dingledine.
+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
+ * Copyright (c) 2007-2013, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#include "or.h"
+#include "channel.h"
+#include "circpathbias.h"
+#include "circuitbuild.h"
+#include "circuitlist.h"
+#include "circuituse.h"
+#include "circuitstats.h"
+#include "connection_edge.h"
+#include "config.h"
+#include "entrynodes.h"
+#include "networkstatus.h"
+#include "relay.h"
+
+static void pathbias_count_successful_close(origin_circuit_t *circ);
+static void pathbias_count_collapse(origin_circuit_t *circ);
+static void pathbias_count_use_failed(origin_circuit_t *circ);
+static void pathbias_measure_use_rate(entry_guard_t *guard);
+static void pathbias_measure_close_rate(entry_guard_t *guard);
+static void pathbias_scale_use_rates(entry_guard_t *guard);
+static void pathbias_scale_close_rates(entry_guard_t *guard);
+static int entry_guard_inc_circ_attempt_count(entry_guard_t *guard);
+
+/** Increment the number of times we successfully extended a circuit to
+ * <b>guard</b>, first checking if the failure rate is high enough that
+ * we should eliminate the guard. Return -1 if the guard looks no good;
+ * return 0 if the guard looks fine.
+ */
+static int
+entry_guard_inc_circ_attempt_count(entry_guard_t *guard)
+{
+ entry_guards_changed();
+
+ pathbias_measure_close_rate(guard);
+
+ if (guard->path_bias_disabled)
+ return -1;
+
+ pathbias_scale_close_rates(guard);
+ guard->circ_attempts++;
+
+ log_info(LD_CIRC, "Got success count %f/%f for guard %s ($%s)",
+ guard->circ_successes, guard->circ_attempts, guard->nickname,
+ hex_str(guard->identity, DIGEST_LEN));
+ return 0;
+}
+
+/** The minimum number of circuit attempts before we start
+ * thinking about warning about path bias and dropping guards */
+static int
+pathbias_get_min_circs(const or_options_t *options)
+{
+#define DFLT_PATH_BIAS_MIN_CIRC 150
+ if (options->PathBiasCircThreshold >= 5)
+ return options->PathBiasCircThreshold;
+ else
+ return networkstatus_get_param(NULL, "pb_mincircs",
+ DFLT_PATH_BIAS_MIN_CIRC,
+ 5, INT32_MAX);
+}
+
+/** The circuit success rate below which we issue a notice */
+static double
+pathbias_get_notice_rate(const or_options_t *options)
+{
+#define DFLT_PATH_BIAS_NOTICE_PCT 70
+ if (options->PathBiasNoticeRate >= 0.0)
+ return options->PathBiasNoticeRate;
+ else
+ return networkstatus_get_param(NULL, "pb_noticepct",
+ DFLT_PATH_BIAS_NOTICE_PCT, 0, 100)/100.0;
+}
+
+/* XXXX024 I'd like to have this be static again, but entrynodes.c needs it. */
+/** The circuit success rate below which we issue a warn */
+static double
+pathbias_get_warn_rate(const or_options_t *options)
+{
+#define DFLT_PATH_BIAS_WARN_PCT 50
+ if (options->PathBiasWarnRate >= 0.0)
+ return options->PathBiasWarnRate;
+ else
+ return networkstatus_get_param(NULL, "pb_warnpct",
+ DFLT_PATH_BIAS_WARN_PCT, 0, 100)/100.0;
+}
+
+/* XXXX024 I'd like to have this be static again, but entrynodes.c needs it. */
+/**
+ * The extreme rate is the rate at which we would drop the guard,
+ * if pb_dropguard is also set. Otherwise we just warn.
+ */
+double
+pathbias_get_extreme_rate(const or_options_t *options)
+{
+#define DFLT_PATH_BIAS_EXTREME_PCT 30
+ if (options->PathBiasExtremeRate >= 0.0)
+ return options->PathBiasExtremeRate;
+ else
+ return networkstatus_get_param(NULL, "pb_extremepct",
+ DFLT_PATH_BIAS_EXTREME_PCT, 0, 100)/100.0;
+}
+
+/* XXXX024 I'd like to have this be static again, but entrynodes.c needs it. */
+/**
+ * If 1, we actually disable use of guards that fall below
+ * the extreme_pct.
+ */
+int
+pathbias_get_dropguards(const or_options_t *options)
+{
+#define DFLT_PATH_BIAS_DROP_GUARDS 0
+ if (options->PathBiasDropGuards >= 0)
+ return options->PathBiasDropGuards;
+ else
+ return networkstatus_get_param(NULL, "pb_dropguards",
+ DFLT_PATH_BIAS_DROP_GUARDS, 0, 1);
+}
+
+/**
+ * This is the number of circuits at which we scale our
+ * counts by mult_factor/scale_factor. Note, this count is
+ * not exact, as we only perform the scaling in the event
+ * of no integer truncation.
+ */
+static int
+pathbias_get_scale_threshold(const or_options_t *options)
+{
+#define DFLT_PATH_BIAS_SCALE_THRESHOLD 300
+ if (options->PathBiasScaleThreshold >= 10)
+ return options->PathBiasScaleThreshold;
+ else
+ return networkstatus_get_param(NULL, "pb_scalecircs",
+ DFLT_PATH_BIAS_SCALE_THRESHOLD, 10,
+ INT32_MAX);
+}
+
+/**
+ * Compute the path bias scaling ratio from the consensus
+ * parameters pb_multfactor/pb_scalefactor.
+ *
+ * Returns a value in (0, 1.0] which we multiply our pathbias
+ * counts with to scale them down.
+ */
+static double
+pathbias_get_scale_ratio(const or_options_t *options)
+{
+ /*
+ * The scale factor is the denominator for our scaling
+ * of circuit counts for our path bias window.
+ *
+ * Note that our use of doubles for the path bias state
+ * file means that powers of 2 work best here.
+ */
+ int denominator = networkstatus_get_param(NULL, "pb_scalefactor",
+ 2, 2, INT32_MAX);
+ (void) options;
+ /**
+ * The mult factor is the numerator for our scaling
+ * of circuit counts for our path bias window. It
+ * allows us to scale by fractions.
+ */
+ return networkstatus_get_param(NULL, "pb_multfactor",
+ 1, 1, denominator)/((double)denominator);
+}
+
+/** The minimum number of circuit usage attempts before we start
+ * thinking about warning about path use bias and dropping guards */
+static int
+pathbias_get_min_use(const or_options_t *options)
+{
+#define DFLT_PATH_BIAS_MIN_USE 20
+ if (options->PathBiasUseThreshold >= 3)
+ return options->PathBiasUseThreshold;
+ else
+ return networkstatus_get_param(NULL, "pb_minuse",
+ DFLT_PATH_BIAS_MIN_USE,
+ 3, INT32_MAX);
+}
+
+/** The circuit use success rate below which we issue a notice */
+static double
+pathbias_get_notice_use_rate(const or_options_t *options)
+{
+#define DFLT_PATH_BIAS_NOTICE_USE_PCT 80
+ if (options->PathBiasNoticeUseRate >= 0.0)
+ return options->PathBiasNoticeUseRate;
+ else
+ return networkstatus_get_param(NULL, "pb_noticeusepct",
+ DFLT_PATH_BIAS_NOTICE_USE_PCT,
+ 0, 100)/100.0;
+}
+
+/**
+ * The extreme use rate is the rate at which we would drop the guard,
+ * if pb_dropguard is also set. Otherwise we just warn.
+ */
+double
+pathbias_get_extreme_use_rate(const or_options_t *options)
+{
+#define DFLT_PATH_BIAS_EXTREME_USE_PCT 60
+ if (options->PathBiasExtremeUseRate >= 0.0)
+ return options->PathBiasExtremeUseRate;
+ else
+ return networkstatus_get_param(NULL, "pb_extremeusepct",
+ DFLT_PATH_BIAS_EXTREME_USE_PCT,
+ 0, 100)/100.0;
+}
+
+/**
+ * This is the number of circuits at which we scale our
+ * use counts by mult_factor/scale_factor. Note, this count is
+ * not exact, as we only perform the scaling in the event
+ * of no integer truncation.
+ */
+static int
+pathbias_get_scale_use_threshold(const or_options_t *options)
+{
+#define DFLT_PATH_BIAS_SCALE_USE_THRESHOLD 100
+ if (options->PathBiasScaleUseThreshold >= 10)
+ return options->PathBiasScaleUseThreshold;
+ else
+ return networkstatus_get_param(NULL, "pb_scaleuse",
+ DFLT_PATH_BIAS_SCALE_USE_THRESHOLD,
+ 10, INT32_MAX);
+}
+
+/**
+ * Convert a Guard's path state to string.
+ */
+const char *
+pathbias_state_to_string(path_state_t state)
+{
+ switch (state) {
+ case PATH_STATE_NEW_CIRC:
+ return "new";
+ case PATH_STATE_BUILD_ATTEMPTED:
+ return "build attempted";
+ case PATH_STATE_BUILD_SUCCEEDED:
+ return "build succeeded";
+ case PATH_STATE_USE_ATTEMPTED:
+ return "use attempted";
+ case PATH_STATE_USE_SUCCEEDED:
+ return "use succeeded";
+ case PATH_STATE_USE_FAILED:
+ return "use failed";
+ case PATH_STATE_ALREADY_COUNTED:
+ return "already counted";
+ }
+
+ return "unknown";
+}
+
+/**
+ * This function decides if a circuit has progressed far enough to count
+ * as a circuit "attempt". As long as end-to-end tagging is possible,
+ * we assume the adversary will use it over hop-to-hop failure. Therefore,
+ * we only need to account bias for the last hop. This should make us
+ * much more resilient to ambient circuit failure, and also make that
+ * failure easier to measure (we only need to measure Exit failure rates).
+ */
+static int
+pathbias_is_new_circ_attempt(origin_circuit_t *circ)
+{
+#define N2N_TAGGING_IS_POSSIBLE
+#ifdef N2N_TAGGING_IS_POSSIBLE
+ /* cpath is a circular list. We want circs with more than one hop,
+ * and the second hop must be waiting for keys still (it's just
+ * about to get them). */
+ return circ->cpath &&
+ circ->cpath->next != circ->cpath &&
+ circ->cpath->next->state == CPATH_STATE_AWAITING_KEYS;
+#else
+ /* If tagging attacks are no longer possible, we probably want to
+ * count bias from the first hop. However, one could argue that
+ * timing-based tagging is still more useful than per-hop failure.
+ * In which case, we'd never want to use this.
+ */
+ return circ->cpath &&
+ circ->cpath->state == CPATH_STATE_AWAITING_KEYS;
+#endif
+}
+
+/**
+ * Decide if the path bias code should count a circuit.
+ *
+ * @returns 1 if we should count it, 0 otherwise.
+ */
+static int
+pathbias_should_count(origin_circuit_t *circ)
+{
+#define PATHBIAS_COUNT_INTERVAL (600)
+ static ratelim_t count_limit =
+ RATELIM_INIT(PATHBIAS_COUNT_INTERVAL);
+ char *rate_msg = NULL;
+
+ /* We can't do path bias accounting without entry guards.
+ * Testing and controller circuits also have no guards.
+ *
+ * We also don't count server-side rends, because their
+ * endpoint could be chosen maliciously.
+ * Similarly, we can't count client-side intro attempts,
+ * because clients can be manipulated into connecting to
+ * malicious intro points. */
+ if (get_options()->UseEntryGuards == 0 ||
+ circ->base_.purpose == CIRCUIT_PURPOSE_TESTING ||
+ circ->base_.purpose == CIRCUIT_PURPOSE_CONTROLLER ||
+ circ->base_.purpose == CIRCUIT_PURPOSE_S_CONNECT_REND ||
+ circ->base_.purpose == CIRCUIT_PURPOSE_S_REND_JOINED ||
+ (circ->base_.purpose >= CIRCUIT_PURPOSE_C_INTRODUCING &&
+ circ->base_.purpose <= CIRCUIT_PURPOSE_C_INTRODUCE_ACKED)) {
+
+ /* Check to see if the shouldcount result has changed due to a
+ * unexpected purpose change that would affect our results.
+ *
+ * The reason we check the path state too here is because for the
+ * cannibalized versions of these purposes, we count them as successful
+ * before their purpose change.
+ */
+ if (circ->pathbias_shouldcount == PATHBIAS_SHOULDCOUNT_COUNTED
+ && circ->path_state != PATH_STATE_ALREADY_COUNTED) {
+ log_info(LD_BUG,
+ "Circuit %d is now being ignored despite being counted "
+ "in the past. Purpose is %s, path state is %s",
+ circ->global_identifier,
+ circuit_purpose_to_string(circ->base_.purpose),
+ pathbias_state_to_string(circ->path_state));
+ }
+ circ->pathbias_shouldcount = PATHBIAS_SHOULDCOUNT_IGNORED;
+ return 0;
+ }
+
+ /* Completely ignore one hop circuits */
+ if (circ->build_state->onehop_tunnel ||
+ circ->build_state->desired_path_len == 1) {
+ /* Check for inconsistency */
+ if (circ->build_state->desired_path_len != 1 ||
+ !circ->build_state->onehop_tunnel) {
+ if ((rate_msg = rate_limit_log(&count_limit, approx_time()))) {
+ log_info(LD_BUG,
+ "One-hop circuit has length %d. Path state is %s. "
+ "Circuit is a %s currently %s.%s",
+ circ->build_state->desired_path_len,
+ pathbias_state_to_string(circ->path_state),
+ circuit_purpose_to_string(circ->base_.purpose),
+ circuit_state_to_string(circ->base_.state),
+ rate_msg);
+ tor_free(rate_msg);
+ }
+ tor_fragile_assert();
+ }
+
+ /* Check to see if the shouldcount result has changed due to a
+ * unexpected change that would affect our results */
+ if (circ->pathbias_shouldcount == PATHBIAS_SHOULDCOUNT_COUNTED) {
+ log_info(LD_BUG,
+ "One-hop circuit %d is now being ignored despite being counted "
+ "in the past. Purpose is %s, path state is %s",
+ circ->global_identifier,
+ circuit_purpose_to_string(circ->base_.purpose),
+ pathbias_state_to_string(circ->path_state));
+ }
+ circ->pathbias_shouldcount = PATHBIAS_SHOULDCOUNT_IGNORED;
+ return 0;
+ }
+
+ /* Check to see if the shouldcount result has changed due to a
+ * unexpected purpose change that would affect our results */
+ if (circ->pathbias_shouldcount == PATHBIAS_SHOULDCOUNT_IGNORED) {
+ log_info(LD_BUG,
+ "Circuit %d is now being counted despite being ignored "
+ "in the past. Purpose is %s, path state is %s",
+ circ->global_identifier,
+ circuit_purpose_to_string(circ->base_.purpose),
+ pathbias_state_to_string(circ->path_state));
+ }
+ circ->pathbias_shouldcount = PATHBIAS_SHOULDCOUNT_COUNTED;
+
+ return 1;
+}
+
+/**
+ * Check our circuit state to see if this is a successful circuit attempt.
+ * If so, record it in the current guard's path bias circ_attempt count.
+ *
+ * Also check for several potential error cases for bug #6475.
+ */
+int
+pathbias_count_build_attempt(origin_circuit_t *circ)
+{
+#define CIRC_ATTEMPT_NOTICE_INTERVAL (600)
+ static ratelim_t circ_attempt_notice_limit =
+ RATELIM_INIT(CIRC_ATTEMPT_NOTICE_INTERVAL);
+ char *rate_msg = NULL;
+
+ if (!pathbias_should_count(circ)) {
+ return 0;
+ }
+
+ if (pathbias_is_new_circ_attempt(circ)) {
+ /* Help track down the real cause of bug #6475: */
+ if (circ->has_opened && circ->path_state != PATH_STATE_BUILD_ATTEMPTED) {
+ if ((rate_msg = rate_limit_log(&circ_attempt_notice_limit,
+ approx_time()))) {
+ log_info(LD_BUG,
+ "Opened circuit is in strange path state %s. "
+ "Circuit is a %s currently %s.%s",
+ pathbias_state_to_string(circ->path_state),
+ circuit_purpose_to_string(circ->base_.purpose),
+ circuit_state_to_string(circ->base_.state),
+ rate_msg);
+ tor_free(rate_msg);
+ }
+ }
+
+ /* Don't re-count cannibalized circs.. */
+ if (!circ->has_opened) {
+ entry_guard_t *guard = NULL;
+
+ if (circ->cpath && circ->cpath->extend_info) {
+ guard = entry_guard_get_by_id_digest(
+ circ->cpath->extend_info->identity_digest);
+ } else if (circ->base_.n_chan) {
+ guard =
+ entry_guard_get_by_id_digest(circ->base_.n_chan->identity_digest);
+ }
+
+ if (guard) {
+ if (circ->path_state == PATH_STATE_NEW_CIRC) {
+ circ->path_state = PATH_STATE_BUILD_ATTEMPTED;
+
+ if (entry_guard_inc_circ_attempt_count(guard) < 0) {
+ /* Bogus guard; we already warned. */
+ return -END_CIRC_REASON_TORPROTOCOL;
+ }
+ } else {
+ if ((rate_msg = rate_limit_log(&circ_attempt_notice_limit,
+ approx_time()))) {
+ log_info(LD_BUG,
+ "Unopened circuit has strange path state %s. "
+ "Circuit is a %s currently %s.%s",
+ pathbias_state_to_string(circ->path_state),
+ circuit_purpose_to_string(circ->base_.purpose),
+ circuit_state_to_string(circ->base_.state),
+ rate_msg);
+ tor_free(rate_msg);
+ }
+ }
+ } else {
+ if ((rate_msg = rate_limit_log(&circ_attempt_notice_limit,
+ approx_time()))) {
+ log_info(LD_CIRC,
+ "Unopened circuit has no known guard. "
+ "Circuit is a %s currently %s.%s",
+ circuit_purpose_to_string(circ->base_.purpose),
+ circuit_state_to_string(circ->base_.state),
+ rate_msg);
+ tor_free(rate_msg);
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+
+/**
+ * Check our circuit state to see if this is a successful circuit
+ * completion. If so, record it in the current guard's path bias
+ * success count.
+ *
+ * Also check for several potential error cases for bug #6475.
+ */
+void
+pathbias_count_build_success(origin_circuit_t *circ)
+{
+#define SUCCESS_NOTICE_INTERVAL (600)
+ static ratelim_t success_notice_limit =
+ RATELIM_INIT(SUCCESS_NOTICE_INTERVAL);
+ char *rate_msg = NULL;
+ entry_guard_t *guard = NULL;
+
+ if (!pathbias_should_count(circ)) {
+ return;
+ }
+
+ /* Don't count cannibalized/reused circs for path bias
+ * "build" success, since they get counted under "use" success. */
+ if (!circ->has_opened) {
+ if (circ->cpath && circ->cpath->extend_info) {
+ guard = entry_guard_get_by_id_digest(
+ circ->cpath->extend_info->identity_digest);
+ }
+
+ if (guard) {
+ if (circ->path_state == PATH_STATE_BUILD_ATTEMPTED) {
+ circ->path_state = PATH_STATE_BUILD_SUCCEEDED;
+ guard->circ_successes++;
+ entry_guards_changed();
+
+ log_info(LD_CIRC, "Got success count %f/%f for guard %s ($%s)",
+ guard->circ_successes, guard->circ_attempts,
+ guard->nickname, hex_str(guard->identity, DIGEST_LEN));
+ } else {
+ if ((rate_msg = rate_limit_log(&success_notice_limit,
+ approx_time()))) {
+ log_info(LD_BUG,
+ "Succeeded circuit is in strange path state %s. "
+ "Circuit is a %s currently %s.%s",
+ pathbias_state_to_string(circ->path_state),
+ circuit_purpose_to_string(circ->base_.purpose),
+ circuit_state_to_string(circ->base_.state),
+ rate_msg);
+ tor_free(rate_msg);
+ }
+ }
+
+ if (guard->circ_attempts < guard->circ_successes) {
+ log_notice(LD_BUG, "Unexpectedly high successes counts (%f/%f) "
+ "for guard %s ($%s)",
+ guard->circ_successes, guard->circ_attempts,
+ guard->nickname, hex_str(guard->identity, DIGEST_LEN));
+ }
+ /* In rare cases, CIRCUIT_PURPOSE_TESTING can get converted to
+ * CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT and have no guards here.
+ * No need to log that case. */
+ } else if (circ->base_.purpose != CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) {
+ if ((rate_msg = rate_limit_log(&success_notice_limit,
+ approx_time()))) {
+ log_info(LD_CIRC,
+ "Completed circuit has no known guard. "
+ "Circuit is a %s currently %s.%s",
+ circuit_purpose_to_string(circ->base_.purpose),
+ circuit_state_to_string(circ->base_.state),
+ rate_msg);
+ tor_free(rate_msg);
+ }
+ }
+ } else {
+ if (circ->path_state < PATH_STATE_BUILD_SUCCEEDED) {
+ if ((rate_msg = rate_limit_log(&success_notice_limit,
+ approx_time()))) {
+ log_info(LD_BUG,
+ "Opened circuit is in strange path state %s. "
+ "Circuit is a %s currently %s.%s",
+ pathbias_state_to_string(circ->path_state),
+ circuit_purpose_to_string(circ->base_.purpose),
+ circuit_state_to_string(circ->base_.state),
+ rate_msg);
+ tor_free(rate_msg);
+ }
+ }
+ }
+}
+
+/**
+ * Record an attempt to use a circuit. Changes the circuit's
+ * path state and update its guard's usage counter.
+ *
+ * Used for path bias usage accounting.
+ */
+void
+pathbias_count_use_attempt(origin_circuit_t *circ)
+{
+ entry_guard_t *guard;
+
+ if (!pathbias_should_count(circ)) {
+ return;
+ }
+
+ if (circ->path_state < PATH_STATE_BUILD_SUCCEEDED) {
+ log_notice(LD_BUG,
+ "Used circuit is in strange path state %s. "
+ "Circuit is a %s currently %s.",
+ pathbias_state_to_string(circ->path_state),
+ circuit_purpose_to_string(circ->base_.purpose),
+ circuit_state_to_string(circ->base_.state));
+ } else if (circ->path_state < PATH_STATE_USE_ATTEMPTED) {
+ guard = entry_guard_get_by_id_digest(
+ circ->cpath->extend_info->identity_digest);
+ if (guard) {
+ pathbias_measure_use_rate(guard);
+ pathbias_scale_use_rates(guard);
+ guard->use_attempts++;
+ entry_guards_changed();
+
+ log_debug(LD_CIRC,
+ "Marked circuit %d (%f/%f) as used for guard %s ($%s).",
+ circ->global_identifier,
+ guard->use_successes, guard->use_attempts,
+ guard->nickname, hex_str(guard->identity, DIGEST_LEN));
+ }
+
+ circ->path_state = PATH_STATE_USE_ATTEMPTED;
+ } else {
+ /* Harmless but educational log message */
+ log_info(LD_CIRC,
+ "Used circuit %d is already in path state %s. "
+ "Circuit is a %s currently %s.",
+ circ->global_identifier,
+ pathbias_state_to_string(circ->path_state),
+ circuit_purpose_to_string(circ->base_.purpose),
+ circuit_state_to_string(circ->base_.state));
+ }
+
+ return;
+}
+
+/**
+ * Check the circuit's path state is appropriate and mark it as
+ * successfully used. Used for path bias usage accounting.
+ *
+ * We don't actually increment the guard's counters until
+ * pathbias_check_close(), because the circuit can still transition
+ * back to PATH_STATE_USE_ATTEMPTED if a stream fails later (this
+ * is done so we can probe the circuit for liveness at close).
+ */
+void
+pathbias_mark_use_success(origin_circuit_t *circ)
+{
+ if (!pathbias_should_count(circ)) {
+ return;
+ }
+
+ if (circ->path_state < PATH_STATE_USE_ATTEMPTED) {
+ log_notice(LD_BUG,
+ "Used circuit %d is in strange path state %s. "
+ "Circuit is a %s currently %s.",
+ circ->global_identifier,
+ pathbias_state_to_string(circ->path_state),
+ circuit_purpose_to_string(circ->base_.purpose),
+ circuit_state_to_string(circ->base_.state));
+
+ pathbias_count_use_attempt(circ);
+ }
+
+ /* We don't do any accounting at the guard until actual circuit close */
+ circ->path_state = PATH_STATE_USE_SUCCEEDED;
+
+ return;
+}
+
+/**
+ * If a stream ever detatches from a circuit in a retriable way,
+ * we need to mark this circuit as still needing either another
+ * successful stream, or in need of a probe.
+ *
+ * An adversary could let the first stream request succeed (ie the
+ * resolve), but then tag and timeout the remainder (via cell
+ * dropping), forcing them on new circuits.
+ *
+ * Rolling back the state will cause us to probe such circuits, which
+ * should lead to probe failures in the event of such tagging due to
+ * either unrecognized cells coming in while we wait for the probe,
+ * or the cipher state getting out of sync in the case of dropped cells.
+ */
+void
+pathbias_mark_use_rollback(origin_circuit_t *circ)
+{
+ if (circ->path_state == PATH_STATE_USE_SUCCEEDED) {
+ log_info(LD_CIRC,
+ "Rolling back pathbias use state to 'attempted' for detached "
+ "circuit %d", circ->global_identifier);
+ circ->path_state = PATH_STATE_USE_ATTEMPTED;
+ }
+}
+
+/**
+ * Actually count a circuit success towards a guard's usage counters
+ * if the path state is appropriate.
+ */
+static void
+pathbias_count_use_success(origin_circuit_t *circ)
+{
+ entry_guard_t *guard;
+
+ if (!pathbias_should_count(circ)) {
+ return;
+ }
+
+ if (circ->path_state != PATH_STATE_USE_SUCCEEDED) {
+ log_notice(LD_BUG,
+ "Successfully used circuit %d is in strange path state %s. "
+ "Circuit is a %s currently %s.",
+ circ->global_identifier,
+ pathbias_state_to_string(circ->path_state),
+ circuit_purpose_to_string(circ->base_.purpose),
+ circuit_state_to_string(circ->base_.state));
+ } else {
+ guard = entry_guard_get_by_id_digest(
+ circ->cpath->extend_info->identity_digest);
+ if (guard) {
+ guard->use_successes++;
+ entry_guards_changed();
+
+ if (guard->use_attempts < guard->use_successes) {
+ log_notice(LD_BUG, "Unexpectedly high use successes counts (%f/%f) "
+ "for guard %s=%s",
+ guard->use_successes, guard->use_attempts,
+ guard->nickname, hex_str(guard->identity, DIGEST_LEN));
+ }
+
+ log_debug(LD_CIRC,
+ "Marked circuit %d (%f/%f) as used successfully for guard "
+ "%s ($%s).",
+ circ->global_identifier, guard->use_successes,
+ guard->use_attempts, guard->nickname,
+ hex_str(guard->identity, DIGEST_LEN));
+ }
+ }
+
+ return;
+}
+
+/**
+ * Send a probe down a circuit that the client attempted to use,
+ * but for which the stream timed out/failed. The probe is a
+ * RELAY_BEGIN cell with a 0.a.b.c destination address, which
+ * the exit will reject and reply back, echoing that address.
+ *
+ * The reason for such probes is because it is possible to bias
+ * a user's paths simply by causing timeouts, and these timeouts
+ * are not possible to differentiate from unresponsive servers.
+ *
+ * The probe is sent at the end of the circuit lifetime for two
+ * reasons: to prevent cryptographic taggers from being able to
+ * drop cells to cause timeouts, and to prevent easy recognition
+ * of probes before any real client traffic happens.
+ *
+ * Returns -1 if we couldn't probe, 0 otherwise.
+ */
+static int
+pathbias_send_usable_probe(circuit_t *circ)
+{
+ /* Based on connection_ap_handshake_send_begin() */
+ char payload[CELL_PAYLOAD_SIZE];
+ int payload_len;
+ origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ);
+ crypt_path_t *cpath_layer = NULL;
+ char *probe_nonce = NULL;
+
+ tor_assert(ocirc);
+
+ cpath_layer = ocirc->cpath->prev;
+
+ if (cpath_layer->state != CPATH_STATE_OPEN) {
+ /* This can happen for cannibalized circuits. Their
+ * last hop isn't yet open */
+ log_info(LD_CIRC,
+ "Got pathbias probe request for unopened circuit %d. "
+ "Opened %d, len %d", ocirc->global_identifier,
+ ocirc->has_opened, ocirc->build_state->desired_path_len);
+ return -1;
+ }
+
+ /* We already went down this road. */
+ if (circ->purpose == CIRCUIT_PURPOSE_PATH_BIAS_TESTING &&
+ ocirc->pathbias_probe_id) {
+ log_info(LD_CIRC,
+ "Got pathbias probe request for circuit %d with "
+ "outstanding probe", ocirc->global_identifier);
+ return -1;
+ }
+
+ /* Can't probe if the channel isn't open */
+ if (circ->n_chan == NULL ||
+ (circ->n_chan->state != CHANNEL_STATE_OPEN
+ && circ->n_chan->state != CHANNEL_STATE_MAINT)) {
+ log_info(LD_CIRC,
+ "Skipping pathbias probe for circuit %d: Channel is not open.",
+ ocirc->global_identifier);
+ return -1;
+ }
+
+ circuit_change_purpose(circ, CIRCUIT_PURPOSE_PATH_BIAS_TESTING);
+
+ /* Update timestamp for when circuit_expire_building() should kill us */
+ tor_gettimeofday(&circ->timestamp_began);
+
+ /* Generate a random address for the nonce */
+ crypto_rand((char*)&ocirc->pathbias_probe_nonce,
+ sizeof(ocirc->pathbias_probe_nonce));
+ ocirc->pathbias_probe_nonce &= 0x00ffffff;
+ probe_nonce = tor_dup_ip(ocirc->pathbias_probe_nonce);
+
+ tor_snprintf(payload,RELAY_PAYLOAD_SIZE, "%s:25", probe_nonce);
+ payload_len = (int)strlen(payload)+1;
+
+ // XXX: need this? Can we assume ipv4 will always be supported?
+ // If not, how do we tell?
+ //if (payload_len <= RELAY_PAYLOAD_SIZE - 4 && edge_conn->begincell_flags) {
+ // set_uint32(payload + payload_len, htonl(edge_conn->begincell_flags));
+ // payload_len += 4;
+ //}
+
+ /* Generate+Store stream id, make sure it's non-zero */
+ ocirc->pathbias_probe_id = get_unique_stream_id_by_circ(ocirc);
+
+ if (ocirc->pathbias_probe_id==0) {
+ log_warn(LD_CIRC,
+ "Ran out of stream IDs on circuit %u during "
+ "pathbias probe attempt.", ocirc->global_identifier);
+ tor_free(probe_nonce);
+ return -1;
+ }
+
+ log_info(LD_CIRC,
+ "Sending pathbias testing cell to %s:25 on stream %d for circ %d.",
+ probe_nonce, ocirc->pathbias_probe_id, ocirc->global_identifier);
+ tor_free(probe_nonce);
+
+ /* Send a test relay cell */
+ if (relay_send_command_from_edge(ocirc->pathbias_probe_id, circ,
+ RELAY_COMMAND_BEGIN, payload,
+ payload_len, cpath_layer) < 0) {
+ log_notice(LD_CIRC,
+ "Failed to send pathbias probe cell on circuit %d.",
+ ocirc->global_identifier);
+ return -1;
+ }
+
+ /* Mark it freshly dirty so it doesn't get expired in the meantime */
+ circ->timestamp_dirty = time(NULL);
+
+ return 0;
+}
+
+/**
+ * Check the response to a pathbias probe, to ensure the
+ * cell is recognized and the nonce and other probe
+ * characteristics are as expected.
+ *
+ * If the response is valid, return 0. Otherwise return < 0.
+ */
+int
+pathbias_check_probe_response(circuit_t *circ, const cell_t *cell)
+{
+ /* Based on connection_edge_process_relay_cell() */
+ relay_header_t rh;
+ int reason;
+ uint32_t ipv4_host;
+ origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ);
+
+ tor_assert(cell);
+ tor_assert(ocirc);
+ tor_assert(circ->purpose == CIRCUIT_PURPOSE_PATH_BIAS_TESTING);
+
+ relay_header_unpack(&rh, cell->payload);
+
+ reason = rh.length > 0 ?
+ get_uint8(cell->payload+RELAY_HEADER_SIZE) : END_STREAM_REASON_MISC;
+
+ if (rh.command == RELAY_COMMAND_END &&
+ reason == END_STREAM_REASON_EXITPOLICY &&
+ ocirc->pathbias_probe_id == rh.stream_id) {
+
+ /* Check length+extract host: It is in network order after the reason code.
+ * See connection_edge_end(). */
+ if (rh.length < 9) { /* reason+ipv4+dns_ttl */
+ log_notice(LD_PROTOCOL,
+ "Short path bias probe response length field (%d).", rh.length);
+ return - END_CIRC_REASON_TORPROTOCOL;
+ }
+
+ ipv4_host = ntohl(get_uint32(cell->payload+RELAY_HEADER_SIZE+1));
+
+ /* Check nonce */
+ if (ipv4_host == ocirc->pathbias_probe_nonce) {
+ pathbias_mark_use_success(ocirc);
+ circuit_mark_for_close(circ, END_CIRC_REASON_FINISHED);
+ log_info(LD_CIRC,
+ "Got valid path bias probe back for circ %d, stream %d.",
+ ocirc->global_identifier, ocirc->pathbias_probe_id);
+ return 0;
+ } else {
+ log_notice(LD_CIRC,
+ "Got strange probe value 0x%x vs 0x%x back for circ %d, "
+ "stream %d.", ipv4_host, ocirc->pathbias_probe_nonce,
+ ocirc->global_identifier, ocirc->pathbias_probe_id);
+ return -1;
+ }
+ }
+ log_info(LD_CIRC,
+ "Got another cell back back on pathbias probe circuit %d: "
+ "Command: %d, Reason: %d, Stream-id: %d",
+ ocirc->global_identifier, rh.command, reason, rh.stream_id);
+ return -1;
+}
+
+/**
+ * Check if a circuit was used and/or closed successfully.
+ *
+ * If we attempted to use the circuit to carry a stream but failed
+ * for whatever reason, or if the circuit mysteriously died before
+ * we could attach any streams, record these two cases.
+ *
+ * If we *have* successfully used the circuit, or it appears to
+ * have been closed by us locally, count it as a success.
+ *
+ * Returns 0 if we're done making decisions with the circ,
+ * or -1 if we want to probe it first.
+ */
+int
+pathbias_check_close(origin_circuit_t *ocirc, int reason)
+{
+ circuit_t *circ = &ocirc->base_;
+
+ if (!pathbias_should_count(ocirc)) {
+ return 0;
+ }
+
+ switch (ocirc->path_state) {
+ /* If the circuit was closed after building, but before use, we need
+ * to ensure we were the ones who tried to close it (and not a remote
+ * actor). */
+ case PATH_STATE_BUILD_SUCCEEDED:
+ if (reason & END_CIRC_REASON_FLAG_REMOTE) {
+ /* Remote circ close reasons on an unused circuit all could be bias */
+ log_info(LD_CIRC,
+ "Circuit %d remote-closed without successful use for reason %d. "
+ "Circuit purpose %d currently %d,%s. Len %d.",
+ ocirc->global_identifier,
+ reason, circ->purpose, ocirc->has_opened,
+ circuit_state_to_string(circ->state),
+ ocirc->build_state->desired_path_len);
+ pathbias_count_collapse(ocirc);
+ } else if ((reason & ~END_CIRC_REASON_FLAG_REMOTE)
+ == END_CIRC_REASON_CHANNEL_CLOSED &&
+ circ->n_chan &&
+ circ->n_chan->reason_for_closing
+ != CHANNEL_CLOSE_REQUESTED) {
+ /* If we didn't close the channel ourselves, it could be bias */
+ /* XXX: Only count bias if the network is live?
+ * What about clock jumps/suspends? */
+ log_info(LD_CIRC,
+ "Circuit %d's channel closed without successful use for reason "
+ "%d, channel reason %d. Circuit purpose %d currently %d,%s. Len "
+ "%d.", ocirc->global_identifier,
+ reason, circ->n_chan->reason_for_closing,
+ circ->purpose, ocirc->has_opened,
+ circuit_state_to_string(circ->state),
+ ocirc->build_state->desired_path_len);
+ pathbias_count_collapse(ocirc);
+ } else {
+ pathbias_count_successful_close(ocirc);
+ }
+ break;
+
+ /* If we tried to use a circuit but failed, we should probe it to ensure
+ * it has not been tampered with. */
+ case PATH_STATE_USE_ATTEMPTED:
+ /* XXX: Only probe and/or count failure if the network is live?
+ * What about clock jumps/suspends? */
+ if (pathbias_send_usable_probe(circ) == 0)
+ return -1;
+ else
+ pathbias_count_use_failed(ocirc);
+
+ /* Any circuit where there were attempted streams but no successful
+ * streams could be bias */
+ log_info(LD_CIRC,
+ "Circuit %d closed without successful use for reason %d. "
+ "Circuit purpose %d currently %d,%s. Len %d.",
+ ocirc->global_identifier,
+ reason, circ->purpose, ocirc->has_opened,
+ circuit_state_to_string(circ->state),
+ ocirc->build_state->desired_path_len);
+ break;
+
+ case PATH_STATE_USE_SUCCEEDED:
+ pathbias_count_successful_close(ocirc);
+ pathbias_count_use_success(ocirc);
+ break;
+
+ case PATH_STATE_USE_FAILED:
+ pathbias_count_use_failed(ocirc);
+ break;
+
+ case PATH_STATE_NEW_CIRC:
+ case PATH_STATE_BUILD_ATTEMPTED:
+ case PATH_STATE_ALREADY_COUNTED:
+ default:
+ // Other states are uninteresting. No stats to count.
+ break;
+ }
+
+ ocirc->path_state = PATH_STATE_ALREADY_COUNTED;
+
+ return 0;
+}
+
+/**
+ * Count a successfully closed circuit.
+ */
+static void
+pathbias_count_successful_close(origin_circuit_t *circ)
+{
+ entry_guard_t *guard = NULL;
+ if (!pathbias_should_count(circ)) {
+ return;
+ }
+
+ if (circ->cpath && circ->cpath->extend_info) {
+ guard = entry_guard_get_by_id_digest(
+ circ->cpath->extend_info->identity_digest);
+ }
+
+ if (guard) {
+ /* In the long run: circuit_success ~= successful_circuit_close +
+ * circ_failure + stream_failure */
+ guard->successful_circuits_closed++;
+ entry_guards_changed();
+ } else if (circ->base_.purpose != CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) {
+ /* In rare cases, CIRCUIT_PURPOSE_TESTING can get converted to
+ * CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT and have no guards here.
+ * No need to log that case. */
+ log_info(LD_CIRC,
+ "Successfully closed circuit has no known guard. "
+ "Circuit is a %s currently %s",
+ circuit_purpose_to_string(circ->base_.purpose),
+ circuit_state_to_string(circ->base_.state));
+ }
+}
+
+/**
+ * Count a circuit that fails after it is built, but before it can
+ * carry any traffic.
+ *
+ * This is needed because there are ways to destroy a
+ * circuit after it has successfully completed. Right now, this is
+ * used for purely informational/debugging purposes.
+ */
+static void
+pathbias_count_collapse(origin_circuit_t *circ)
+{
+ entry_guard_t *guard = NULL;
+
+ if (!pathbias_should_count(circ)) {
+ return;
+ }
+
+ if (circ->cpath && circ->cpath->extend_info) {
+ guard = entry_guard_get_by_id_digest(
+ circ->cpath->extend_info->identity_digest);
+ }
+
+ if (guard) {
+ guard->collapsed_circuits++;
+ entry_guards_changed();
+ } else if (circ->base_.purpose != CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) {
+ /* In rare cases, CIRCUIT_PURPOSE_TESTING can get converted to
+ * CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT and have no guards here.
+ * No need to log that case. */
+ log_info(LD_CIRC,
+ "Destroyed circuit has no known guard. "
+ "Circuit is a %s currently %s",
+ circuit_purpose_to_string(circ->base_.purpose),
+ circuit_state_to_string(circ->base_.state));
+ }
+}
+
+/**
+ * Count a known failed circuit (because we could not probe it).
+ *
+ * This counter is informational.
+ */
+static void
+pathbias_count_use_failed(origin_circuit_t *circ)
+{
+ entry_guard_t *guard = NULL;
+ if (!pathbias_should_count(circ)) {
+ return;
+ }
+
+ if (circ->cpath && circ->cpath->extend_info) {
+ guard = entry_guard_get_by_id_digest(
+ circ->cpath->extend_info->identity_digest);
+ }
+
+ if (guard) {
+ guard->unusable_circuits++;
+ entry_guards_changed();
+ } else if (circ->base_.purpose != CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) {
+ /* In rare cases, CIRCUIT_PURPOSE_TESTING can get converted to
+ * CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT and have no guards here.
+ * No need to log that case. */
+ /* XXX note cut-and-paste code in this function compared to nearby
+ * functions. Would be nice to refactor. -RD */
+ log_info(LD_CIRC,
+ "Stream-failing circuit has no known guard. "
+ "Circuit is a %s currently %s",
+ circuit_purpose_to_string(circ->base_.purpose),
+ circuit_state_to_string(circ->base_.state));
+ }
+}
+
+/**
+ * Count timeouts for path bias log messages.
+ *
+ * These counts are purely informational.
+ */
+void
+pathbias_count_timeout(origin_circuit_t *circ)
+{
+ entry_guard_t *guard = NULL;
+
+ if (!pathbias_should_count(circ)) {
+ return;
+ }
+
+ /* For hidden service circs, they can actually be used
+ * successfully and then time out later (because
+ * the other side declines to use them). */
+ if (circ->path_state == PATH_STATE_USE_SUCCEEDED) {
+ return;
+ }
+
+ if (circ->cpath && circ->cpath->extend_info) {
+ guard = entry_guard_get_by_id_digest(
+ circ->cpath->extend_info->identity_digest);
+ }
+
+ if (guard) {
+ guard->timeouts++;
+ entry_guards_changed();
+ }
+}
+
+/**
+ * Helper function to count all of the currently opened circuits
+ * for a guard that are in a given path state range. The state
+ * range is inclusive on both ends.
+ */
+static int
+pathbias_count_circs_in_states(entry_guard_t *guard,
+ path_state_t from,
+ path_state_t to)
+{
+ circuit_t *circ;
+ int open_circuits = 0;
+
+ /* Count currently open circuits. Give them the benefit of the doubt. */
+ TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) {
+ origin_circuit_t *ocirc = NULL;
+ if (!CIRCUIT_IS_ORIGIN(circ) || /* didn't originate here */
+ circ->marked_for_close) /* already counted */
+ continue;
+
+ ocirc = TO_ORIGIN_CIRCUIT(circ);
+
+ if (!ocirc->cpath || !ocirc->cpath->extend_info)
+ continue;
+
+ if (ocirc->path_state >= from &&
+ ocirc->path_state <= to &&
+ pathbias_should_count(ocirc) &&
+ fast_memeq(guard->identity,
+ ocirc->cpath->extend_info->identity_digest,
+ DIGEST_LEN)) {
+ log_debug(LD_CIRC, "Found opened circuit %d in path_state %s",
+ ocirc->global_identifier,
+ pathbias_state_to_string(ocirc->path_state));
+ open_circuits++;
+ }
+ }
+
+ return open_circuits;
+}
+
+/**
+ * Return the number of circuits counted as successfully closed for
+ * this guard.
+ *
+ * Also add in the currently open circuits to give them the benefit
+ * of the doubt.
+ */
+double
+pathbias_get_close_success_count(entry_guard_t *guard)
+{
+ return guard->successful_circuits_closed +
+ pathbias_count_circs_in_states(guard,
+ PATH_STATE_BUILD_SUCCEEDED,
+ PATH_STATE_USE_SUCCEEDED);
+}
+
+/**
+ * Return the number of circuits counted as successfully used
+ * this guard.
+ *
+ * Also add in the currently open circuits that we are attempting
+ * to use to give them the benefit of the doubt.
+ */
+double
+pathbias_get_use_success_count(entry_guard_t *guard)
+{
+ return guard->use_successes +
+ pathbias_count_circs_in_states(guard,
+ PATH_STATE_USE_ATTEMPTED,
+ PATH_STATE_USE_SUCCEEDED);
+}
+
+/**
+ * Check the path bias use rate against our consensus parameter limits.
+ *
+ * Emits a log message if the use success rates are too low.
+ *
+ * If pathbias_get_dropguards() is set, we also disable the use of
+ * very failure prone guards.
+ */
+static void
+pathbias_measure_use_rate(entry_guard_t *guard)
+{
+ const or_options_t *options = get_options();
+
+ if (guard->use_attempts > pathbias_get_min_use(options)) {
+ /* Note: We rely on the < comparison here to allow us to set a 0
+ * rate and disable the feature entirely. If refactoring, don't
+ * change to <= */
+ if (pathbias_get_use_success_count(guard)/guard->use_attempts
+ < pathbias_get_extreme_use_rate(options)) {
+ /* Dropping is currently disabled by default. */
+ if (pathbias_get_dropguards(options)) {
+ if (!guard->path_bias_disabled) {
+ log_warn(LD_CIRC,
+ "Your Guard %s ($%s) is failing to carry an extremely large "
+ "amount of stream on its circuits. "
+ "To avoid potential route manipulation attacks, Tor has "
+ "disabled use of this guard. "
+ "Use counts are %ld/%ld. Success counts are %ld/%ld. "
+ "%ld circuits completed, %ld were unusable, %ld collapsed, "
+ "and %ld timed out. "
+ "For reference, your timeout cutoff is %ld seconds.",
+ guard->nickname, hex_str(guard->identity, DIGEST_LEN),
+ tor_lround(pathbias_get_use_success_count(guard)),
+ tor_lround(guard->use_attempts),
+ tor_lround(pathbias_get_close_success_count(guard)),
+ tor_lround(guard->circ_attempts),
+ tor_lround(guard->circ_successes),
+ tor_lround(guard->unusable_circuits),
+ tor_lround(guard->collapsed_circuits),
+ tor_lround(guard->timeouts),
+ tor_lround(get_circuit_build_close_time_ms()/1000));
+ guard->path_bias_disabled = 1;
+ guard->bad_since = approx_time();
+ entry_guards_changed();
+ return;
+ }
+ } else if (!guard->path_bias_use_extreme) {
+ guard->path_bias_use_extreme = 1;
+ log_warn(LD_CIRC,
+ "Your Guard %s ($%s) is failing to carry an extremely large "
+ "amount of streams on its circuits. "
+ "This could indicate a route manipulation attack, network "
+ "overload, bad local network connectivity, or a bug. "
+ "Use counts are %ld/%ld. Success counts are %ld/%ld. "
+ "%ld circuits completed, %ld were unusable, %ld collapsed, "
+ "and %ld timed out. "
+ "For reference, your timeout cutoff is %ld seconds.",
+ guard->nickname, hex_str(guard->identity, DIGEST_LEN),
+ tor_lround(pathbias_get_use_success_count(guard)),
+ tor_lround(guard->use_attempts),
+ tor_lround(pathbias_get_close_success_count(guard)),
+ tor_lround(guard->circ_attempts),
+ tor_lround(guard->circ_successes),
+ tor_lround(guard->unusable_circuits),
+ tor_lround(guard->collapsed_circuits),
+ tor_lround(guard->timeouts),
+ tor_lround(get_circuit_build_close_time_ms()/1000));
+ }
+ } else if (pathbias_get_use_success_count(guard)/guard->use_attempts
+ < pathbias_get_notice_use_rate(options)) {
+ if (!guard->path_bias_use_noticed) {
+ guard->path_bias_use_noticed = 1;
+ log_notice(LD_CIRC,
+ "Your Guard %s ($%s) is failing to carry more streams on its "
+ "circuits than usual. "
+ "Most likely this means the Tor network is overloaded "
+ "or your network connection is poor. "
+ "Use counts are %ld/%ld. Success counts are %ld/%ld. "
+ "%ld circuits completed, %ld were unusable, %ld collapsed, "
+ "and %ld timed out. "
+ "For reference, your timeout cutoff is %ld seconds.",
+ guard->nickname, hex_str(guard->identity, DIGEST_LEN),
+ tor_lround(pathbias_get_use_success_count(guard)),
+ tor_lround(guard->use_attempts),
+ tor_lround(pathbias_get_close_success_count(guard)),
+ tor_lround(guard->circ_attempts),
+ tor_lround(guard->circ_successes),
+ tor_lround(guard->unusable_circuits),
+ tor_lround(guard->collapsed_circuits),
+ tor_lround(guard->timeouts),
+ tor_lround(get_circuit_build_close_time_ms()/1000));
+ }
+ }
+ }
+}
+
+/**
+ * Check the path bias circuit close status rates against our consensus
+ * parameter limits.
+ *
+ * Emits a log message if the use success rates are too low.
+ *
+ * If pathbias_get_dropguards() is set, we also disable the use of
+ * very failure prone guards.
+ *
+ * XXX: This function shares similar log messages and checks to
+ * pathbias_measure_use_rate(). It may be possible to combine them
+ * eventually, especially if we can ever remove the need for 3
+ * levels of closure warns (if the overall circuit failure rate
+ * goes down with ntor). One way to do so would be to multiply
+ * the build rate with the use rate to get an idea of the total
+ * fraction of the total network paths the user is able to use.
+ * See ticket #8159.
+ */
+static void
+pathbias_measure_close_rate(entry_guard_t *guard)
+{
+ const or_options_t *options = get_options();
+
+ if (guard->circ_attempts > pathbias_get_min_circs(options)) {
+ /* Note: We rely on the < comparison here to allow us to set a 0
+ * rate and disable the feature entirely. If refactoring, don't
+ * change to <= */
+ if (pathbias_get_close_success_count(guard)/guard->circ_attempts
+ < pathbias_get_extreme_rate(options)) {
+ /* Dropping is currently disabled by default. */
+ if (pathbias_get_dropguards(options)) {
+ if (!guard->path_bias_disabled) {
+ log_warn(LD_CIRC,
+ "Your Guard %s ($%s) is failing an extremely large "
+ "amount of circuits. "
+ "To avoid potential route manipulation attacks, Tor has "
+ "disabled use of this guard. "
+ "Success counts are %ld/%ld. Use counts are %ld/%ld. "
+ "%ld circuits completed, %ld were unusable, %ld collapsed, "
+ "and %ld timed out. "
+ "For reference, your timeout cutoff is %ld seconds.",
+ guard->nickname, hex_str(guard->identity, DIGEST_LEN),
+ tor_lround(pathbias_get_close_success_count(guard)),
+ tor_lround(guard->circ_attempts),
+ tor_lround(pathbias_get_use_success_count(guard)),
+ tor_lround(guard->use_attempts),
+ tor_lround(guard->circ_successes),
+ tor_lround(guard->unusable_circuits),
+ tor_lround(guard->collapsed_circuits),
+ tor_lround(guard->timeouts),
+ tor_lround(get_circuit_build_close_time_ms()/1000));
+ guard->path_bias_disabled = 1;
+ guard->bad_since = approx_time();
+ entry_guards_changed();
+ return;
+ }
+ } else if (!guard->path_bias_extreme) {
+ guard->path_bias_extreme = 1;
+ log_warn(LD_CIRC,
+ "Your Guard %s ($%s) is failing an extremely large "
+ "amount of circuits. "
+ "This could indicate a route manipulation attack, "
+ "extreme network overload, or a bug. "
+ "Success counts are %ld/%ld. Use counts are %ld/%ld. "
+ "%ld circuits completed, %ld were unusable, %ld collapsed, "
+ "and %ld timed out. "
+ "For reference, your timeout cutoff is %ld seconds.",
+ guard->nickname, hex_str(guard->identity, DIGEST_LEN),
+ tor_lround(pathbias_get_close_success_count(guard)),
+ tor_lround(guard->circ_attempts),
+ tor_lround(pathbias_get_use_success_count(guard)),
+ tor_lround(guard->use_attempts),
+ tor_lround(guard->circ_successes),
+ tor_lround(guard->unusable_circuits),
+ tor_lround(guard->collapsed_circuits),
+ tor_lround(guard->timeouts),
+ tor_lround(get_circuit_build_close_time_ms()/1000));
+ }
+ } else if (pathbias_get_close_success_count(guard)/guard->circ_attempts
+ < pathbias_get_warn_rate(options)) {
+ if (!guard->path_bias_warned) {
+ guard->path_bias_warned = 1;
+ log_warn(LD_CIRC,
+ "Your Guard %s ($%s) is failing a very large "
+ "amount of circuits. "
+ "Most likely this means the Tor network is "
+ "overloaded, but it could also mean an attack against "
+ "you or potentially the guard itself. "
+ "Success counts are %ld/%ld. Use counts are %ld/%ld. "
+ "%ld circuits completed, %ld were unusable, %ld collapsed, "
+ "and %ld timed out. "
+ "For reference, your timeout cutoff is %ld seconds.",
+ guard->nickname, hex_str(guard->identity, DIGEST_LEN),
+ tor_lround(pathbias_get_close_success_count(guard)),
+ tor_lround(guard->circ_attempts),
+ tor_lround(pathbias_get_use_success_count(guard)),
+ tor_lround(guard->use_attempts),
+ tor_lround(guard->circ_successes),
+ tor_lround(guard->unusable_circuits),
+ tor_lround(guard->collapsed_circuits),
+ tor_lround(guard->timeouts),
+ tor_lround(get_circuit_build_close_time_ms()/1000));
+ }
+ } else if (pathbias_get_close_success_count(guard)/guard->circ_attempts
+ < pathbias_get_notice_rate(options)) {
+ if (!guard->path_bias_noticed) {
+ guard->path_bias_noticed = 1;
+ log_notice(LD_CIRC,
+ "Your Guard %s ($%s) is failing more circuits than "
+ "usual. "
+ "Most likely this means the Tor network is overloaded. "
+ "Success counts are %ld/%ld. Use counts are %ld/%ld. "
+ "%ld circuits completed, %ld were unusable, %ld collapsed, "
+ "and %ld timed out. "
+ "For reference, your timeout cutoff is %ld seconds.",
+ guard->nickname, hex_str(guard->identity, DIGEST_LEN),
+ tor_lround(pathbias_get_close_success_count(guard)),
+ tor_lround(guard->circ_attempts),
+ tor_lround(pathbias_get_use_success_count(guard)),
+ tor_lround(guard->use_attempts),
+ tor_lround(guard->circ_successes),
+ tor_lround(guard->unusable_circuits),
+ tor_lround(guard->collapsed_circuits),
+ tor_lround(guard->timeouts),
+ tor_lround(get_circuit_build_close_time_ms()/1000));
+ }
+ }
+ }
+}
+
+/**
+ * This function scales the path bias use rates if we have
+ * more data than the scaling threshold. This allows us to
+ * be more sensitive to recent measurements.
+ *
+ * XXX: The attempt count transfer stuff here might be done
+ * better by keeping separate pending counters that get
+ * transfered at circuit close. See ticket #8160.
+ */
+static void
+pathbias_scale_close_rates(entry_guard_t *guard)
+{
+ const or_options_t *options = get_options();
+
+ /* If we get a ton of circuits, just scale everything down */
+ if (guard->circ_attempts > pathbias_get_scale_threshold(options)) {
+ double scale_ratio = pathbias_get_scale_ratio(options);
+ int opened_attempts = pathbias_count_circs_in_states(guard,
+ PATH_STATE_BUILD_ATTEMPTED, PATH_STATE_BUILD_ATTEMPTED);
+ int opened_built = pathbias_count_circs_in_states(guard,
+ PATH_STATE_BUILD_SUCCEEDED,
+ PATH_STATE_USE_FAILED);
+ /* Verify that the counts are sane before and after scaling */
+ int counts_are_sane = (guard->circ_attempts >= guard->circ_successes);
+
+ guard->circ_attempts -= (opened_attempts+opened_built);
+ guard->circ_successes -= opened_built;
+
+ guard->circ_attempts *= scale_ratio;
+ guard->circ_successes *= scale_ratio;
+ guard->timeouts *= scale_ratio;
+ guard->successful_circuits_closed *= scale_ratio;
+ guard->collapsed_circuits *= scale_ratio;
+ guard->unusable_circuits *= scale_ratio;
+
+ guard->circ_attempts += (opened_attempts+opened_built);
+ guard->circ_successes += opened_built;
+
+ entry_guards_changed();
+
+ log_info(LD_CIRC,
+ "Scaled pathbias counts to (%f,%f)/%f (%d/%d open) for guard "
+ "%s ($%s)",
+ guard->circ_successes, guard->successful_circuits_closed,
+ guard->circ_attempts, opened_built, opened_attempts,
+ guard->nickname, hex_str(guard->identity, DIGEST_LEN));
+
+ /* Have the counts just become invalid by this scaling attempt? */
+ if (counts_are_sane && guard->circ_attempts < guard->circ_successes) {
+ log_notice(LD_BUG,
+ "Scaling has mangled pathbias counts to %f/%f (%d/%d open) "
+ "for guard %s ($%s)",
+ guard->circ_successes, guard->circ_attempts, opened_built,
+ opened_attempts, guard->nickname,
+ hex_str(guard->identity, DIGEST_LEN));
+ }
+ }
+}
+
+/**
+ * This function scales the path bias circuit close rates if we have
+ * more data than the scaling threshold. This allows us to be more
+ * sensitive to recent measurements.
+ *
+ * XXX: The attempt count transfer stuff here might be done
+ * better by keeping separate pending counters that get
+ * transfered at circuit close. See ticket #8160.
+ */
+void
+pathbias_scale_use_rates(entry_guard_t *guard)
+{
+ const or_options_t *options = get_options();
+
+ /* If we get a ton of circuits, just scale everything down */
+ if (guard->use_attempts > pathbias_get_scale_use_threshold(options)) {
+ double scale_ratio = pathbias_get_scale_ratio(options);
+ int opened_attempts = pathbias_count_circs_in_states(guard,
+ PATH_STATE_USE_ATTEMPTED, PATH_STATE_USE_SUCCEEDED);
+ /* Verify that the counts are sane before and after scaling */
+ int counts_are_sane = (guard->use_attempts >= guard->use_successes);
+
+ guard->use_attempts -= opened_attempts;
+
+ guard->use_attempts *= scale_ratio;
+ guard->use_successes *= scale_ratio;
+
+ guard->use_attempts += opened_attempts;
+
+ log_info(LD_CIRC,
+ "Scaled pathbias use counts to %f/%f (%d open) for guard %s ($%s)",
+ guard->use_successes, guard->use_attempts, opened_attempts,
+ guard->nickname, hex_str(guard->identity, DIGEST_LEN));
+
+ /* Have the counts just become invalid by this scaling attempt? */
+ if (counts_are_sane && guard->use_attempts < guard->use_successes) {
+ log_notice(LD_BUG,
+ "Scaling has mangled pathbias usage counts to %f/%f "
+ "(%d open) for guard %s ($%s)",
+ guard->circ_successes, guard->circ_attempts,
+ opened_attempts, guard->nickname,
+ hex_str(guard->identity, DIGEST_LEN));
+ }
+
+ entry_guards_changed();
+ }
+}
+
diff --git a/src/or/circpathbias.h b/src/or/circpathbias.h
new file mode 100644
index 000000000..c95d801a4
--- /dev/null
+++ b/src/or/circpathbias.h
@@ -0,0 +1,29 @@
+/* Copyright (c) 2001 Matej Pfajfar.
+ * Copyright (c) 2001-2004, Roger Dingledine.
+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
+ * Copyright (c) 2007-2013, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file circuitbuild.h
+ * \brief Header file for circuitbuild.c.
+ **/
+
+#ifndef TOR_CIRCPATHBIAS_H
+#define TOR_CIRCPATHBIAS_H
+
+double pathbias_get_extreme_rate(const or_options_t *options);
+double pathbias_get_extreme_use_rate(const or_options_t *options);
+int pathbias_get_dropguards(const or_options_t *options);
+void pathbias_count_timeout(origin_circuit_t *circ);
+void pathbias_count_build_success(origin_circuit_t *circ);
+int pathbias_count_build_attempt(origin_circuit_t *circ);
+int pathbias_check_close(origin_circuit_t *circ, int reason);
+int pathbias_check_probe_response(circuit_t *circ, const cell_t *cell);
+void pathbias_count_use_attempt(origin_circuit_t *circ);
+void pathbias_mark_use_success(origin_circuit_t *circ);
+void pathbias_mark_use_rollback(origin_circuit_t *circ);
+const char *pathbias_state_to_string(path_state_t state);
+
+#endif
+
diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c
index e47a2780a..9d06759de 100644
--- a/src/or/circuitbuild.c
+++ b/src/or/circuitbuild.c
@@ -9,8 +9,11 @@
* \brief The actual details of building circuits.
**/
+#define CIRCUITBUILD_PRIVATE
+
#include "or.h"
#include "channel.h"
+#include "circpathbias.h"
#include "circuitbuild.h"
#include "circuitlist.h"
#include "circuitstats.h"
@@ -40,19 +43,11 @@
#include "routerparse.h"
#include "routerset.h"
#include "crypto.h"
-#include "connection_edge.h"
#ifndef MIN
#define MIN(a,b) ((a)<(b)?(a):(b))
#endif
-/********* START VARIABLES **********/
-
-/** A global list of all circuits at this hop. */
-extern circuit_t *global_circuitlist;
-
-/********* END VARIABLES ************/
-
static channel_t * channel_connect_for_circuit(const tor_addr_t *addr,
uint16_t port,
const char *id_digest);
@@ -64,14 +59,6 @@ static crypt_path_t *onion_next_hop_in_cpath(crypt_path_t *cpath);
static int onion_extend_cpath(origin_circuit_t *circ);
static int count_acceptable_nodes(smartlist_t *routers);
static int onion_append_hop(crypt_path_t **head_ptr, extend_info_t *choice);
-static int entry_guard_inc_circ_attempt_count(entry_guard_t *guard);
-static void pathbias_count_build_success(origin_circuit_t *circ);
-static void pathbias_count_successful_close(origin_circuit_t *circ);
-static void pathbias_count_collapse(origin_circuit_t *circ);
-static void pathbias_count_use_failed(origin_circuit_t *circ);
-static void pathbias_measure_use_rate(entry_guard_t *guard);
-static void pathbias_measure_close_rate(entry_guard_t *guard);
-static void pathbias_scale_use_rates(entry_guard_t *guard);
#ifdef CURVE25519_ENABLED
static int circuits_can_use_ntor(void);
#endif
@@ -92,18 +79,27 @@ channel_connect_for_circuit(const tor_addr_t *addr, uint16_t port,
return chan;
}
-/** Iterate over values of circ_id, starting from conn-\>next_circ_id,
- * and with the high bit specified by conn-\>circ_id_type, until we get
- * a circ_id that is not in use by any other circuit on that conn.
+/** Search for a value for circ_id that we can use on <b>chan</b> for an
+ * outbound circuit, until we get a circ_id that is not in use by any other
+ * circuit on that conn.
*
* Return it, or 0 if can't get a unique circ_id.
*/
-static circid_t
+STATIC circid_t
get_unique_circ_id_by_chan(channel_t *chan)
{
+/* This number is chosen somewhat arbitrarily; see comment below for more
+ * info. When the space is 80% full, it gives a one-in-a-million failure
+ * chance; when the space is 90% full, it gives a one-in-850 chance; and when
+ * the space is 95% full, it gives a one-in-26 failure chance. That seems
+ * okay, though you could make a case IMO for anything between N=32 and
+ * N=256. */
+#define MAX_CIRCID_ATTEMPTS 64
+ int in_use;
+ unsigned n_with_circ = 0, n_pending_destroy = 0;
circid_t test_circ_id;
circid_t attempts=0;
- circid_t high_bit, max_range;
+ circid_t high_bit, max_range, mask;
tor_assert(chan);
@@ -113,25 +109,52 @@ get_unique_circ_id_by_chan(channel_t *chan)
"a client with no identity.");
return 0;
}
- max_range = (chan->wide_circ_ids) ? (1u<<31) : (1u<<15);
+ max_range = (chan->wide_circ_ids) ? (1u<<31) : (1u<<15);
+ mask = max_range - 1;
high_bit = (chan->circ_id_type == CIRC_ID_TYPE_HIGHER) ? max_range : 0;
do {
- /* Sequentially iterate over test_circ_id=1...max_range until we find a
- * circID such that (high_bit|test_circ_id) is not already used. */
- test_circ_id = chan->next_circ_id++;
- if (test_circ_id == 0 || test_circ_id >= max_range) {
- test_circ_id = 1;
- chan->next_circ_id = 2;
- }
- if (++attempts > max_range) {
- /* Make sure we don't loop forever if all circ_id's are used. This
- * matters because it's an external DoS opportunity.
+ if (++attempts > MAX_CIRCID_ATTEMPTS) {
+ /* Make sure we don't loop forever because all circuit IDs are used.
+ *
+ * Once, we would try until we had tried every possible circuit ID. But
+ * that's quite expensive. Instead, we try MAX_CIRCID_ATTEMPTS random
+ * circuit IDs, and then give up.
+ *
+ * This potentially causes us to give up early if our circuit ID space
+ * is nearly full. If we have N circuit IDs in use, then we will reject
+ * a new circuit with probability (N / max_range) ^ MAX_CIRCID_ATTEMPTS.
+ * This means that in practice, a few percent of our circuit ID capacity
+ * will go unused.
+ *
+ * The alternative here, though, is to do a linear search over the
+ * whole circuit ID space every time we extend a circuit, which is
+ * not so great either.
*/
- log_warn(LD_CIRC,"No unused circ IDs. Failing.");
+ log_fn_ratelim(&chan->last_warned_circ_ids_exhausted, LOG_WARN,
+ LD_CIRC,"No unused circIDs found on channel %s wide "
+ "circID support, with %u inbound and %u outbound circuits. "
+ "Found %u circuit IDs in use by circuits, and %u with "
+ "pending destroy cells."
+ "Failing a circuit.",
+ chan->wide_circ_ids ? "with" : "without",
+ chan->num_p_circuits, chan->num_n_circuits,
+ n_with_circ, n_pending_destroy);
return 0;
}
+
+ do {
+ crypto_rand((char*) &test_circ_id, sizeof(test_circ_id));
+ test_circ_id &= mask;
+ } while (test_circ_id == 0);
+
test_circ_id |= high_bit;
- } while (circuit_id_in_use_on_channel(test_circ_id, chan));
+
+ in_use = circuit_id_in_use_on_channel(test_circ_id, chan);
+ if (in_use == 1)
+ ++n_with_circ;
+ else if (in_use == 2)
+ ++n_pending_destroy;
+ } while (in_use);
return test_circ_id;
}
@@ -292,9 +315,9 @@ circuit_rep_hist_note_result(origin_circuit_t *circ)
static int
circuit_cpath_supports_ntor(const origin_circuit_t *circ)
{
- crypt_path_t *head = circ->cpath, *cpath = circ->cpath;
+ crypt_path_t *head, *cpath;
- cpath = head;
+ cpath = head = circ->cpath;
do {
if (cpath->extend_info &&
!tor_mem_is_zero(
@@ -576,7 +599,9 @@ circuit_deliver_create_cell(circuit_t *circ, const create_cell_t *create_cell,
id = get_unique_circ_id_by_chan(circ->n_chan);
if (!id) {
- log_warn(LD_CIRC,"failed to get unique circID.");
+ static ratelim_t circid_warning_limit = RATELIM_INIT(9600);
+ log_fn_ratelim(&circid_warning_limit, LOG_WARN, LD_CIRC,
+ "failed to get unique circID.");
return -1;
}
log_debug(LD_CIRC,"Chosen circID %u.", (unsigned)id);
@@ -621,27 +646,30 @@ int
inform_testing_reachability(void)
{
char dirbuf[128];
+ char *address;
const routerinfo_t *me = router_get_my_routerinfo();
if (!me)
return 0;
+ address = tor_dup_ip(me->addr);
control_event_server_status(LOG_NOTICE,
"CHECKING_REACHABILITY ORADDRESS=%s:%d",
- me->address, me->or_port);
+ address, me->or_port);
if (me->dir_port) {
tor_snprintf(dirbuf, sizeof(dirbuf), " and DirPort %s:%d",
- me->address, me->dir_port);
+ address, me->dir_port);
control_event_server_status(LOG_NOTICE,
"CHECKING_REACHABILITY DIRADDRESS=%s:%d",
- me->address, me->dir_port);
+ address, me->dir_port);
}
log_notice(LD_OR, "Now checking whether ORPort %s:%d%s %s reachable... "
"(this may take up to %d minutes -- look for log "
"messages indicating success)",
- me->address, me->or_port,
+ address, me->or_port,
me->dir_port ? dirbuf : "",
me->dir_port ? "are" : "is",
TIMEOUT_UNTIL_UNREACHABILITY_COMPLAINT/60);
+ tor_free(address);
return 1;
}
@@ -656,16 +684,18 @@ should_use_create_fast_for_circuit(origin_circuit_t *circ)
if (!circ->cpath->extend_info->onion_key)
return 1; /* our hand is forced: only a create_fast will work. */
- if (!options->FastFirstHopPK)
- return 0; /* we prefer to avoid create_fast */
if (public_server_mode(options)) {
/* We're a server, and we know an onion key. We can choose.
* Prefer to blend our circuit into the other circuits we are
* creating on behalf of others. */
return 0;
}
+ if (options->FastFirstHopPK == -1) {
+ /* option is "auto", so look at the consensus. */
+ return networkstatus_get_param(NULL, "usecreatefast", 1, 0, 1);
+ }
- return 1;
+ return options->FastFirstHopPK;
}
/** Return true if <b>circ</b> is the type of circuit we want to count
@@ -835,20 +865,24 @@ circuit_send_next_onion_skin(origin_circuit_t *circ)
* it off at, we probably had a suspend event along this codepath,
* and we should discard the value.
*/
- if (timediff < 0 || timediff > 2*circ_times.close_ms+1000) {
+ if (timediff < 0 ||
+ timediff > 2*get_circuit_build_close_time_ms()+1000) {
log_notice(LD_CIRC, "Strange value for circuit build time: %ldmsec. "
"Assuming clock jump. Purpose %d (%s)", timediff,
circ->base_.purpose,
circuit_purpose_to_string(circ->base_.purpose));
} else if (!circuit_build_times_disabled()) {
/* Only count circuit times if the network is live */
- if (circuit_build_times_network_check_live(&circ_times)) {
- circuit_build_times_add_time(&circ_times, (build_time_t)timediff);
- circuit_build_times_set_timeout(&circ_times);
+ if (circuit_build_times_network_check_live(
+ get_circuit_build_times())) {
+ circuit_build_times_add_time(get_circuit_build_times_mutable(),
+ (build_time_t)timediff);
+ circuit_build_times_set_timeout(get_circuit_build_times_mutable());
}
if (circ->base_.purpose != CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) {
- circuit_build_times_network_circ_success(&circ_times);
+ circuit_build_times_network_circ_success(
+ get_circuit_build_times_mutable());
}
}
}
@@ -1143,1516 +1177,6 @@ circuit_init_cpath_crypto(crypt_path_t *cpath, const char *key_data,
return 0;
}
-/** The minimum number of circuit attempts before we start
- * thinking about warning about path bias and dropping guards */
-static int
-pathbias_get_min_circs(const or_options_t *options)
-{
-#define DFLT_PATH_BIAS_MIN_CIRC 150
- if (options->PathBiasCircThreshold >= 5)
- return options->PathBiasCircThreshold;
- else
- return networkstatus_get_param(NULL, "pb_mincircs",
- DFLT_PATH_BIAS_MIN_CIRC,
- 5, INT32_MAX);
-}
-
-/** The circuit success rate below which we issue a notice */
-static double
-pathbias_get_notice_rate(const or_options_t *options)
-{
-#define DFLT_PATH_BIAS_NOTICE_PCT 70
- if (options->PathBiasNoticeRate >= 0.0)
- return options->PathBiasNoticeRate;
- else
- return networkstatus_get_param(NULL, "pb_noticepct",
- DFLT_PATH_BIAS_NOTICE_PCT, 0, 100)/100.0;
-}
-
-/* XXXX024 I'd like to have this be static again, but entrynodes.c needs it. */
-/** The circuit success rate below which we issue a warn */
-static double
-pathbias_get_warn_rate(const or_options_t *options)
-{
-#define DFLT_PATH_BIAS_WARN_PCT 50
- if (options->PathBiasWarnRate >= 0.0)
- return options->PathBiasWarnRate;
- else
- return networkstatus_get_param(NULL, "pb_warnpct",
- DFLT_PATH_BIAS_WARN_PCT, 0, 100)/100.0;
-}
-
-/* XXXX024 I'd like to have this be static again, but entrynodes.c needs it. */
-/**
- * The extreme rate is the rate at which we would drop the guard,
- * if pb_dropguard is also set. Otherwise we just warn.
- */
-double
-pathbias_get_extreme_rate(const or_options_t *options)
-{
-#define DFLT_PATH_BIAS_EXTREME_PCT 30
- if (options->PathBiasExtremeRate >= 0.0)
- return options->PathBiasExtremeRate;
- else
- return networkstatus_get_param(NULL, "pb_extremepct",
- DFLT_PATH_BIAS_EXTREME_PCT, 0, 100)/100.0;
-}
-
-/* XXXX024 I'd like to have this be static again, but entrynodes.c needs it. */
-/**
- * If 1, we actually disable use of guards that fall below
- * the extreme_pct.
- */
-int
-pathbias_get_dropguards(const or_options_t *options)
-{
-#define DFLT_PATH_BIAS_DROP_GUARDS 0
- if (options->PathBiasDropGuards >= 0)
- return options->PathBiasDropGuards;
- else
- return networkstatus_get_param(NULL, "pb_dropguards",
- DFLT_PATH_BIAS_DROP_GUARDS, 0, 1);
-}
-
-/**
- * This is the number of circuits at which we scale our
- * counts by mult_factor/scale_factor. Note, this count is
- * not exact, as we only perform the scaling in the event
- * of no integer truncation.
- */
-static int
-pathbias_get_scale_threshold(const or_options_t *options)
-{
-#define DFLT_PATH_BIAS_SCALE_THRESHOLD 300
- if (options->PathBiasScaleThreshold >= 10)
- return options->PathBiasScaleThreshold;
- else
- return networkstatus_get_param(NULL, "pb_scalecircs",
- DFLT_PATH_BIAS_SCALE_THRESHOLD, 10,
- INT32_MAX);
-}
-
-/**
- * Compute the path bias scaling ratio from the consensus
- * parameters pb_multfactor/pb_scalefactor.
- *
- * Returns a value in (0, 1.0] which we multiply our pathbias
- * counts with to scale them down.
- */
-static double
-pathbias_get_scale_ratio(const or_options_t *options)
-{
- /*
- * The scale factor is the denominator for our scaling
- * of circuit counts for our path bias window.
- *
- * Note that our use of doubles for the path bias state
- * file means that powers of 2 work best here.
- */
- int denominator = networkstatus_get_param(NULL, "pb_scalefactor",
- 2, 2, INT32_MAX);
- (void) options;
- /**
- * The mult factor is the numerator for our scaling
- * of circuit counts for our path bias window. It
- * allows us to scale by fractions.
- */
- return networkstatus_get_param(NULL, "pb_multfactor",
- 1, 1, denominator)/((double)denominator);
-}
-
-/** The minimum number of circuit usage attempts before we start
- * thinking about warning about path use bias and dropping guards */
-static int
-pathbias_get_min_use(const or_options_t *options)
-{
-#define DFLT_PATH_BIAS_MIN_USE 20
- if (options->PathBiasUseThreshold >= 3)
- return options->PathBiasUseThreshold;
- else
- return networkstatus_get_param(NULL, "pb_minuse",
- DFLT_PATH_BIAS_MIN_USE,
- 3, INT32_MAX);
-}
-
-/** The circuit use success rate below which we issue a notice */
-static double
-pathbias_get_notice_use_rate(const or_options_t *options)
-{
-#define DFLT_PATH_BIAS_NOTICE_USE_PCT 80
- if (options->PathBiasNoticeUseRate >= 0.0)
- return options->PathBiasNoticeUseRate;
- else
- return networkstatus_get_param(NULL, "pb_noticeusepct",
- DFLT_PATH_BIAS_NOTICE_USE_PCT,
- 0, 100)/100.0;
-}
-
-/**
- * The extreme use rate is the rate at which we would drop the guard,
- * if pb_dropguard is also set. Otherwise we just warn.
- */
-double
-pathbias_get_extreme_use_rate(const or_options_t *options)
-{
-#define DFLT_PATH_BIAS_EXTREME_USE_PCT 60
- if (options->PathBiasExtremeUseRate >= 0.0)
- return options->PathBiasExtremeUseRate;
- else
- return networkstatus_get_param(NULL, "pb_extremeusepct",
- DFLT_PATH_BIAS_EXTREME_USE_PCT,
- 0, 100)/100.0;
-}
-
-/**
- * This is the number of circuits at which we scale our
- * use counts by mult_factor/scale_factor. Note, this count is
- * not exact, as we only perform the scaling in the event
- * of no integer truncation.
- */
-static int
-pathbias_get_scale_use_threshold(const or_options_t *options)
-{
-#define DFLT_PATH_BIAS_SCALE_USE_THRESHOLD 100
- if (options->PathBiasScaleUseThreshold >= 10)
- return options->PathBiasScaleUseThreshold;
- else
- return networkstatus_get_param(NULL, "pb_scaleuse",
- DFLT_PATH_BIAS_SCALE_USE_THRESHOLD,
- 10, INT32_MAX);
-}
-
-/**
- * Convert a Guard's path state to string.
- */
-const char *
-pathbias_state_to_string(path_state_t state)
-{
- switch (state) {
- case PATH_STATE_NEW_CIRC:
- return "new";
- case PATH_STATE_BUILD_ATTEMPTED:
- return "build attempted";
- case PATH_STATE_BUILD_SUCCEEDED:
- return "build succeeded";
- case PATH_STATE_USE_ATTEMPTED:
- return "use attempted";
- case PATH_STATE_USE_SUCCEEDED:
- return "use succeeded";
- case PATH_STATE_USE_FAILED:
- return "use failed";
- case PATH_STATE_ALREADY_COUNTED:
- return "already counted";
- }
-
- return "unknown";
-}
-
-/**
- * This function decides if a circuit has progressed far enough to count
- * as a circuit "attempt". As long as end-to-end tagging is possible,
- * we assume the adversary will use it over hop-to-hop failure. Therefore,
- * we only need to account bias for the last hop. This should make us
- * much more resilient to ambient circuit failure, and also make that
- * failure easier to measure (we only need to measure Exit failure rates).
- */
-static int
-pathbias_is_new_circ_attempt(origin_circuit_t *circ)
-{
-#define N2N_TAGGING_IS_POSSIBLE
-#ifdef N2N_TAGGING_IS_POSSIBLE
- /* cpath is a circular list. We want circs with more than one hop,
- * and the second hop must be waiting for keys still (it's just
- * about to get them). */
- return circ->cpath &&
- circ->cpath->next != circ->cpath &&
- circ->cpath->next->state == CPATH_STATE_AWAITING_KEYS;
-#else
- /* If tagging attacks are no longer possible, we probably want to
- * count bias from the first hop. However, one could argue that
- * timing-based tagging is still more useful than per-hop failure.
- * In which case, we'd never want to use this.
- */
- return circ->cpath &&
- circ->cpath->state == CPATH_STATE_AWAITING_KEYS;
-#endif
-}
-
-/**
- * Decide if the path bias code should count a circuit.
- *
- * @returns 1 if we should count it, 0 otherwise.
- */
-static int
-pathbias_should_count(origin_circuit_t *circ)
-{
-#define PATHBIAS_COUNT_INTERVAL (600)
- static ratelim_t count_limit =
- RATELIM_INIT(PATHBIAS_COUNT_INTERVAL);
- char *rate_msg = NULL;
-
- /* We can't do path bias accounting without entry guards.
- * Testing and controller circuits also have no guards.
- *
- * We also don't count server-side rends, because their
- * endpoint could be chosen maliciously.
- * Similarly, we can't count client-side intro attempts,
- * because clients can be manipulated into connecting to
- * malicious intro points. */
- if (get_options()->UseEntryGuards == 0 ||
- circ->base_.purpose == CIRCUIT_PURPOSE_TESTING ||
- circ->base_.purpose == CIRCUIT_PURPOSE_CONTROLLER ||
- circ->base_.purpose == CIRCUIT_PURPOSE_S_CONNECT_REND ||
- circ->base_.purpose == CIRCUIT_PURPOSE_S_REND_JOINED ||
- (circ->base_.purpose >= CIRCUIT_PURPOSE_C_INTRODUCING &&
- circ->base_.purpose <= CIRCUIT_PURPOSE_C_INTRODUCE_ACKED)) {
-
- /* Check to see if the shouldcount result has changed due to a
- * unexpected purpose change that would affect our results.
- *
- * The reason we check the path state too here is because for the
- * cannibalized versions of these purposes, we count them as successful
- * before their purpose change.
- */
- if (circ->pathbias_shouldcount == PATHBIAS_SHOULDCOUNT_COUNTED
- && circ->path_state != PATH_STATE_ALREADY_COUNTED) {
- log_info(LD_BUG,
- "Circuit %d is now being ignored despite being counted "
- "in the past. Purpose is %s, path state is %s",
- circ->global_identifier,
- circuit_purpose_to_string(circ->base_.purpose),
- pathbias_state_to_string(circ->path_state));
- }
- circ->pathbias_shouldcount = PATHBIAS_SHOULDCOUNT_IGNORED;
- return 0;
- }
-
- /* Completely ignore one hop circuits */
- if (circ->build_state->onehop_tunnel ||
- circ->build_state->desired_path_len == 1) {
- /* Check for inconsistency */
- if (circ->build_state->desired_path_len != 1 ||
- !circ->build_state->onehop_tunnel) {
- if ((rate_msg = rate_limit_log(&count_limit, approx_time()))) {
- log_info(LD_BUG,
- "One-hop circuit has length %d. Path state is %s. "
- "Circuit is a %s currently %s.%s",
- circ->build_state->desired_path_len,
- pathbias_state_to_string(circ->path_state),
- circuit_purpose_to_string(circ->base_.purpose),
- circuit_state_to_string(circ->base_.state),
- rate_msg);
- tor_free(rate_msg);
- }
- tor_fragile_assert();
- }
-
- /* Check to see if the shouldcount result has changed due to a
- * unexpected change that would affect our results */
- if (circ->pathbias_shouldcount == PATHBIAS_SHOULDCOUNT_COUNTED) {
- log_info(LD_BUG,
- "One-hop circuit %d is now being ignored despite being counted "
- "in the past. Purpose is %s, path state is %s",
- circ->global_identifier,
- circuit_purpose_to_string(circ->base_.purpose),
- pathbias_state_to_string(circ->path_state));
- }
- circ->pathbias_shouldcount = PATHBIAS_SHOULDCOUNT_IGNORED;
- return 0;
- }
-
- /* Check to see if the shouldcount result has changed due to a
- * unexpected purpose change that would affect our results */
- if (circ->pathbias_shouldcount == PATHBIAS_SHOULDCOUNT_IGNORED) {
- log_info(LD_BUG,
- "Circuit %d is now being counted despite being ignored "
- "in the past. Purpose is %s, path state is %s",
- circ->global_identifier,
- circuit_purpose_to_string(circ->base_.purpose),
- pathbias_state_to_string(circ->path_state));
- }
- circ->pathbias_shouldcount = PATHBIAS_SHOULDCOUNT_COUNTED;
-
- return 1;
-}
-
-/**
- * Check our circuit state to see if this is a successful circuit attempt.
- * If so, record it in the current guard's path bias circ_attempt count.
- *
- * Also check for several potential error cases for bug #6475.
- */
-static int
-pathbias_count_build_attempt(origin_circuit_t *circ)
-{
-#define CIRC_ATTEMPT_NOTICE_INTERVAL (600)
- static ratelim_t circ_attempt_notice_limit =
- RATELIM_INIT(CIRC_ATTEMPT_NOTICE_INTERVAL);
- char *rate_msg = NULL;
-
- if (!pathbias_should_count(circ)) {
- return 0;
- }
-
- if (pathbias_is_new_circ_attempt(circ)) {
- /* Help track down the real cause of bug #6475: */
- if (circ->has_opened && circ->path_state != PATH_STATE_BUILD_ATTEMPTED) {
- if ((rate_msg = rate_limit_log(&circ_attempt_notice_limit,
- approx_time()))) {
- log_info(LD_BUG,
- "Opened circuit is in strange path state %s. "
- "Circuit is a %s currently %s.%s",
- pathbias_state_to_string(circ->path_state),
- circuit_purpose_to_string(circ->base_.purpose),
- circuit_state_to_string(circ->base_.state),
- rate_msg);
- tor_free(rate_msg);
- }
- }
-
- /* Don't re-count cannibalized circs.. */
- if (!circ->has_opened) {
- entry_guard_t *guard = NULL;
-
- if (circ->cpath && circ->cpath->extend_info) {
- guard = entry_guard_get_by_id_digest(
- circ->cpath->extend_info->identity_digest);
- } else if (circ->base_.n_chan) {
- guard =
- entry_guard_get_by_id_digest(circ->base_.n_chan->identity_digest);
- }
-
- if (guard) {
- if (circ->path_state == PATH_STATE_NEW_CIRC) {
- circ->path_state = PATH_STATE_BUILD_ATTEMPTED;
-
- if (entry_guard_inc_circ_attempt_count(guard) < 0) {
- /* Bogus guard; we already warned. */
- return -END_CIRC_REASON_TORPROTOCOL;
- }
- } else {
- if ((rate_msg = rate_limit_log(&circ_attempt_notice_limit,
- approx_time()))) {
- log_info(LD_BUG,
- "Unopened circuit has strange path state %s. "
- "Circuit is a %s currently %s.%s",
- pathbias_state_to_string(circ->path_state),
- circuit_purpose_to_string(circ->base_.purpose),
- circuit_state_to_string(circ->base_.state),
- rate_msg);
- tor_free(rate_msg);
- }
- }
- } else {
- if ((rate_msg = rate_limit_log(&circ_attempt_notice_limit,
- approx_time()))) {
- log_info(LD_CIRC,
- "Unopened circuit has no known guard. "
- "Circuit is a %s currently %s.%s",
- circuit_purpose_to_string(circ->base_.purpose),
- circuit_state_to_string(circ->base_.state),
- rate_msg);
- tor_free(rate_msg);
- }
- }
- }
- }
-
- return 0;
-}
-
-/**
- * Check our circuit state to see if this is a successful circuit
- * completion. If so, record it in the current guard's path bias
- * success count.
- *
- * Also check for several potential error cases for bug #6475.
- */
-static void
-pathbias_count_build_success(origin_circuit_t *circ)
-{
-#define SUCCESS_NOTICE_INTERVAL (600)
- static ratelim_t success_notice_limit =
- RATELIM_INIT(SUCCESS_NOTICE_INTERVAL);
- char *rate_msg = NULL;
- entry_guard_t *guard = NULL;
-
- if (!pathbias_should_count(circ)) {
- return;
- }
-
- /* Don't count cannibalized/reused circs for path bias
- * "build" success, since they get counted under "use" success. */
- if (!circ->has_opened) {
- if (circ->cpath && circ->cpath->extend_info) {
- guard = entry_guard_get_by_id_digest(
- circ->cpath->extend_info->identity_digest);
- }
-
- if (guard) {
- if (circ->path_state == PATH_STATE_BUILD_ATTEMPTED) {
- circ->path_state = PATH_STATE_BUILD_SUCCEEDED;
- guard->circ_successes++;
- entry_guards_changed();
-
- log_info(LD_CIRC, "Got success count %f/%f for guard %s ($%s)",
- guard->circ_successes, guard->circ_attempts,
- guard->nickname, hex_str(guard->identity, DIGEST_LEN));
- } else {
- if ((rate_msg = rate_limit_log(&success_notice_limit,
- approx_time()))) {
- log_info(LD_BUG,
- "Succeeded circuit is in strange path state %s. "
- "Circuit is a %s currently %s.%s",
- pathbias_state_to_string(circ->path_state),
- circuit_purpose_to_string(circ->base_.purpose),
- circuit_state_to_string(circ->base_.state),
- rate_msg);
- tor_free(rate_msg);
- }
- }
-
- if (guard->circ_attempts < guard->circ_successes) {
- log_notice(LD_BUG, "Unexpectedly high successes counts (%f/%f) "
- "for guard %s ($%s)",
- guard->circ_successes, guard->circ_attempts,
- guard->nickname, hex_str(guard->identity, DIGEST_LEN));
- }
- /* In rare cases, CIRCUIT_PURPOSE_TESTING can get converted to
- * CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT and have no guards here.
- * No need to log that case. */
- } else if (circ->base_.purpose != CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) {
- if ((rate_msg = rate_limit_log(&success_notice_limit,
- approx_time()))) {
- log_info(LD_CIRC,
- "Completed circuit has no known guard. "
- "Circuit is a %s currently %s.%s",
- circuit_purpose_to_string(circ->base_.purpose),
- circuit_state_to_string(circ->base_.state),
- rate_msg);
- tor_free(rate_msg);
- }
- }
- } else {
- if (circ->path_state < PATH_STATE_BUILD_SUCCEEDED) {
- if ((rate_msg = rate_limit_log(&success_notice_limit,
- approx_time()))) {
- log_info(LD_BUG,
- "Opened circuit is in strange path state %s. "
- "Circuit is a %s currently %s.%s",
- pathbias_state_to_string(circ->path_state),
- circuit_purpose_to_string(circ->base_.purpose),
- circuit_state_to_string(circ->base_.state),
- rate_msg);
- tor_free(rate_msg);
- }
- }
- }
-}
-
-/**
- * Record an attempt to use a circuit. Changes the circuit's
- * path state and update its guard's usage counter.
- *
- * Used for path bias usage accounting.
- */
-void
-pathbias_count_use_attempt(origin_circuit_t *circ)
-{
- entry_guard_t *guard;
-
- if (!pathbias_should_count(circ)) {
- return;
- }
-
- if (circ->path_state < PATH_STATE_BUILD_SUCCEEDED) {
- log_notice(LD_BUG,
- "Used circuit is in strange path state %s. "
- "Circuit is a %s currently %s.",
- pathbias_state_to_string(circ->path_state),
- circuit_purpose_to_string(circ->base_.purpose),
- circuit_state_to_string(circ->base_.state));
- } else if (circ->path_state < PATH_STATE_USE_ATTEMPTED) {
- guard = entry_guard_get_by_id_digest(
- circ->cpath->extend_info->identity_digest);
- if (guard) {
- pathbias_measure_use_rate(guard);
- pathbias_scale_use_rates(guard);
- guard->use_attempts++;
- entry_guards_changed();
-
- log_debug(LD_CIRC,
- "Marked circuit %d (%f/%f) as used for guard %s ($%s).",
- circ->global_identifier,
- guard->use_successes, guard->use_attempts,
- guard->nickname, hex_str(guard->identity, DIGEST_LEN));
- }
-
- circ->path_state = PATH_STATE_USE_ATTEMPTED;
- } else {
- /* Harmless but educational log message */
- log_info(LD_CIRC,
- "Used circuit %d is already in path state %s. "
- "Circuit is a %s currently %s.",
- circ->global_identifier,
- pathbias_state_to_string(circ->path_state),
- circuit_purpose_to_string(circ->base_.purpose),
- circuit_state_to_string(circ->base_.state));
- }
-
- return;
-}
-
-/**
- * Check the circuit's path state is appropriate and mark it as
- * successfully used. Used for path bias usage accounting.
- *
- * We don't actually increment the guard's counters until
- * pathbias_check_close(), because the circuit can still transition
- * back to PATH_STATE_USE_ATTEMPTED if a stream fails later (this
- * is done so we can probe the circuit for liveness at close).
- */
-void
-pathbias_mark_use_success(origin_circuit_t *circ)
-{
- if (!pathbias_should_count(circ)) {
- return;
- }
-
- if (circ->path_state < PATH_STATE_USE_ATTEMPTED) {
- log_notice(LD_BUG,
- "Used circuit %d is in strange path state %s. "
- "Circuit is a %s currently %s.",
- circ->global_identifier,
- pathbias_state_to_string(circ->path_state),
- circuit_purpose_to_string(circ->base_.purpose),
- circuit_state_to_string(circ->base_.state));
-
- pathbias_count_use_attempt(circ);
- }
-
- /* We don't do any accounting at the guard until actual circuit close */
- circ->path_state = PATH_STATE_USE_SUCCEEDED;
-
- return;
-}
-
-/**
- * If a stream ever detatches from a circuit in a retriable way,
- * we need to mark this circuit as still needing either another
- * successful stream, or in need of a probe.
- *
- * An adversary could let the first stream request succeed (ie the
- * resolve), but then tag and timeout the remainder (via cell
- * dropping), forcing them on new circuits.
- *
- * Rolling back the state will cause us to probe such circuits, which
- * should lead to probe failures in the event of such tagging due to
- * either unrecognized cells coming in while we wait for the probe,
- * or the cipher state getting out of sync in the case of dropped cells.
- */
-void
-pathbias_mark_use_rollback(origin_circuit_t *circ)
-{
- if (circ->path_state == PATH_STATE_USE_SUCCEEDED) {
- log_info(LD_CIRC,
- "Rolling back pathbias use state to 'attempted' for detached "
- "circuit %d", circ->global_identifier);
- circ->path_state = PATH_STATE_USE_ATTEMPTED;
- }
-}
-
-/**
- * Actually count a circuit success towards a guard's usage counters
- * if the path state is appropriate.
- */
-static void
-pathbias_count_use_success(origin_circuit_t *circ)
-{
- entry_guard_t *guard;
-
- if (!pathbias_should_count(circ)) {
- return;
- }
-
- if (circ->path_state != PATH_STATE_USE_SUCCEEDED) {
- log_notice(LD_BUG,
- "Successfully used circuit %d is in strange path state %s. "
- "Circuit is a %s currently %s.",
- circ->global_identifier,
- pathbias_state_to_string(circ->path_state),
- circuit_purpose_to_string(circ->base_.purpose),
- circuit_state_to_string(circ->base_.state));
- } else {
- guard = entry_guard_get_by_id_digest(
- circ->cpath->extend_info->identity_digest);
- if (guard) {
- guard->use_successes++;
- entry_guards_changed();
-
- if (guard->use_attempts < guard->use_successes) {
- log_notice(LD_BUG, "Unexpectedly high use successes counts (%f/%f) "
- "for guard %s=%s",
- guard->use_successes, guard->use_attempts,
- guard->nickname, hex_str(guard->identity, DIGEST_LEN));
- }
-
- log_debug(LD_CIRC,
- "Marked circuit %d (%f/%f) as used successfully for guard "
- "%s ($%s).",
- circ->global_identifier, guard->use_successes,
- guard->use_attempts, guard->nickname,
- hex_str(guard->identity, DIGEST_LEN));
- }
- }
-
- return;
-}
-
-/**
- * Send a probe down a circuit that the client attempted to use,
- * but for which the stream timed out/failed. The probe is a
- * RELAY_BEGIN cell with a 0.a.b.c destination address, which
- * the exit will reject and reply back, echoing that address.
- *
- * The reason for such probes is because it is possible to bias
- * a user's paths simply by causing timeouts, and these timeouts
- * are not possible to differentiate from unresponsive servers.
- *
- * The probe is sent at the end of the circuit lifetime for two
- * reasons: to prevent cryptographic taggers from being able to
- * drop cells to cause timeouts, and to prevent easy recognition
- * of probes before any real client traffic happens.
- *
- * Returns -1 if we couldn't probe, 0 otherwise.
- */
-static int
-pathbias_send_usable_probe(circuit_t *circ)
-{
- /* Based on connection_ap_handshake_send_begin() */
- char payload[CELL_PAYLOAD_SIZE];
- int payload_len;
- origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ);
- crypt_path_t *cpath_layer = NULL;
- char *probe_nonce = NULL;
-
- tor_assert(ocirc);
-
- cpath_layer = ocirc->cpath->prev;
-
- if (cpath_layer->state != CPATH_STATE_OPEN) {
- /* This can happen for cannibalized circuits. Their
- * last hop isn't yet open */
- log_info(LD_CIRC,
- "Got pathbias probe request for unopened circuit %d. "
- "Opened %d, len %d", ocirc->global_identifier,
- ocirc->has_opened, ocirc->build_state->desired_path_len);
- return -1;
- }
-
- /* We already went down this road. */
- if (circ->purpose == CIRCUIT_PURPOSE_PATH_BIAS_TESTING &&
- ocirc->pathbias_probe_id) {
- log_info(LD_CIRC,
- "Got pathbias probe request for circuit %d with "
- "outstanding probe", ocirc->global_identifier);
- return -1;
- }
-
- /* Can't probe if the channel isn't open */
- if (circ->n_chan == NULL ||
- (circ->n_chan->state != CHANNEL_STATE_OPEN
- && circ->n_chan->state != CHANNEL_STATE_MAINT)) {
- log_info(LD_CIRC,
- "Skipping pathbias probe for circuit %d: Channel is not open.",
- ocirc->global_identifier);
- return -1;
- }
-
- circuit_change_purpose(circ, CIRCUIT_PURPOSE_PATH_BIAS_TESTING);
-
- /* Update timestamp for when circuit_expire_building() should kill us */
- tor_gettimeofday(&circ->timestamp_began);
-
- /* Generate a random address for the nonce */
- crypto_rand((char*)&ocirc->pathbias_probe_nonce,
- sizeof(ocirc->pathbias_probe_nonce));
- ocirc->pathbias_probe_nonce &= 0x00ffffff;
- probe_nonce = tor_dup_ip(ocirc->pathbias_probe_nonce);
-
- tor_snprintf(payload,RELAY_PAYLOAD_SIZE, "%s:25", probe_nonce);
- payload_len = (int)strlen(payload)+1;
-
- // XXX: need this? Can we assume ipv4 will always be supported?
- // If not, how do we tell?
- //if (payload_len <= RELAY_PAYLOAD_SIZE - 4 && edge_conn->begincell_flags) {
- // set_uint32(payload + payload_len, htonl(edge_conn->begincell_flags));
- // payload_len += 4;
- //}
-
- /* Generate+Store stream id, make sure it's non-zero */
- ocirc->pathbias_probe_id = get_unique_stream_id_by_circ(ocirc);
-
- if (ocirc->pathbias_probe_id==0) {
- log_warn(LD_CIRC,
- "Ran out of stream IDs on circuit %u during "
- "pathbias probe attempt.", ocirc->global_identifier);
- tor_free(probe_nonce);
- return -1;
- }
-
- log_info(LD_CIRC,
- "Sending pathbias testing cell to %s:25 on stream %d for circ %d.",
- probe_nonce, ocirc->pathbias_probe_id, ocirc->global_identifier);
- tor_free(probe_nonce);
-
- /* Send a test relay cell */
- if (relay_send_command_from_edge(ocirc->pathbias_probe_id, circ,
- RELAY_COMMAND_BEGIN, payload,
- payload_len, cpath_layer) < 0) {
- log_notice(LD_CIRC,
- "Failed to send pathbias probe cell on circuit %d.",
- ocirc->global_identifier);
- return -1;
- }
-
- /* Mark it freshly dirty so it doesn't get expired in the meantime */
- circ->timestamp_dirty = time(NULL);
-
- return 0;
-}
-
-/**
- * Check the response to a pathbias probe, to ensure the
- * cell is recognized and the nonce and other probe
- * characteristics are as expected.
- *
- * If the response is valid, return 0. Otherwise return < 0.
- */
-int
-pathbias_check_probe_response(circuit_t *circ, const cell_t *cell)
-{
- /* Based on connection_edge_process_relay_cell() */
- relay_header_t rh;
- int reason;
- uint32_t ipv4_host;
- origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ);
-
- tor_assert(cell);
- tor_assert(ocirc);
- tor_assert(circ->purpose == CIRCUIT_PURPOSE_PATH_BIAS_TESTING);
-
- relay_header_unpack(&rh, cell->payload);
-
- reason = rh.length > 0 ?
- get_uint8(cell->payload+RELAY_HEADER_SIZE) : END_STREAM_REASON_MISC;
-
- if (rh.command == RELAY_COMMAND_END &&
- reason == END_STREAM_REASON_EXITPOLICY &&
- ocirc->pathbias_probe_id == rh.stream_id) {
-
- /* Check length+extract host: It is in network order after the reason code.
- * See connection_edge_end(). */
- if (rh.length < 9) { /* reason+ipv4+dns_ttl */
- log_notice(LD_PROTOCOL,
- "Short path bias probe response length field (%d).", rh.length);
- return - END_CIRC_REASON_TORPROTOCOL;
- }
-
- ipv4_host = ntohl(get_uint32(cell->payload+RELAY_HEADER_SIZE+1));
-
- /* Check nonce */
- if (ipv4_host == ocirc->pathbias_probe_nonce) {
- pathbias_mark_use_success(ocirc);
- circuit_mark_for_close(circ, END_CIRC_REASON_FINISHED);
- log_info(LD_CIRC,
- "Got valid path bias probe back for circ %d, stream %d.",
- ocirc->global_identifier, ocirc->pathbias_probe_id);
- return 0;
- } else {
- log_notice(LD_CIRC,
- "Got strange probe value 0x%x vs 0x%x back for circ %d, "
- "stream %d.", ipv4_host, ocirc->pathbias_probe_nonce,
- ocirc->global_identifier, ocirc->pathbias_probe_id);
- return -1;
- }
- }
- log_info(LD_CIRC,
- "Got another cell back back on pathbias probe circuit %d: "
- "Command: %d, Reason: %d, Stream-id: %d",
- ocirc->global_identifier, rh.command, reason, rh.stream_id);
- return -1;
-}
-
-/**
- * Check if a circuit was used and/or closed successfully.
- *
- * If we attempted to use the circuit to carry a stream but failed
- * for whatever reason, or if the circuit mysteriously died before
- * we could attach any streams, record these two cases.
- *
- * If we *have* successfully used the circuit, or it appears to
- * have been closed by us locally, count it as a success.
- *
- * Returns 0 if we're done making decisions with the circ,
- * or -1 if we want to probe it first.
- */
-int
-pathbias_check_close(origin_circuit_t *ocirc, int reason)
-{
- circuit_t *circ = &ocirc->base_;
-
- if (!pathbias_should_count(ocirc)) {
- return 0;
- }
-
- switch (ocirc->path_state) {
- /* If the circuit was closed after building, but before use, we need
- * to ensure we were the ones who tried to close it (and not a remote
- * actor). */
- case PATH_STATE_BUILD_SUCCEEDED:
- if (reason & END_CIRC_REASON_FLAG_REMOTE) {
- /* Remote circ close reasons on an unused circuit all could be bias */
- log_info(LD_CIRC,
- "Circuit %d remote-closed without successful use for reason %d. "
- "Circuit purpose %d currently %d,%s. Len %d.",
- ocirc->global_identifier,
- reason, circ->purpose, ocirc->has_opened,
- circuit_state_to_string(circ->state),
- ocirc->build_state->desired_path_len);
- pathbias_count_collapse(ocirc);
- } else if ((reason & ~END_CIRC_REASON_FLAG_REMOTE)
- == END_CIRC_REASON_CHANNEL_CLOSED &&
- circ->n_chan &&
- circ->n_chan->reason_for_closing
- != CHANNEL_CLOSE_REQUESTED) {
- /* If we didn't close the channel ourselves, it could be bias */
- /* XXX: Only count bias if the network is live?
- * What about clock jumps/suspends? */
- log_info(LD_CIRC,
- "Circuit %d's channel closed without successful use for reason "
- "%d, channel reason %d. Circuit purpose %d currently %d,%s. Len "
- "%d.", ocirc->global_identifier,
- reason, circ->n_chan->reason_for_closing,
- circ->purpose, ocirc->has_opened,
- circuit_state_to_string(circ->state),
- ocirc->build_state->desired_path_len);
- pathbias_count_collapse(ocirc);
- } else {
- pathbias_count_successful_close(ocirc);
- }
- break;
-
- /* If we tried to use a circuit but failed, we should probe it to ensure
- * it has not been tampered with. */
- case PATH_STATE_USE_ATTEMPTED:
- /* XXX: Only probe and/or count failure if the network is live?
- * What about clock jumps/suspends? */
- if (pathbias_send_usable_probe(circ) == 0)
- return -1;
- else
- pathbias_count_use_failed(ocirc);
-
- /* Any circuit where there were attempted streams but no successful
- * streams could be bias */
- log_info(LD_CIRC,
- "Circuit %d closed without successful use for reason %d. "
- "Circuit purpose %d currently %d,%s. Len %d.",
- ocirc->global_identifier,
- reason, circ->purpose, ocirc->has_opened,
- circuit_state_to_string(circ->state),
- ocirc->build_state->desired_path_len);
- break;
-
- case PATH_STATE_USE_SUCCEEDED:
- pathbias_count_successful_close(ocirc);
- pathbias_count_use_success(ocirc);
- break;
-
- case PATH_STATE_USE_FAILED:
- pathbias_count_use_failed(ocirc);
- break;
-
- case PATH_STATE_NEW_CIRC:
- case PATH_STATE_BUILD_ATTEMPTED:
- case PATH_STATE_ALREADY_COUNTED:
- default:
- // Other states are uninteresting. No stats to count.
- break;
- }
-
- ocirc->path_state = PATH_STATE_ALREADY_COUNTED;
-
- return 0;
-}
-
-/**
- * Count a successfully closed circuit.
- */
-static void
-pathbias_count_successful_close(origin_circuit_t *circ)
-{
- entry_guard_t *guard = NULL;
- if (!pathbias_should_count(circ)) {
- return;
- }
-
- if (circ->cpath && circ->cpath->extend_info) {
- guard = entry_guard_get_by_id_digest(
- circ->cpath->extend_info->identity_digest);
- }
-
- if (guard) {
- /* In the long run: circuit_success ~= successful_circuit_close +
- * circ_failure + stream_failure */
- guard->successful_circuits_closed++;
- entry_guards_changed();
- } else if (circ->base_.purpose != CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) {
- /* In rare cases, CIRCUIT_PURPOSE_TESTING can get converted to
- * CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT and have no guards here.
- * No need to log that case. */
- log_info(LD_CIRC,
- "Successfully closed circuit has no known guard. "
- "Circuit is a %s currently %s",
- circuit_purpose_to_string(circ->base_.purpose),
- circuit_state_to_string(circ->base_.state));
- }
-}
-
-/**
- * Count a circuit that fails after it is built, but before it can
- * carry any traffic.
- *
- * This is needed because there are ways to destroy a
- * circuit after it has successfully completed. Right now, this is
- * used for purely informational/debugging purposes.
- */
-static void
-pathbias_count_collapse(origin_circuit_t *circ)
-{
- entry_guard_t *guard = NULL;
-
- if (!pathbias_should_count(circ)) {
- return;
- }
-
- if (circ->cpath && circ->cpath->extend_info) {
- guard = entry_guard_get_by_id_digest(
- circ->cpath->extend_info->identity_digest);
- }
-
- if (guard) {
- guard->collapsed_circuits++;
- entry_guards_changed();
- } else if (circ->base_.purpose != CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) {
- /* In rare cases, CIRCUIT_PURPOSE_TESTING can get converted to
- * CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT and have no guards here.
- * No need to log that case. */
- log_info(LD_CIRC,
- "Destroyed circuit has no known guard. "
- "Circuit is a %s currently %s",
- circuit_purpose_to_string(circ->base_.purpose),
- circuit_state_to_string(circ->base_.state));
- }
-}
-
-/**
- * Count a known failed circuit (because we could not probe it).
- *
- * This counter is informational.
- */
-static void
-pathbias_count_use_failed(origin_circuit_t *circ)
-{
- entry_guard_t *guard = NULL;
- if (!pathbias_should_count(circ)) {
- return;
- }
-
- if (circ->cpath && circ->cpath->extend_info) {
- guard = entry_guard_get_by_id_digest(
- circ->cpath->extend_info->identity_digest);
- }
-
- if (guard) {
- guard->unusable_circuits++;
- entry_guards_changed();
- } else if (circ->base_.purpose != CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) {
- /* In rare cases, CIRCUIT_PURPOSE_TESTING can get converted to
- * CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT and have no guards here.
- * No need to log that case. */
- /* XXX note cut-and-paste code in this function compared to nearby
- * functions. Would be nice to refactor. -RD */
- log_info(LD_CIRC,
- "Stream-failing circuit has no known guard. "
- "Circuit is a %s currently %s",
- circuit_purpose_to_string(circ->base_.purpose),
- circuit_state_to_string(circ->base_.state));
- }
-}
-
-/**
- * Count timeouts for path bias log messages.
- *
- * These counts are purely informational.
- */
-void
-pathbias_count_timeout(origin_circuit_t *circ)
-{
- entry_guard_t *guard = NULL;
-
- if (!pathbias_should_count(circ)) {
- return;
- }
-
- /* For hidden service circs, they can actually be used
- * successfully and then time out later (because
- * the other side declines to use them). */
- if (circ->path_state == PATH_STATE_USE_SUCCEEDED) {
- return;
- }
-
- if (circ->cpath && circ->cpath->extend_info) {
- guard = entry_guard_get_by_id_digest(
- circ->cpath->extend_info->identity_digest);
- }
-
- if (guard) {
- guard->timeouts++;
- entry_guards_changed();
- }
-}
-
-/**
- * Helper function to count all of the currently opened circuits
- * for a guard that are in a given path state range. The state
- * range is inclusive on both ends.
- */
-static int
-pathbias_count_circs_in_states(entry_guard_t *guard,
- path_state_t from,
- path_state_t to)
-{
- circuit_t *circ;
- int open_circuits = 0;
-
- /* Count currently open circuits. Give them the benefit of the doubt. */
- for (circ = global_circuitlist; circ; circ = circ->next) {
- origin_circuit_t *ocirc = NULL;
- if (!CIRCUIT_IS_ORIGIN(circ) || /* didn't originate here */
- circ->marked_for_close) /* already counted */
- continue;
-
- ocirc = TO_ORIGIN_CIRCUIT(circ);
-
- if (!ocirc->cpath || !ocirc->cpath->extend_info)
- continue;
-
- if (ocirc->path_state >= from &&
- ocirc->path_state <= to &&
- pathbias_should_count(ocirc) &&
- fast_memeq(guard->identity,
- ocirc->cpath->extend_info->identity_digest,
- DIGEST_LEN)) {
- log_debug(LD_CIRC, "Found opened circuit %d in path_state %s",
- ocirc->global_identifier,
- pathbias_state_to_string(ocirc->path_state));
- open_circuits++;
- }
- }
-
- return open_circuits;
-}
-
-/**
- * Return the number of circuits counted as successfully closed for
- * this guard.
- *
- * Also add in the currently open circuits to give them the benefit
- * of the doubt.
- */
-double
-pathbias_get_close_success_count(entry_guard_t *guard)
-{
- return guard->successful_circuits_closed +
- pathbias_count_circs_in_states(guard,
- PATH_STATE_BUILD_SUCCEEDED,
- PATH_STATE_USE_SUCCEEDED);
-}
-
-/**
- * Return the number of circuits counted as successfully used
- * this guard.
- *
- * Also add in the currently open circuits that we are attempting
- * to use to give them the benefit of the doubt.
- */
-double
-pathbias_get_use_success_count(entry_guard_t *guard)
-{
- return guard->use_successes +
- pathbias_count_circs_in_states(guard,
- PATH_STATE_USE_ATTEMPTED,
- PATH_STATE_USE_SUCCEEDED);
-}
-
-/**
- * Check the path bias use rate against our consensus parameter limits.
- *
- * Emits a log message if the use success rates are too low.
- *
- * If pathbias_get_dropguards() is set, we also disable the use of
- * very failure prone guards.
- */
-static void
-pathbias_measure_use_rate(entry_guard_t *guard)
-{
- const or_options_t *options = get_options();
-
- if (guard->use_attempts > pathbias_get_min_use(options)) {
- /* Note: We rely on the < comparison here to allow us to set a 0
- * rate and disable the feature entirely. If refactoring, don't
- * change to <= */
- if (pathbias_get_use_success_count(guard)/guard->use_attempts
- < pathbias_get_extreme_use_rate(options)) {
- /* Dropping is currently disabled by default. */
- if (pathbias_get_dropguards(options)) {
- if (!guard->path_bias_disabled) {
- log_warn(LD_CIRC,
- "Your Guard %s ($%s) is failing to carry an extremely large "
- "amount of stream on its circuits. "
- "To avoid potential route manipulation attacks, Tor has "
- "disabled use of this guard. "
- "Use counts are %ld/%ld. Success counts are %ld/%ld. "
- "%ld circuits completed, %ld were unusable, %ld collapsed, "
- "and %ld timed out. "
- "For reference, your timeout cutoff is %ld seconds.",
- guard->nickname, hex_str(guard->identity, DIGEST_LEN),
- tor_lround(pathbias_get_use_success_count(guard)),
- tor_lround(guard->use_attempts),
- tor_lround(pathbias_get_close_success_count(guard)),
- tor_lround(guard->circ_attempts),
- tor_lround(guard->circ_successes),
- tor_lround(guard->unusable_circuits),
- tor_lround(guard->collapsed_circuits),
- tor_lround(guard->timeouts),
- tor_lround(circ_times.close_ms/1000));
- guard->path_bias_disabled = 1;
- guard->bad_since = approx_time();
- entry_guards_changed();
- return;
- }
- } else if (!guard->path_bias_use_extreme) {
- guard->path_bias_use_extreme = 1;
- log_warn(LD_CIRC,
- "Your Guard %s ($%s) is failing to carry an extremely large "
- "amount of streams on its circuits. "
- "This could indicate a route manipulation attack, network "
- "overload, bad local network connectivity, or a bug. "
- "Use counts are %ld/%ld. Success counts are %ld/%ld. "
- "%ld circuits completed, %ld were unusable, %ld collapsed, "
- "and %ld timed out. "
- "For reference, your timeout cutoff is %ld seconds.",
- guard->nickname, hex_str(guard->identity, DIGEST_LEN),
- tor_lround(pathbias_get_use_success_count(guard)),
- tor_lround(guard->use_attempts),
- tor_lround(pathbias_get_close_success_count(guard)),
- tor_lround(guard->circ_attempts),
- tor_lround(guard->circ_successes),
- tor_lround(guard->unusable_circuits),
- tor_lround(guard->collapsed_circuits),
- tor_lround(guard->timeouts),
- tor_lround(circ_times.close_ms/1000));
- }
- } else if (pathbias_get_use_success_count(guard)/guard->use_attempts
- < pathbias_get_notice_use_rate(options)) {
- if (!guard->path_bias_use_noticed) {
- guard->path_bias_use_noticed = 1;
- log_notice(LD_CIRC,
- "Your Guard %s ($%s) is failing to carry more streams on its "
- "circuits than usual. "
- "Most likely this means the Tor network is overloaded "
- "or your network connection is poor. "
- "Use counts are %ld/%ld. Success counts are %ld/%ld. "
- "%ld circuits completed, %ld were unusable, %ld collapsed, "
- "and %ld timed out. "
- "For reference, your timeout cutoff is %ld seconds.",
- guard->nickname, hex_str(guard->identity, DIGEST_LEN),
- tor_lround(pathbias_get_use_success_count(guard)),
- tor_lround(guard->use_attempts),
- tor_lround(pathbias_get_close_success_count(guard)),
- tor_lround(guard->circ_attempts),
- tor_lround(guard->circ_successes),
- tor_lround(guard->unusable_circuits),
- tor_lround(guard->collapsed_circuits),
- tor_lround(guard->timeouts),
- tor_lround(circ_times.close_ms/1000));
- }
- }
- }
-}
-
-/**
- * Check the path bias circuit close status rates against our consensus
- * parameter limits.
- *
- * Emits a log message if the use success rates are too low.
- *
- * If pathbias_get_dropguards() is set, we also disable the use of
- * very failure prone guards.
- *
- * XXX: This function shares similar log messages and checks to
- * pathbias_measure_use_rate(). It may be possible to combine them
- * eventually, especially if we can ever remove the need for 3
- * levels of closure warns (if the overall circuit failure rate
- * goes down with ntor). One way to do so would be to multiply
- * the build rate with the use rate to get an idea of the total
- * fraction of the total network paths the user is able to use.
- * See ticket #8159.
- */
-static void
-pathbias_measure_close_rate(entry_guard_t *guard)
-{
- const or_options_t *options = get_options();
-
- if (guard->circ_attempts > pathbias_get_min_circs(options)) {
- /* Note: We rely on the < comparison here to allow us to set a 0
- * rate and disable the feature entirely. If refactoring, don't
- * change to <= */
- if (pathbias_get_close_success_count(guard)/guard->circ_attempts
- < pathbias_get_extreme_rate(options)) {
- /* Dropping is currently disabled by default. */
- if (pathbias_get_dropguards(options)) {
- if (!guard->path_bias_disabled) {
- log_warn(LD_CIRC,
- "Your Guard %s ($%s) is failing an extremely large "
- "amount of circuits. "
- "To avoid potential route manipulation attacks, Tor has "
- "disabled use of this guard. "
- "Success counts are %ld/%ld. Use counts are %ld/%ld. "
- "%ld circuits completed, %ld were unusable, %ld collapsed, "
- "and %ld timed out. "
- "For reference, your timeout cutoff is %ld seconds.",
- guard->nickname, hex_str(guard->identity, DIGEST_LEN),
- tor_lround(pathbias_get_close_success_count(guard)),
- tor_lround(guard->circ_attempts),
- tor_lround(pathbias_get_use_success_count(guard)),
- tor_lround(guard->use_attempts),
- tor_lround(guard->circ_successes),
- tor_lround(guard->unusable_circuits),
- tor_lround(guard->collapsed_circuits),
- tor_lround(guard->timeouts),
- tor_lround(circ_times.close_ms/1000));
- guard->path_bias_disabled = 1;
- guard->bad_since = approx_time();
- entry_guards_changed();
- return;
- }
- } else if (!guard->path_bias_extreme) {
- guard->path_bias_extreme = 1;
- log_warn(LD_CIRC,
- "Your Guard %s ($%s) is failing an extremely large "
- "amount of circuits. "
- "This could indicate a route manipulation attack, "
- "extreme network overload, or a bug. "
- "Success counts are %ld/%ld. Use counts are %ld/%ld. "
- "%ld circuits completed, %ld were unusable, %ld collapsed, "
- "and %ld timed out. "
- "For reference, your timeout cutoff is %ld seconds.",
- guard->nickname, hex_str(guard->identity, DIGEST_LEN),
- tor_lround(pathbias_get_close_success_count(guard)),
- tor_lround(guard->circ_attempts),
- tor_lround(pathbias_get_use_success_count(guard)),
- tor_lround(guard->use_attempts),
- tor_lround(guard->circ_successes),
- tor_lround(guard->unusable_circuits),
- tor_lround(guard->collapsed_circuits),
- tor_lround(guard->timeouts),
- tor_lround(circ_times.close_ms/1000));
- }
- } else if (pathbias_get_close_success_count(guard)/guard->circ_attempts
- < pathbias_get_warn_rate(options)) {
- if (!guard->path_bias_warned) {
- guard->path_bias_warned = 1;
- log_warn(LD_CIRC,
- "Your Guard %s ($%s) is failing a very large "
- "amount of circuits. "
- "Most likely this means the Tor network is "
- "overloaded, but it could also mean an attack against "
- "you or potentially the guard itself. "
- "Success counts are %ld/%ld. Use counts are %ld/%ld. "
- "%ld circuits completed, %ld were unusable, %ld collapsed, "
- "and %ld timed out. "
- "For reference, your timeout cutoff is %ld seconds.",
- guard->nickname, hex_str(guard->identity, DIGEST_LEN),
- tor_lround(pathbias_get_close_success_count(guard)),
- tor_lround(guard->circ_attempts),
- tor_lround(pathbias_get_use_success_count(guard)),
- tor_lround(guard->use_attempts),
- tor_lround(guard->circ_successes),
- tor_lround(guard->unusable_circuits),
- tor_lround(guard->collapsed_circuits),
- tor_lround(guard->timeouts),
- tor_lround(circ_times.close_ms/1000));
- }
- } else if (pathbias_get_close_success_count(guard)/guard->circ_attempts
- < pathbias_get_notice_rate(options)) {
- if (!guard->path_bias_noticed) {
- guard->path_bias_noticed = 1;
- log_notice(LD_CIRC,
- "Your Guard %s ($%s) is failing more circuits than "
- "usual. "
- "Most likely this means the Tor network is overloaded. "
- "Success counts are %ld/%ld. Use counts are %ld/%ld. "
- "%ld circuits completed, %ld were unusable, %ld collapsed, "
- "and %ld timed out. "
- "For reference, your timeout cutoff is %ld seconds.",
- guard->nickname, hex_str(guard->identity, DIGEST_LEN),
- tor_lround(pathbias_get_close_success_count(guard)),
- tor_lround(guard->circ_attempts),
- tor_lround(pathbias_get_use_success_count(guard)),
- tor_lround(guard->use_attempts),
- tor_lround(guard->circ_successes),
- tor_lround(guard->unusable_circuits),
- tor_lround(guard->collapsed_circuits),
- tor_lround(guard->timeouts),
- tor_lround(circ_times.close_ms/1000));
- }
- }
- }
-}
-
-/**
- * This function scales the path bias use rates if we have
- * more data than the scaling threshold. This allows us to
- * be more sensitive to recent measurements.
- *
- * XXX: The attempt count transfer stuff here might be done
- * better by keeping separate pending counters that get
- * transfered at circuit close. See ticket #8160.
- */
-static void
-pathbias_scale_close_rates(entry_guard_t *guard)
-{
- const or_options_t *options = get_options();
-
- /* If we get a ton of circuits, just scale everything down */
- if (guard->circ_attempts > pathbias_get_scale_threshold(options)) {
- double scale_ratio = pathbias_get_scale_ratio(options);
- int opened_attempts = pathbias_count_circs_in_states(guard,
- PATH_STATE_BUILD_ATTEMPTED, PATH_STATE_BUILD_ATTEMPTED);
- int opened_built = pathbias_count_circs_in_states(guard,
- PATH_STATE_BUILD_SUCCEEDED,
- PATH_STATE_USE_FAILED);
- /* Verify that the counts are sane before and after scaling */
- int counts_are_sane = (guard->circ_attempts >= guard->circ_successes);
-
- guard->circ_attempts -= (opened_attempts+opened_built);
- guard->circ_successes -= opened_built;
-
- guard->circ_attempts *= scale_ratio;
- guard->circ_successes *= scale_ratio;
- guard->timeouts *= scale_ratio;
- guard->successful_circuits_closed *= scale_ratio;
- guard->collapsed_circuits *= scale_ratio;
- guard->unusable_circuits *= scale_ratio;
-
- guard->circ_attempts += (opened_attempts+opened_built);
- guard->circ_successes += opened_built;
-
- entry_guards_changed();
-
- log_info(LD_CIRC,
- "Scaled pathbias counts to (%f,%f)/%f (%d/%d open) for guard "
- "%s ($%s)",
- guard->circ_successes, guard->successful_circuits_closed,
- guard->circ_attempts, opened_built, opened_attempts,
- guard->nickname, hex_str(guard->identity, DIGEST_LEN));
-
- /* Have the counts just become invalid by this scaling attempt? */
- if (counts_are_sane && guard->circ_attempts < guard->circ_successes) {
- log_notice(LD_BUG,
- "Scaling has mangled pathbias counts to %f/%f (%d/%d open) "
- "for guard %s ($%s)",
- guard->circ_successes, guard->circ_attempts, opened_built,
- opened_attempts, guard->nickname,
- hex_str(guard->identity, DIGEST_LEN));
- }
- }
-}
-
-/**
- * This function scales the path bias circuit close rates if we have
- * more data than the scaling threshold. This allows us to be more
- * sensitive to recent measurements.
- *
- * XXX: The attempt count transfer stuff here might be done
- * better by keeping separate pending counters that get
- * transfered at circuit close. See ticket #8160.
- */
-void
-pathbias_scale_use_rates(entry_guard_t *guard)
-{
- const or_options_t *options = get_options();
-
- /* If we get a ton of circuits, just scale everything down */
- if (guard->use_attempts > pathbias_get_scale_use_threshold(options)) {
- double scale_ratio = pathbias_get_scale_ratio(options);
- int opened_attempts = pathbias_count_circs_in_states(guard,
- PATH_STATE_USE_ATTEMPTED, PATH_STATE_USE_SUCCEEDED);
- /* Verify that the counts are sane before and after scaling */
- int counts_are_sane = (guard->use_attempts >= guard->use_successes);
-
- guard->use_attempts -= opened_attempts;
-
- guard->use_attempts *= scale_ratio;
- guard->use_successes *= scale_ratio;
-
- guard->use_attempts += opened_attempts;
-
- log_info(LD_CIRC,
- "Scaled pathbias use counts to %f/%f (%d open) for guard %s ($%s)",
- guard->use_successes, guard->use_attempts, opened_attempts,
- guard->nickname, hex_str(guard->identity, DIGEST_LEN));
-
- /* Have the counts just become invalid by this scaling attempt? */
- if (counts_are_sane && guard->use_attempts < guard->use_successes) {
- log_notice(LD_BUG,
- "Scaling has mangled pathbias usage counts to %f/%f "
- "(%d open) for guard %s ($%s)",
- guard->circ_successes, guard->circ_attempts,
- opened_attempts, guard->nickname,
- hex_str(guard->identity, DIGEST_LEN));
- }
-
- entry_guards_changed();
- }
-}
-
-/** Increment the number of times we successfully extended a circuit to
- * <b>guard</b>, first checking if the failure rate is high enough that
- * we should eliminate the guard. Return -1 if the guard looks no good;
- * return 0 if the guard looks fine.
- */
-static int
-entry_guard_inc_circ_attempt_count(entry_guard_t *guard)
-{
- entry_guards_changed();
-
- pathbias_measure_close_rate(guard);
-
- if (guard->path_bias_disabled)
- return -1;
-
- pathbias_scale_close_rates(guard);
- guard->circ_attempts++;
-
- log_info(LD_CIRC, "Got success count %f/%f for guard %s ($%s)",
- guard->circ_successes, guard->circ_attempts, guard->nickname,
- hex_str(guard->identity, DIGEST_LEN));
- return 0;
-}
-
/** A "created" cell <b>reply</b> came back to us on circuit <b>circ</b>.
* (The body of <b>reply</b> varies depending on what sort of handshake
* this is.)
@@ -2821,11 +1345,7 @@ onionskin_answer(or_circuit_t *circ,
* number of endpoints that would give something away about our destination.
*
* If the routerlist <b>nodes</b> doesn't have enough routers
- * to handle the desired path length, return as large a path length as
- * is feasible, except if it's less than 2, in which case return -1.
- * XXX ^^ I think this behavior is a hold-over from back when we had only a
- * few relays in the network, and certainly back before guards existed.
- * We should very likely get rid of it. -RD
+ * to handle the desired path length, return -1.
*/
static int
new_route_len(uint8_t purpose, extend_info_t *exit, smartlist_t *nodes)
@@ -2846,19 +1366,13 @@ new_route_len(uint8_t purpose, extend_info_t *exit, smartlist_t *nodes)
log_debug(LD_CIRC,"Chosen route length %d (%d/%d routers suitable).",
routelen, num_acceptable_routers, smartlist_len(nodes));
- if (num_acceptable_routers < 2) {
+ if (num_acceptable_routers < routelen) {
log_info(LD_CIRC,
- "Not enough acceptable routers (%d). Discarding this circuit.",
- num_acceptable_routers);
+ "Not enough acceptable routers (%d/%d). Discarding this circuit.",
+ num_acceptable_routers, routelen);
return -1;
}
- if (num_acceptable_routers < routelen) {
- log_info(LD_CIRC,"Not enough routers: cutting routelen from %d to %d.",
- routelen, num_acceptable_routers);
- routelen = num_acceptable_routers;
- }
-
return routelen;
}
diff --git a/src/or/circuitbuild.h b/src/or/circuitbuild.h
index a3091707e..71caea94e 100644
--- a/src/or/circuitbuild.h
+++ b/src/or/circuitbuild.h
@@ -57,16 +57,10 @@ const char *build_state_get_exit_nickname(cpath_build_state_t *state);
const node_t *choose_good_entry_server(uint8_t purpose,
cpath_build_state_t *state);
-double pathbias_get_extreme_rate(const or_options_t *options);
-double pathbias_get_extreme_use_rate(const or_options_t *options);
-int pathbias_get_dropguards(const or_options_t *options);
-void pathbias_count_timeout(origin_circuit_t *circ);
-int pathbias_check_close(origin_circuit_t *circ, int reason);
-int pathbias_check_probe_response(circuit_t *circ, const cell_t *cell);
-void pathbias_count_use_attempt(origin_circuit_t *circ);
-void pathbias_mark_use_success(origin_circuit_t *circ);
-void pathbias_mark_use_rollback(origin_circuit_t *circ);
-const char *pathbias_state_to_string(path_state_t state);
+
+#ifdef CIRCUITBUILD_PRIVATE
+STATIC circid_t get_unique_circ_id_by_chan(channel_t *chan);
+#endif
#endif
diff --git a/src/or/circuitlist.c b/src/or/circuitlist.c
index 3cb429be1..0140afcd7 100644
--- a/src/or/circuitlist.c
+++ b/src/or/circuitlist.c
@@ -8,9 +8,10 @@
* \file circuitlist.c
* \brief Manage the global circuit list.
**/
-
+#define CIRCUITLIST_PRIVATE
#include "or.h"
#include "channel.h"
+#include "circpathbias.h"
#include "circuitbuild.h"
#include "circuitlist.h"
#include "circuituse.h"
@@ -31,20 +32,23 @@
#include "rephist.h"
#include "routerlist.h"
#include "routerset.h"
+
#include "ht.h"
/********* START VARIABLES **********/
/** A global list of all circuits at this hop. */
-circuit_t *global_circuitlist=NULL;
+struct global_circuitlist_s global_circuitlist =
+ TOR_LIST_HEAD_INITIALIZER(global_circuitlist);
/** A list of all the circuits in CIRCUIT_STATE_CHAN_WAIT. */
static smartlist_t *circuits_pending_chans = NULL;
-static void circuit_free(circuit_t *circ);
-static void circuit_free_cpath(crypt_path_t *cpath);
static void circuit_free_cpath_node(crypt_path_t *victim);
static void cpath_ref_decref(crypt_path_reference_t *cpath_ref);
+//static void circuit_set_rend_token(or_circuit_t *circ, int is_rend_circ,
+// const uint8_t *token);
+static void circuit_clear_rend_token(or_circuit_t *circ);
/********* END VARIABLES ************/
@@ -72,7 +76,15 @@ chan_circid_entries_eq_(chan_circid_circuit_map_t *a,
static INLINE unsigned int
chan_circid_entry_hash_(chan_circid_circuit_map_t *a)
{
- return ((unsigned)a->circ_id) ^ (unsigned)(uintptr_t)(a->chan);
+ /* Try to squeze the siphash input into 8 bytes to save any extra siphash
+ * rounds. This hash function is in the critical path. */
+ uintptr_t chan = (uintptr_t) (void*) a->chan;
+ uint32_t array[2];
+ array[0] = a->circ_id;
+ /* The low bits of the channel pointer are uninteresting, since the channel
+ * is a pretty big structure. */
+ array[1] = (uint32_t) (chan >> 6);
+ return (unsigned) siphash24g(array, sizeof(array));
}
/** Map from [chan,circid] to circuit. */
@@ -207,21 +219,126 @@ circuit_set_circid_chan_helper(circuit_t *circ, int direction,
}
}
+/** Mark that circuit id <b>id</b> shouldn't be used on channel <b>chan</b>,
+ * even if there is no circuit on the channel. We use this to keep the
+ * circuit id from getting re-used while we have queued but not yet sent
+ * a destroy cell. */
+void
+channel_mark_circid_unusable(channel_t *chan, circid_t id)
+{
+ chan_circid_circuit_map_t search;
+ chan_circid_circuit_map_t *ent;
+
+ /* See if there's an entry there. That wouldn't be good. */
+ memset(&search, 0, sizeof(search));
+ search.chan = chan;
+ search.circ_id = id;
+ ent = HT_FIND(chan_circid_map, &chan_circid_map, &search);
+
+ if (ent && ent->circuit) {
+ /* we have a problem. */
+ log_warn(LD_BUG, "Tried to mark %u unusable on %p, but there was already "
+ "a circuit there.", (unsigned)id, chan);
+ } else if (ent) {
+ /* It's already marked. */
+ } else {
+ ent = tor_malloc_zero(sizeof(chan_circid_circuit_map_t));
+ ent->chan = chan;
+ ent->circ_id = id;
+ /* leave circuit at NULL */
+ HT_INSERT(chan_circid_map, &chan_circid_map, ent);
+ }
+}
+
+/** Mark that a circuit id <b>id</b> can be used again on <b>chan</b>.
+ * We use this to re-enable the circuit ID after we've sent a destroy cell.
+ */
+void
+channel_mark_circid_usable(channel_t *chan, circid_t id)
+{
+ chan_circid_circuit_map_t search;
+ chan_circid_circuit_map_t *ent;
+
+ /* See if there's an entry there. That wouldn't be good. */
+ memset(&search, 0, sizeof(search));
+ search.chan = chan;
+ search.circ_id = id;
+ ent = HT_REMOVE(chan_circid_map, &chan_circid_map, &search);
+ if (ent && ent->circuit) {
+ log_warn(LD_BUG, "Tried to mark %u usable on %p, but there was already "
+ "a circuit there.", (unsigned)id, chan);
+ return;
+ }
+ if (_last_circid_chan_ent == ent)
+ _last_circid_chan_ent = NULL;
+ tor_free(ent);
+}
+
+/** Called to indicate that a DESTROY is pending on <b>chan</b> with
+ * circuit ID <b>id</b>, but hasn't been sent yet. */
+void
+channel_note_destroy_pending(channel_t *chan, circid_t id)
+{
+ circuit_t *circ = circuit_get_by_circid_channel_even_if_marked(id,chan);
+ if (circ) {
+ if (circ->n_chan == chan && circ->n_circ_id == id) {
+ circ->n_delete_pending = 1;
+ } else {
+ or_circuit_t *orcirc = TO_OR_CIRCUIT(circ);
+ if (orcirc->p_chan == chan && orcirc->p_circ_id == id) {
+ circ->p_delete_pending = 1;
+ }
+ }
+ return;
+ }
+ channel_mark_circid_unusable(chan, id);
+}
+
+/** Called to indicate that a DESTROY is no longer pending on <b>chan</b> with
+ * circuit ID <b>id</b> -- typically, because it has been sent. */
+void
+channel_note_destroy_not_pending(channel_t *chan, circid_t id)
+{
+ circuit_t *circ = circuit_get_by_circid_channel_even_if_marked(id,chan);
+ if (circ) {
+ if (circ->n_chan == chan && circ->n_circ_id == id) {
+ circ->n_delete_pending = 0;
+ } else {
+ or_circuit_t *orcirc = TO_OR_CIRCUIT(circ);
+ if (orcirc->p_chan == chan && orcirc->p_circ_id == id) {
+ circ->p_delete_pending = 0;
+ }
+ }
+ /* XXXX this shouldn't happen; log a bug here. */
+ return;
+ }
+ channel_mark_circid_usable(chan, id);
+}
+
/** Set the p_conn field of a circuit <b>circ</b>, along
* with the corresponding circuit ID, and add the circuit as appropriate
* to the (chan,id)-\>circuit map. */
void
-circuit_set_p_circid_chan(or_circuit_t *circ, circid_t id,
+circuit_set_p_circid_chan(or_circuit_t *or_circ, circid_t id,
channel_t *chan)
{
- circuit_set_circid_chan_helper(TO_CIRCUIT(circ), CELL_DIRECTION_IN,
- id, chan);
+ circuit_t *circ = TO_CIRCUIT(or_circ);
+ channel_t *old_chan = or_circ->p_chan;
+ circid_t old_id = or_circ->p_circ_id;
+
+ circuit_set_circid_chan_helper(circ, CELL_DIRECTION_IN, id, chan);
if (chan) {
- tor_assert(bool_eq(circ->p_chan_cells.n, circ->next_active_on_p_chan));
+ tor_assert(bool_eq(or_circ->p_chan_cells.n,
+ or_circ->next_active_on_p_chan));
chan->timestamp_last_had_circuits = approx_time();
}
+
+ if (circ->p_delete_pending && old_chan) {
+ channel_mark_circid_unusable(old_chan, old_id);
+ circ->p_delete_pending = 0;
+ }
}
/** Set the n_conn field of a circuit <b>circ</b>, along
@@ -231,6 +348,9 @@ void
circuit_set_n_circid_chan(circuit_t *circ, circid_t id,
channel_t *chan)
{
+ channel_t *old_chan = circ->n_chan;
+ circid_t old_id = circ->n_circ_id;
+
circuit_set_circid_chan_helper(circ, CELL_DIRECTION_OUT, id, chan);
if (chan) {
@@ -238,6 +358,11 @@ circuit_set_n_circid_chan(circuit_t *circ, circid_t id,
chan->timestamp_last_had_circuits = approx_time();
}
+
+ if (circ->n_delete_pending && old_chan) {
+ channel_mark_circid_unusable(old_chan, old_id);
+ circ->n_delete_pending = 0;
+ }
}
/** Change the state of <b>circ</b> to <b>state</b>, adding it to or removing
@@ -263,21 +388,6 @@ circuit_set_state(circuit_t *circ, uint8_t state)
circ->state = state;
}
-/** Add <b>circ</b> to the global list of circuits. This is called only from
- * within circuit_new.
- */
-static void
-circuit_add(circuit_t *circ)
-{
- if (!global_circuitlist) { /* first one */
- global_circuitlist = circ;
- circ->next = NULL;
- } else {
- circ->next = global_circuitlist;
- global_circuitlist = circ;
- }
-}
-
/** Append to <b>out</b> all circuits in state CHAN_WAIT waiting for
* the given connection. */
void
@@ -335,33 +445,17 @@ circuit_count_pending_on_channel(channel_t *chan)
void
circuit_close_all_marked(void)
{
- circuit_t *tmp,*m;
-
- while (global_circuitlist && global_circuitlist->marked_for_close) {
- tmp = global_circuitlist->next;
- circuit_free(global_circuitlist);
- global_circuitlist = tmp;
- }
-
- tmp = global_circuitlist;
- while (tmp && tmp->next) {
- if (tmp->next->marked_for_close) {
- m = tmp->next->next;
- circuit_free(tmp->next);
- tmp->next = m;
- /* Need to check new tmp->next; don't advance tmp. */
- } else {
- /* Advance tmp. */
- tmp = tmp->next;
- }
- }
+ circuit_t *circ, *tmp;
+ TOR_LIST_FOREACH_SAFE(circ, &global_circuitlist, head, tmp)
+ if (circ->marked_for_close)
+ circuit_free(circ);
}
/** Return the head of the global linked list of circuits. */
-circuit_t *
-circuit_get_global_list_(void)
+MOCK_IMPL(struct global_circuitlist_s *,
+circuit_get_global_list,(void))
{
- return global_circuitlist;
+ return &global_circuitlist;
}
/** Function to make circ-\>state human-readable */
@@ -576,8 +670,9 @@ init_circuit_base(circuit_t *circ)
circ->package_window = circuit_initial_package_window();
circ->deliver_window = CIRCWINDOW_START;
+ cell_queue_init(&circ->n_chan_cells);
- circuit_add(circ);
+ TOR_LIST_INSERT_HEAD(&global_circuitlist, circ, head);
}
/** Allocate space for a new circuit, initializing with <b>p_circ_id</b>
@@ -601,7 +696,7 @@ origin_circuit_new(void)
init_circuit_base(TO_CIRCUIT(circ));
- circ_times.last_circ_at = approx_time();
+ circuit_build_times_update_last_circ(get_circuit_build_times_mutable());
return circ;
}
@@ -621,6 +716,7 @@ or_circuit_new(circid_t p_circ_id, channel_t *p_chan)
circuit_set_p_circid_chan(circ, p_circ_id, p_chan);
circ->remaining_relay_early_cells = MAX_RELAY_EARLY_CELLS_PER_CIRCUIT;
+ cell_queue_init(&circ->p_chan_cells);
init_circuit_base(TO_CIRCUIT(circ));
@@ -629,7 +725,7 @@ or_circuit_new(circid_t p_circ_id, channel_t *p_chan)
/** Deallocate space associated with circ.
*/
-static void
+STATIC void
circuit_free(circuit_t *circ)
{
void *mem;
@@ -649,7 +745,7 @@ circuit_free(circuit_t *circ)
}
tor_free(ocirc->build_state);
- circuit_free_cpath(ocirc->cpath);
+ circuit_clear_cpath(ocirc);
crypto_pk_free(ocirc->intro_key);
rend_data_free(ocirc->rend_data);
@@ -678,6 +774,8 @@ circuit_free(circuit_t *circ)
crypto_cipher_free(ocirc->n_crypto);
crypto_digest_free(ocirc->n_digest);
+ circuit_clear_rend_token(ocirc);
+
if (ocirc->rend_splice) {
or_circuit_t *other = ocirc->rend_splice;
tor_assert(other->base_.magic == OR_CIRCUIT_MAGIC);
@@ -695,6 +793,8 @@ circuit_free(circuit_t *circ)
extend_info_free(circ->n_hop);
tor_free(circ->n_chan_create_cell);
+ TOR_LIST_REMOVE(circ, head);
+
/* Remove from map. */
circuit_set_n_circid_chan(circ, 0, NULL);
@@ -706,11 +806,14 @@ circuit_free(circuit_t *circ)
tor_free(mem);
}
-/** Deallocate space associated with the linked list <b>cpath</b>. */
-static void
-circuit_free_cpath(crypt_path_t *cpath)
+/** Deallocate the linked list circ-><b>cpath</b>, and remove the cpath from
+ * <b>circ</b>. */
+void
+circuit_clear_cpath(origin_circuit_t *circ)
{
- crypt_path_t *victim, *head=cpath;
+ crypt_path_t *victim, *head, *cpath;
+
+ head = cpath = circ->cpath;
if (!cpath)
return;
@@ -724,13 +827,7 @@ circuit_free_cpath(crypt_path_t *cpath)
}
circuit_free_cpath_node(cpath);
-}
-/** Remove all the items in the cpath on <b>circ</b>.*/
-void
-circuit_clear_cpath(origin_circuit_t *circ)
-{
- circuit_free_cpath(circ->cpath);
circ->cpath = NULL;
}
@@ -738,11 +835,11 @@ circuit_clear_cpath(origin_circuit_t *circ)
void
circuit_free_all(void)
{
- circuit_t *next;
- while (global_circuitlist) {
- next = global_circuitlist->next;
- if (! CIRCUIT_IS_ORIGIN(global_circuitlist)) {
- or_circuit_t *or_circ = TO_OR_CIRCUIT(global_circuitlist);
+ circuit_t *tmp, *tmp2;
+
+ TOR_LIST_FOREACH_SAFE(tmp, &global_circuitlist, head, tmp2) {
+ if (! CIRCUIT_IS_ORIGIN(tmp)) {
+ or_circuit_t *or_circ = TO_OR_CIRCUIT(tmp);
while (or_circ->resolving_streams) {
edge_connection_t *next_conn;
next_conn = or_circ->resolving_streams->next_stream;
@@ -750,13 +847,24 @@ circuit_free_all(void)
or_circ->resolving_streams = next_conn;
}
}
- circuit_free(global_circuitlist);
- global_circuitlist = next;
+ circuit_free(tmp);
}
smartlist_free(circuits_pending_chans);
circuits_pending_chans = NULL;
+ {
+ chan_circid_circuit_map_t **elt, **next, *c;
+ for (elt = HT_START(chan_circid_map, &chan_circid_map);
+ elt;
+ elt = next) {
+ c = *elt;
+ next = HT_NEXT_RMV(chan_circid_map, &chan_circid_map, elt);
+
+ tor_assert(c->circuit == NULL);
+ tor_free(c);
+ }
+ }
HT_CLEAR(chan_circid_map, &chan_circid_map);
}
@@ -821,7 +929,7 @@ circuit_dump_by_conn(connection_t *conn, int severity)
circuit_t *circ;
edge_connection_t *tmpconn;
- for (circ = global_circuitlist; circ; circ = circ->next) {
+ TOR_LIST_FOREACH(circ, &global_circuitlist, head) {
circid_t n_circ_id = circ->n_circ_id, p_circ_id = 0;
if (circ->marked_for_close) {
@@ -854,79 +962,13 @@ circuit_dump_by_conn(connection_t *conn, int severity)
}
}
-/** A helper function for circuit_dump_by_chan() below. Log a bunch
- * of information about circuit <b>circ</b>.
- */
-static void
-circuit_dump_chan_details(int severity,
- circuit_t *circ,
- channel_t *chan,
- const char *type,
- circid_t this_circid,
- circid_t other_circid)
-{
- tor_log(severity, LD_CIRC, "Conn %p has %s circuit: circID %u "
- "(other side %u), state %d (%s), born %ld:",
- chan, type, (unsigned)this_circid, (unsigned)other_circid, circ->state,
- circuit_state_to_string(circ->state),
- (long)circ->timestamp_began.tv_sec);
- if (CIRCUIT_IS_ORIGIN(circ)) { /* circ starts at this node */
- circuit_log_path(severity, LD_CIRC, TO_ORIGIN_CIRCUIT(circ));
- }
-}
-
-/** Log, at severity <b>severity</b>, information about each circuit
- * that is connected to <b>chan</b>.
- */
-void
-circuit_dump_by_chan(channel_t *chan, int severity)
-{
- circuit_t *circ;
-
- tor_assert(chan);
-
- for (circ = global_circuitlist; circ; circ = circ->next) {
- circid_t n_circ_id = circ->n_circ_id, p_circ_id = 0;
-
- if (circ->marked_for_close) {
- continue;
- }
-
- if (!CIRCUIT_IS_ORIGIN(circ)) {
- p_circ_id = TO_OR_CIRCUIT(circ)->p_circ_id;
- }
-
- if (! CIRCUIT_IS_ORIGIN(circ) && TO_OR_CIRCUIT(circ)->p_chan &&
- TO_OR_CIRCUIT(circ)->p_chan == chan) {
- circuit_dump_chan_details(severity, circ, chan, "App-ward",
- p_circ_id, n_circ_id);
- }
-
- if (circ->n_chan && circ->n_chan == chan) {
- circuit_dump_chan_details(severity, circ, chan, "Exit-ward",
- n_circ_id, p_circ_id);
- }
-
- if (!circ->n_chan && circ->n_hop &&
- channel_matches_extend_info(chan, circ->n_hop) &&
- tor_memeq(chan->identity_digest,
- circ->n_hop->identity_digest, DIGEST_LEN)) {
- circuit_dump_chan_details(severity, circ, chan,
- (circ->state == CIRCUIT_STATE_OPEN &&
- !CIRCUIT_IS_ORIGIN(circ)) ?
- "Endpoint" : "Pending",
- n_circ_id, p_circ_id);
- }
- }
-}
-
/** Return the circuit whose global ID is <b>id</b>, or NULL if no
* such circuit exists. */
origin_circuit_t *
circuit_get_by_global_id(uint32_t id)
{
circuit_t *circ;
- for (circ=global_circuitlist;circ;circ = circ->next) {
+ TOR_LIST_FOREACH(circ, &global_circuitlist, head) {
if (CIRCUIT_IS_ORIGIN(circ) &&
TO_ORIGIN_CIRCUIT(circ)->global_identifier == id) {
if (circ->marked_for_close)
@@ -942,9 +984,13 @@ circuit_get_by_global_id(uint32_t id)
* - circ-\>n_circ_id or circ-\>p_circ_id is equal to <b>circ_id</b>, and
* - circ is attached to <b>chan</b>, either as p_chan or n_chan.
* Return NULL if no such circuit exists.
+ *
+ * If <b>found_entry_out</b> is provided, set it to true if we have a
+ * placeholder entry for circid/chan, and leave it unset otherwise.
*/
static INLINE circuit_t *
-circuit_get_by_circid_channel_impl(circid_t circ_id, channel_t *chan)
+circuit_get_by_circid_channel_impl(circid_t circ_id, channel_t *chan,
+ int *found_entry_out)
{
chan_circid_circuit_map_t search;
chan_circid_circuit_map_t *found;
@@ -965,21 +1011,27 @@ circuit_get_by_circid_channel_impl(circid_t circ_id, channel_t *chan)
" circ_id %u, channel ID " U64_FORMAT " (%p)",
found->circuit, (unsigned)circ_id,
U64_PRINTF_ARG(chan->global_identifier), chan);
+ if (found_entry_out)
+ *found_entry_out = 1;
return found->circuit;
}
log_debug(LD_CIRC,
- "circuit_get_by_circid_channel_impl() found nothing for"
+ "circuit_get_by_circid_channel_impl() found %s for"
" circ_id %u, channel ID " U64_FORMAT " (%p)",
+ found ? "placeholder" : "nothing",
(unsigned)circ_id,
U64_PRINTF_ARG(chan->global_identifier), chan);
+ if (found_entry_out)
+ *found_entry_out = found ? 1 : 0;
+
return NULL;
/* The rest of this checks for bugs. Disabled by default. */
/* We comment it out because coverity complains otherwise.
{
circuit_t *circ;
- for (circ=global_circuitlist;circ;circ = circ->next) {
+ TOR_LIST_FOREACH(circ, &global_circuitlist, head) {
if (! CIRCUIT_IS_ORIGIN(circ)) {
or_circuit_t *or_circ = TO_OR_CIRCUIT(circ);
if (or_circ->p_chan == chan && or_circ->p_circ_id == circ_id) {
@@ -1007,7 +1059,7 @@ circuit_get_by_circid_channel_impl(circid_t circ_id, channel_t *chan)
circuit_t *
circuit_get_by_circid_channel(circid_t circ_id, channel_t *chan)
{
- circuit_t *circ = circuit_get_by_circid_channel_impl(circ_id, chan);
+ circuit_t *circ = circuit_get_by_circid_channel_impl(circ_id, chan, NULL);
if (!circ || circ->marked_for_close)
return NULL;
else
@@ -1023,15 +1075,25 @@ circuit_t *
circuit_get_by_circid_channel_even_if_marked(circid_t circ_id,
channel_t *chan)
{
- return circuit_get_by_circid_channel_impl(circ_id, chan);
+ return circuit_get_by_circid_channel_impl(circ_id, chan, NULL);
}
/** Return true iff the circuit ID <b>circ_id</b> is currently used by a
- * circuit, marked or not, on <b>chan</b>. */
+ * circuit, marked or not, on <b>chan</b>, or if the circ ID is reserved until
+ * a queued destroy cell can be sent.
+ *
+ * (Return 1 if the circuit is present, marked or not; Return 2
+ * if the circuit ID is pending a destroy.)
+ **/
int
circuit_id_in_use_on_channel(circid_t circ_id, channel_t *chan)
{
- return circuit_get_by_circid_channel_impl(circ_id, chan) != NULL;
+ int found = 0;
+ if (circuit_get_by_circid_channel_impl(circ_id, chan, &found) != NULL)
+ return 1;
+ if (found)
+ return 2;
+ return 0;
}
/** Return the circuit that a given edge connection is using. */
@@ -1055,13 +1117,59 @@ circuit_get_by_edge_conn(edge_connection_t *conn)
void
circuit_unlink_all_from_channel(channel_t *chan, int reason)
{
- circuit_t *circ;
+ smartlist_t *detached = smartlist_new();
+
+/* #define DEBUG_CIRCUIT_UNLINK_ALL */
- channel_unlink_all_circuits(chan);
+ channel_unlink_all_circuits(chan, detached);
- for (circ = global_circuitlist; circ; circ = circ->next) {
+#ifdef DEBUG_CIRCUIT_UNLINK_ALL
+ {
+ circuit_t *circ;
+ smartlist_t *detached_2 = smartlist_new();
+ int mismatch = 0, badlen = 0;
+
+ TOR_LIST_FOREACH(circ, &global_circuitlist, head) {
+ if (circ->n_chan == chan ||
+ (!CIRCUIT_IS_ORIGIN(circ) &&
+ TO_OR_CIRCUIT(circ)->p_chan == chan)) {
+ smartlist_add(detached_2, circ);
+ }
+ }
+
+ if (smartlist_len(detached) != smartlist_len(detached_2)) {
+ log_warn(LD_BUG, "List of detached circuits had the wrong length! "
+ "(got %d, should have gotten %d)",
+ (int)smartlist_len(detached),
+ (int)smartlist_len(detached_2));
+ badlen = 1;
+ }
+ smartlist_sort_pointers(detached);
+ smartlist_sort_pointers(detached_2);
+
+ SMARTLIST_FOREACH(detached, circuit_t *, c,
+ if (c != smartlist_get(detached_2, c_sl_idx))
+ mismatch = 1;
+ );
+
+ if (mismatch)
+ log_warn(LD_BUG, "Mismatch in list of detached circuits.");
+
+ if (badlen || mismatch) {
+ smartlist_free(detached);
+ detached = detached_2;
+ } else {
+ log_notice(LD_CIRC, "List of %d circuits was as expected.",
+ (int)smartlist_len(detached));
+ smartlist_free(detached_2);
+ }
+ }
+#endif
+
+ SMARTLIST_FOREACH_BEGIN(detached, circuit_t *, circ) {
int mark = 0;
if (circ->n_chan == chan) {
+
circuit_set_n_circid_chan(circ, 0, NULL);
mark = 1;
@@ -1077,9 +1185,16 @@ circuit_unlink_all_from_channel(channel_t *chan, int reason)
mark = 1;
}
}
- if (mark && !circ->marked_for_close)
+ if (!mark) {
+ log_warn(LD_BUG, "Circuit on detached list which I had no reason "
+ "to mark");
+ continue;
+ }
+ if (!circ->marked_for_close)
circuit_mark_for_close(circ, reason);
- }
+ } SMARTLIST_FOREACH_END(circ);
+
+ smartlist_free(detached);
}
/** Return a circ such that
@@ -1095,8 +1210,7 @@ origin_circuit_t *
circuit_get_ready_rend_circ_by_rend_data(const rend_data_t *rend_data)
{
circuit_t *circ;
-
- for (circ = global_circuitlist; circ; circ = circ->next) {
+ TOR_LIST_FOREACH(circ, &global_circuitlist, head) {
if (!circ->marked_for_close &&
circ->purpose == CIRCUIT_PURPOSE_C_REND_READY) {
origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ);
@@ -1124,11 +1238,11 @@ circuit_get_next_by_pk_and_purpose(origin_circuit_t *start,
circuit_t *circ;
tor_assert(CIRCUIT_PURPOSE_IS_ORIGIN(purpose));
if (start == NULL)
- circ = global_circuitlist;
+ circ = TOR_LIST_FIRST(&global_circuitlist);
else
- circ = TO_CIRCUIT(start)->next;
+ circ = TOR_LIST_NEXT(TO_CIRCUIT(start), head);
- for ( ; circ; circ = circ->next) {
+ for ( ; circ; circ = TOR_LIST_NEXT(circ, head)) {
if (circ->marked_for_close)
continue;
if (circ->purpose != purpose)
@@ -1143,43 +1257,175 @@ circuit_get_next_by_pk_and_purpose(origin_circuit_t *start,
return NULL;
}
-/** Return the first OR circuit in the global list whose purpose is
- * <b>purpose</b>, and whose rend_token is the <b>len</b>-byte
- * <b>token</b>. */
+/** Map from rendezvous cookie to or_circuit_t */
+static digestmap_t *rend_cookie_map = NULL;
+
+/** Map from introduction point digest to or_circuit_t */
+static digestmap_t *intro_digest_map = NULL;
+
+/** Return the OR circuit whose purpose is <b>purpose</b>, and whose
+ * rend_token is the REND_TOKEN_LEN-byte <b>token</b>. If <b>is_rend_circ</b>,
+ * look for rendezvous point circuits; otherwise look for introduction point
+ * circuits. */
static or_circuit_t *
-circuit_get_by_rend_token_and_purpose(uint8_t purpose, const char *token,
- size_t len)
+circuit_get_by_rend_token_and_purpose(uint8_t purpose, int is_rend_circ,
+ const char *token)
{
- circuit_t *circ;
- for (circ = global_circuitlist; circ; circ = circ->next) {
- if (! circ->marked_for_close &&
- circ->purpose == purpose &&
- tor_memeq(TO_OR_CIRCUIT(circ)->rend_token, token, len))
- return TO_OR_CIRCUIT(circ);
+ or_circuit_t *circ;
+ digestmap_t *map = is_rend_circ ? rend_cookie_map : intro_digest_map;
+
+ if (!map)
+ return NULL;
+
+ circ = digestmap_get(map, token);
+ if (!circ ||
+ circ->base_.purpose != purpose ||
+ circ->base_.marked_for_close)
+ return NULL;
+
+ if (!circ->rendinfo) {
+ char *t = tor_strdup(hex_str(token, REND_TOKEN_LEN));
+ log_warn(LD_BUG, "Wanted a circuit with %s:%d, but lookup returned a "
+ "circuit with no rendinfo set.",
+ safe_str(t), is_rend_circ);
+ tor_free(t);
+ return NULL;
}
- return NULL;
+
+ if (! bool_eq(circ->rendinfo->is_rend_circ, is_rend_circ) ||
+ tor_memneq(circ->rendinfo->rend_token, token, REND_TOKEN_LEN)) {
+ char *t = tor_strdup(hex_str(token, REND_TOKEN_LEN));
+ log_warn(LD_BUG, "Wanted a circuit with %s:%d, but lookup returned %s:%d",
+ safe_str(t), is_rend_circ,
+ safe_str(hex_str(circ->rendinfo->rend_token, REND_TOKEN_LEN)),
+ (int)circ->rendinfo->is_rend_circ);
+ tor_free(t);
+ return NULL;
+ }
+
+ return circ;
+}
+
+/** Clear the rendezvous cookie or introduction point key digest that's
+ * configured on <b>circ</b>, if any, and remove it from any such maps. */
+static void
+circuit_clear_rend_token(or_circuit_t *circ)
+{
+ or_circuit_t *found_circ;
+ digestmap_t *map;
+
+ if (!circ || !circ->rendinfo)
+ return;
+
+ map = circ->rendinfo->is_rend_circ ? rend_cookie_map : intro_digest_map;
+
+ if (!map) {
+ log_warn(LD_BUG, "Tried to clear rend token on circuit, but found no map");
+ return;
+ }
+
+ found_circ = digestmap_get(map, circ->rendinfo->rend_token);
+ if (found_circ == circ) {
+ /* Great, this is the right one. */
+ digestmap_remove(map, circ->rendinfo->rend_token);
+ } else if (found_circ) {
+ log_warn(LD_BUG, "Tried to clear rend token on circuit, but "
+ "it was already replaced in the map.");
+ } else {
+ log_warn(LD_BUG, "Tried to clear rend token on circuit, but "
+ "it not in the map at all.");
+ }
+
+ tor_free(circ->rendinfo); /* Sets it to NULL too */
+}
+
+/** Set the rendezvous cookie (if is_rend_circ), or the introduction point
+ * digest (if ! is_rend_circ) of <b>circ</b> to the REND_TOKEN_LEN-byte value
+ * in <b>token</b>, and add it to the appropriate map. If it previously had a
+ * token, clear it. If another circuit previously had the same
+ * cookie/intro-digest, mark that circuit and remove it from the map. */
+static void
+circuit_set_rend_token(or_circuit_t *circ, int is_rend_circ,
+ const uint8_t *token)
+{
+ digestmap_t **map_p, *map;
+ or_circuit_t *found_circ;
+
+ /* Find the right map, creating it as needed */
+ map_p = is_rend_circ ? &rend_cookie_map : &intro_digest_map;
+
+ if (!*map_p)
+ *map_p = digestmap_new();
+
+ map = *map_p;
+
+ /* If this circuit already has a token, we need to remove that. */
+ if (circ->rendinfo)
+ circuit_clear_rend_token(circ);
+
+ if (token == NULL) {
+ /* We were only trying to remove this token, not set a new one. */
+ return;
+ }
+
+ found_circ = digestmap_get(map, (const char *)token);
+ if (found_circ) {
+ tor_assert(found_circ != circ);
+ circuit_clear_rend_token(found_circ);
+ if (! found_circ->base_.marked_for_close) {
+ circuit_mark_for_close(TO_CIRCUIT(found_circ), END_CIRC_REASON_FINISHED);
+ if (is_rend_circ) {
+ log_fn(LOG_PROTOCOL_WARN, LD_REND,
+ "Duplicate rendezvous cookie (%s...) used on two circuits",
+ hex_str((const char*)token, 4)); /* only log first 4 chars */
+ }
+ }
+ }
+
+ /* Now set up the rendinfo */
+ circ->rendinfo = tor_malloc(sizeof(*circ->rendinfo));
+ memcpy(circ->rendinfo->rend_token, token, REND_TOKEN_LEN);
+ circ->rendinfo->is_rend_circ = is_rend_circ ? 1 : 0;
+
+ digestmap_set(map, (const char *)token, circ);
}
/** Return the circuit waiting for a rendezvous with the provided cookie.
* Return NULL if no such circuit is found.
*/
or_circuit_t *
-circuit_get_rendezvous(const char *cookie)
+circuit_get_rendezvous(const uint8_t *cookie)
{
return circuit_get_by_rend_token_and_purpose(
CIRCUIT_PURPOSE_REND_POINT_WAITING,
- cookie, REND_COOKIE_LEN);
+ 1, (const char*)cookie);
}
/** Return the circuit waiting for intro cells of the given digest.
* Return NULL if no such circuit is found.
*/
or_circuit_t *
-circuit_get_intro_point(const char *digest)
+circuit_get_intro_point(const uint8_t *digest)
{
return circuit_get_by_rend_token_and_purpose(
- CIRCUIT_PURPOSE_INTRO_POINT, digest,
- DIGEST_LEN);
+ CIRCUIT_PURPOSE_INTRO_POINT, 0,
+ (const char *)digest);
+}
+
+/** Set the rendezvous cookie of <b>circ</b> to <b>cookie</b>. If another
+ * circuit previously had that cookie, mark it. */
+void
+circuit_set_rendezvous_cookie(or_circuit_t *circ, const uint8_t *cookie)
+{
+ circuit_set_rend_token(circ, 1, cookie);
+}
+
+/** Set the intro point key digest of <b>circ</b> to <b>cookie</b>. If another
+ * circuit previously had that intro point digest, mark it. */
+void
+circuit_set_intro_point_digest(or_circuit_t *circ, const uint8_t *digest)
+{
+ circuit_set_rend_token(circ, 0, digest);
}
/** Return a circuit that is open, is CIRCUIT_PURPOSE_C_GENERAL,
@@ -1213,7 +1459,7 @@ circuit_find_to_cannibalize(uint8_t purpose, extend_info_t *info,
"capacity %d, internal %d",
purpose, need_uptime, need_capacity, internal);
- for (circ_=global_circuitlist; circ_; circ_ = circ_->next) {
+ TOR_LIST_FOREACH(circ_, &global_circuitlist, head) {
if (CIRCUIT_IS_ORIGIN(circ_) &&
circ_->state == CIRCUIT_STATE_OPEN &&
!circ_->marked_for_close &&
@@ -1303,8 +1549,7 @@ void
circuit_mark_all_unused_circs(void)
{
circuit_t *circ;
-
- for (circ=global_circuitlist; circ; circ = circ->next) {
+ TOR_LIST_FOREACH(circ, &global_circuitlist, head) {
if (CIRCUIT_IS_ORIGIN(circ) &&
!circ->marked_for_close &&
!circ->timestamp_dirty)
@@ -1323,8 +1568,7 @@ void
circuit_mark_all_dirty_circs_as_unusable(void)
{
circuit_t *circ;
-
- for (circ=global_circuitlist; circ; circ = circ->next) {
+ TOR_LIST_FOREACH(circ, &global_circuitlist, head) {
if (CIRCUIT_IS_ORIGIN(circ) &&
!circ->marked_for_close &&
circ->timestamp_dirty) {
@@ -1350,9 +1594,9 @@ circuit_mark_all_dirty_circs_as_unusable(void)
* - If circ->rend_splice is set (we are the midpoint of a joined
* rendezvous stream), then mark the other circuit to close as well.
*/
-void
-circuit_mark_for_close_(circuit_t *circ, int reason, int line,
- const char *file)
+MOCK_IMPL(void,
+circuit_mark_for_close_, (circuit_t *circ, int reason, int line,
+ const char *file))
{
int orig_reason = reason; /* Passed to the controller */
assert_circuit_ok(circ);
@@ -1456,6 +1700,7 @@ circuit_mark_for_close_(circuit_t *circ, int reason, int line,
channel_send_destroy(circ->n_circ_id, circ->n_chan, reason);
}
circuitmux_detach_circuit(circ->n_chan->cmux, circ);
+ circuit_set_n_circid_chan(circ, 0, NULL);
}
if (! CIRCUIT_IS_ORIGIN(circ)) {
@@ -1489,6 +1734,7 @@ circuit_mark_for_close_(circuit_t *circ, int reason, int line,
channel_send_destroy(or_circ->p_circ_id, or_circ->p_chan, reason);
}
circuitmux_detach_circuit(or_circ->p_chan->cmux, circ);
+ circuit_set_p_circid_chan(or_circ, 0, NULL);
}
} else {
origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ);
@@ -1527,8 +1773,40 @@ marked_circuit_free_cells(circuit_t *circ)
cell_queue_clear(& TO_OR_CIRCUIT(circ)->p_chan_cells);
}
-/** Return the number of cells used by the circuit <b>c</b>'s cell queues. */
+/** Aggressively free buffer contents on all the buffers of all streams in the
+ * list starting at <b>stream</b>. Return the number of bytes recovered. */
static size_t
+marked_circuit_streams_free_bytes(edge_connection_t *stream)
+{
+ size_t result = 0;
+ for ( ; stream; stream = stream->next_stream) {
+ connection_t *conn = TO_CONN(stream);
+ if (conn->inbuf) {
+ result += buf_allocation(conn->inbuf);
+ buf_clear(conn->inbuf);
+ }
+ if (conn->outbuf) {
+ result += buf_allocation(conn->outbuf);
+ buf_clear(conn->outbuf);
+ }
+ }
+ return result;
+}
+
+/** Aggressively free buffer contents on all the buffers of all streams on
+ * circuit <b>c</b>. Return the number of bytes recovered. */
+static size_t
+marked_circuit_free_stream_bytes(circuit_t *c)
+{
+ if (CIRCUIT_IS_ORIGIN(c)) {
+ return marked_circuit_streams_free_bytes(TO_ORIGIN_CIRCUIT(c)->p_streams);
+ } else {
+ return marked_circuit_streams_free_bytes(TO_OR_CIRCUIT(c)->n_streams);
+ }
+}
+
+/** Return the number of cells used by the circuit <b>c</b>'s cell queues. */
+STATIC size_t
n_cells_in_circ_queues(const circuit_t *c)
{
size_t n = c->n_chan_cells.n;
@@ -1547,17 +1825,19 @@ n_cells_in_circ_queues(const circuit_t *c)
* This function will return incorrect results if the oldest cell queued on
* the circuit is older than 2**32 msec (about 49 days) old.
*/
-static uint32_t
+STATIC uint32_t
circuit_max_queued_cell_age(const circuit_t *c, uint32_t now)
{
uint32_t age = 0;
- if (c->n_chan_cells.head)
- age = now - c->n_chan_cells.head->inserted_time;
+ packed_cell_t *cell;
+
+ if (NULL != (cell = TOR_SIMPLEQ_FIRST(&c->n_chan_cells.head)))
+ age = now - cell->inserted_time;
if (! CIRCUIT_IS_ORIGIN(c)) {
- const or_circuit_t *orcirc = TO_OR_CIRCUIT((circuit_t*)c);
- if (orcirc->p_chan_cells.head) {
- uint32_t age2 = now - orcirc->p_chan_cells.head->inserted_time;
+ const or_circuit_t *orcirc = CONST_TO_OR_CIRCUIT(c);
+ if (NULL != (cell = TOR_SIMPLEQ_FIRST(&orcirc->p_chan_cells.head))) {
+ uint32_t age2 = now - cell->inserted_time;
if (age2 > age)
return age2;
}
@@ -1565,20 +1845,68 @@ circuit_max_queued_cell_age(const circuit_t *c, uint32_t now)
return age;
}
-/** Temporary variable for circuits_compare_by_oldest_queued_cell_ This is a
- * kludge to work around the fact that qsort doesn't provide a way for
- * comparison functions to take an extra argument. */
-static uint32_t circcomp_now_tmp;
+/** Return the age in milliseconds of the oldest buffer chunk on any stream in
+ * the linked list <b>stream</b>, where age is taken in milliseconds before
+ * the time <b>now</b> (in truncated milliseconds since the epoch). */
+static uint32_t
+circuit_get_streams_max_data_age(const edge_connection_t *stream, uint32_t now)
+{
+ uint32_t age = 0, age2;
+ for (; stream; stream = stream->next_stream) {
+ const connection_t *conn = TO_CONN(stream);
+ if (conn->outbuf) {
+ age2 = buf_get_oldest_chunk_timestamp(conn->outbuf, now);
+ if (age2 > age)
+ age = age2;
+ }
+ if (conn->inbuf) {
+ age2 = buf_get_oldest_chunk_timestamp(conn->inbuf, now);
+ if (age2 > age)
+ age = age2;
+ }
+ }
+
+ return age;
+}
+
+/** Return the age in milliseconds of the oldest buffer chunk on any stream
+ * attached to the circuit <b>c</b>, where age is taken in milliseconds before
+ * the time <b>now</b> (in truncated milliseconds since the epoch). */
+STATIC uint32_t
+circuit_max_queued_data_age(const circuit_t *c, uint32_t now)
+{
+ if (CIRCUIT_IS_ORIGIN(c)) {
+ return circuit_get_streams_max_data_age(
+ CONST_TO_ORIGIN_CIRCUIT(c)->p_streams, now);
+ } else {
+ return circuit_get_streams_max_data_age(
+ CONST_TO_OR_CIRCUIT(c)->n_streams, now);
+ }
+}
-/** Helper to sort a list of circuit_t by age of oldest cell, in descending
- * order. Requires that circcomp_now_tmp is set correctly. */
+/** Return the age of the oldest cell or stream buffer chunk on the circuit
+ * <b>c</b>, where age is taken in milliseconds before the time <b>now</b> (in
+ * truncated milliseconds since the epoch). */
+STATIC uint32_t
+circuit_max_queued_item_age(const circuit_t *c, uint32_t now)
+{
+ uint32_t cell_age = circuit_max_queued_cell_age(c, now);
+ uint32_t data_age = circuit_max_queued_data_age(c, now);
+ if (cell_age > data_age)
+ return cell_age;
+ else
+ return data_age;
+}
+
+/** Helper to sort a list of circuit_t by age of oldest item, in descending
+ * order. */
static int
-circuits_compare_by_oldest_queued_cell_(const void **a_, const void **b_)
+circuits_compare_by_oldest_queued_item_(const void **a_, const void **b_)
{
const circuit_t *a = *a_;
const circuit_t *b = *b_;
- uint32_t age_a = circuit_max_queued_cell_age(a, circcomp_now_tmp);
- uint32_t age_b = circuit_max_queued_cell_age(b, circcomp_now_tmp);
+ uint32_t age_a = a->age_tmp;
+ uint32_t age_b = b->age_tmp;
if (age_a < age_b)
return 1;
@@ -1588,67 +1916,90 @@ circuits_compare_by_oldest_queued_cell_(const void **a_, const void **b_)
return -1;
}
-#define FRACTION_OF_CELLS_TO_RETAIN_ON_OOM 0.90
+#define FRACTION_OF_DATA_TO_RETAIN_ON_OOM 0.90
/** We're out of memory for cells, having allocated <b>current_allocation</b>
* bytes' worth. Kill the 'worst' circuits until we're under
- * FRACTION_OF_CIRCS_TO_RETAIN_ON_OOM of our maximum usage. */
+ * FRACTION_OF_DATA_TO_RETAIN_ON_OOM of our maximum usage. */
void
circuits_handle_oom(size_t current_allocation)
{
/* Let's hope there's enough slack space for this allocation here... */
smartlist_t *circlist = smartlist_new();
circuit_t *circ;
- size_t n_cells_removed=0, n_cells_to_remove;
+ size_t mem_to_recover;
+ size_t mem_recovered=0;
int n_circuits_killed=0;
struct timeval now;
+ uint32_t now_ms;
log_notice(LD_GENERAL, "We're low on memory. Killing circuits with "
"over-long queues. (This behavior is controlled by "
- "MaxMemInCellQueues.)");
+ "MaxMemInQueues.)");
+
+ {
+ const size_t recovered = buf_shrink_freelists(1);
+ if (recovered >= current_allocation) {
+ log_warn(LD_BUG, "We somehow recovered more memory from freelists "
+ "than we thought we had allocated");
+ current_allocation = 0;
+ } else {
+ current_allocation -= recovered;
+ }
+ }
{
- size_t mem_target = (size_t)(get_options()->MaxMemInCellQueues *
- FRACTION_OF_CELLS_TO_RETAIN_ON_OOM);
- size_t mem_to_recover;
+ size_t mem_target = (size_t)(get_options()->MaxMemInQueues *
+ FRACTION_OF_DATA_TO_RETAIN_ON_OOM);
if (current_allocation <= mem_target)
return;
mem_to_recover = current_allocation - mem_target;
- n_cells_to_remove = CEIL_DIV(mem_to_recover, packed_cell_mem_cost());
}
+ tor_gettimeofday_cached_monotonic(&now);
+ now_ms = (uint32_t)tv_to_msec(&now);
+
/* This algorithm itself assumes that you've got enough memory slack
* to actually run it. */
- for (circ = global_circuitlist; circ; circ = circ->next)
+ TOR_LIST_FOREACH(circ, &global_circuitlist, head) {
+ circ->age_tmp = circuit_max_queued_item_age(circ, now_ms);
smartlist_add(circlist, circ);
-
- /* Set circcomp_now_tmp so that the sort can work. */
- tor_gettimeofday_cached(&now);
- circcomp_now_tmp = (uint32_t)tv_to_msec(&now);
+ }
/* This is O(n log n); there are faster algorithms we could use instead.
* Let's hope this doesn't happen enough to be in the critical path. */
- smartlist_sort(circlist, circuits_compare_by_oldest_queued_cell_);
+ smartlist_sort(circlist, circuits_compare_by_oldest_queued_item_);
/* Okay, now the worst circuits are at the front of the list. Let's mark
* them, and reclaim their storage aggressively. */
SMARTLIST_FOREACH_BEGIN(circlist, circuit_t *, circ) {
size_t n = n_cells_in_circ_queues(circ);
+ size_t freed;
if (! circ->marked_for_close) {
circuit_mark_for_close(circ, END_CIRC_REASON_RESOURCELIMIT);
}
marked_circuit_free_cells(circ);
+ freed = marked_circuit_free_stream_bytes(circ);
++n_circuits_killed;
- n_cells_removed += n;
- if (n_cells_removed >= n_cells_to_remove)
+
+ mem_recovered += n * packed_cell_mem_cost();
+ mem_recovered += freed;
+
+ if (mem_recovered >= mem_to_recover)
break;
} SMARTLIST_FOREACH_END(circ);
+#ifdef ENABLE_MEMPOOLS
clean_cell_pool(); /* In case this helps. */
+#endif /* ENABLE_MEMPOOLS */
+ buf_shrink_freelists(1); /* This is necessary to actually release buffer
+ chunks. */
- log_notice(LD_GENERAL, "Removed "U64_FORMAT" bytes by killing %d circuits.",
- U64_PRINTF_ARG(n_cells_removed * packed_cell_mem_cost()),
- n_circuits_killed);
+ log_notice(LD_GENERAL, "Removed "U64_FORMAT" bytes by killing %d circuits; "
+ "%d circuits remain alive.",
+ U64_PRINTF_ARG(mem_recovered),
+ n_circuits_killed,
+ smartlist_len(circlist) - n_circuits_killed);
smartlist_free(circlist);
}
@@ -1722,15 +2073,10 @@ assert_circuit_ok(const circuit_t *c)
tor_assert(c->purpose >= CIRCUIT_PURPOSE_MIN_ &&
c->purpose <= CIRCUIT_PURPOSE_MAX_);
- {
- /* Having a separate variable for this pleases GCC 4.2 in ways I hope I
- * never understand. -NM. */
- circuit_t *nonconst_circ = (circuit_t*) c;
- if (CIRCUIT_IS_ORIGIN(c))
- origin_circ = TO_ORIGIN_CIRCUIT(nonconst_circ);
- else
- or_circ = TO_OR_CIRCUIT(nonconst_circ);
- }
+ if (CIRCUIT_IS_ORIGIN(c))
+ origin_circ = CONST_TO_ORIGIN_CIRCUIT(c);
+ else
+ or_circ = CONST_TO_OR_CIRCUIT(c);
if (c->n_chan) {
tor_assert(!c->n_hop);
@@ -1739,15 +2085,16 @@ assert_circuit_ok(const circuit_t *c)
/* We use the _impl variant here to make sure we don't fail on marked
* circuits, which would not be returned by the regular function. */
circuit_t *c2 = circuit_get_by_circid_channel_impl(c->n_circ_id,
- c->n_chan);
+ c->n_chan, NULL);
tor_assert(c == c2);
}
}
if (or_circ && or_circ->p_chan) {
if (or_circ->p_circ_id) {
/* ibid */
- circuit_t *c2 = circuit_get_by_circid_channel_impl(or_circ->p_circ_id,
- or_circ->p_chan);
+ circuit_t *c2 =
+ circuit_get_by_circid_channel_impl(or_circ->p_circ_id,
+ or_circ->p_chan, NULL);
tor_assert(c == c2);
}
}
diff --git a/src/or/circuitlist.h b/src/or/circuitlist.h
index acc4b81fc..916afba21 100644
--- a/src/or/circuitlist.h
+++ b/src/or/circuitlist.h
@@ -12,17 +12,22 @@
#ifndef TOR_CIRCUITLIST_H
#define TOR_CIRCUITLIST_H
-circuit_t * circuit_get_global_list_(void);
+#include "testsupport.h"
+
+TOR_LIST_HEAD(global_circuitlist_s, circuit_t);
+
+MOCK_DECL(struct global_circuitlist_s*, circuit_get_global_list, (void));
const char *circuit_state_to_string(int state);
const char *circuit_purpose_to_controller_string(uint8_t purpose);
const char *circuit_purpose_to_controller_hs_state_string(uint8_t purpose);
const char *circuit_purpose_to_string(uint8_t purpose);
void circuit_dump_by_conn(connection_t *conn, int severity);
-void circuit_dump_by_chan(channel_t *chan, int severity);
void circuit_set_p_circid_chan(or_circuit_t *circ, circid_t id,
channel_t *chan);
void circuit_set_n_circid_chan(circuit_t *circ, circid_t id,
channel_t *chan);
+void channel_mark_circid_unusable(channel_t *chan, circid_t id);
+void channel_mark_circid_usable(channel_t *chan, circid_t id);
void circuit_set_state(circuit_t *circ, uint8_t state);
void circuit_close_all_marked(void);
int32_t circuit_initial_package_window(void);
@@ -41,14 +46,16 @@ origin_circuit_t *circuit_get_ready_rend_circ_by_rend_data(
const rend_data_t *rend_data);
origin_circuit_t *circuit_get_next_by_pk_and_purpose(origin_circuit_t *start,
const char *digest, uint8_t purpose);
-or_circuit_t *circuit_get_rendezvous(const char *cookie);
-or_circuit_t *circuit_get_intro_point(const char *digest);
+or_circuit_t *circuit_get_rendezvous(const uint8_t *cookie);
+or_circuit_t *circuit_get_intro_point(const uint8_t *digest);
+void circuit_set_rendezvous_cookie(or_circuit_t *circ, const uint8_t *cookie);
+void circuit_set_intro_point_digest(or_circuit_t *circ, const uint8_t *digest);
origin_circuit_t *circuit_find_to_cannibalize(uint8_t purpose,
extend_info_t *info, int flags);
void circuit_mark_all_unused_circs(void);
void circuit_mark_all_dirty_circs_as_unusable(void);
-void circuit_mark_for_close_(circuit_t *circ, int reason,
- int line, const char *file);
+MOCK_DECL(void, circuit_mark_for_close_, (circuit_t *circ, int reason,
+ int line, const char *file));
int circuit_get_cpath_len(origin_circuit_t *circ);
void circuit_clear_cpath(origin_circuit_t *circ);
crypt_path_t *circuit_get_cpath_hop(origin_circuit_t *circ, int hopnum);
@@ -64,5 +71,16 @@ void assert_circuit_ok(const circuit_t *c);
void circuit_free_all(void);
void circuits_handle_oom(size_t current_allocation);
+void channel_note_destroy_pending(channel_t *chan, circid_t id);
+void channel_note_destroy_not_pending(channel_t *chan, circid_t id);
+
+#ifdef CIRCUITLIST_PRIVATE
+STATIC void circuit_free(circuit_t *circ);
+STATIC size_t n_cells_in_circ_queues(const circuit_t *c);
+STATIC uint32_t circuit_max_queued_data_age(const circuit_t *c, uint32_t now);
+STATIC uint32_t circuit_max_queued_cell_age(const circuit_t *c, uint32_t now);
+STATIC uint32_t circuit_max_queued_item_age(const circuit_t *c, uint32_t now);
+#endif
+
#endif
diff --git a/src/or/circuitmux.c b/src/or/circuitmux.c
index 545cfd065..52ebfef08 100644
--- a/src/or/circuitmux.c
+++ b/src/or/circuitmux.c
@@ -10,6 +10,7 @@
#include "channel.h"
#include "circuitlist.h"
#include "circuitmux.h"
+#include "relay.h"
/*
* Private typedefs for circuitmux.c
@@ -115,6 +116,22 @@ struct circuitmux_s {
*/
struct circuit_t *active_circuits_head, *active_circuits_tail;
+ /** List of queued destroy cells */
+ cell_queue_t destroy_cell_queue;
+ /** Boolean: True iff the last cell to circuitmux_get_first_active_circuit
+ * returned the destroy queue. Used to force alternation between
+ * destroy/non-destroy cells.
+ *
+ * XXXX There is no reason to think that alternating is a particularly good
+ * approach -- it's just designed to prevent destroys from starving other
+ * cells completely.
+ */
+ unsigned int last_cell_was_destroy : 1;
+ /** Destroy counter: increment this when a destroy gets queued, decrement
+ * when we unqueue it, so we can test to make sure they don't starve.
+ */
+ int64_t destroy_ctr;
+
/*
* Circuitmux policy; if this is non-NULL, it can override the built-
* in round-robin active circuits behavior. This is how EWMA works in
@@ -193,6 +210,11 @@ static void circuitmux_assert_okay_pass_one(circuitmux_t *cmux);
static void circuitmux_assert_okay_pass_two(circuitmux_t *cmux);
static void circuitmux_assert_okay_pass_three(circuitmux_t *cmux);
+/* Static global variables */
+
+/** Count the destroy balance to debug destroy queue logic */
+static int64_t global_destroy_ctr = 0;
+
/* Function definitions */
/**
@@ -361,16 +383,20 @@ circuitmux_alloc(void)
rv = tor_malloc_zero(sizeof(*rv));
rv->chanid_circid_map = tor_malloc_zero(sizeof(*( rv->chanid_circid_map)));
HT_INIT(chanid_circid_muxinfo_map, rv->chanid_circid_map);
+ cell_queue_init(&rv->destroy_cell_queue);
return rv;
}
/**
* Detach all circuits from a circuitmux (use before circuitmux_free())
+ *
+ * If <b>detached_out</b> is non-NULL, add every detached circuit_t to
+ * detached_out.
*/
void
-circuitmux_detach_all_circuits(circuitmux_t *cmux)
+circuitmux_detach_all_circuits(circuitmux_t *cmux, smartlist_t *detached_out)
{
chanid_circid_muxinfo_t **i = NULL, *to_remove;
channel_t *chan = NULL;
@@ -386,7 +412,11 @@ circuitmux_detach_all_circuits(circuitmux_t *cmux)
i = HT_START(chanid_circid_muxinfo_map, cmux->chanid_circid_map);
while (i) {
to_remove = *i;
- if (to_remove) {
+
+ if (! to_remove) {
+ log_warn(LD_BUG, "Somehow, an HT iterator gave us a NULL pointer.");
+ break;
+ } else {
/* Find a channel and circuit */
chan = channel_find_by_global_id(to_remove->chan_id);
if (chan) {
@@ -407,6 +437,9 @@ circuitmux_detach_all_circuits(circuitmux_t *cmux)
/* Clear n_mux */
circ->n_mux = NULL;
+
+ if (detached_out)
+ smartlist_add(detached_out, circ);
} else if (circ->magic == OR_CIRCUIT_MAGIC) {
/*
* Update active_circuits et al.; this does policy notifies, so
@@ -422,6 +455,9 @@ circuitmux_detach_all_circuits(circuitmux_t *cmux)
* so clear p_mux.
*/
TO_OR_CIRCUIT(circ)->p_mux = NULL;
+
+ if (detached_out)
+ smartlist_add(detached_out, circ);
} else {
/* Complain and move on */
log_warn(LD_CIRC,
@@ -476,6 +512,31 @@ circuitmux_detach_all_circuits(circuitmux_t *cmux)
cmux->n_cells = 0;
}
+/** Reclaim all circuit IDs currently marked as unusable on <b>chan</b> because
+ * of pending destroy cells in <b>cmux</b>.
+ *
+ * This function must be called AFTER circuits are unlinked from the (channel,
+ * circuid-id) map with circuit_unlink_all_from_channel(), but before calling
+ * circuitmux_free().
+ */
+void
+circuitmux_mark_destroyed_circids_usable(circuitmux_t *cmux, channel_t *chan)
+{
+ packed_cell_t *cell;
+ int n_bad = 0;
+ TOR_SIMPLEQ_FOREACH(cell, &cmux->destroy_cell_queue.head, next) {
+ circid_t circid = 0;
+ if (packed_cell_is_destroy(chan, cell, &circid)) {
+ channel_mark_circid_usable(chan, circid);
+ } else {
+ ++n_bad;
+ }
+ }
+ if (n_bad)
+ log_warn(LD_BUG, "%d cell(s) on destroy queue did not look like a "
+ "DESTROY cell.", n_bad);
+}
+
/**
* Free a circuitmux_t; the circuits must be detached first with
* circuitmux_detach_all_circuits().
@@ -508,6 +569,30 @@ circuitmux_free(circuitmux_t *cmux)
tor_free(cmux->chanid_circid_map);
}
+ /*
+ * We're throwing away some destroys; log the counter and
+ * adjust the global counter by the queue size.
+ */
+ if (cmux->destroy_cell_queue.n > 0) {
+ cmux->destroy_ctr -= cmux->destroy_cell_queue.n;
+ global_destroy_ctr -= cmux->destroy_cell_queue.n;
+ log_debug(LD_CIRC,
+ "Freeing cmux at %p with %u queued destroys; the last cmux "
+ "destroy balance was "I64_FORMAT", global is "I64_FORMAT,
+ cmux, cmux->destroy_cell_queue.n,
+ I64_PRINTF_ARG(cmux->destroy_ctr),
+ I64_PRINTF_ARG(global_destroy_ctr));
+ } else {
+ log_debug(LD_CIRC,
+ "Freeing cmux at %p with no queued destroys, the cmux destroy "
+ "balance was "I64_FORMAT", global is "I64_FORMAT,
+ cmux,
+ I64_PRINTF_ARG(cmux->destroy_ctr),
+ I64_PRINTF_ARG(global_destroy_ctr));
+ }
+
+ cell_queue_clear(&cmux->destroy_cell_queue);
+
tor_free(cmux);
}
@@ -816,7 +901,7 @@ circuitmux_num_cells(circuitmux_t *cmux)
{
tor_assert(cmux);
- return cmux->n_cells;
+ return cmux->n_cells + cmux->destroy_cell_queue.n;
}
/**
@@ -851,9 +936,9 @@ circuitmux_num_circuits(circuitmux_t *cmux)
* Attach a circuit to a circuitmux, for the specified direction.
*/
-void
-circuitmux_attach_circuit(circuitmux_t *cmux, circuit_t *circ,
- cell_direction_t direction)
+MOCK_IMPL(void,
+circuitmux_attach_circuit,(circuitmux_t *cmux, circuit_t *circ,
+ cell_direction_t direction))
{
channel_t *chan = NULL;
uint64_t channel_id;
@@ -1000,8 +1085,8 @@ circuitmux_attach_circuit(circuitmux_t *cmux, circuit_t *circ,
* no-op if not attached.
*/
-void
-circuitmux_detach_circuit(circuitmux_t *cmux, circuit_t *circ)
+MOCK_IMPL(void,
+circuitmux_detach_circuit,(circuitmux_t *cmux, circuit_t *circ))
{
chanid_circid_muxinfo_t search, *hashent = NULL;
/*
@@ -1368,16 +1453,36 @@ circuitmux_set_num_cells(circuitmux_t *cmux, circuit_t *circ,
/**
* Pick a circuit to send from, using the active circuits list or a
* circuitmux policy if one is available. This is called from channel.c.
+ *
+ * If we would rather send a destroy cell, return NULL and set
+ * *<b>destroy_queue_out</b> to the destroy queue.
+ *
+ * If we have nothing to send, set *<b>destroy_queue_out</b> to NULL and
+ * return NULL.
*/
circuit_t *
-circuitmux_get_first_active_circuit(circuitmux_t *cmux)
+circuitmux_get_first_active_circuit(circuitmux_t *cmux,
+ cell_queue_t **destroy_queue_out)
{
circuit_t *circ = NULL;
tor_assert(cmux);
+ tor_assert(destroy_queue_out);
+
+ *destroy_queue_out = NULL;
- if (cmux->n_active_circuits > 0) {
+ if (cmux->destroy_cell_queue.n &&
+ (!cmux->last_cell_was_destroy || cmux->n_active_circuits == 0)) {
+ /* We have destroy cells to send, and either we just sent a relay cell,
+ * or we have no relay cells to send. */
+
+ /* XXXX We should let the cmux policy have some say in this eventually. */
+ /* XXXX Alternating is not a terribly brilliant approach here. */
+ *destroy_queue_out = &cmux->destroy_cell_queue;
+
+ cmux->last_cell_was_destroy = 1;
+ } else if (cmux->n_active_circuits > 0) {
/* We also must have a cell available for this to be the case */
tor_assert(cmux->n_cells > 0);
/* Do we have a policy-provided circuit selector? */
@@ -1389,7 +1494,11 @@ circuitmux_get_first_active_circuit(circuitmux_t *cmux)
tor_assert(cmux->active_circuits_head);
circ = cmux->active_circuits_head;
}
- } else tor_assert(cmux->n_cells == 0);
+ cmux->last_cell_was_destroy = 0;
+ } else {
+ tor_assert(cmux->n_cells == 0);
+ tor_assert(cmux->destroy_cell_queue.n == 0);
+ }
return circ;
}
@@ -1463,6 +1572,26 @@ circuitmux_notify_xmit_cells(circuitmux_t *cmux, circuit_t *circ,
circuitmux_assert_okay_paranoid(cmux);
}
+/**
+ * Notify the circuitmux that a destroy was sent, so we can update
+ * the counter.
+ */
+
+void
+circuitmux_notify_xmit_destroy(circuitmux_t *cmux)
+{
+ tor_assert(cmux);
+
+ --(cmux->destroy_ctr);
+ --(global_destroy_ctr);
+ log_debug(LD_CIRC,
+ "Cmux at %p sent a destroy, cmux counter is now "I64_FORMAT", "
+ "global counter is now "I64_FORMAT,
+ cmux,
+ I64_PRINTF_ARG(cmux->destroy_ctr),
+ I64_PRINTF_ARG(global_destroy_ctr));
+}
+
/*
* Circuitmux consistency checking assertions
*/
@@ -1743,3 +1872,40 @@ circuitmux_assert_okay_pass_three(circuitmux_t *cmux)
}
}
+/*DOCDOC */
+void
+circuitmux_append_destroy_cell(channel_t *chan,
+ circuitmux_t *cmux,
+ circid_t circ_id,
+ uint8_t reason)
+{
+ cell_t cell;
+ memset(&cell, 0, sizeof(cell_t));
+ cell.circ_id = circ_id;
+ cell.command = CELL_DESTROY;
+ cell.payload[0] = (uint8_t) reason;
+
+ cell_queue_append_packed_copy(NULL, &cmux->destroy_cell_queue, 0, &cell,
+ chan->wide_circ_ids, 0);
+
+ /* Destroy entering the queue, update counters */
+ ++(cmux->destroy_ctr);
+ ++global_destroy_ctr;
+ log_debug(LD_CIRC,
+ "Cmux at %p queued a destroy for circ %u, cmux counter is now "
+ I64_FORMAT", global counter is now "I64_FORMAT,
+ cmux, circ_id,
+ I64_PRINTF_ARG(cmux->destroy_ctr),
+ I64_PRINTF_ARG(global_destroy_ctr));
+
+ /* XXXX Duplicate code from append_cell_to_circuit_queue */
+ if (!channel_has_queued_writes(chan)) {
+ /* There is no data at all waiting to be sent on the outbuf. Add a
+ * cell, so that we can notice when it gets flushed, flushed_some can
+ * get called, and we can start putting more data onto the buffer then.
+ */
+ log_debug(LD_GENERAL, "Primed a buffer.");
+ channel_flush_from_first_active_circuit(chan, 1);
+ }
+}
+
diff --git a/src/or/circuitmux.h b/src/or/circuitmux.h
index 25644ffab..c4c0649c6 100644
--- a/src/or/circuitmux.h
+++ b/src/or/circuitmux.h
@@ -10,6 +10,7 @@
#define TOR_CIRCUITMUX_H
#include "or.h"
+#include "testsupport.h"
typedef struct circuitmux_policy_s circuitmux_policy_t;
typedef struct circuitmux_policy_data_s circuitmux_policy_data_t;
@@ -98,7 +99,8 @@ void circuitmux_assert_okay(circuitmux_t *cmux);
/* Create/destroy */
circuitmux_t * circuitmux_alloc(void);
-void circuitmux_detach_all_circuits(circuitmux_t *cmux);
+void circuitmux_detach_all_circuits(circuitmux_t *cmux,
+ smartlist_t *detached_out);
void circuitmux_free(circuitmux_t *cmux);
/* Policy control */
@@ -120,17 +122,27 @@ unsigned int circuitmux_num_circuits(circuitmux_t *cmux);
unsigned int circuitmux_num_active_circuits(circuitmux_t *cmux);
/* Channel interface */
-circuit_t * circuitmux_get_first_active_circuit(circuitmux_t *cmux);
+circuit_t * circuitmux_get_first_active_circuit(circuitmux_t *cmux,
+ cell_queue_t **destroy_queue_out);
void circuitmux_notify_xmit_cells(circuitmux_t *cmux, circuit_t *circ,
unsigned int n_cells);
+void circuitmux_notify_xmit_destroy(circuitmux_t *cmux);
/* Circuit interface */
-void circuitmux_attach_circuit(circuitmux_t *cmux, circuit_t *circ,
- cell_direction_t direction);
-void circuitmux_detach_circuit(circuitmux_t *cmux, circuit_t *circ);
+MOCK_DECL(void, circuitmux_attach_circuit, (circuitmux_t *cmux,
+ circuit_t *circ,
+ cell_direction_t direction));
+MOCK_DECL(void, circuitmux_detach_circuit,
+ (circuitmux_t *cmux, circuit_t *circ));
void circuitmux_clear_num_cells(circuitmux_t *cmux, circuit_t *circ);
void circuitmux_set_num_cells(circuitmux_t *cmux, circuit_t *circ,
unsigned int n_cells);
+void circuitmux_append_destroy_cell(channel_t *chan,
+ circuitmux_t *cmux, circid_t circ_id,
+ uint8_t reason);
+void circuitmux_mark_destroyed_circids_usable(circuitmux_t *cmux,
+ channel_t *chan);
+
#endif /* TOR_CIRCUITMUX_H */
diff --git a/src/or/circuitstats.c b/src/or/circuitstats.c
index 1d7812bf2..e362b1b49 100644
--- a/src/or/circuitstats.c
+++ b/src/or/circuitstats.c
@@ -12,12 +12,17 @@
#include "config.h"
#include "confparse.h"
#include "control.h"
+#include "main.h"
#include "networkstatus.h"
#include "statefile.h"
#undef log
#include <math.h>
+static void cbt_control_event_buildtimeout_set(
+ const circuit_build_times_t *cbt,
+ buildtimeout_set_event_t type);
+
#define CBT_BIN_TO_MS(bin) ((bin)*CBT_BIN_WIDTH + (CBT_BIN_WIDTH/2))
/** Global list of circuit build times */
@@ -26,12 +31,46 @@
// vary in their own latency. The downside of this is that guards
// can change frequently, so we'd be building a lot more circuits
// most likely.
-/* XXXX024 Make this static; add accessor functions. */
-circuit_build_times_t circ_times;
+static circuit_build_times_t circ_times;
+#ifdef TOR_UNIT_TESTS
/** If set, we're running the unit tests: we should avoid clobbering
* our state file or accessing get_options() or get_or_state() */
static int unit_tests = 0;
+#else
+#define unit_tests 0
+#endif
+
+/** Return a pointer to the data structure describing our current circuit
+ * build time history and computations. */
+const circuit_build_times_t *
+get_circuit_build_times(void)
+{
+ return &circ_times;
+}
+
+/** As get_circuit_build_times, but return a mutable pointer. */
+circuit_build_times_t *
+get_circuit_build_times_mutable(void)
+{
+ return &circ_times;
+}
+
+/** Return the time to wait before actually closing an under-construction, in
+ * milliseconds. */
+double
+get_circuit_build_close_time_ms(void)
+{
+ return circ_times.close_ms;
+}
+
+/** Return the time to wait before giving up on an under-construction circuit,
+ * in milliseconds. */
+double
+get_circuit_build_timeout_ms(void)
+{
+ return circ_times.timeout_ms;
+}
/**
* This function decides if CBT learning should be disabled. It returns
@@ -56,18 +95,22 @@ circuit_build_times_disabled(void)
if (consensus_disabled || config_disabled || dirauth_disabled ||
state_disabled) {
+#if 0
log_debug(LD_CIRC,
"CircuitBuildTime learning is disabled. "
"Consensus=%d, Config=%d, AuthDir=%d, StateFile=%d",
consensus_disabled, config_disabled, dirauth_disabled,
state_disabled);
+#endif
return 1;
} else {
+#if 0
log_debug(LD_CIRC,
"CircuitBuildTime learning is not disabled. "
"Consensus=%d, Config=%d, AuthDir=%d, StateFile=%d",
consensus_disabled, config_disabled, dirauth_disabled,
state_disabled);
+#endif
return 0;
}
}
@@ -154,7 +197,7 @@ circuit_build_times_min_circs_to_observe(void)
/** Return true iff <b>cbt</b> has recorded enough build times that we
* want to start acting on the timeout it implies. */
int
-circuit_build_times_enough_to_compute(circuit_build_times_t *cbt)
+circuit_build_times_enough_to_compute(const circuit_build_times_t *cbt)
{
return cbt->total_build_times >= circuit_build_times_min_circs_to_observe();
}
@@ -438,7 +481,7 @@ circuit_build_times_get_initial_timeout(void)
* Leave estimated parameters, timeout and network liveness intact
* for future use.
*/
-void
+STATIC void
circuit_build_times_reset(circuit_build_times_t *cbt)
{
memset(cbt->circuit_build_times, 0, sizeof(cbt->circuit_build_times));
@@ -471,7 +514,7 @@ circuit_build_times_init(circuit_build_times_t *cbt)
cbt->liveness.timeouts_after_firsthop = NULL;
}
cbt->close_ms = cbt->timeout_ms = circuit_build_times_get_initial_timeout();
- control_event_buildtimeout_set(cbt, BUILDTIMEOUT_SET_EVENT_RESET);
+ cbt_control_event_buildtimeout_set(cbt, BUILDTIMEOUT_SET_EVENT_RESET);
}
/**
@@ -557,7 +600,7 @@ circuit_build_times_add_time(circuit_build_times_t *cbt, build_time_t time)
* Return maximum circuit build time
*/
static build_time_t
-circuit_build_times_max(circuit_build_times_t *cbt)
+circuit_build_times_max(const circuit_build_times_t *cbt)
{
int i = 0;
build_time_t max_build_time = 0;
@@ -598,7 +641,7 @@ circuit_build_times_min(circuit_build_times_t *cbt)
* The return value must be freed by the caller.
*/
static uint32_t *
-circuit_build_times_create_histogram(circuit_build_times_t *cbt,
+circuit_build_times_create_histogram(const circuit_build_times_t *cbt,
build_time_t *nbins)
{
uint32_t *histogram;
@@ -688,7 +731,7 @@ circuit_build_times_get_xm(circuit_build_times_t *cbt)
* the or_state_t state structure.
*/
void
-circuit_build_times_update_state(circuit_build_times_t *cbt,
+circuit_build_times_update_state(const circuit_build_times_t *cbt,
or_state_t *state)
{
uint32_t *histogram;
@@ -949,7 +992,7 @@ circuit_build_times_parse_state(circuit_build_times_t *cbt,
* an acceptable approximation because we are only concerned with the
* accuracy of the CDF of the tail.
*/
-int
+STATIC int
circuit_build_times_update_alpha(circuit_build_times_t *cbt)
{
build_time_t *x=cbt->circuit_build_times;
@@ -1033,7 +1076,7 @@ circuit_build_times_update_alpha(circuit_build_times_t *cbt)
*
* Return value is in milliseconds.
*/
-double
+STATIC double
circuit_build_times_calculate_timeout(circuit_build_times_t *cbt,
double quantile)
{
@@ -1050,6 +1093,7 @@ circuit_build_times_calculate_timeout(circuit_build_times_t *cbt,
return ret;
}
+#ifdef TOR_UNIT_TESTS
/** Pareto CDF */
double
circuit_build_times_cdf(circuit_build_times_t *cbt, double x)
@@ -1060,7 +1104,9 @@ circuit_build_times_cdf(circuit_build_times_t *cbt, double x)
tor_assert(0 <= ret && ret <= 1.0);
return ret;
}
+#endif
+#ifdef TOR_UNIT_TESTS
/**
* Generate a synthetic time using our distribution parameters.
*
@@ -1093,7 +1139,9 @@ circuit_build_times_generate_sample(circuit_build_times_t *cbt,
tor_assert(ret > 0);
return ret;
}
+#endif
+#ifdef TOR_UNIT_TESTS
/**
* Estimate an initial alpha parameter by solving the quantile
* function with a quantile point and a specific timeout value.
@@ -1114,12 +1162,13 @@ circuit_build_times_initial_alpha(circuit_build_times_t *cbt,
(tor_mathlog(cbt->Xm)-tor_mathlog(timeout_ms));
tor_assert(cbt->alpha > 0);
}
+#endif
/**
* Returns true if we need circuits to be built
*/
int
-circuit_build_times_needs_circuits(circuit_build_times_t *cbt)
+circuit_build_times_needs_circuits(const circuit_build_times_t *cbt)
{
/* Return true if < MIN_CIRCUITS_TO_OBSERVE */
return !circuit_build_times_enough_to_compute(cbt);
@@ -1130,13 +1179,19 @@ circuit_build_times_needs_circuits(circuit_build_times_t *cbt)
* right now.
*/
int
-circuit_build_times_needs_circuits_now(circuit_build_times_t *cbt)
+circuit_build_times_needs_circuits_now(const circuit_build_times_t *cbt)
{
return circuit_build_times_needs_circuits(cbt) &&
approx_time()-cbt->last_circ_at > circuit_build_times_test_frequency();
}
/**
+ * How long should we be unreachable before we think we need to check if
+ * our published IP address has changed.
+ */
+#define CIRCUIT_TIMEOUT_BEFORE_RECHECK_IP (60*3)
+
+/**
* Called to indicate that the network showed some signs of liveness,
* i.e. we received a cell.
*
@@ -1151,12 +1206,15 @@ circuit_build_times_network_is_live(circuit_build_times_t *cbt)
{
time_t now = approx_time();
if (cbt->liveness.nonlive_timeouts > 0) {
+ time_t time_since_live = now - cbt->liveness.network_last_live;
log_notice(LD_CIRC,
"Tor now sees network activity. Restoring circuit build "
"timeout recording. Network was down for %d seconds "
"during %d circuit attempts.",
- (int)(now - cbt->liveness.network_last_live),
+ (int)time_since_live,
cbt->liveness.nonlive_timeouts);
+ if (time_since_live > CIRCUIT_TIMEOUT_BEFORE_RECHECK_IP)
+ reschedule_descriptor_update_check();
}
cbt->liveness.network_last_live = now;
cbt->liveness.nonlive_timeouts = 0;
@@ -1263,7 +1321,7 @@ circuit_build_times_network_close(circuit_build_times_t *cbt,
* in the case of recent liveness changes.
*/
int
-circuit_build_times_network_check_live(circuit_build_times_t *cbt)
+circuit_build_times_network_check_live(const circuit_build_times_t *cbt)
{
if (cbt->liveness.nonlive_timeouts > 0) {
return 0;
@@ -1282,7 +1340,7 @@ circuit_build_times_network_check_live(circuit_build_times_t *cbt)
* to restart the process of building test circuits and estimating a
* new timeout.
*/
-int
+STATIC int
circuit_build_times_network_check_changed(circuit_build_times_t *cbt)
{
int total_build_times = cbt->total_build_times;
@@ -1329,7 +1387,7 @@ circuit_build_times_network_check_changed(circuit_build_times_t *cbt)
= circuit_build_times_get_initial_timeout();
}
- control_event_buildtimeout_set(cbt, BUILDTIMEOUT_SET_EVENT_RESET);
+ cbt_control_event_buildtimeout_set(cbt, BUILDTIMEOUT_SET_EVENT_RESET);
log_notice(LD_CIRC,
"Your network connection speed appears to have changed. Resetting "
@@ -1511,7 +1569,7 @@ circuit_build_times_set_timeout(circuit_build_times_t *cbt)
}
}
- control_event_buildtimeout_set(cbt, BUILDTIMEOUT_SET_EVENT_COMPUTED);
+ cbt_control_event_buildtimeout_set(cbt, BUILDTIMEOUT_SET_EVENT_COMPUTED);
timeout_rate = circuit_build_times_timeout_rate(cbt);
@@ -1546,6 +1604,8 @@ circuit_build_times_set_timeout(circuit_build_times_t *cbt)
cbt->total_build_times);
}
}
+
+#ifdef TOR_UNIT_TESTS
/** Make a note that we're running unit tests (rather than running Tor
* itself), so we avoid clobbering our state file. */
void
@@ -1553,4 +1613,46 @@ circuitbuild_running_unit_tests(void)
{
unit_tests = 1;
}
+#endif
+
+void
+circuit_build_times_update_last_circ(circuit_build_times_t *cbt)
+{
+ cbt->last_circ_at = approx_time();
+}
+
+static void
+cbt_control_event_buildtimeout_set(const circuit_build_times_t *cbt,
+ buildtimeout_set_event_t type)
+{
+ char *args = NULL;
+ double qnt;
+
+ switch (type) {
+ case BUILDTIMEOUT_SET_EVENT_RESET:
+ case BUILDTIMEOUT_SET_EVENT_SUSPENDED:
+ case BUILDTIMEOUT_SET_EVENT_DISCARD:
+ qnt = 1.0;
+ break;
+ case BUILDTIMEOUT_SET_EVENT_COMPUTED:
+ case BUILDTIMEOUT_SET_EVENT_RESUME:
+ default:
+ qnt = circuit_build_times_quantile_cutoff();
+ break;
+ }
+
+ tor_asprintf(&args, "TOTAL_TIMES=%lu "
+ "TIMEOUT_MS=%lu XM=%lu ALPHA=%f CUTOFF_QUANTILE=%f "
+ "TIMEOUT_RATE=%f CLOSE_MS=%lu CLOSE_RATE=%f",
+ (unsigned long)cbt->total_build_times,
+ (unsigned long)cbt->timeout_ms,
+ (unsigned long)cbt->Xm, cbt->alpha, qnt,
+ circuit_build_times_timeout_rate(cbt),
+ (unsigned long)cbt->close_ms,
+ circuit_build_times_close_rate(cbt));
+
+ control_event_buildtimeout_set(type, args);
+
+ tor_free(args);
+}
diff --git a/src/or/circuitstats.h b/src/or/circuitstats.h
index 87dce99f4..3343310b8 100644
--- a/src/or/circuitstats.h
+++ b/src/or/circuitstats.h
@@ -12,11 +12,14 @@
#ifndef TOR_CIRCUITSTATS_H
#define TOR_CIRCUITSTATS_H
-extern circuit_build_times_t circ_times;
+const circuit_build_times_t *get_circuit_build_times(void);
+circuit_build_times_t *get_circuit_build_times_mutable(void);
+double get_circuit_build_close_time_ms(void);
+double get_circuit_build_timeout_ms(void);
int circuit_build_times_disabled(void);
-int circuit_build_times_enough_to_compute(circuit_build_times_t *cbt);
-void circuit_build_times_update_state(circuit_build_times_t *cbt,
+int circuit_build_times_enough_to_compute(const circuit_build_times_t *cbt);
+void circuit_build_times_update_state(const circuit_build_times_t *cbt,
or_state_t *state);
int circuit_build_times_parse_state(circuit_build_times_t *cbt,
or_state_t *state);
@@ -27,9 +30,9 @@ int circuit_build_times_count_close(circuit_build_times_t *cbt,
void circuit_build_times_set_timeout(circuit_build_times_t *cbt);
int circuit_build_times_add_time(circuit_build_times_t *cbt,
build_time_t time);
-int circuit_build_times_needs_circuits(circuit_build_times_t *cbt);
+int circuit_build_times_needs_circuits(const circuit_build_times_t *cbt);
-int circuit_build_times_needs_circuits_now(circuit_build_times_t *cbt);
+int circuit_build_times_needs_circuits_now(const circuit_build_times_t *cbt);
void circuit_build_times_init(circuit_build_times_t *cbt);
void circuit_build_times_free_timeouts(circuit_build_times_t *cbt);
void circuit_build_times_new_consensus_params(circuit_build_times_t *cbt,
@@ -37,29 +40,59 @@ void circuit_build_times_new_consensus_params(circuit_build_times_t *cbt,
double circuit_build_times_timeout_rate(const circuit_build_times_t *cbt);
double circuit_build_times_close_rate(const circuit_build_times_t *cbt);
+void circuit_build_times_update_last_circ(circuit_build_times_t *cbt);
+
#ifdef CIRCUITSTATS_PRIVATE
-double circuit_build_times_calculate_timeout(circuit_build_times_t *cbt,
+STATIC double circuit_build_times_calculate_timeout(circuit_build_times_t *cbt,
double quantile);
+STATIC int circuit_build_times_update_alpha(circuit_build_times_t *cbt);
+STATIC void circuit_build_times_reset(circuit_build_times_t *cbt);
+
+/* Network liveness functions */
+STATIC int circuit_build_times_network_check_changed(
+ circuit_build_times_t *cbt);
+#endif
+
+#ifdef TOR_UNIT_TESTS
build_time_t circuit_build_times_generate_sample(circuit_build_times_t *cbt,
double q_lo, double q_hi);
+double circuit_build_times_cdf(circuit_build_times_t *cbt, double x);
void circuit_build_times_initial_alpha(circuit_build_times_t *cbt,
double quantile, double time_ms);
-int circuit_build_times_update_alpha(circuit_build_times_t *cbt);
-double circuit_build_times_cdf(circuit_build_times_t *cbt, double x);
void circuitbuild_running_unit_tests(void);
-void circuit_build_times_reset(circuit_build_times_t *cbt);
-
-/* Network liveness functions */
-int circuit_build_times_network_check_changed(circuit_build_times_t *cbt);
#endif
/* Network liveness functions */
void circuit_build_times_network_is_live(circuit_build_times_t *cbt);
-int circuit_build_times_network_check_live(circuit_build_times_t *cbt);
+int circuit_build_times_network_check_live(const circuit_build_times_t *cbt);
void circuit_build_times_network_circ_success(circuit_build_times_t *cbt);
-/* DOCDOC circuit_build_times_get_bw_scale */
-int circuit_build_times_get_bw_scale(networkstatus_t *ns);
+#ifdef CIRCUITSTATS_PRIVATE
+/** Structure for circuit build times history */
+struct circuit_build_times_s {
+ /** The circular array of recorded build times in milliseconds */
+ build_time_t circuit_build_times[CBT_NCIRCUITS_TO_OBSERVE];
+ /** Current index in the circuit_build_times circular array */
+ int build_times_idx;
+ /** Total number of build times accumulated. Max CBT_NCIRCUITS_TO_OBSERVE */
+ int total_build_times;
+ /** Information about the state of our local network connection */
+ network_liveness_t liveness;
+ /** Last time we built a circuit. Used to decide to build new test circs */
+ time_t last_circ_at;
+ /** "Minimum" value of our pareto distribution (actually mode) */
+ build_time_t Xm;
+ /** alpha exponent for pareto dist. */
+ double alpha;
+ /** Have we computed a timeout? */
+ int have_computed_timeout;
+ /** The exact value for that timeout in milliseconds. Stored as a double
+ * to maintain precision from calculations to and from quantile value. */
+ double timeout_ms;
+ /** How long we wait before actually closing the circuit. */
+ double close_ms;
+};
+#endif
#endif
diff --git a/src/or/circuituse.c b/src/or/circuituse.c
index 598469198..023bd4cac 100644
--- a/src/or/circuituse.c
+++ b/src/or/circuituse.c
@@ -12,6 +12,7 @@
#include "or.h"
#include "addressmap.h"
#include "channel.h"
+#include "circpathbias.h"
#include "circuitbuild.h"
#include "circuitlist.h"
#include "circuitstats.h"
@@ -31,12 +32,6 @@
#include "router.h"
#include "routerlist.h"
-/********* START VARIABLES **********/
-
-extern circuit_t *global_circuitlist; /* from circuitlist.c */
-
-/********* END VARIABLES ************/
-
static void circuit_expire_old_circuits_clientside(void);
static void circuit_increment_failure_count(void);
@@ -286,7 +281,7 @@ circuit_get_best(const entry_connection_t *conn,
tor_gettimeofday(&now);
- for (circ=global_circuitlist;circ;circ = circ->next) {
+ TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) {
origin_circuit_t *origin_circ;
if (!CIRCUIT_IS_ORIGIN(circ))
continue;
@@ -301,7 +296,7 @@ circuit_get_best(const entry_connection_t *conn,
}
if (!circuit_is_acceptable(origin_circ,conn,must_be_open,purpose,
- need_uptime,need_internal,now.tv_sec))
+ need_uptime,need_internal, (time_t)now.tv_sec))
continue;
/* now this is an acceptable circ to hand back. but that doesn't
@@ -327,7 +322,7 @@ count_pending_general_client_circuits(void)
int count = 0;
- for (circ = global_circuitlist; circ; circ = circ->next) {
+ TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) {
if (circ->marked_for_close ||
circ->state == CIRCUIT_STATE_OPEN ||
circ->purpose != CIRCUIT_PURPOSE_C_GENERAL ||
@@ -375,7 +370,7 @@ circuit_conforms_to_options(const origin_circuit_t *circ,
void
circuit_expire_building(void)
{
- circuit_t *victim, *next_circ = global_circuitlist;
+ circuit_t *victim, *next_circ;
/* circ_times.timeout_ms and circ_times.close_ms are from
* circuit_build_times_get_initial_timeout() if we haven't computed
* custom timeouts yet */
@@ -393,10 +388,9 @@ circuit_expire_building(void)
* we want to be more lenient with timeouts, in case the
* user has relocated and/or changed network connections.
* See bug #3443. */
- while (next_circ) {
+ TOR_LIST_FOREACH(next_circ, circuit_get_global_list(), head) {
if (!CIRCUIT_IS_ORIGIN(next_circ) || /* didn't originate here */
next_circ->marked_for_close) { /* don't mess with marked circs */
- next_circ = next_circ->next;
continue;
}
@@ -408,9 +402,7 @@ circuit_expire_building(void)
any_opened_circs = 1;
break;
}
- next_circ = next_circ->next;
}
- next_circ = global_circuitlist;
#define SET_CUTOFF(target, msec) do { \
long ms = tor_lround(msec); \
@@ -451,12 +443,12 @@ circuit_expire_building(void)
* RTTs = 4a + 3b + 2c
* RTTs = 9h
*/
- SET_CUTOFF(general_cutoff, circ_times.timeout_ms);
- SET_CUTOFF(begindir_cutoff, circ_times.timeout_ms);
+ SET_CUTOFF(general_cutoff, get_circuit_build_timeout_ms());
+ SET_CUTOFF(begindir_cutoff, get_circuit_build_timeout_ms());
/* > 3hop circs seem to have a 1.0 second delay on their cannibalized
* 4th hop. */
- SET_CUTOFF(fourhop_cutoff, circ_times.timeout_ms * (10/6.0) + 1000);
+ SET_CUTOFF(fourhop_cutoff, get_circuit_build_timeout_ms() * (10/6.0) + 1000);
/* CIRCUIT_PURPOSE_C_ESTABLISH_REND behaves more like a RELAY cell.
* Use the stream cutoff (more or less). */
@@ -465,26 +457,25 @@ circuit_expire_building(void)
/* Be lenient with cannibalized circs. They already survived the official
* CBT, and they're usually not performance-critical. */
SET_CUTOFF(cannibalized_cutoff,
- MAX(circ_times.close_ms*(4/6.0),
+ MAX(get_circuit_build_close_time_ms()*(4/6.0),
options->CircuitStreamTimeout * 1000) + 1000);
/* Intro circs have an extra round trip (and are also 4 hops long) */
- SET_CUTOFF(c_intro_cutoff, circ_times.timeout_ms * (14/6.0) + 1000);
+ SET_CUTOFF(c_intro_cutoff, get_circuit_build_timeout_ms() * (14/6.0) + 1000);
/* Server intro circs have an extra round trip */
- SET_CUTOFF(s_intro_cutoff, circ_times.timeout_ms * (9/6.0) + 1000);
+ SET_CUTOFF(s_intro_cutoff, get_circuit_build_timeout_ms() * (9/6.0) + 1000);
- SET_CUTOFF(close_cutoff, circ_times.close_ms);
- SET_CUTOFF(extremely_old_cutoff, circ_times.close_ms*2 + 1000);
+ SET_CUTOFF(close_cutoff, get_circuit_build_close_time_ms());
+ SET_CUTOFF(extremely_old_cutoff, get_circuit_build_close_time_ms()*2 + 1000);
SET_CUTOFF(hs_extremely_old_cutoff,
- MAX(circ_times.close_ms*2 + 1000,
+ MAX(get_circuit_build_close_time_ms()*2 + 1000,
options->SocksTimeout * 1000));
- while (next_circ) {
+ TOR_LIST_FOREACH(next_circ, circuit_get_global_list(), head) {
struct timeval cutoff;
victim = next_circ;
- next_circ = next_circ->next;
if (!CIRCUIT_IS_ORIGIN(victim) || /* didn't originate here */
victim->marked_for_close) /* don't mess with marked circs */
continue;
@@ -546,7 +537,9 @@ circuit_expire_building(void)
"%d guards are live.",
TO_ORIGIN_CIRCUIT(victim)->global_identifier,
circuit_purpose_to_string(victim->purpose),
- TO_ORIGIN_CIRCUIT(victim)->build_state->desired_path_len,
+ TO_ORIGIN_CIRCUIT(victim)->build_state ?
+ TO_ORIGIN_CIRCUIT(victim)->build_state->desired_path_len :
+ -1,
circuit_state_to_string(victim->state),
channel_state_to_string(victim->n_chan->state),
num_live_entry_guards(0));
@@ -555,12 +548,14 @@ circuit_expire_building(void)
* was a timeout, and the timeout value needs to reset if we
* see enough of them. Note this means we also need to avoid
* double-counting below, too. */
- circuit_build_times_count_timeout(&circ_times, first_hop_succeeded);
+ circuit_build_times_count_timeout(get_circuit_build_times_mutable(),
+ first_hop_succeeded);
TO_ORIGIN_CIRCUIT(victim)->relaxed_timeout = 1;
}
continue;
} else {
static ratelim_t relax_timeout_limit = RATELIM_INIT(3600);
+ const double build_close_ms = get_circuit_build_close_time_ms();
log_fn_ratelim(&relax_timeout_limit, LOG_NOTICE, LD_CIRC,
"No circuits are opened. Relaxed timeout for circuit %d "
"(a %s %d-hop circuit in state %s with channel state %s) to "
@@ -568,10 +563,13 @@ circuit_expire_building(void)
"anyway. %d guards are live.",
TO_ORIGIN_CIRCUIT(victim)->global_identifier,
circuit_purpose_to_string(victim->purpose),
- TO_ORIGIN_CIRCUIT(victim)->build_state->desired_path_len,
+ TO_ORIGIN_CIRCUIT(victim)->build_state ?
+ TO_ORIGIN_CIRCUIT(victim)->build_state->desired_path_len :
+ -1,
circuit_state_to_string(victim->state),
channel_state_to_string(victim->n_chan->state),
- (long)circ_times.close_ms, num_live_entry_guards(0));
+ (long)build_close_ms,
+ num_live_entry_guards(0));
}
}
@@ -651,7 +649,7 @@ circuit_expire_building(void)
}
if (circuit_timeout_want_to_count_circ(TO_ORIGIN_CIRCUIT(victim)) &&
- circuit_build_times_enough_to_compute(&circ_times)) {
+ circuit_build_times_enough_to_compute(get_circuit_build_times())) {
/* Circuits are allowed to last longer for measurement.
* Switch their purpose and wait. */
if (victim->purpose != CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) {
@@ -665,8 +663,9 @@ circuit_expire_building(void)
* have a timeout. We also want to avoid double-counting
* already "relaxed" circuits, which are counted above. */
if (!TO_ORIGIN_CIRCUIT(victim)->relaxed_timeout) {
- circuit_build_times_count_timeout(&circ_times,
- first_hop_succeeded);
+ circuit_build_times_count_timeout(
+ get_circuit_build_times_mutable(),
+ first_hop_succeeded);
}
continue;
}
@@ -683,10 +682,11 @@ circuit_expire_building(void)
(long)(now.tv_sec - victim->timestamp_began.tv_sec),
victim->purpose,
circuit_purpose_to_string(victim->purpose));
- } else if (circuit_build_times_count_close(&circ_times,
- first_hop_succeeded,
- victim->timestamp_created.tv_sec)) {
- circuit_build_times_set_timeout(&circ_times);
+ } else if (circuit_build_times_count_close(
+ get_circuit_build_times_mutable(),
+ first_hop_succeeded,
+ (time_t)victim->timestamp_created.tv_sec)) {
+ circuit_build_times_set_timeout(get_circuit_build_times_mutable());
}
}
}
@@ -711,7 +711,8 @@ circuit_expire_building(void)
* and we have tried to send an INTRODUCE1 cell specifying it.
* Thus, if the pending_final_cpath field *is* NULL, then we
* want to not spare it. */
- if (TO_ORIGIN_CIRCUIT(victim)->build_state->pending_final_cpath ==
+ if (TO_ORIGIN_CIRCUIT(victim)->build_state &&
+ TO_ORIGIN_CIRCUIT(victim)->build_state->pending_final_cpath ==
NULL)
break;
/* fallthrough! */
@@ -750,23 +751,27 @@ circuit_expire_building(void)
if (victim->n_chan)
log_info(LD_CIRC,
- "Abandoning circ %u %s:%d (state %d,%d:%s, purpose %d, "
+ "Abandoning circ %u %s:%u (state %d,%d:%s, purpose %d, "
"len %d)", TO_ORIGIN_CIRCUIT(victim)->global_identifier,
channel_get_canonical_remote_descr(victim->n_chan),
(unsigned)victim->n_circ_id,
TO_ORIGIN_CIRCUIT(victim)->has_opened,
victim->state, circuit_state_to_string(victim->state),
victim->purpose,
- TO_ORIGIN_CIRCUIT(victim)->build_state->desired_path_len);
+ TO_ORIGIN_CIRCUIT(victim)->build_state ?
+ TO_ORIGIN_CIRCUIT(victim)->build_state->desired_path_len :
+ -1);
else
log_info(LD_CIRC,
- "Abandoning circ %u %d (state %d,%d:%s, purpose %d, len %d)",
+ "Abandoning circ %u %u (state %d,%d:%s, purpose %d, len %d)",
TO_ORIGIN_CIRCUIT(victim)->global_identifier,
(unsigned)victim->n_circ_id,
TO_ORIGIN_CIRCUIT(victim)->has_opened,
victim->state,
circuit_state_to_string(victim->state), victim->purpose,
- TO_ORIGIN_CIRCUIT(victim)->build_state->desired_path_len);
+ TO_ORIGIN_CIRCUIT(victim)->build_state ?
+ TO_ORIGIN_CIRCUIT(victim)->build_state->desired_path_len :
+ -1);
circuit_log_path(LOG_INFO,LD_CIRC,TO_ORIGIN_CIRCUIT(victim));
if (victim->purpose == CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT)
@@ -778,6 +783,122 @@ circuit_expire_building(void)
}
}
+/**
+ * As a diagnostic for bug 8387, log information about how many one-hop
+ * circuits we have around that have been there for at least <b>age</b>
+ * seconds. Log a few of them.
+ */
+void
+circuit_log_ancient_one_hop_circuits(int age)
+{
+#define MAX_ANCIENT_ONEHOP_CIRCUITS_TO_LOG 10
+ time_t now = time(NULL);
+ time_t cutoff = now - age;
+ int n_found = 0;
+ smartlist_t *log_these = smartlist_new();
+ const circuit_t *circ;
+
+ TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) {
+ const origin_circuit_t *ocirc;
+ if (! CIRCUIT_IS_ORIGIN(circ))
+ continue;
+ if (circ->timestamp_created.tv_sec >= cutoff)
+ continue;
+ ocirc = CONST_TO_ORIGIN_CIRCUIT(circ);
+
+ if (ocirc->build_state && ocirc->build_state->onehop_tunnel) {
+ ++n_found;
+
+ if (smartlist_len(log_these) < MAX_ANCIENT_ONEHOP_CIRCUITS_TO_LOG)
+ smartlist_add(log_these, (origin_circuit_t*) ocirc);
+ }
+ }
+
+ if (n_found == 0)
+ goto done;
+
+ log_notice(LD_HEARTBEAT,
+ "Diagnostic for issue 8387: Found %d one-hop circuits more "
+ "than %d seconds old! Logging %d...",
+ n_found, age, smartlist_len(log_these));
+
+ SMARTLIST_FOREACH_BEGIN(log_these, const origin_circuit_t *, ocirc) {
+ char created[ISO_TIME_LEN+1];
+ int stream_num;
+ const edge_connection_t *conn;
+ char *dirty = NULL;
+ circ = TO_CIRCUIT(ocirc);
+
+ format_local_iso_time(created,
+ (time_t)circ->timestamp_created.tv_sec);
+
+
+ if (circ->timestamp_dirty) {
+ char dirty_since[ISO_TIME_LEN+1];
+ format_local_iso_time(dirty_since, circ->timestamp_dirty);
+
+ tor_asprintf(&dirty, "Dirty since %s (%ld seconds vs %ld-second cutoff)",
+ dirty_since, (long)(now - circ->timestamp_dirty),
+ (long) get_options()->MaxCircuitDirtiness);
+ } else {
+ dirty = tor_strdup("Not marked dirty");
+ }
+
+ log_notice(LD_HEARTBEAT, " #%d created at %s. %s, %s. %s for close. "
+ "%s for new conns. %s.",
+ ocirc_sl_idx,
+ created,
+ circuit_state_to_string(circ->state),
+ circuit_purpose_to_string(circ->purpose),
+ circ->marked_for_close ? "Marked" : "Not marked",
+ ocirc->unusable_for_new_conns ? "Not usable" : "usable",
+ dirty);
+ tor_free(dirty);
+
+ stream_num = 0;
+ for (conn = ocirc->p_streams; conn; conn = conn->next_stream) {
+ const connection_t *c = TO_CONN(conn);
+ char stream_created[ISO_TIME_LEN+1];
+ if (++stream_num >= 5)
+ break;
+
+ format_local_iso_time(stream_created, c->timestamp_created);
+
+ log_notice(LD_HEARTBEAT, " Stream#%d created at %s. "
+ "%s conn in state %s. "
+ "%s for close (%s:%d). Hold-open is %sset. "
+ "Has %ssent RELAY_END. %s on circuit.",
+ stream_num,
+ stream_created,
+ conn_type_to_string(c->type),
+ conn_state_to_string(c->type, c->state),
+ c->marked_for_close ? "Marked" : "Not marked",
+ c->marked_for_close_file ? c->marked_for_close_file : "--",
+ c->marked_for_close,
+ c->hold_open_until_flushed ? "" : "not ",
+ conn->edge_has_sent_end ? "" : "not ",
+ conn->edge_blocked_on_circ ? "Blocked" : "Not blocked");
+ if (! c->linked_conn)
+ continue;
+
+ c = c->linked_conn;
+
+ log_notice(LD_HEARTBEAT, " Linked to %s connection in state %s "
+ "(Purpose %d). %s for close (%s:%d). Hold-open is %sset. ",
+ conn_type_to_string(c->type),
+ conn_state_to_string(c->type, c->state),
+ c->purpose,
+ c->marked_for_close ? "Marked" : "Not marked",
+ c->marked_for_close_file ? c->marked_for_close_file : "--",
+ c->marked_for_close,
+ c->hold_open_until_flushed ? "" : "not ");
+ }
+ } SMARTLIST_FOREACH_END(ocirc);
+
+ done:
+ smartlist_free(log_these);
+}
+
/** Remove any elements in <b>needed_ports</b> that are handled by an
* open or in-progress circuit.
*/
@@ -818,7 +939,7 @@ circuit_stream_is_being_handled(entry_connection_t *conn,
get_options()->LongLivedPorts,
conn ? conn->socks_request->port : port);
- for (circ=global_circuitlist;circ;circ = circ->next) {
+ TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) {
if (CIRCUIT_IS_ORIGIN(circ) &&
!circ->marked_for_close &&
circ->purpose == CIRCUIT_PURPOSE_C_GENERAL &&
@@ -869,7 +990,7 @@ circuit_predict_and_launch_new(void)
int flags = 0;
/* First, count how many of each type of circuit we have already. */
- for (circ=global_circuitlist;circ;circ = circ->next) {
+ TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) {
cpath_build_state_t *build_state;
origin_circuit_t *origin_circ;
if (!CIRCUIT_IS_ORIGIN(circ))
@@ -949,7 +1070,7 @@ circuit_predict_and_launch_new(void)
* we can still build circuits preemptively as needed. */
if (num < MAX_UNUSED_OPEN_CIRCUITS-2 &&
! circuit_build_times_disabled() &&
- circuit_build_times_needs_circuits_now(&circ_times)) {
+ circuit_build_times_needs_circuits_now(get_circuit_build_times())) {
flags = CIRCLAUNCH_NEED_CAPACITY;
log_info(LD_CIRC,
"Have %d clean circs need another buildtime test circ.", num);
@@ -1085,7 +1206,7 @@ circuit_expire_old_circuits_clientside(void)
cutoff = now;
if (! circuit_build_times_disabled() &&
- circuit_build_times_needs_circuits(&circ_times)) {
+ circuit_build_times_needs_circuits(get_circuit_build_times())) {
/* Circuits should be shorter lived if we need more of them
* for learning a good build timeout */
cutoff.tv_sec -= IDLE_TIMEOUT_WHILE_LEARNING;
@@ -1093,7 +1214,7 @@ circuit_expire_old_circuits_clientside(void)
cutoff.tv_sec -= get_options()->CircuitIdleTimeout;
}
- for (circ = global_circuitlist; circ; circ = circ->next) {
+ TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) {
if (circ->marked_for_close || !CIRCUIT_IS_ORIGIN(circ))
continue;
/* If the circuit has been dirty for too long, and there are no streams
@@ -1176,7 +1297,7 @@ circuit_expire_old_circuits_serverside(time_t now)
or_circuit_t *or_circ;
time_t cutoff = now - IDLE_ONE_HOP_CIRC_TIMEOUT;
- for (circ = global_circuitlist; circ; circ = circ->next) {
+ TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) {
if (circ->marked_for_close || CIRCUIT_IS_ORIGIN(circ))
continue;
or_circ = TO_OR_CIRCUIT(circ);
@@ -1223,7 +1344,7 @@ circuit_enough_testing_circs(void)
if (have_performed_bandwidth_test)
return 1;
- for (circ = global_circuitlist; circ; circ = circ->next) {
+ TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) {
if (!circ->marked_for_close && CIRCUIT_IS_ORIGIN(circ) &&
circ->purpose == CIRCUIT_PURPOSE_TESTING &&
circ->state == CIRCUIT_STATE_OPEN)
@@ -1382,10 +1503,11 @@ circuit_build_failed(origin_circuit_t *circ)
failed_at_last_hop = 1;
}
if (circ->cpath &&
- circ->cpath->state != CPATH_STATE_OPEN) {
- /* We failed at the first hop. If there's an OR connection
- * to blame, blame it. Also, avoid this relay for a while, and
- * fail any one-hop directory fetches destined for it. */
+ circ->cpath->state != CPATH_STATE_OPEN &&
+ ! circ->base_.received_destroy) {
+ /* We failed at the first hop for some reason other than a DESTROY cell.
+ * If there's an OR connection to blame, blame it. Also, avoid this relay
+ * for a while, and fail any one-hop directory fetches destined for it. */
const char *n_chan_id = circ->cpath->extend_info->identity_digest;
int already_marked = 0;
if (circ->base_.n_chan) {
@@ -1518,7 +1640,7 @@ circuit_launch_by_extend_info(uint8_t purpose,
circ = circuit_find_to_cannibalize(purpose, extend_info, flags);
if (circ) {
uint8_t old_purpose = circ->base_.purpose;
- struct timeval old_timestamp_began;
+ struct timeval old_timestamp_began = circ->base_.timestamp_began;
log_info(LD_CIRC,"Cannibalizing circ '%s' for purpose %d (%s)",
build_state_get_exit_nickname(circ->build_state), purpose,
diff --git a/src/or/circuituse.h b/src/or/circuituse.h
index 11e5a6416..f228a6758 100644
--- a/src/or/circuituse.h
+++ b/src/or/circuituse.h
@@ -16,6 +16,7 @@ void circuit_expire_building(void);
void circuit_remove_handled_ports(smartlist_t *needed_ports);
int circuit_stream_is_being_handled(entry_connection_t *conn, uint16_t port,
int min);
+void circuit_log_ancient_one_hop_circuits(int age);
#if 0
int circuit_conforms_to_options(const origin_circuit_t *circ,
const or_options_t *options);
diff --git a/src/or/command.c b/src/or/command.c
index 699b02fb4..105bdc637 100644
--- a/src/or/command.c
+++ b/src/or/command.c
@@ -53,6 +53,33 @@ static void command_process_created_cell(cell_t *cell, channel_t *chan);
static void command_process_relay_cell(cell_t *cell, channel_t *chan);
static void command_process_destroy_cell(cell_t *cell, channel_t *chan);
+/** Convert the cell <b>command</b> into a lower-case, human-readable
+ * string. */
+const char *
+cell_command_to_string(uint8_t command)
+{
+ switch (command) {
+ case CELL_PADDING: return "padding";
+ case CELL_CREATE: return "create";
+ case CELL_CREATED: return "created";
+ case CELL_RELAY: return "relay";
+ case CELL_DESTROY: return "destroy";
+ case CELL_CREATE_FAST: return "create_fast";
+ case CELL_CREATED_FAST: return "created_fast";
+ case CELL_VERSIONS: return "versions";
+ case CELL_NETINFO: return "netinfo";
+ case CELL_RELAY_EARLY: return "relay_early";
+ case CELL_CREATE2: return "create2";
+ case CELL_CREATED2: return "created2";
+ case CELL_VPADDING: return "vpadding";
+ case CELL_CERTS: return "certs";
+ case CELL_AUTH_CHALLENGE: return "auth_challenge";
+ case CELL_AUTHENTICATE: return "authenticate";
+ case CELL_AUTHORIZE: return "authorize";
+ default: return "unrecognized";
+ }
+}
+
#ifdef KEEP_TIMING_STATS
/** This is a wrapper function around the actual function that processes the
* <b>cell</b> that just arrived on <b>conn</b>. Increment <b>*time</b>
@@ -349,7 +376,7 @@ command_process_created_cell(cell_t *cell, channel_t *chan)
return;
}
- if (circ->n_circ_id != cell->circ_id) {
+ if (circ->n_circ_id != cell->circ_id || circ->n_chan != chan) {
log_fn(LOG_PROTOCOL_WARN,LD_PROTOCOL,
"got created cell from Tor client? Closing.");
circuit_mark_for_close(circ, END_CIRC_REASON_TORPROTOCOL);
@@ -434,6 +461,7 @@ command_process_relay_cell(cell_t *cell, channel_t *chan)
}
if (!CIRCUIT_IS_ORIGIN(circ) &&
+ chan == TO_OR_CIRCUIT(circ)->p_chan &&
cell->circ_id == TO_OR_CIRCUIT(circ)->p_circ_id)
direction = CELL_DIRECTION_OUT;
else
@@ -499,8 +527,10 @@ command_process_destroy_cell(cell_t *cell, channel_t *chan)
log_debug(LD_OR,"Received for circID %u.",(unsigned)cell->circ_id);
reason = (uint8_t)cell->payload[0];
+ circ->received_destroy = 1;
if (!CIRCUIT_IS_ORIGIN(circ) &&
+ chan == TO_OR_CIRCUIT(circ)->p_chan &&
cell->circ_id == TO_OR_CIRCUIT(circ)->p_circ_id) {
/* the destroy came from behind */
circuit_set_p_circid_chan(TO_OR_CIRCUIT(circ), 0, NULL);
diff --git a/src/or/command.h b/src/or/command.h
index 913f46a5c..adea6adea 100644
--- a/src/or/command.h
+++ b/src/or/command.h
@@ -19,6 +19,8 @@ void command_process_var_cell(channel_t *chan, var_cell_t *cell);
void command_setup_channel(channel_t *chan);
void command_setup_listener(channel_listener_t *chan_l);
+const char *cell_command_to_string(uint8_t command);
+
extern uint64_t stats_n_padding_cells_processed;
extern uint64_t stats_n_create_cells_processed;
extern uint64_t stats_n_created_cells_processed;
diff --git a/src/or/config.c b/src/or/config.c
index ef0294626..10df83975 100644
--- a/src/or/config.c
+++ b/src/or/config.c
@@ -1,4 +1,4 @@
- /* Copyright (c) 2001 Matej Pfajfar.
+/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
* Copyright (c) 2007-2013, The Tor Project, Inc. */
@@ -10,7 +10,6 @@
**/
#define CONFIG_PRIVATE
-
#include "or.h"
#include "addressmap.h"
#include "channel.h"
@@ -40,11 +39,14 @@
#include "rendservice.h"
#include "rephist.h"
#include "router.h"
+#include "sandbox.h"
#include "util.h"
#include "routerlist.h"
#include "routerset.h"
#include "statefile.h"
#include "transports.h"
+#include "ext_orport.h"
+#include "torgzip.h"
#ifdef _WIN32
#include <shlobj.h>
#endif
@@ -83,6 +85,7 @@ static config_abbrev_t option_abbrevs_[] = {
{ "DirFetchPostPeriod", "StatusFetchPeriod", 0, 0},
{ "DirServer", "DirAuthority", 0, 0}, /* XXXX024 later, make this warn? */
{ "MaxConn", "ConnLimit", 0, 1},
+ { "MaxMemInCellQueues", "MaxMemInQueues", 0, 0},
{ "ORBindAddress", "ORListenAddress", 0, 0},
{ "DirBindAddress", "DirListenAddress", 0, 0},
{ "SocksBindAddress", "SocksListenAddress", 0, 0},
@@ -135,7 +138,7 @@ static config_var_t option_vars_[] = {
V(AllowSingleHopExits, BOOL, "0"),
V(AlternateBridgeAuthority, LINELIST, NULL),
V(AlternateDirAuthority, LINELIST, NULL),
- V(AlternateHSAuthority, LINELIST, NULL),
+ OBSOLETE("AlternateHSAuthority"),
V(AssumeReachable, BOOL, "0"),
V(AuthDirBadDir, LINELIST, NULL),
V(AuthDirBadDirCCs, CSV, ""),
@@ -213,11 +216,14 @@ static config_var_t option_vars_[] = {
V(DisableAllSwap, BOOL, "0"),
V(DisableDebuggerAttachment, BOOL, "1"),
V(DisableIOCP, BOOL, "1"),
- V(DisableV2DirectoryInfo_, BOOL, "0"),
+ OBSOLETE("DisableV2DirectoryInfo_"),
V(DynamicDHGroups, BOOL, "0"),
VPORT(DNSPort, LINELIST, NULL),
V(DNSListenAddress, LINELIST, NULL),
V(DownloadExtraInfo, BOOL, "0"),
+ V(TestingEnableConnBwEvent, BOOL, "0"),
+ V(TestingEnableCellStatsEvent, BOOL, "0"),
+ V(TestingEnableTbEmptyEvent, BOOL, "0"),
V(EnforceDistinctSubnets, BOOL, "1"),
V(EntryNodes, ROUTERSET, NULL),
V(EntryStatistics, BOOL, "0"),
@@ -230,19 +236,21 @@ static config_var_t option_vars_[] = {
V(ExitPolicyRejectPrivate, BOOL, "1"),
V(ExitPortStatistics, BOOL, "0"),
V(ExtendAllowPrivateAddresses, BOOL, "0"),
+ VPORT(ExtORPort, LINELIST, NULL),
+ V(ExtORPortCookieAuthFile, STRING, NULL),
V(ExtraInfoStatistics, BOOL, "1"),
V(FallbackDir, LINELIST, NULL),
OBSOLETE("FallbackNetworkstatusFile"),
V(FascistFirewall, BOOL, "0"),
V(FirewallPorts, CSV, ""),
- V(FastFirstHopPK, BOOL, "1"),
+ V(FastFirstHopPK, AUTOBOOL, "auto"),
V(FetchDirInfoEarly, BOOL, "0"),
V(FetchDirInfoExtraEarly, BOOL, "0"),
V(FetchServerDescriptors, BOOL, "1"),
V(FetchHidServDescriptors, BOOL, "1"),
V(FetchUselessDescriptors, BOOL, "0"),
- V(FetchV2Networkstatus, BOOL, "0"),
+ OBSOLETE("FetchV2Networkstatus"),
V(GeoIPExcludeUnknown, AUTOBOOL, "auto"),
#ifdef _WIN32
V(GeoIPFile, FILENAME, "<default>"),
@@ -270,7 +278,7 @@ static config_var_t option_vars_[] = {
VAR("HiddenServiceVersion",LINELIST_S, RendConfigLines, NULL),
VAR("HiddenServiceAuthorizeClient",LINELIST_S,RendConfigLines, NULL),
V(HidServAuth, LINELIST, NULL),
- V(HSAuthoritativeDir, BOOL, "0"),
+ OBSOLETE("HSAuthoritativeDir"),
OBSOLETE("HSAuthorityRecordStats"),
V(CloseHSClientCircuitsImmediatelyOnTimeout, BOOL, "0"),
V(CloseHSServiceRendCircuitsImmediatelyOnTimeout, BOOL, "0"),
@@ -281,6 +289,7 @@ static config_var_t option_vars_[] = {
V(IPv6Exit, BOOL, "0"),
VAR("ServerTransportPlugin", LINELIST, ServerTransportPlugin, NULL),
V(ServerTransportListenAddr, LINELIST, NULL),
+ V(ServerTransportOptions, LINELIST, NULL),
V(Socks4Proxy, STRING, NULL),
V(Socks5Proxy, STRING, NULL),
V(Socks5ProxyUsername, STRING, NULL),
@@ -299,7 +308,7 @@ static config_var_t option_vars_[] = {
V(MaxAdvertisedBandwidth, MEMUNIT, "1 GB"),
V(MaxCircuitDirtiness, INTERVAL, "10 minutes"),
V(MaxClientCircuitsPending, UINT, "32"),
- V(MaxMemInCellQueues, MEMUNIT, "8 GB"),
+ VAR("MaxMemInQueues", MEMUNIT, MaxMemInQueues_raw, "0"),
OBSOLETE("MaxOnionsPending"),
V(MaxOnionQueueDelay, MSEC_INTERVAL, "1750 msec"),
V(MinMeasuredBWsForAuthToIgnoreAdvertised, INT, "500"),
@@ -310,6 +319,7 @@ static config_var_t option_vars_[] = {
V(NATDListenAddress, LINELIST, NULL),
VPORT(NATDPort, LINELIST, NULL),
V(Nickname, STRING, NULL),
+ V(PredictedPortsRelevanceTime, INTERVAL, "1 hour"),
V(WarnUnsafeSocks, BOOL, "1"),
OBSOLETE("NoPublish"),
VAR("NodeFamily", LINELIST, NodeFamilies, NULL),
@@ -347,7 +357,7 @@ static config_var_t option_vars_[] = {
V(OptimisticData, AUTOBOOL, "auto"),
V(PortForwarding, BOOL, "0"),
V(PortForwardingHelper, FILENAME, "tor-fw-helper"),
- V(PreferTunneledDirConns, BOOL, "1"),
+ OBSOLETE("PreferTunneledDirConns"),
V(ProtocolWarnings, BOOL, "0"),
V(PublishServerDescriptor, CSV, "1"),
V(PublishHidServDescriptors, BOOL, "1"),
@@ -370,6 +380,7 @@ static config_var_t option_vars_[] = {
V(RunAsDaemon, BOOL, "0"),
// V(RunTesting, BOOL, "0"),
OBSOLETE("RunTesting"), // currently unused
+ V(Sandbox, BOOL, "0"),
V(SafeLogging, STRING, "1"),
V(SafeSocks, BOOL, "0"),
V(ServerDNSAllowBrokenConfig, BOOL, "1"),
@@ -400,21 +411,23 @@ static config_var_t option_vars_[] = {
OBSOLETE("TrafficShaping"),
V(TransListenAddress, LINELIST, NULL),
VPORT(TransPort, LINELIST, NULL),
- V(TunnelDirConns, BOOL, "1"),
+ V(TransProxyType, STRING, "default"),
+ OBSOLETE("TunnelDirConns"),
V(UpdateBridgesFromAuthority, BOOL, "0"),
V(UseBridges, BOOL, "0"),
V(UseEntryGuards, BOOL, "1"),
V(UseEntryGuardsAsDirGuards, BOOL, "1"),
V(UseMicrodescriptors, AUTOBOOL, "auto"),
- V(UseNTorHandshake, AUTOBOOL, "auto"),
+ V(UseNTorHandshake, AUTOBOOL, "1"),
V(User, STRING, NULL),
V(UserspaceIOCPBuffers, BOOL, "0"),
- VAR("V1AuthoritativeDirectory",BOOL, V1AuthoritativeDir, "0"),
- VAR("V2AuthoritativeDirectory",BOOL, V2AuthoritativeDir, "0"),
+ OBSOLETE("V1AuthoritativeDirectory"),
+ OBSOLETE("V2AuthoritativeDirectory"),
VAR("V3AuthoritativeDirectory",BOOL, V3AuthoritativeDir, "0"),
V(TestingV3AuthInitialVotingInterval, INTERVAL, "30 minutes"),
V(TestingV3AuthInitialVoteDelay, INTERVAL, "5 minutes"),
V(TestingV3AuthInitialDistDelay, INTERVAL, "5 minutes"),
+ V(TestingV3AuthVotingStartOffset, INTERVAL, "0"),
V(V3AuthVotingInterval, INTERVAL, "1 hour"),
V(V3AuthVoteDelay, INTERVAL, "5 minutes"),
V(V3AuthDistDelay, INTERVAL, "5 minutes"),
@@ -435,6 +448,24 @@ static config_var_t option_vars_[] = {
VAR("__OwningControllerProcess",STRING,OwningControllerProcess, NULL),
V(MinUptimeHidServDirectoryV2, INTERVAL, "25 hours"),
V(VoteOnHidServDirectoriesV2, BOOL, "1"),
+ V(TestingServerDownloadSchedule, CSV_INTERVAL, "0, 0, 0, 60, 60, 120, "
+ "300, 900, 2147483647"),
+ V(TestingClientDownloadSchedule, CSV_INTERVAL, "0, 0, 60, 300, 600, "
+ "2147483647"),
+ V(TestingServerConsensusDownloadSchedule, CSV_INTERVAL, "0, 0, 60, "
+ "300, 600, 1800, 1800, 1800, 1800, "
+ "1800, 3600, 7200"),
+ V(TestingClientConsensusDownloadSchedule, CSV_INTERVAL, "0, 0, 60, "
+ "300, 600, 1800, 3600, 3600, 3600, "
+ "10800, 21600, 43200"),
+ V(TestingBridgeDownloadSchedule, CSV_INTERVAL, "3600, 900, 900, 3600"),
+ V(TestingClientMaxIntervalWithoutRequest, INTERVAL, "10 minutes"),
+ V(TestingDirConnectionMaxStall, INTERVAL, "5 minutes"),
+ V(TestingConsensusMaxDownloadTries, UINT, "8"),
+ V(TestingDescriptorMaxDownloadTries, UINT, "8"),
+ V(TestingMicrodescMaxDownloadTries, UINT, "8"),
+ V(TestingCertMaxDownloadTries, UINT, "8"),
+ V(TestingDirAuthVoteGuard, ROUTERSET, NULL),
VAR("___UsingTestNetworkDefaults", BOOL, UsingTestNetworkDefaults_, "0"),
{ NULL, CONFIG_TYPE_OBSOLETE, 0, NULL }
@@ -460,9 +491,28 @@ static const config_var_t testing_tor_network_defaults[] = {
V(TestingV3AuthInitialVotingInterval, INTERVAL, "5 minutes"),
V(TestingV3AuthInitialVoteDelay, INTERVAL, "20 seconds"),
V(TestingV3AuthInitialDistDelay, INTERVAL, "20 seconds"),
+ V(TestingV3AuthVotingStartOffset, INTERVAL, "0"),
V(TestingAuthDirTimeToLearnReachability, INTERVAL, "0 minutes"),
V(TestingEstimatedDescriptorPropagationTime, INTERVAL, "0 minutes"),
V(MinUptimeHidServDirectoryV2, INTERVAL, "0 minutes"),
+ V(TestingServerDownloadSchedule, CSV_INTERVAL, "0, 0, 0, 5, 10, 15, "
+ "20, 30, 60"),
+ V(TestingClientDownloadSchedule, CSV_INTERVAL, "0, 0, 5, 10, 15, 20, "
+ "30, 60"),
+ V(TestingServerConsensusDownloadSchedule, CSV_INTERVAL, "0, 0, 5, 10, "
+ "15, 20, 30, 60"),
+ V(TestingClientConsensusDownloadSchedule, CSV_INTERVAL, "0, 0, 5, 10, "
+ "15, 20, 30, 60"),
+ V(TestingBridgeDownloadSchedule, CSV_INTERVAL, "60, 30, 30, 60"),
+ V(TestingClientMaxIntervalWithoutRequest, INTERVAL, "5 seconds"),
+ V(TestingDirConnectionMaxStall, INTERVAL, "30 seconds"),
+ V(TestingConsensusMaxDownloadTries, UINT, "80"),
+ V(TestingDescriptorMaxDownloadTries, UINT, "80"),
+ V(TestingMicrodescMaxDownloadTries, UINT, "80"),
+ V(TestingCertMaxDownloadTries, UINT, "80"),
+ V(TestingEnableConnBwEvent, BOOL, "1"),
+ V(TestingEnableCellStatsEvent, BOOL, "1"),
+ V(TestingEnableTbEmptyEvent, BOOL, "1"),
VAR("___UsingTestNetworkDefaults", BOOL, UsingTestNetworkDefaults_, "1"),
{ NULL, CONFIG_TYPE_OBSOLETE, 0, NULL }
@@ -475,9 +525,6 @@ static const config_var_t testing_tor_network_defaults[] = {
#ifdef _WIN32
static char *get_windows_conf_root(void);
#endif
-static int options_validate(or_options_t *old_options,
- or_options_t *options,
- int from_setconf, char **msg);
static int options_act_reversible(const or_options_t *old_options, char **msg);
static int options_act(const or_options_t *old_options);
static int options_transition_allowed(const or_options_t *old,
@@ -487,12 +534,13 @@ static int options_transition_affects_workers(
const or_options_t *old_options, const or_options_t *new_options);
static int options_transition_affects_descriptor(
const or_options_t *old_options, const or_options_t *new_options);
-static int check_nickname_list(const char *lst, const char *name, char **msg);
+static int check_nickname_list(char **lst, const char *name, char **msg);
-static int parse_bridge_line(const char *line, int validate_only);
-static int parse_client_transport_line(const char *line, int validate_only);
+static int parse_client_transport_line(const or_options_t *options,
+ const char *line, int validate_only);
-static int parse_server_transport_line(const char *line, int validate_only);
+static int parse_server_transport_line(const or_options_t *options,
+ const char *line, int validate_only);
static char *get_bindaddr_from_transport_listen_line(const char *line,
const char *transport);
static int parse_dir_authority_line(const char *line,
@@ -517,18 +565,23 @@ static int parse_outbound_addresses(or_options_t *options, int validate_only,
char **msg);
static void config_maybe_load_geoip_files_(const or_options_t *options,
const or_options_t *old_options);
+static int options_validate_cb(void *old_options, void *options,
+ void *default_options,
+ int from_setconf, char **msg);
+static uint64_t compute_real_max_mem_in_queues(const uint64_t val,
+ int log_guess);
/** Magic value for or_options_t. */
#define OR_OPTIONS_MAGIC 9090909
/** Configuration format for or_options_t. */
-static config_format_t options_format = {
+STATIC config_format_t options_format = {
sizeof(or_options_t),
OR_OPTIONS_MAGIC,
STRUCT_OFFSET(or_options_t, magic_),
option_abbrevs_,
option_vars_,
- (validate_fn_t)options_validate,
+ options_validate_cb,
NULL
};
@@ -545,8 +598,12 @@ static or_options_t *global_default_options = NULL;
static char *torrc_fname = NULL;
/** Name of the most recently read torrc-defaults file.*/
static char *torrc_defaults_fname;
-/** Configuration Options set by command line. */
+/** Configuration options set by command line. */
static config_line_t *global_cmdline_options = NULL;
+/** Non-configuration options set by the command line */
+static config_line_t *global_cmdline_only_options = NULL;
+/** Boolean: Have we parsed the command line? */
+static int have_parsed_cmdline = 0;
/** Contents of most recently read DirPortFrontPage file. */
static char *global_dirfrontpagecontents = NULL;
/** List of port_cfg_t for all configured ports. */
@@ -568,8 +625,8 @@ get_options_mutable(void)
}
/** Returns the currently configured options */
-const or_options_t *
-get_options(void)
+MOCK_IMPL(const or_options_t *,
+get_options,(void))
{
return get_options_mutable();
}
@@ -678,7 +735,7 @@ get_short_version(void)
/** Release additional memory allocated in options
*/
-static void
+STATIC void
or_options_free(or_options_t *options)
{
if (!options)
@@ -691,6 +748,7 @@ or_options_free(or_options_t *options)
smartlist_free(options->NodeFamilySets);
}
tor_free(options->BridgePassword_AuthDigest_);
+ tor_free(options->command_arg);
config_free(&options_format, options);
}
@@ -707,6 +765,9 @@ config_free_all(void)
config_free_lines(global_cmdline_options);
global_cmdline_options = NULL;
+ config_free_lines(global_cmdline_only_options);
+ global_cmdline_only_options = NULL;
+
if (configured_ports) {
SMARTLIST_FOREACH(configured_ports,
port_cfg_t *, p, port_cfg_free(p));
@@ -787,30 +848,30 @@ add_default_trusted_dir_authorities(dirinfo_type_t type)
{
int i;
const char *authorities[] = {
- "moria1 orport=9101 no-v2 "
+ "moria1 orport=9101 "
"v3ident=D586D18309DED4CD6D57C18FDB97EFA96D330566 "
"128.31.0.39:9131 9695 DFC3 5FFE B861 329B 9F1A B04C 4639 7020 CE31",
- "tor26 v1 orport=443 v3ident=14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4 "
+ "tor26 orport=443 v3ident=14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4 "
"86.59.21.38:80 847B 1F85 0344 D787 6491 A548 92F9 0493 4E4E B85D",
"dizum orport=443 v3ident=E8A9C45EDE6D711294FADF8E7951F4DE6CA56B58 "
"194.109.206.212:80 7EA6 EAD6 FD83 083C 538F 4403 8BBF A077 587D D755",
- "Tonga orport=443 bridge no-v2 82.94.251.203:80 "
+ "Tonga orport=443 bridge 82.94.251.203:80 "
"4A0C CD2D DC79 9508 3D73 F5D6 6710 0C8A 5831 F16D",
- "turtles orport=9090 no-v2 "
+ "turtles orport=9090 "
"v3ident=27B6B5996C426270A5C95488AA5BCEB6BCC86956 "
"76.73.17.194:9030 F397 038A DC51 3361 35E7 B80B D99C A384 4360 292B",
- "gabelmoo orport=443 no-v2 "
+ "gabelmoo orport=443 "
"v3ident=ED03BB616EB2F60BEC80151114BB25CEF515B226 "
"212.112.245.170:80 F204 4413 DAC2 E02E 3D6B CF47 35A1 9BCA 1DE9 7281",
- "dannenberg orport=443 no-v2 "
+ "dannenberg orport=443 "
"v3ident=585769C78764D58426B8B52B6651A5A71137189A "
"193.23.244.244:80 7BE6 83E6 5D48 1413 21C5 ED92 F075 C553 64AC 7123",
- "urras orport=80 no-v2 v3ident=80550987E1D626E3EBA5E5E75A458DE0626D088C "
+ "urras orport=80 v3ident=80550987E1D626E3EBA5E5E75A458DE0626D088C "
"208.83.223.34:443 0AD3 FA88 4D18 F89E EA2D 89C0 1937 9E0E 7FD9 4417",
- "maatuska orport=80 no-v2 "
+ "maatuska orport=80 "
"v3ident=49015F787433103580E3B66A1707A00E60F2D15B "
"171.25.193.9:443 BD6A 8292 55CB 08E6 6FBE 7D37 4836 3586 E46B 3810",
- "Faravahar orport=443 no-v2 "
+ "Faravahar orport=443 "
"v3ident=EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97 "
"154.35.32.5:80 CF6D 0AAF B385 BE71 B8E1 11FC 5CFF 4B47 9237 33BC",
NULL
@@ -850,8 +911,7 @@ validate_dir_servers(or_options_t *options, or_options_t *old_options)
config_line_t *cl;
if (options->DirAuthorities &&
- (options->AlternateDirAuthority || options->AlternateBridgeAuthority ||
- options->AlternateHSAuthority)) {
+ (options->AlternateDirAuthority || options->AlternateBridgeAuthority)) {
log_warn(LD_CONFIG,
"You cannot set both DirAuthority and Alternate*Authority.");
return -1;
@@ -887,9 +947,6 @@ validate_dir_servers(or_options_t *options, or_options_t *old_options)
for (cl = options->AlternateDirAuthority; cl; cl = cl->next)
if (parse_dir_authority_line(cl->value, NO_DIRINFO, 1)<0)
return -1;
- for (cl = options->AlternateHSAuthority; cl; cl = cl->next)
- if (parse_dir_authority_line(cl->value, NO_DIRINFO, 1)<0)
- return -1;
for (cl = options->FallbackDir; cl; cl = cl->next)
if (parse_dir_fallback_line(cl->value, 1)<0)
return -1;
@@ -912,9 +969,7 @@ consider_adding_dir_servers(const or_options_t *options,
!config_lines_eq(options->AlternateBridgeAuthority,
old_options->AlternateBridgeAuthority) ||
!config_lines_eq(options->AlternateDirAuthority,
- old_options->AlternateDirAuthority) ||
- !config_lines_eq(options->AlternateHSAuthority,
- old_options->AlternateHSAuthority);
+ old_options->AlternateDirAuthority);
if (!need_to_update)
return 0; /* all done */
@@ -928,10 +983,7 @@ consider_adding_dir_servers(const or_options_t *options,
if (!options->AlternateBridgeAuthority)
type |= BRIDGE_DIRINFO;
if (!options->AlternateDirAuthority)
- type |= V1_DIRINFO | V2_DIRINFO | V3_DIRINFO | EXTRAINFO_DIRINFO |
- MICRODESC_DIRINFO;
- if (!options->AlternateHSAuthority)
- type |= HIDSERV_DIRINFO;
+ type |= V3_DIRINFO | EXTRAINFO_DIRINFO | MICRODESC_DIRINFO;
add_default_trusted_dir_authorities(type);
}
if (!options->FallbackDir)
@@ -946,9 +998,6 @@ consider_adding_dir_servers(const or_options_t *options,
for (cl = options->AlternateDirAuthority; cl; cl = cl->next)
if (parse_dir_authority_line(cl->value, NO_DIRINFO, 0)<0)
return -1;
- for (cl = options->AlternateHSAuthority; cl; cl = cl->next)
- if (parse_dir_authority_line(cl->value, NO_DIRINFO, 0)<0)
- return -1;
for (cl = options->FallbackDir; cl; cl = cl->next)
if (parse_dir_fallback_line(cl->value, 0)<0)
return -1;
@@ -972,6 +1021,7 @@ options_act_reversible(const or_options_t *old_options, char **msg)
int set_conn_limit = 0;
int r = -1;
int logs_marked = 0;
+ int old_min_log_level = get_min_log_level();
/* Daemonize _first_, since we only want to open most of this stuff in
* the subprocess. Libevent bases can't be reliably inherited across
@@ -998,12 +1048,18 @@ options_act_reversible(const or_options_t *old_options, char **msg)
if (running_tor) {
int n_ports=0;
/* We need to set the connection limit before we can open the listeners. */
- if (set_max_file_descriptors((unsigned)options->ConnLimit,
- &options->ConnLimit_) < 0) {
- *msg = tor_strdup("Problem with ConnLimit value. See logs for details.");
- goto rollback;
+ if (! sandbox_is_active()) {
+ if (set_max_file_descriptors((unsigned)options->ConnLimit,
+ &options->ConnLimit_) < 0) {
+ *msg = tor_strdup("Problem with ConnLimit value. "
+ "See logs for details.");
+ goto rollback;
+ }
+ set_conn_limit = 1;
+ } else {
+ tor_assert(old_options);
+ options->ConnLimit_ = old_options->ConnLimit_;
}
- set_conn_limit = 1;
/* Set up libevent. (We need to do this before we can register the
* listeners as listeners.) */
@@ -1044,7 +1100,8 @@ options_act_reversible(const or_options_t *old_options, char **msg)
#if defined(HAVE_NET_IF_H) && defined(HAVE_NET_PFVAR_H)
/* Open /dev/pf before dropping privileges. */
- if (options->TransPort_set) {
+ if (options->TransPort_set &&
+ options->TransProxyType_parsed == TPT_DEFAULT) {
if (get_pf_socket() < 0) {
*msg = tor_strdup("Unable to open /dev/pf for transparent proxy.");
goto rollback;
@@ -1081,23 +1138,6 @@ options_act_reversible(const or_options_t *old_options, char **msg)
/* No need to roll back, since you can't change the value. */
}
- /* Write control ports to disk as appropriate */
- control_ports_write_to_file();
-
- if (directory_caches_v2_dir_info(options)) {
- char *fn = NULL;
- tor_asprintf(&fn, "%s"PATH_SEPARATOR"cached-status",
- options->DataDirectory);
- if (check_private_dir(fn, running_tor ? CPD_CREATE : CPD_CHECK,
- options->User) < 0) {
- tor_asprintf(msg,
- "Couldn't access/create private data directory \"%s\"", fn);
- tor_free(fn);
- goto done;
- }
- tor_free(fn);
- }
-
/* Bail out at this point if we're not going to be a client or server:
* we don't run Tor itself. */
if (!running_tor)
@@ -1119,13 +1159,44 @@ options_act_reversible(const or_options_t *old_options, char **msg)
add_callback_log(severity, control_event_logmsg);
control_adjust_event_log_severity();
tor_free(severity);
+ tor_log_update_sigsafe_err_fds();
+ }
+
+ {
+ const char *badness = NULL;
+ int bad_safelog = 0, bad_severity = 0, new_badness = 0;
+ if (options->SafeLogging_ != SAFELOG_SCRUB_ALL) {
+ bad_safelog = 1;
+ if (!old_options || old_options->SafeLogging_ != options->SafeLogging_)
+ new_badness = 1;
+ }
+ if (get_min_log_level() >= LOG_INFO) {
+ bad_severity = 1;
+ if (get_min_log_level() != old_min_log_level)
+ new_badness = 1;
+ }
+ if (bad_safelog && bad_severity)
+ badness = "you disabled SafeLogging, and "
+ "you're logging more than \"notice\"";
+ else if (bad_safelog)
+ badness = "you disabled SafeLogging";
+ else
+ badness = "you're logging more than \"notice\"";
+ if (new_badness)
+ log_warn(LD_GENERAL, "Your log may contain sensitive information - %s. "
+ "Don't log unless it serves an important reason. "
+ "Overwrite the log afterwards.", badness);
}
+
SMARTLIST_FOREACH(replaced_listeners, connection_t *, conn,
{
+ int marked = conn->marked_for_close;
log_notice(LD_NET, "Closing old %s on %s:%d",
conn_type_to_string(conn->type), conn->address, conn->port);
connection_close_immediate(conn);
- connection_mark_for_close(conn);
+ if (!marked) {
+ connection_mark_for_close(conn);
+ }
});
goto done;
@@ -1272,6 +1343,9 @@ options_act(const or_options_t *old_options)
}
}
+ /* Write control ports to disk as appropriate */
+ control_ports_write_to_file();
+
if (running_tor && !have_lockfile()) {
if (try_locking(options, 1) < 0)
return -1;
@@ -1302,14 +1376,29 @@ options_act(const or_options_t *old_options)
}
#endif
+ /* If we are a bridge with a pluggable transport proxy but no
+ Extended ORPort, inform the user that she is missing out. */
+ if (server_mode(options) && options->ServerTransportPlugin &&
+ !options->ExtORPort_lines) {
+ log_notice(LD_CONFIG, "We use pluggable transports but the Extended "
+ "ORPort is disabled. Tor and your pluggable transports proxy "
+ "communicate with each other via the Extended ORPort so it "
+ "is suggested you enable it: it will also allow your Bridge "
+ "to collect statistics about its clients that use pluggable "
+ "transports. Please enable it using the ExtORPort torrc option "
+ "(e.g. set 'ExtORPort auto').");
+ }
+
if (options->Bridges) {
mark_bridge_list();
for (cl = options->Bridges; cl; cl = cl->next) {
- if (parse_bridge_line(cl->value, 0)<0) {
+ bridge_line_t *bridge_line = parse_bridge_line(cl->value);
+ if (!bridge_line) {
log_warn(LD_BUG,
"Previously validated Bridge line could not be added!");
return -1;
}
+ bridge_add_from_config(bridge_line);
}
sweep_bridge_list();
}
@@ -1337,7 +1426,7 @@ options_act(const or_options_t *old_options)
pt_prepare_proxy_list_for_config_read();
if (options->ClientTransportPlugin) {
for (cl = options->ClientTransportPlugin; cl; cl = cl->next) {
- if (parse_client_transport_line(cl->value, 0)<0) {
+ if (parse_client_transport_line(options, cl->value, 0)<0) {
log_warn(LD_BUG,
"Previously validated ClientTransportPlugin line "
"could not be added!");
@@ -1348,7 +1437,7 @@ options_act(const or_options_t *old_options)
if (options->ServerTransportPlugin && server_mode(options)) {
for (cl = options->ServerTransportPlugin; cl; cl = cl->next) {
- if (parse_server_transport_line(cl->value, 0)<0) {
+ if (parse_server_transport_line(options, cl->value, 0)<0) {
log_warn(LD_BUG,
"Previously validated ServerTransportPlugin line "
"could not be added!");
@@ -1359,6 +1448,12 @@ options_act(const or_options_t *old_options)
sweep_transport_list();
sweep_proxy_list();
+ /* Start the PT proxy configuration. By doing this configuration
+ here, we also figure out which proxies need to be restarted and
+ which not. */
+ if (pt_proxies_configuration_pending() && !net_is_disabled())
+ pt_configure_remaining_proxies();
+
/* Bail out at this point if we're not going to be a client or server:
* we want to not fork, and to log stuff to stderr. */
if (!running_tor)
@@ -1408,8 +1503,9 @@ options_act(const or_options_t *old_options)
/* Write our PID to the PID file. If we do not have write permissions we
* will log a warning */
- if (options->PidFile)
+ if (options->PidFile && !sandbox_is_active()) {
write_pidfile(options->PidFile);
+ }
/* Register addressmap directives */
config_register_addressmaps(options);
@@ -1423,8 +1519,14 @@ options_act(const or_options_t *old_options)
return -1;
}
- if (init_cookie_authentication(options->CookieAuthentication) < 0) {
- log_warn(LD_CONFIG,"Error creating cookie authentication file.");
+ if (init_control_cookie_authentication(options->CookieAuthentication) < 0) {
+ log_warn(LD_CONFIG,"Error creating control cookie authentication file.");
+ return -1;
+ }
+
+ /* If we have an ExtORPort, initialize its auth cookie. */
+ if (init_ext_or_cookie_authentication(!!options->ExtORPort_lines) < 0) {
+ log_warn(LD_CONFIG,"Error creating Extended ORPort cookie file.");
return -1;
}
@@ -1606,10 +1708,14 @@ options_act(const or_options_t *old_options)
time_t now = time(NULL);
int print_notice = 0;
- /* If we aren't acting as a server, we can't collect stats anyway. */
+ /* Only collect directory-request statistics on relays and bridges. */
if (!server_mode(options)) {
- options->CellStatistics = 0;
options->DirReqStatistics = 0;
+ }
+
+ /* Only collect other relay-only statistics on relays. */
+ if (!public_server_mode(options)) {
+ options->CellStatistics = 0;
options->EntryStatistics = 0;
options->ExitPortStatistics = 0;
}
@@ -1732,40 +1838,66 @@ options_act(const or_options_t *old_options)
return 0;
}
-/** Helper: Read a list of configuration options from the command line.
- * If successful, put them in *<b>result</b> and return 0, and return
- * -1 and leave *<b>result</b> alone. */
-static int
-config_get_commandlines(int argc, char **argv, config_line_t **result)
+static const struct {
+ const char *name;
+ int takes_argument;
+} CMDLINE_ONLY_OPTIONS[] = {
+ { "-f", 1 },
+ { "--allow-missing-torrc", 0 },
+ { "--defaults-torrc", 1 },
+ { "--hash-password", 1 },
+ { "--dump-config", 1 },
+ { "--list-fingerprint", 0 },
+ { "--verify-config", 0 },
+ { "--ignore-missing-torrc", 0 },
+ { "--quiet", 0 },
+ { "--hush", 0 },
+ { "--version", 0 },
+ { "--library-versions", 0 },
+ { "-h", 0 },
+ { "--help", 0 },
+ { "--list-torrc-options", 0 },
+ { "--digests", 0 },
+ { "--nt-service", 0 },
+ { "-nt-service", 0 },
+ { NULL, 0 },
+};
+
+/** Helper: Read a list of configuration options from the command line. If
+ * successful, or if ignore_errors is set, put them in *<b>result</b>, put the
+ * commandline-only options in *<b>cmdline_result</b>, and return 0;
+ * otherwise, return -1 and leave *<b>result</b> and <b>cmdline_result</b>
+ * alone. */
+int
+config_parse_commandline(int argc, char **argv, int ignore_errors,
+ config_line_t **result,
+ config_line_t **cmdline_result)
{
+ config_line_t *param = NULL;
+
config_line_t *front = NULL;
config_line_t **new = &front;
- char *s;
+
+ config_line_t *front_cmdline = NULL;
+ config_line_t **new_cmdline = &front_cmdline;
+
+ char *s, *arg;
int i = 1;
while (i < argc) {
unsigned command = CONFIG_LINE_NORMAL;
int want_arg = 1;
+ int is_cmdline = 0;
+ int j;
- if (!strcmp(argv[i],"-f") ||
- !strcmp(argv[i],"--defaults-torrc") ||
- !strcmp(argv[i],"--hash-password")) {
- i += 2; /* command-line option with argument. ignore them. */
- continue;
- } else if (!strcmp(argv[i],"--list-fingerprint") ||
- !strcmp(argv[i],"--verify-config") ||
- !strcmp(argv[i],"--ignore-missing-torrc") ||
- !strcmp(argv[i],"--quiet") ||
- !strcmp(argv[i],"--hush")) {
- i += 1; /* command-line option. ignore it. */
- continue;
- } else if (!strcmp(argv[i],"--nt-service") ||
- !strcmp(argv[i],"-nt-service")) {
- i += 1;
- continue;
+ for (j = 0; CMDLINE_ONLY_OPTIONS[j].name != NULL; ++j) {
+ if (!strcmp(argv[i], CMDLINE_ONLY_OPTIONS[j].name)) {
+ is_cmdline = 1;
+ want_arg = CMDLINE_ONLY_OPTIONS[j].takes_argument;
+ break;
+ }
}
- *new = tor_malloc_zero(sizeof(config_line_t));
s = argv[i];
/* Each keyword may be prefixed with one or two dashes. */
@@ -1785,22 +1917,38 @@ config_get_commandlines(int argc, char **argv, config_line_t **result)
}
if (want_arg && i == argc-1) {
- log_warn(LD_CONFIG,"Command-line option '%s' with no value. Failing.",
- argv[i]);
- config_free_lines(front);
- return -1;
+ if (ignore_errors) {
+ arg = strdup("");
+ } else {
+ log_warn(LD_CONFIG,"Command-line option '%s' with no value. Failing.",
+ argv[i]);
+ config_free_lines(front);
+ config_free_lines(front_cmdline);
+ return -1;
+ }
+ } else {
+ arg = want_arg ? tor_strdup(argv[i+1]) : strdup("");
}
- (*new)->key = tor_strdup(config_expand_abbrev(&options_format, s, 1, 1));
- (*new)->value = want_arg ? tor_strdup(argv[i+1]) : tor_strdup("");
- (*new)->command = command;
- (*new)->next = NULL;
+ param = tor_malloc_zero(sizeof(config_line_t));
+ param->key = is_cmdline ? tor_strdup(argv[i]) : tor_strdup(s);
+ param->value = arg;
+ param->command = command;
+ param->next = NULL;
log_debug(LD_CONFIG, "command line: parsed keyword '%s', value '%s'",
- (*new)->key, (*new)->value);
+ param->key, param->value);
+
+ if (is_cmdline) {
+ *new_cmdline = param;
+ new_cmdline = &((*new_cmdline)->next);
+ } else {
+ *new = param;
+ new = &((*new)->next);
+ }
- new = &((*new)->next);
i += want_arg ? 2 : 1;
}
+ *cmdline_result = front_cmdline;
*result = front;
return 0;
}
@@ -1852,7 +2000,8 @@ options_trial_assign(config_line_t *list, int use_defaults,
return r;
}
- if (options_validate(get_options_mutable(), trial_options, 1, msg) < 0) {
+ if (options_validate(get_options_mutable(), trial_options,
+ global_default_options, 1, msg) < 0) {
config_free(&options_format, trial_options);
return SETOPT_ERR_PARSE; /*XXX make this a separate return value. */
}
@@ -1945,6 +2094,7 @@ resolve_my_address(int warn_severity, const or_options_t *options,
int notice_severity = warn_severity <= LOG_NOTICE ?
LOG_NOTICE : warn_severity;
+ tor_addr_t myaddr;
tor_assert(addr_out);
/*
@@ -1995,24 +2145,26 @@ resolve_my_address(int warn_severity, const or_options_t *options,
"local interface. Using that.", fmt_addr32(addr));
strlcpy(hostname, "<guessed from interfaces>", sizeof(hostname));
} else { /* resolved hostname into addr */
+ tor_addr_from_ipv4h(&myaddr, addr);
+
if (!explicit_hostname &&
- is_internal_IP(addr, 0)) {
- uint32_t interface_ip;
+ tor_addr_is_internal(&myaddr, 0)) {
+ tor_addr_t interface_ip;
log_fn(notice_severity, LD_CONFIG, "Guessed local hostname '%s' "
"resolves to a private IP address (%s). Trying something "
"else.", hostname, fmt_addr32(addr));
- if (get_interface_address(warn_severity, &interface_ip)) {
+ if (get_interface_address6(warn_severity, AF_INET, &interface_ip)<0) {
log_fn(warn_severity, LD_CONFIG,
"Could not get local interface IP address. Too bad.");
- } else if (is_internal_IP(interface_ip, 0)) {
+ } else if (tor_addr_is_internal(&interface_ip, 0)) {
log_fn(notice_severity, LD_CONFIG,
"Interface IP address '%s' is a private address too. "
- "Ignoring.", fmt_addr32(interface_ip));
+ "Ignoring.", fmt_addr(&interface_ip));
} else {
from_interface = 1;
- addr = interface_ip;
+ addr = tor_addr_to_ipv4h(&interface_ip);
log_fn(notice_severity, LD_CONFIG,
"Learned IP address '%s' for local interface."
" Using that.", fmt_addr32(addr));
@@ -2030,8 +2182,10 @@ resolve_my_address(int warn_severity, const or_options_t *options,
* out if it is and we don't want that.
*/
+ tor_addr_from_ipv4h(&myaddr,addr);
+
addr_string = tor_dup_ip(addr);
- if (is_internal_IP(addr, 0)) {
+ if (tor_addr_is_internal(&myaddr, 0)) {
/* make sure we're ok with publishing an internal IP */
if (!options->DirAuthorities && !options->AlternateDirAuthority) {
/* if they are using the default authorities, disallow internal IPs
@@ -2137,7 +2291,7 @@ is_local_addr(const tor_addr_t *addr)
* resolve_my_address will never be called at all). In those cases,
* last_resolved_addr will be 0, and so checking to see whether ip is on
* the same /24 as last_resolved_addr will be the same as checking whether
- * it was on net 0, which is already done by is_internal_IP.
+ * it was on net 0, which is already done by tor_addr_is_internal.
*/
if ((last_resolved_addr & (uint32_t)0xffffff00ul)
== (ip & (uint32_t)0xffffff00ul))
@@ -2166,10 +2320,29 @@ options_init(or_options_t *options)
* include options that are the same as Tor's defaults.
*/
char *
-options_dump(const or_options_t *options, int minimal)
+options_dump(const or_options_t *options, int how_to_dump)
{
- return config_dump(&options_format, global_default_options,
- options, minimal, 0);
+ const or_options_t *use_defaults;
+ int minimal;
+ switch (how_to_dump) {
+ case OPTIONS_DUMP_MINIMAL:
+ use_defaults = global_default_options;
+ minimal = 1;
+ break;
+ case OPTIONS_DUMP_DEFAULTS:
+ use_defaults = NULL;
+ minimal = 1;
+ break;
+ case OPTIONS_DUMP_ALL:
+ use_defaults = NULL;
+ minimal = 0;
+ break;
+ default:
+ log_warn(LD_BUG, "Bogus value for how_to_dump==%d", how_to_dump);
+ return NULL;
+ }
+
+ return config_dump(&options_format, use_defaults, options, minimal, 0);
}
/** Return 0 if every element of sl is a string holding a decimal
@@ -2218,7 +2391,7 @@ ensure_bandwidth_cap(uint64_t *value, const char *desc, char **msg)
/** Parse an authority type from <b>options</b>-\>PublishServerDescriptor
* and write it to <b>options</b>-\>PublishServerDescriptor_. Treat "1"
- * as "v2,v3" unless BridgeRelay is 1, in which case treat it as "bridge".
+ * as "v3" unless BridgeRelay is 1, in which case treat it as "bridge".
* Treat "0" as "".
* Return 0 on success or -1 if not a recognized authority type (in which
* case the value of PublishServerDescriptor_ is undefined). */
@@ -2232,14 +2405,16 @@ compute_publishserverdescriptor(or_options_t *options)
return 0;
SMARTLIST_FOREACH_BEGIN(list, const char *, string) {
if (!strcasecmp(string, "v1"))
- *auth |= V1_DIRINFO;
+ log_warn(LD_CONFIG, "PublishServerDescriptor v1 has no effect, because "
+ "there are no v1 directory authorities anymore.");
else if (!strcmp(string, "1"))
if (options->BridgeRelay)
*auth |= BRIDGE_DIRINFO;
else
- *auth |= V2_DIRINFO | V3_DIRINFO;
+ *auth |= V3_DIRINFO;
else if (!strcasecmp(string, "v2"))
- *auth |= V2_DIRINFO;
+ log_warn(LD_CONFIG, "PublishServerDescriptor v2 has no effect, because "
+ "there are no v2 directory authorities anymore.");
else if (!strcasecmp(string, "v3"))
*auth |= V3_DIRINFO;
else if (!strcasecmp(string, "bridge"))
@@ -2260,6 +2435,11 @@ compute_publishserverdescriptor(or_options_t *options)
* services can overload the directory system. */
#define MIN_REND_POST_PERIOD (10*60)
+/** Higest allowable value for PredictedPortsRelevanceTime; if this is
+ * too high, our selection of exits will decrease for an extended
+ * period of time to an uncomfortable level .*/
+#define MAX_PREDICTED_CIRCS_RELEVANCE (60*60)
+
/** Highest allowable value for RendPostPeriod. */
#define MAX_DIR_PERIOD (MIN_ONION_KEY_LIFETIME/2)
@@ -2286,10 +2466,19 @@ compute_publishserverdescriptor(or_options_t *options)
* */
#define RECOMMENDED_MIN_CIRCUIT_BUILD_TIMEOUT (10)
-/** Return 0 if every setting in <b>options</b> is reasonable, and a
- * permissible transition from <b>old_options</b>. Else return -1.
- * Should have no side effects, except for normalizing the contents of
- * <b>options</b>.
+static int
+options_validate_cb(void *old_options, void *options, void *default_options,
+ int from_setconf, char **msg)
+{
+ return options_validate(old_options, options, default_options,
+ from_setconf, msg);
+}
+
+/** Return 0 if every setting in <b>options</b> is reasonable, is a
+ * permissible transition from <b>old_options</b>, and none of the
+ * testing-only settings differ from <b>default_options</b> unless in
+ * testing mode. Else return -1. Should have no side effects, except for
+ * normalizing the contents of <b>options</b>.
*
* On error, tor_strdup an error explanation into *<b>msg</b>.
*
@@ -2298,9 +2487,9 @@ compute_publishserverdescriptor(or_options_t *options)
* Log line should stay empty. If it's 0, then give us a default log
* if there are no logs defined.
*/
-static int
+STATIC int
options_validate(or_options_t *old_options, or_options_t *options,
- int from_setconf, char **msg)
+ or_options_t *default_options, int from_setconf, char **msg)
{
int i;
config_line_t *cl;
@@ -2381,10 +2570,43 @@ options_validate(or_options_t *old_options, or_options_t *options,
"undefined, and there aren't any hidden services configured. "
"Tor will still run, but probably won't do anything.");
-#ifndef USE_TRANSPARENT
- /* XXXX024 I think we can remove this TransListenAddress */
- if (options->TransPort_set || options->TransListenAddress)
- REJECT("TransPort and TransListenAddress are disabled in this build.");
+ options->TransProxyType_parsed = TPT_DEFAULT;
+#ifdef USE_TRANSPARENT
+ if (options->TransProxyType) {
+ if (!strcasecmp(options->TransProxyType, "default")) {
+ options->TransProxyType_parsed = TPT_DEFAULT;
+ } else if (!strcasecmp(options->TransProxyType, "pf-divert")) {
+#ifndef __OpenBSD__
+ REJECT("pf-divert is a OpenBSD-specific feature.");
+#else
+ options->TransProxyType_parsed = TPT_PF_DIVERT;
+#endif
+ } else if (!strcasecmp(options->TransProxyType, "tproxy")) {
+#ifndef __linux__
+ REJECT("TPROXY is a Linux-specific feature.");
+#else
+ options->TransProxyType_parsed = TPT_TPROXY;
+#endif
+ } else if (!strcasecmp(options->TransProxyType, "ipfw")) {
+#ifndef __FreeBSD__
+ REJECT("ipfw is a FreeBSD-specific feature.");
+#else
+ options->TransProxyType_parsed = TPT_IPFW;
+#endif
+ } else {
+ REJECT("Unrecognized value for TransProxyType");
+ }
+
+ if (strcasecmp(options->TransProxyType, "default") &&
+ !options->TransPort_set) {
+ REJECT("Cannot use TransProxyType without any valid TransPort or "
+ "TransListenAddress.");
+ }
+ }
+#else
+ if (options->TransPort_set)
+ REJECT("TransPort and TransListenAddress are disabled "
+ "in this build.");
#endif
if (options->TokenBucketRefillInterval <= 0
@@ -2392,10 +2614,6 @@ options_validate(or_options_t *old_options, or_options_t *options,
REJECT("TokenBucketRefillInterval must be between 1 and 1000 inclusive.");
}
- if (options->DisableV2DirectoryInfo_ && ! authdir_mode(options)) {
- REJECT("DisableV2DirectoryInfo_ set, but we aren't an authority.");
- }
-
if (options->ExcludeExitNodes || options->ExcludeNodes) {
options->ExcludeExitNodesUnion_ = routerset_new();
routerset_union(options->ExcludeExitNodesUnion_,options->ExcludeExitNodes);
@@ -2429,8 +2647,6 @@ options_validate(or_options_t *old_options, or_options_t *options,
if (options->AuthoritativeDir) {
if (!options->ContactInfo && !options->TestingTorNetwork)
REJECT("Authoritative directory servers must set ContactInfo");
- if (options->V1AuthoritativeDir && !options->RecommendedVersions)
- REJECT("V1 authoritative dir servers must set RecommendedVersions.");
if (!options->RecommendedClientVersions)
options->RecommendedClientVersions =
config_lines_dup(options->RecommendedVersions);
@@ -2452,11 +2668,10 @@ options_validate(or_options_t *old_options, or_options_t *options,
"extra-info documents. Setting DownloadExtraInfo.");
options->DownloadExtraInfo = 1;
}
- if (!(options->BridgeAuthoritativeDir || options->HSAuthoritativeDir ||
- options->V1AuthoritativeDir || options->V2AuthoritativeDir ||
+ if (!(options->BridgeAuthoritativeDir ||
options->V3AuthoritativeDir))
REJECT("AuthoritativeDir is set, but none of "
- "(Bridge/HS/V1/V2/V3)AuthoritativeDir is set.");
+ "(Bridge/V3)AuthoritativeDir is set.");
/* If we have a v3bandwidthsfile and it's broken, complain on startup */
if (options->V3BandwidthsFile && !old_options) {
dirserv_read_measured_bandwidths(options->V3BandwidthsFile, NULL);
@@ -2476,10 +2691,6 @@ options_validate(or_options_t *old_options, or_options_t *options,
REJECT("FetchDirInfoExtraEarly requires that you also set "
"FetchDirInfoEarly");
- if (options->HSAuthoritativeDir && proxy_mode(options))
- REJECT("Running as authoritative v0 HS directory, but also configured "
- "as a client.");
-
if (options->ConnLimit <= 0) {
tor_asprintf(msg,
"ConnLimit must be greater than 0, but was set to %d",
@@ -2616,11 +2827,9 @@ options_validate(or_options_t *old_options, or_options_t *options,
REJECT("If EntryNodes is set, UseEntryGuards must be enabled.");
}
- if (options->MaxMemInCellQueues < (500 << 20)) {
- log_warn(LD_CONFIG, "MaxMemInCellQueues must be at least 500 MB for now. "
- "Ideally, have it as large as you can afford.");
- options->MaxMemInCellQueues = (500 << 20);
- }
+ options->MaxMemInQueues =
+ compute_real_max_mem_in_queues(options->MaxMemInQueues_raw,
+ server_mode(options));
options->AllowInvalid_ = 0;
@@ -2665,8 +2874,7 @@ options_validate(or_options_t *old_options, or_options_t *options,
if ((options->BridgeRelay
|| options->PublishServerDescriptor_ & BRIDGE_DIRINFO)
- && (options->PublishServerDescriptor_
- & (V1_DIRINFO|V2_DIRINFO|V3_DIRINFO))) {
+ && (options->PublishServerDescriptor_ & V3_DIRINFO)) {
REJECT("Bridges are not supposed to publish router descriptors to the "
"directory authorities. Please correct your "
"PublishServerDescriptor line.");
@@ -2698,6 +2906,13 @@ options_validate(or_options_t *old_options, or_options_t *options,
options->RendPostPeriod = MAX_DIR_PERIOD;
}
+ if (options->PredictedPortsRelevanceTime >
+ MAX_PREDICTED_CIRCS_RELEVANCE) {
+ log_warn(LD_CONFIG, "PredictedPortsRelevanceTime is too large; "
+ "clipping to %ds.", MAX_PREDICTED_CIRCS_RELEVANCE);
+ options->PredictedPortsRelevanceTime = MAX_PREDICTED_CIRCS_RELEVANCE;
+ }
+
if (options->Tor2webMode && options->LearnCircuitBuildTimeout) {
/* LearnCircuitBuildTimeout and Tor2webMode are incompatible in
* two ways:
@@ -2814,6 +3029,11 @@ options_validate(or_options_t *old_options, or_options_t *options,
if (options->KeepalivePeriod < 1)
REJECT("KeepalivePeriod option must be positive.");
+ if (options->PortForwarding && options->Sandbox) {
+ REJECT("PortForwarding is not compatible with Sandbox; at most one can "
+ "be set");
+ }
+
if (ensure_bandwidth_cap(&options->BandwidthRate,
"BandwidthRate", msg) < 0)
return -1;
@@ -2973,14 +3193,14 @@ options_validate(or_options_t *old_options, or_options_t *options,
size_t len;
len = strlen(options->Socks5ProxyUsername);
- if (len < 1 || len > 255)
+ if (len < 1 || len > MAX_SOCKS5_AUTH_FIELD_SIZE)
REJECT("Socks5ProxyUsername must be between 1 and 255 characters.");
if (!options->Socks5ProxyPassword)
REJECT("Socks5ProxyPassword must be included with Socks5ProxyUsername.");
len = strlen(options->Socks5ProxyPassword);
- if (len < 1 || len > 255)
+ if (len < 1 || len > MAX_SOCKS5_AUTH_FIELD_SIZE)
REJECT("Socks5ProxyPassword must be between 1 and 255 characters.");
} else if (options->Socks5ProxyPassword)
REJECT("Socks5ProxyPassword must be included with Socks5ProxyUsername.");
@@ -3040,7 +3260,7 @@ options_validate(or_options_t *old_options, or_options_t *options,
"You should also make sure you aren't listing this bridge's "
"fingerprint in any other MyFamily.");
}
- if (check_nickname_list(options->MyFamily, "MyFamily", msg))
+ if (check_nickname_list(&options->MyFamily, "MyFamily", msg))
return -1;
for (cl = options->NodeFamilies; cl; cl = cl->next) {
routerset_t *rs = routerset_new();
@@ -3060,22 +3280,22 @@ options_validate(or_options_t *old_options, or_options_t *options,
if (options->UseBridges && !options->Bridges)
REJECT("If you set UseBridges, you must specify at least one bridge.");
- if (options->UseBridges && !options->TunnelDirConns)
- REJECT("If you set UseBridges, you must set TunnelDirConns.");
for (cl = options->Bridges; cl; cl = cl->next) {
- if (parse_bridge_line(cl->value, 1)<0)
- REJECT("Bridge line did not parse. See logs for details.");
+ bridge_line_t *bridge_line = parse_bridge_line(cl->value);
+ if (!bridge_line)
+ REJECT("Bridge line did not parse. See logs for details.");
+ bridge_line_free(bridge_line);
}
for (cl = options->ClientTransportPlugin; cl; cl = cl->next) {
- if (parse_client_transport_line(cl->value, 1)<0)
- REJECT("Transport line did not parse. See logs for details.");
+ if (parse_client_transport_line(options, cl->value, 1)<0)
+ REJECT("Invalid client transport line. See logs for details.");
}
for (cl = options->ServerTransportPlugin; cl; cl = cl->next) {
- if (parse_server_transport_line(cl->value, 1)<0)
- REJECT("Server transport line did not parse. See logs for details.");
+ if (parse_server_transport_line(options, cl->value, 1)<0)
+ REJECT("Invalid server transport line. See logs for details.");
}
if (options->ServerTransportPlugin && !server_mode(options)) {
@@ -3101,6 +3321,19 @@ options_validate(or_options_t *old_options, or_options_t *options,
"ServerTransportListenAddr line will be ignored.");
}
+ for (cl = options->ServerTransportOptions; cl; cl = cl->next) {
+ /** If get_options_from_transport_options_line() fails with
+ 'transport' being NULL, it means that something went wrong
+ while parsing the ServerTransportOptions line. */
+ smartlist_t *options_sl =
+ get_options_from_transport_options_line(cl->value, NULL);
+ if (!options_sl)
+ REJECT("ServerTransportOptions did not parse. See logs for details.");
+
+ SMARTLIST_FOREACH(options_sl, char *, cp, tor_free(cp));
+ smartlist_free(options_sl);
+ }
+
if (options->ConstrainedSockets) {
/* If the user wants to constrain socket buffer use, make sure the desired
* limit is between MIN|MAX_TCPSOCK_BUFFER in k increments. */
@@ -3159,15 +3392,6 @@ options_validate(or_options_t *old_options, or_options_t *options,
AF_INET6, 1, msg)<0)
return -1;
- if (options->PreferTunneledDirConns && !options->TunnelDirConns)
- REJECT("Must set TunnelDirConns if PreferTunneledDirConns is set.");
-
- if ((options->Socks4Proxy || options->Socks5Proxy) &&
- !options->HTTPProxy && !options->PreferTunneledDirConns)
- REJECT("When Socks4Proxy or Socks5Proxy is configured, "
- "PreferTunneledDirConns and TunnelDirConns must both be "
- "set to 1, or HTTPProxy must be configured.");
-
if (options->AutomapHostsSuffixes) {
SMARTLIST_FOREACH(options->AutomapHostsSuffixes, char *, suf,
{
@@ -3193,35 +3417,46 @@ options_validate(or_options_t *old_options, or_options_t *options,
"ignore you.");
}
- /*XXXX checking for defaults manually like this is a bit fragile.*/
-
- /* Keep changes to hard-coded values synchronous to man page and default
- * values table. */
- if (options->TestingV3AuthInitialVotingInterval != 30*60 &&
- !options->TestingTorNetwork && !options->UsingTestNetworkDefaults_) {
- REJECT("TestingV3AuthInitialVotingInterval may only be changed in testing "
- "Tor networks!");
- } else if (options->TestingV3AuthInitialVotingInterval < MIN_VOTE_INTERVAL) {
+#define CHECK_DEFAULT(arg) \
+ STMT_BEGIN \
+ if (!options->TestingTorNetwork && \
+ !options->UsingTestNetworkDefaults_ && \
+ !config_is_same(&options_format,options, \
+ default_options,#arg)) { \
+ REJECT(#arg " may only be changed in testing Tor " \
+ "networks!"); \
+ } STMT_END
+ CHECK_DEFAULT(TestingV3AuthInitialVotingInterval);
+ CHECK_DEFAULT(TestingV3AuthInitialVoteDelay);
+ CHECK_DEFAULT(TestingV3AuthInitialDistDelay);
+ CHECK_DEFAULT(TestingV3AuthVotingStartOffset);
+ CHECK_DEFAULT(TestingAuthDirTimeToLearnReachability);
+ CHECK_DEFAULT(TestingEstimatedDescriptorPropagationTime);
+ CHECK_DEFAULT(TestingServerDownloadSchedule);
+ CHECK_DEFAULT(TestingClientDownloadSchedule);
+ CHECK_DEFAULT(TestingServerConsensusDownloadSchedule);
+ CHECK_DEFAULT(TestingClientConsensusDownloadSchedule);
+ CHECK_DEFAULT(TestingBridgeDownloadSchedule);
+ CHECK_DEFAULT(TestingClientMaxIntervalWithoutRequest);
+ CHECK_DEFAULT(TestingDirConnectionMaxStall);
+ CHECK_DEFAULT(TestingConsensusMaxDownloadTries);
+ CHECK_DEFAULT(TestingDescriptorMaxDownloadTries);
+ CHECK_DEFAULT(TestingMicrodescMaxDownloadTries);
+ CHECK_DEFAULT(TestingCertMaxDownloadTries);
+#undef CHECK_DEFAULT
+
+ if (options->TestingV3AuthInitialVotingInterval < MIN_VOTE_INTERVAL) {
REJECT("TestingV3AuthInitialVotingInterval is insanely low.");
} else if (((30*60) % options->TestingV3AuthInitialVotingInterval) != 0) {
REJECT("TestingV3AuthInitialVotingInterval does not divide evenly into "
"30 minutes.");
}
- if (options->TestingV3AuthInitialVoteDelay != 5*60 &&
- !options->TestingTorNetwork && !options->UsingTestNetworkDefaults_) {
-
- REJECT("TestingV3AuthInitialVoteDelay may only be changed in testing "
- "Tor networks!");
- } else if (options->TestingV3AuthInitialVoteDelay < MIN_VOTE_SECONDS) {
+ if (options->TestingV3AuthInitialVoteDelay < MIN_VOTE_SECONDS) {
REJECT("TestingV3AuthInitialVoteDelay is way too low.");
}
- if (options->TestingV3AuthInitialDistDelay != 5*60 &&
- !options->TestingTorNetwork && !options->UsingTestNetworkDefaults_) {
- REJECT("TestingV3AuthInitialDistDelay may only be changed in testing "
- "Tor networks!");
- } else if (options->TestingV3AuthInitialDistDelay < MIN_DIST_SECONDS) {
+ if (options->TestingV3AuthInitialDistDelay < MIN_DIST_SECONDS) {
REJECT("TestingV3AuthInitialDistDelay is way too low.");
}
@@ -3232,26 +3467,79 @@ options_validate(or_options_t *old_options, or_options_t *options,
"must be less than half TestingV3AuthInitialVotingInterval");
}
- if (options->TestingAuthDirTimeToLearnReachability != 30*60 &&
- !options->TestingTorNetwork && !options->UsingTestNetworkDefaults_) {
- REJECT("TestingAuthDirTimeToLearnReachability may only be changed in "
- "testing Tor networks!");
- } else if (options->TestingAuthDirTimeToLearnReachability < 0) {
+ if (options->TestingV3AuthVotingStartOffset >
+ MIN(options->TestingV3AuthInitialVotingInterval,
+ options->V3AuthVotingInterval)) {
+ REJECT("TestingV3AuthVotingStartOffset is higher than the voting "
+ "interval.");
+ }
+
+ if (options->TestingAuthDirTimeToLearnReachability < 0) {
REJECT("TestingAuthDirTimeToLearnReachability must be non-negative.");
} else if (options->TestingAuthDirTimeToLearnReachability > 2*60*60) {
COMPLAIN("TestingAuthDirTimeToLearnReachability is insanely high.");
}
- if (options->TestingEstimatedDescriptorPropagationTime != 10*60 &&
- !options->TestingTorNetwork && !options->UsingTestNetworkDefaults_) {
- REJECT("TestingEstimatedDescriptorPropagationTime may only be changed in "
- "testing Tor networks!");
- } else if (options->TestingEstimatedDescriptorPropagationTime < 0) {
+ if (options->TestingEstimatedDescriptorPropagationTime < 0) {
REJECT("TestingEstimatedDescriptorPropagationTime must be non-negative.");
} else if (options->TestingEstimatedDescriptorPropagationTime > 60*60) {
COMPLAIN("TestingEstimatedDescriptorPropagationTime is insanely high.");
}
+ if (options->TestingClientMaxIntervalWithoutRequest < 1) {
+ REJECT("TestingClientMaxIntervalWithoutRequest is way too low.");
+ } else if (options->TestingClientMaxIntervalWithoutRequest > 3600) {
+ COMPLAIN("TestingClientMaxIntervalWithoutRequest is insanely high.");
+ }
+
+ if (options->TestingDirConnectionMaxStall < 5) {
+ REJECT("TestingDirConnectionMaxStall is way too low.");
+ } else if (options->TestingDirConnectionMaxStall > 3600) {
+ COMPLAIN("TestingDirConnectionMaxStall is insanely high.");
+ }
+
+ if (options->TestingConsensusMaxDownloadTries < 2) {
+ REJECT("TestingConsensusMaxDownloadTries must be greater than 1.");
+ } else if (options->TestingConsensusMaxDownloadTries > 800) {
+ COMPLAIN("TestingConsensusMaxDownloadTries is insanely high.");
+ }
+
+ if (options->TestingDescriptorMaxDownloadTries < 2) {
+ REJECT("TestingDescriptorMaxDownloadTries must be greater than 1.");
+ } else if (options->TestingDescriptorMaxDownloadTries > 800) {
+ COMPLAIN("TestingDescriptorMaxDownloadTries is insanely high.");
+ }
+
+ if (options->TestingMicrodescMaxDownloadTries < 2) {
+ REJECT("TestingMicrodescMaxDownloadTries must be greater than 1.");
+ } else if (options->TestingMicrodescMaxDownloadTries > 800) {
+ COMPLAIN("TestingMicrodescMaxDownloadTries is insanely high.");
+ }
+
+ if (options->TestingCertMaxDownloadTries < 2) {
+ REJECT("TestingCertMaxDownloadTries must be greater than 1.");
+ } else if (options->TestingCertMaxDownloadTries > 800) {
+ COMPLAIN("TestingCertMaxDownloadTries is insanely high.");
+ }
+
+ if (options->TestingEnableConnBwEvent &&
+ !options->TestingTorNetwork && !options->UsingTestNetworkDefaults_) {
+ REJECT("TestingEnableConnBwEvent may only be changed in testing "
+ "Tor networks!");
+ }
+
+ if (options->TestingEnableCellStatsEvent &&
+ !options->TestingTorNetwork && !options->UsingTestNetworkDefaults_) {
+ REJECT("TestingEnableCellStatsEvent may only be changed in testing "
+ "Tor networks!");
+ }
+
+ if (options->TestingEnableTbEmptyEvent &&
+ !options->TestingTorNetwork && !options->UsingTestNetworkDefaults_) {
+ REJECT("TestingEnableTbEmptyEvent may only be changed in testing "
+ "Tor networks!");
+ }
+
if (options->TestingTorNetwork) {
log_warn(LD_CONFIG, "TestingTorNetwork is set. This will make your node "
"almost unusable in the public Tor network, and is "
@@ -3285,6 +3573,68 @@ options_validate(or_options_t *old_options, or_options_t *options,
#undef COMPLAIN
}
+/* Given the value that the user has set for MaxMemInQueues, compute the
+ * actual maximum value. We clip this value if it's too low, and autodetect
+ * it if it's set to 0. */
+static uint64_t
+compute_real_max_mem_in_queues(const uint64_t val, int log_guess)
+{
+ uint64_t result;
+
+ if (val == 0) {
+#define ONE_GIGABYTE (U64_LITERAL(1) << 30)
+#define ONE_MEGABYTE (U64_LITERAL(1) << 20)
+#if SIZEOF_VOID_P >= 8
+#define MAX_DEFAULT_MAXMEM (8*ONE_GIGABYTE)
+#else
+#define MAX_DEFAULT_MAXMEM (2*ONE_GIGABYTE)
+#endif
+ /* The user didn't pick a memory limit. Choose a very large one
+ * that is still smaller than the system memory */
+ static int notice_sent = 0;
+ size_t ram = 0;
+ if (get_total_system_memory(&ram) < 0) {
+ /* We couldn't determine our total system memory! */
+#if SIZEOF_VOID_P >= 8
+ /* 64-bit system. Let's hope for 8 GB. */
+ result = 8 * ONE_GIGABYTE;
+#else
+ /* (presumably) 32-bit system. Let's hope for 1 GB. */
+ result = ONE_GIGABYTE;
+#endif
+ } else {
+ /* We detected it, so let's pick 3/4 of the total RAM as our limit. */
+ const uint64_t avail = (ram / 4) * 3;
+
+ /* Make sure it's in range from 0.25 GB to 8 GB. */
+ if (avail > MAX_DEFAULT_MAXMEM) {
+ /* If you want to use more than this much RAM, you need to configure
+ it yourself */
+ result = MAX_DEFAULT_MAXMEM;
+ } else if (avail < ONE_GIGABYTE / 4) {
+ result = ONE_GIGABYTE / 4;
+ } else {
+ result = avail;
+ }
+ }
+ if (log_guess && ! notice_sent) {
+ log_notice(LD_CONFIG, "%sMaxMemInQueues is set to "U64_FORMAT" MB. "
+ "You can override this by setting MaxMemInQueues by hand.",
+ ram ? "Based on detected system memory, " : "",
+ U64_PRINTF_ARG(result / ONE_MEGABYTE));
+ notice_sent = 1;
+ }
+ return result;
+ } else if (val < ONE_GIGABYTE / 4) {
+ log_warn(LD_CONFIG, "MaxMemInQueues must be at least 256 MB for now. "
+ "Ideally, have it as large as you can afford.");
+ return ONE_GIGABYTE / 4;
+ } else {
+ /* The value was fine all along */
+ return val;
+ }
+}
+
/** Helper: return true iff s1 and s2 are both NULL, or both non-NULL
* equal strings. */
static int
@@ -3313,6 +3663,12 @@ options_transition_allowed(const or_options_t *old,
return -1;
}
+ if (old->Sandbox != new_val->Sandbox) {
+ *msg = tor_strdup("While Tor is running, changing Sandbox "
+ "is not allowed.");
+ return -1;
+ }
+
if (strcmp(old->DataDirectory,new_val->DataDirectory)!=0) {
tor_asprintf(msg,
"While Tor is running, changing DataDirectory "
@@ -3365,6 +3721,38 @@ options_transition_allowed(const or_options_t *old,
return -1;
}
+ if (sandbox_is_active()) {
+#define SB_NOCHANGE_STR(opt) \
+ do { \
+ if (! opt_streq(old->opt, new_val->opt)) { \
+ *msg = tor_strdup("Can't change " #opt " while Sandbox is active"); \
+ return -1; \
+ } \
+ } while (0)
+
+ SB_NOCHANGE_STR(PidFile);
+ SB_NOCHANGE_STR(ServerDNSResolvConfFile);
+ SB_NOCHANGE_STR(DirPortFrontPage);
+ SB_NOCHANGE_STR(CookieAuthFile);
+ SB_NOCHANGE_STR(ExtORPortCookieAuthFile);
+
+#undef SB_NOCHANGE_STR
+
+ if (! config_lines_eq(old->Logs, new_val->Logs)) {
+ *msg = tor_strdup("Can't change Logs while Sandbox is active");
+ return -1;
+ }
+ if (old->ConnLimit != new_val->ConnLimit) {
+ *msg = tor_strdup("Can't change ConnLimit while Sandbox is active");
+ return -1;
+ }
+ if (server_mode(old) != server_mode(new_val)) {
+ *msg = tor_strdup("Can't start/stop being a server while "
+ "Sandbox is active");
+ return -1;
+ }
+ }
+
return 0;
}
@@ -3510,31 +3898,63 @@ get_default_conf_file(int defaults_file)
}
/** Verify whether lst is a string containing valid-looking comma-separated
- * nicknames, or NULL. Return 0 on success. Warn and return -1 on failure.
+ * nicknames, or NULL. Will normalise <b>lst</b> to prefix '$' to any nickname
+ * or fingerprint that needs it. Return 0 on success.
+ * Warn and return -1 on failure.
*/
static int
-check_nickname_list(const char *lst, const char *name, char **msg)
+check_nickname_list(char **lst, const char *name, char **msg)
{
int r = 0;
smartlist_t *sl;
+ int changes = 0;
- if (!lst)
+ if (!*lst)
return 0;
sl = smartlist_new();
- smartlist_split_string(sl, lst, ",",
+ smartlist_split_string(sl, *lst, ",",
SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK|SPLIT_STRIP_SPACE, 0);
- SMARTLIST_FOREACH(sl, const char *, s,
+ SMARTLIST_FOREACH_BEGIN(sl, char *, s)
{
if (!is_legal_nickname_or_hexdigest(s)) {
+ // check if first char is dollar
+ if (s[0] != '$') {
+ // Try again but with a dollar symbol prepended
+ char *prepended;
+ tor_asprintf(&prepended, "$%s", s);
+
+ if (is_legal_nickname_or_hexdigest(prepended)) {
+ // The nickname is valid when it's prepended, swap the current
+ // version with a prepended one
+ tor_free(s);
+ SMARTLIST_REPLACE_CURRENT(sl, s, prepended);
+ changes = 1;
+ continue;
+ }
+
+ // Still not valid, free and fallback to error message
+ tor_free(prepended);
+ }
+
tor_asprintf(msg, "Invalid nickname '%s' in %s line", s, name);
r = -1;
break;
}
- });
+ }
+ SMARTLIST_FOREACH_END(s);
+
+ // Replace the caller's nickname list with a fixed one
+ if (changes && r == 0) {
+ char *newNicknames = smartlist_join_strings(sl, ", ", 0, NULL);
+ tor_free(*lst);
+ *lst = newNicknames;
+ }
+
SMARTLIST_FOREACH(sl, char *, s, tor_free(s));
smartlist_free(sl);
+
return r;
}
@@ -3550,26 +3970,26 @@ check_nickname_list(const char *lst, const char *name, char **msg)
* filename if it doesn't exist.
*/
static char *
-find_torrc_filename(int argc, char **argv,
+find_torrc_filename(config_line_t *cmd_arg,
int defaults_file,
int *using_default_fname, int *ignore_missing_torrc)
{
char *fname=NULL;
- int i;
+ config_line_t *p_index;
const char *fname_opt = defaults_file ? "--defaults-torrc" : "-f";
const char *ignore_opt = defaults_file ? NULL : "--ignore-missing-torrc";
if (defaults_file)
*ignore_missing_torrc = 1;
- for (i = 1; i < argc; ++i) {
- if (i < argc-1 && !strcmp(argv[i],fname_opt)) {
+ for (p_index = cmd_arg; p_index; p_index = p_index->next) {
+ if (!strcmp(p_index->key, fname_opt)) {
if (fname) {
log_warn(LD_CONFIG, "Duplicate %s options on command line.",
fname_opt);
tor_free(fname);
}
- fname = expand_filename(argv[i+1]);
+ fname = expand_filename(p_index->value);
{
char *absfname;
@@ -3579,8 +3999,7 @@ find_torrc_filename(int argc, char **argv,
}
*using_default_fname = 0;
- ++i;
- } else if (ignore_opt && !strcmp(argv[i],ignore_opt)) {
+ } else if (ignore_opt && !strcmp(p_index->key,ignore_opt)) {
*ignore_missing_torrc = 1;
}
}
@@ -3617,7 +4036,7 @@ find_torrc_filename(int argc, char **argv,
* Return the contents of the file on success, and NULL on failure.
*/
static char *
-load_torrc_from_disk(int argc, char **argv, int defaults_file)
+load_torrc_from_disk(config_line_t *cmd_arg, int defaults_file)
{
char *fname=NULL;
char *cf = NULL;
@@ -3625,7 +4044,7 @@ load_torrc_from_disk(int argc, char **argv, int defaults_file)
int ignore_missing_torrc = 0;
char **fname_var = defaults_file ? &torrc_defaults_fname : &torrc_fname;
- fname = find_torrc_filename(argc, argv, defaults_file,
+ fname = find_torrc_filename(cmd_arg, defaults_file,
&using_default_torrc, &ignore_missing_torrc);
tor_assert(fname);
log_debug(LD_CONFIG, "Opening config file \"%s\"", fname);
@@ -3667,59 +4086,75 @@ int
options_init_from_torrc(int argc, char **argv)
{
char *cf=NULL, *cf_defaults=NULL;
- int i, command;
+ int command;
int retval = -1;
- static char **backup_argv;
- static int backup_argc;
char *command_arg = NULL;
char *errmsg=NULL;
+ config_line_t *p_index = NULL;
+ config_line_t *cmdline_only_options = NULL;
- if (argv) { /* first time we're called. save command line args */
- backup_argv = argv;
- backup_argc = argc;
- } else { /* we're reloading. need to clean up old options first. */
- argv = backup_argv;
- argc = backup_argc;
+ /* Go through command-line variables */
+ if (! have_parsed_cmdline) {
+ /* Or we could redo the list every time we pass this place.
+ * It does not really matter */
+ if (config_parse_commandline(argc, argv, 0, &global_cmdline_options,
+ &global_cmdline_only_options) < 0) {
+ goto err;
+ }
+ have_parsed_cmdline = 1;
}
- if (argc > 1 && (!strcmp(argv[1], "-h") || !strcmp(argv[1],"--help"))) {
+ cmdline_only_options = global_cmdline_only_options;
+
+ if (config_line_find(cmdline_only_options, "-h") ||
+ config_line_find(cmdline_only_options, "--help")) {
print_usage();
exit(0);
}
- if (argc > 1 && !strcmp(argv[1], "--list-torrc-options")) {
+ if (config_line_find(cmdline_only_options, "--list-torrc-options")) {
/* For documenting validating whether we've documented everything. */
list_torrc_options();
exit(0);
}
- if (argc > 1 && (!strcmp(argv[1],"--version"))) {
+ if (config_line_find(cmdline_only_options, "--version")) {
printf("Tor version %s.\n",get_version());
exit(0);
}
- if (argc > 1 && (!strcmp(argv[1],"--digests"))) {
+
+ if (config_line_find(cmdline_only_options, "--digests")) {
printf("Tor version %s.\n",get_version());
printf("%s", libor_get_digests());
printf("%s", tor_get_digests());
exit(0);
}
- /* Go through command-line variables */
- if (!global_cmdline_options) {
- /* Or we could redo the list every time we pass this place.
- * It does not really matter */
- if (config_get_commandlines(argc, argv, &global_cmdline_options) < 0) {
- goto err;
- }
+ if (config_line_find(cmdline_only_options, "--library-versions")) {
+ printf("Tor version %s. \n", get_version());
+ printf("Library versions\tCompiled\t\tRuntime\n");
+ printf("Libevent\t\t%-15s\t\t%s\n",
+ tor_libevent_get_header_version_str(),
+ tor_libevent_get_version_str());
+ printf("OpenSSL \t\t%-15s\t\t%s\n",
+ crypto_openssl_get_header_version_str(),
+ crypto_openssl_get_version_str());
+ printf("Zlib \t\t%-15s\t\t%s\n",
+ tor_zlib_get_header_version_str(),
+ tor_zlib_get_version_str());
+ //TODO: Hex versions?
+ exit(0);
}
command = CMD_RUN_TOR;
- for (i = 1; i < argc; ++i) {
- if (!strcmp(argv[i],"--list-fingerprint")) {
+ for (p_index = cmdline_only_options; p_index; p_index = p_index->next) {
+ if (!strcmp(p_index->key,"--list-fingerprint")) {
command = CMD_LIST_FINGERPRINT;
- } else if (!strcmp(argv[i],"--hash-password")) {
+ } else if (!strcmp(p_index->key, "--hash-password")) {
command = CMD_HASH_PASSWORD;
- command_arg = tor_strdup( (i < argc-1) ? argv[i+1] : "");
- ++i;
- } else if (!strcmp(argv[i],"--verify-config")) {
+ command_arg = p_index->value;
+ } else if (!strcmp(p_index->key, "--dump-config")) {
+ command = CMD_DUMP_CONFIG;
+ command_arg = p_index->value;
+ } else if (!strcmp(p_index->key, "--verify-config")) {
command = CMD_VERIFY_CONFIG;
}
}
@@ -3728,10 +4163,15 @@ options_init_from_torrc(int argc, char **argv)
cf_defaults = tor_strdup("");
cf = tor_strdup("");
} else {
- cf_defaults = load_torrc_from_disk(argc, argv, 1);
- cf = load_torrc_from_disk(argc, argv, 0);
- if (!cf)
- goto err;
+ cf_defaults = load_torrc_from_disk(cmdline_only_options, 1);
+ cf = load_torrc_from_disk(cmdline_only_options, 0);
+ if (!cf) {
+ if (config_line_find(cmdline_only_options, "--allow-missing-torrc")) {
+ cf = tor_strdup("");
+ } else {
+ goto err;
+ }
+ }
}
retval = options_init_from_string(cf_defaults, cf, command, command_arg,
@@ -3775,7 +4215,7 @@ options_init_from_string(const char *cf_defaults, const char *cf,
newoptions->magic_ = OR_OPTIONS_MAGIC;
options_init(newoptions);
newoptions->command = command;
- newoptions->command_arg = command_arg;
+ newoptions->command_arg = command_arg ? tor_strdup(command_arg) : NULL;
for (i = 0; i < 2; ++i) {
const char *body = i==0 ? cf_defaults : cf;
@@ -3839,7 +4279,7 @@ options_init_from_string(const char *cf_defaults, const char *cf,
newoptions->magic_ = OR_OPTIONS_MAGIC;
options_init(newoptions);
newoptions->command = command;
- newoptions->command_arg = command_arg;
+ newoptions->command_arg = command_arg ? tor_strdup(command_arg) : NULL;
/* Assign all options a second time. */
for (i = 0; i < 2; ++i) {
@@ -3871,7 +4311,8 @@ options_init_from_string(const char *cf_defaults, const char *cf,
}
/* Validate newoptions */
- if (options_validate(oldoptions, newoptions, 0, msg) < 0) {
+ if (options_validate(oldoptions, newoptions, newdefaultoptions,
+ 0, msg) < 0) {
err = SETOPT_ERR_PARSE; /*XXX make this a separate return value.*/
goto err;
}
@@ -4128,21 +4569,72 @@ options_init_logs(or_options_t *options, int validate_only)
return ok?0:-1;
}
+/** Given a smartlist of SOCKS arguments to be passed to a transport
+ * proxy in <b>args</b>, validate them and return -1 if they are
+ * corrupted. Return 0 if they seem OK. */
+static int
+validate_transport_socks_arguments(const smartlist_t *args)
+{
+ char *socks_string = NULL;
+ size_t socks_string_len;
+
+ tor_assert(args);
+ tor_assert(smartlist_len(args) > 0);
+
+ SMARTLIST_FOREACH_BEGIN(args, const char *, s) {
+ if (!string_is_key_value(LOG_WARN, s)) { /* items should be k=v items */
+ log_warn(LD_CONFIG, "'%s' is not a k=v item.", s);
+ return -1;
+ }
+ } SMARTLIST_FOREACH_END(s);
+
+ socks_string = pt_stringify_socks_args(args);
+ if (!socks_string)
+ return -1;
+
+ socks_string_len = strlen(socks_string);
+ tor_free(socks_string);
+
+ if (socks_string_len > MAX_SOCKS5_AUTH_SIZE_TOTAL) {
+ log_warn(LD_CONFIG, "SOCKS arguments can't be more than %u bytes (%lu).",
+ MAX_SOCKS5_AUTH_SIZE_TOTAL,
+ (unsigned long) socks_string_len);
+ return -1;
+ }
+
+ return 0;
+}
+
+/** Deallocate a bridge_line_t structure. */
+/* private */ void
+bridge_line_free(bridge_line_t *bridge_line)
+{
+ if (!bridge_line)
+ return;
+
+ if (bridge_line->socks_args) {
+ SMARTLIST_FOREACH(bridge_line->socks_args, char*, s, tor_free(s));
+ smartlist_free(bridge_line->socks_args);
+ }
+ tor_free(bridge_line->transport_name);
+ tor_free(bridge_line);
+}
+
/** Read the contents of a Bridge line from <b>line</b>. Return 0
* if the line is well-formed, and -1 if it isn't. If
* <b>validate_only</b> is 0, and the line is well-formed, then add
- * the bridge described in the line to our internal bridge list. */
-static int
-parse_bridge_line(const char *line, int validate_only)
+ * the bridge described in the line to our internal bridge list.
+ *
+ * Bridge line format:
+ * Bridge [transport] IP:PORT [id-fingerprint] [k=v] [k=v] ...
+ */
+/* private */ bridge_line_t *
+parse_bridge_line(const char *line)
{
smartlist_t *items = NULL;
- int r;
char *addrport=NULL, *fingerprint=NULL;
- char *transport_name=NULL;
- char *field1=NULL;
- tor_addr_t addr;
- uint16_t port = 0;
- char digest[DIGEST_LEN];
+ char *field=NULL;
+ bridge_line_t *bridge_line = tor_malloc_zero(sizeof(bridge_line_t));
items = smartlist_new();
smartlist_split_string(items, line, NULL,
@@ -4152,80 +4644,109 @@ parse_bridge_line(const char *line, int validate_only)
goto err;
}
- /* field1 is either a transport name or addrport */
- field1 = smartlist_get(items, 0);
+ /* first field is either a transport name or addrport */
+ field = smartlist_get(items, 0);
smartlist_del_keeporder(items, 0);
- if (!(strstr(field1, ".") || strstr(field1, ":"))) {
- /* new-style bridge line */
- transport_name = field1;
+ if (string_is_C_identifier(field)) {
+ /* It's a transport name. */
+ bridge_line->transport_name = field;
if (smartlist_len(items) < 1) {
log_warn(LD_CONFIG, "Too few items to Bridge line.");
goto err;
}
- addrport = smartlist_get(items, 0);
+ addrport = smartlist_get(items, 0); /* Next field is addrport then. */
smartlist_del_keeporder(items, 0);
} else {
- addrport = field1;
+ addrport = field;
}
- if (tor_addr_port_lookup(addrport, &addr, &port)<0) {
+ if (tor_addr_port_parse(LOG_INFO, addrport,
+ &bridge_line->addr, &bridge_line->port, 443)<0) {
log_warn(LD_CONFIG, "Error parsing Bridge address '%s'", addrport);
goto err;
}
- if (!port) {
- log_info(LD_CONFIG,
- "Bridge address '%s' has no port; using default port 443.",
- addrport);
- port = 443;
- }
+ /* If transports are enabled, next field could be a fingerprint or a
+ socks argument. If transports are disabled, next field must be
+ a fingerprint. */
if (smartlist_len(items)) {
- fingerprint = smartlist_join_strings(items, "", 0, NULL);
+ if (bridge_line->transport_name) { /* transports enabled: */
+ field = smartlist_get(items, 0);
+ smartlist_del_keeporder(items, 0);
+
+ /* If it's a key=value pair, then it's a SOCKS argument for the
+ transport proxy... */
+ if (string_is_key_value(LOG_DEBUG, field)) {
+ bridge_line->socks_args = smartlist_new();
+ smartlist_add(bridge_line->socks_args, field);
+ } else { /* ...otherwise, it's the bridge fingerprint. */
+ fingerprint = field;
+ }
+
+ } else { /* transports disabled: */
+ fingerprint = smartlist_join_strings(items, "", 0, NULL);
+ }
+ }
+
+ /* Handle fingerprint, if it was provided. */
+ if (fingerprint) {
if (strlen(fingerprint) != HEX_DIGEST_LEN) {
log_warn(LD_CONFIG, "Key digest for Bridge is wrong length.");
goto err;
}
- if (base16_decode(digest, DIGEST_LEN, fingerprint, HEX_DIGEST_LEN)<0) {
+ if (base16_decode(bridge_line->digest, DIGEST_LEN,
+ fingerprint, HEX_DIGEST_LEN)<0) {
log_warn(LD_CONFIG, "Unable to decode Bridge key digest.");
goto err;
}
}
- if (!validate_only) {
- log_debug(LD_DIR, "Bridge at %s (transport: %s) (%s)",
- fmt_addrport(&addr, port),
- transport_name ? transport_name : "no transport",
- fingerprint ? fingerprint : "no key listed");
- bridge_add_from_config(&addr, port,
- fingerprint ? digest : NULL, transport_name);
+ /* If we are using transports, any remaining items in the smartlist
+ should be k=v values. */
+ if (bridge_line->transport_name && smartlist_len(items)) {
+ if (!bridge_line->socks_args)
+ bridge_line->socks_args = smartlist_new();
+
+ /* append remaining items of 'items' to 'socks_args' */
+ smartlist_add_all(bridge_line->socks_args, items);
+ smartlist_clear(items);
+
+ tor_assert(smartlist_len(bridge_line->socks_args) > 0);
+ }
+
+ if (bridge_line->socks_args) {
+ if (validate_transport_socks_arguments(bridge_line->socks_args) < 0)
+ goto err;
}
- r = 0;
goto done;
err:
- r = -1;
+ bridge_line_free(bridge_line);
+ bridge_line = NULL;
done:
SMARTLIST_FOREACH(items, char*, s, tor_free(s));
smartlist_free(items);
tor_free(addrport);
- tor_free(transport_name);
tor_free(fingerprint);
- return r;
+
+ return bridge_line;
}
/** Read the contents of a ClientTransportPlugin line from
* <b>line</b>. Return 0 if the line is well-formed, and -1 if it
* isn't.
*
- * If <b>validate_only</b> is 0, and the line is well-formed:
+ * If <b>validate_only</b> is 0, the line is well-formed, and the
+ * transport is needed by some bridge:
* - If it's an external proxy line, add the transport described in the line to
* our internal transport list.
* - If it's a managed proxy line, launch the managed proxy. */
static int
-parse_client_transport_line(const char *line, int validate_only)
+parse_client_transport_line(const or_options_t *options,
+ const char *line, int validate_only)
{
smartlist_t *items = NULL;
int r;
@@ -4242,7 +4763,8 @@ parse_client_transport_line(const char *line, int validate_only)
int is_managed=0;
char **proxy_argv=NULL;
char **tmp=NULL;
- int proxy_argc,i;
+ int proxy_argc, i;
+ int is_useless_proxy=1;
int line_length;
@@ -4264,11 +4786,16 @@ parse_client_transport_line(const char *line, int validate_only)
smartlist_split_string(transport_list, transports, ",",
SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
SMARTLIST_FOREACH_BEGIN(transport_list, const char *, transport_name) {
+ /* validate transport names */
if (!string_is_C_identifier(transport_name)) {
log_warn(LD_CONFIG, "Transport name is not a C identifier (%s).",
transport_name);
goto err;
}
+
+ /* see if we actually need the transports provided by this proxy */
+ if (!validate_only && transport_is_needed(transport_name))
+ is_useless_proxy = 0;
} SMARTLIST_FOREACH_END(transport_name);
/* field2 is either a SOCKS version or "exec" */
@@ -4286,10 +4813,22 @@ parse_client_transport_line(const char *line, int validate_only)
goto err;
}
+ if (is_managed && options->Sandbox) {
+ log_warn(LD_CONFIG, "Managed proxies are not compatible with Sandbox mode."
+ "(ClientTransportPlugin line was %s)", escaped(line));
+ goto err;
+ }
+
if (is_managed) { /* managed */
- if (!validate_only) { /* if we are not just validating, use the
- rest of the line as the argv of the proxy
- to be launched */
+ if (!validate_only && is_useless_proxy) {
+ log_notice(LD_GENERAL, "Pluggable transport proxy (%s) does not provide "
+ "any needed transports and will not be launched.", line);
+ }
+
+ /* If we are not just validating, use the rest of the line as the
+ argv of the proxy to be launched. Also, make sure that we are
+ only launching proxies that contribute useful transports. */
+ if (!validate_only && !is_useless_proxy) {
proxy_argc = line_length-2;
tor_assert(proxy_argc > 0);
proxy_argv = tor_malloc_zero(sizeof(char*)*(proxy_argc+1));
@@ -4384,7 +4923,7 @@ get_bindaddr_from_transport_listen_line(const char *line,const char *transport)
goto err;
/* Validate addrport */
- if (tor_addr_port_parse(LOG_WARN, addrport, &addr, &port)<0) {
+ if (tor_addr_port_parse(LOG_WARN, addrport, &addr, &port, -1)<0) {
log_warn(LD_CONFIG, "Error parsing ServerTransportListenAddr "
"address '%s'", addrport);
goto err;
@@ -4403,6 +4942,63 @@ get_bindaddr_from_transport_listen_line(const char *line,const char *transport)
return addrport;
}
+/** Given a ServerTransportOptions <b>line</b>, return a smartlist
+ * with the options. Return NULL if the line was not well-formed.
+ *
+ * If <b>transport</b> is set, return NULL if the line is not
+ * referring to <b>transport</b>.
+ *
+ * The returned smartlist and its strings are allocated on the heap
+ * and it's the responsibility of the caller to free it. */
+smartlist_t *
+get_options_from_transport_options_line(const char *line,const char *transport)
+{
+ smartlist_t *items = smartlist_new();
+ smartlist_t *options = smartlist_new();
+ const char *parsed_transport = NULL;
+
+ smartlist_split_string(items, line, NULL,
+ SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, -1);
+
+ if (smartlist_len(items) < 2) {
+ log_warn(LD_CONFIG,"Too few arguments on ServerTransportOptions line.");
+ goto err;
+ }
+
+ parsed_transport = smartlist_get(items, 0);
+ /* If 'transport' is given, check if it matches the one on the line */
+ if (transport && strcmp(transport, parsed_transport))
+ goto err;
+
+ SMARTLIST_FOREACH_BEGIN(items, const char *, option) {
+ if (option_sl_idx == 0) /* skip the transport field (first field)*/
+ continue;
+
+ /* validate that it's a k=v value */
+ if (!string_is_key_value(LOG_WARN, option)) {
+ log_warn(LD_CONFIG, "%s is not a k=v value.", escaped(option));
+ goto err;
+ }
+
+ /* add it to the options smartlist */
+ smartlist_add(options, tor_strdup(option));
+ log_debug(LD_CONFIG, "Added %s to the list of options", escaped(option));
+ } SMARTLIST_FOREACH_END(option);
+
+ goto done;
+
+ err:
+ SMARTLIST_FOREACH(options, char*, s, tor_free(s));
+ smartlist_free(options);
+ options = NULL;
+
+ done:
+ SMARTLIST_FOREACH(items, char*, s, tor_free(s));
+ smartlist_free(items);
+
+ return options;
+}
+
/** Given the name of a pluggable transport in <b>transport</b>, check
* the configuration file to see if the user has explicitly asked for
* it to listen on a specific port. Return a <address:port> string if
@@ -4423,13 +5019,34 @@ get_transport_bindaddr_from_config(const char *transport)
return NULL;
}
+/** Given the name of a pluggable transport in <b>transport</b>, check
+ * the configuration file to see if the user has asked us to pass any
+ * parameters to the pluggable transport. Return a smartlist
+ * containing the parameters, otherwise NULL. */
+smartlist_t *
+get_options_for_server_transport(const char *transport)
+{
+ config_line_t *cl;
+ const or_options_t *options = get_options();
+
+ for (cl = options->ServerTransportOptions; cl; cl = cl->next) {
+ smartlist_t *options_sl =
+ get_options_from_transport_options_line(cl->value, transport);
+ if (options_sl)
+ return options_sl;
+ }
+
+ return NULL;
+}
+
/** Read the contents of a ServerTransportPlugin line from
* <b>line</b>. Return 0 if the line is well-formed, and -1 if it
* isn't.
* If <b>validate_only</b> is 0, the line is well-formed, and it's a
* managed proxy line, launch the managed proxy. */
static int
-parse_server_transport_line(const char *line, int validate_only)
+parse_server_transport_line(const or_options_t *options,
+ const char *line, int validate_only)
{
smartlist_t *items = NULL;
int r;
@@ -4484,6 +5101,12 @@ parse_server_transport_line(const char *line, int validate_only)
goto err;
}
+ if (is_managed && options->Sandbox) {
+ log_warn(LD_CONFIG, "Managed proxies are not compatible with Sandbox mode."
+ "(ServerTransportPlugin line was %s)", escaped(line));
+ goto err;
+ }
+
if (is_managed) { /* managed */
if (!validate_only) {
proxy_argc = line_length-2;
@@ -4559,8 +5182,7 @@ parse_dir_authority_line(const char *line, dirinfo_type_t required_type,
uint16_t dir_port = 0, or_port = 0;
char digest[DIGEST_LEN];
char v3_digest[DIGEST_LEN];
- dirinfo_type_t type = V2_DIRINFO;
- int is_not_hidserv_authority = 0, is_not_v2_authority = 0;
+ dirinfo_type_t type = 0;
double weight = 1.0;
items = smartlist_new();
@@ -4580,16 +5202,15 @@ parse_dir_authority_line(const char *line, dirinfo_type_t required_type,
char *flag = smartlist_get(items, 0);
if (TOR_ISDIGIT(flag[0]))
break;
- if (!strcasecmp(flag, "v1")) {
- type |= (V1_DIRINFO | HIDSERV_DIRINFO);
- } else if (!strcasecmp(flag, "hs")) {
- type |= HIDSERV_DIRINFO;
- } else if (!strcasecmp(flag, "no-hs")) {
- is_not_hidserv_authority = 1;
+ if (!strcasecmp(flag, "hs") ||
+ !strcasecmp(flag, "no-hs")) {
+ log_warn(LD_CONFIG, "The DirAuthority options 'hs' and 'no-hs' are "
+ "obsolete; you don't need them any more.");
} else if (!strcasecmp(flag, "bridge")) {
type |= BRIDGE_DIRINFO;
} else if (!strcasecmp(flag, "no-v2")) {
- is_not_v2_authority = 1;
+ /* obsolete, but may still be contained in DirAuthority lines generated
+ by various tools */;
} else if (!strcasecmpstart(flag, "orport=")) {
int ok;
char *portstring = flag + strlen("orport=");
@@ -4621,10 +5242,6 @@ parse_dir_authority_line(const char *line, dirinfo_type_t required_type,
tor_free(flag);
smartlist_del_keeporder(items, 0);
}
- if (is_not_hidserv_authority)
- type &= ~HIDSERV_DIRINFO;
- if (is_not_v2_authority)
- type &= ~V2_DIRINFO;
if (smartlist_len(items) < 2) {
log_warn(LD_CONFIG, "Too few arguments to DirAuthority line.");
@@ -4827,6 +5444,27 @@ warn_nonlocal_client_ports(const smartlist_t *ports, const char *portname,
} SMARTLIST_FOREACH_END(port);
}
+/** Warn for every Extended ORPort port in <b>ports</b> that is on a
+ * publicly routable address. */
+static void
+warn_nonlocal_ext_orports(const smartlist_t *ports, const char *portname)
+{
+ SMARTLIST_FOREACH_BEGIN(ports, const port_cfg_t *, port) {
+ if (port->type != CONN_TYPE_EXT_OR_LISTENER)
+ continue;
+ if (port->is_unix_addr)
+ continue;
+ /* XXX maybe warn even if address is RFC1918? */
+ if (!tor_addr_is_internal(&port->addr, 1)) {
+ log_warn(LD_CONFIG, "You specified a public address '%s' for %sPort. "
+ "This is not advised; this address is supposed to only be "
+ "exposed on localhost so that your pluggable transport "
+ "proxies can connect to it.",
+ fmt_addrport(&port->addr, port->port), portname);
+ }
+ } SMARTLIST_FOREACH_END(port);
+}
+
/** Given a list of port_cfg_t in <b>ports</b>, warn any controller port there
* is listening on any non-loopback address. If <b>forbid</b> is true,
* then emit a stronger warning and remove the port from the list.
@@ -4927,6 +5565,7 @@ parse_port_config(smartlist_t *out,
smartlist_t *elts;
int retval = -1;
const unsigned is_control = (listener_type == CONN_TYPE_CONTROL_LISTENER);
+ const unsigned is_ext_orport = (listener_type == CONN_TYPE_EXT_OR_LISTENER);
const unsigned allow_no_options = flags & CL_PORT_NO_OPTIONS;
const unsigned use_server_options = flags & CL_PORT_SERVER_OPTIONS;
const unsigned warn_nonlocal = flags & CL_PORT_WARN_NONLOCAL;
@@ -5004,6 +5643,8 @@ parse_port_config(smartlist_t *out,
if (warn_nonlocal && out) {
if (is_control)
warn_nonlocal_controller_ports(out, forbid_nonlocal);
+ else if (is_ext_orport)
+ warn_nonlocal_ext_orports(out, portname);
else
warn_nonlocal_client_ports(out, portname, listener_type);
}
@@ -5277,6 +5918,8 @@ parse_port_config(smartlist_t *out,
if (warn_nonlocal && out) {
if (is_control)
warn_nonlocal_controller_ports(out, forbid_nonlocal);
+ else if (is_ext_orport)
+ warn_nonlocal_ext_orports(out, portname);
else
warn_nonlocal_client_ports(out, portname, listener_type);
}
@@ -5423,6 +6066,14 @@ parse_ports(or_options_t *options, int validate_only,
goto err;
}
if (parse_port_config(ports,
+ options->ExtORPort_lines, NULL,
+ "ExtOR", CONN_TYPE_EXT_OR_LISTENER,
+ "127.0.0.1", 0,
+ CL_PORT_SERVER_OPTIONS|CL_PORT_WARN_NONLOCAL) < 0) {
+ *msg = tor_strdup("Invalid ExtORPort configuration");
+ goto err;
+ }
+ if (parse_port_config(ports,
options->DirPort_lines, options->DirListenAddress,
"Dir", CONN_TYPE_DIR_LISTENER,
"0.0.0.0", 0,
@@ -5457,6 +6108,8 @@ parse_ports(or_options_t *options, int validate_only,
!! count_real_listeners(ports, CONN_TYPE_DIR_LISTENER);
options->DNSPort_set =
!! count_real_listeners(ports, CONN_TYPE_AP_DNS_LISTENER);
+ options->ExtORPort_set =
+ !! count_real_listeners(ports, CONN_TYPE_EXT_OR_LISTENER);
if (!validate_only) {
if (configured_ports) {
@@ -5744,7 +6397,7 @@ write_configuration_file(const char *fname, const or_options_t *options)
return -1;
}
- if (!(new_conf = options_dump(options, 1))) {
+ if (!(new_conf = options_dump(options, OPTIONS_DUMP_MINIMAL))) {
log_warn(LD_BUG, "Couldn't get configuration string");
goto err;
}
@@ -5763,7 +6416,7 @@ write_configuration_file(const char *fname, const or_options_t *options)
++i;
}
log_notice(LD_CONFIG, "Renaming old configuration file to \"%s\"", fn_tmp);
- if (rename(fname, fn_tmp) < 0) {
+ if (tor_rename(fname, fn_tmp) < 0) {//XXXX sandbox doesn't allow
log_warn(LD_FS,
"Couldn't rename configuration file \"%s\" to \"%s\": %s",
fname, fn_tmp, strerror(errno));
@@ -5904,6 +6557,43 @@ options_get_datadir_fname2_suffix(const or_options_t *options,
return fname;
}
+/** Check wether the data directory has a private subdirectory
+ * <b>subdir</b>. If not, try to create it. Return 0 on success,
+ * -1 otherwise. */
+int
+check_or_create_data_subdir(const char *subdir)
+{
+ char *statsdir = get_datadir_fname(subdir);
+ int return_val = 0;
+
+ if (check_private_dir(statsdir, CPD_CREATE, get_options()->User) < 0) {
+ log_warn(LD_HIST, "Unable to create %s/ directory!", subdir);
+ return_val = -1;
+ }
+ tor_free(statsdir);
+ return return_val;
+}
+
+/** Create a file named <b>fname</b> with contents <b>str</b> in the
+ * subdirectory <b>subdir</b> of the data directory. <b>descr</b>
+ * should be a short description of the file's content and will be
+ * used for the warning message, if it's present and the write process
+ * fails. Return 0 on success, -1 otherwise.*/
+int
+write_to_data_subdir(const char* subdir, const char* fname,
+ const char* str, const char* descr)
+{
+ char *filename = get_datadir_fname2(subdir, fname);
+ int return_val = 0;
+
+ if (write_str_to_file(filename, str, 0) < 0) {
+ log_warn(LD_HIST, "Unable to write %s to disk!", descr ? descr : fname);
+ return_val = -1;
+ }
+ tor_free(filename);
+ return return_val;
+}
+
/** Given a file name check to see whether the file exists but has not been
* modified for a very long time. If so, remove it. */
void
@@ -5912,12 +6602,17 @@ remove_file_if_very_old(const char *fname, time_t now)
#define VERY_OLD_FILE_AGE (28*24*60*60)
struct stat st;
- if (stat(fname, &st)==0 && st.st_mtime < now-VERY_OLD_FILE_AGE) {
+ log_debug(LD_FS, "stat()ing %s", fname);
+ if (stat(sandbox_intern_string(fname), &st)==0 &&
+ st.st_mtime < now-VERY_OLD_FILE_AGE) {
char buf[ISO_TIME_LEN+1];
format_local_iso_time(buf, st.st_mtime);
log_notice(LD_GENERAL, "Obsolete file %s hasn't been modified since %s. "
"Removing it.", fname, buf);
- unlink(fname);
+ if (unlink(fname) != 0) {
+ log_warn(LD_FS, "Failed to unlink %s: %s",
+ fname, strerror(errno));
+ }
}
}
@@ -5993,6 +6688,7 @@ getinfo_helper_config(control_connection_t *conn,
case CONFIG_TYPE_ISOTIME: type = "Time"; break;
case CONFIG_TYPE_ROUTERSET: type = "RouterList"; break;
case CONFIG_TYPE_CSV: type = "CommaList"; break;
+ case CONFIG_TYPE_CSV_INTERVAL: type = "TimeIntervalCommaList"; break;
case CONFIG_TYPE_LINELIST: type = "LineList"; break;
case CONFIG_TYPE_LINELIST_S: type = "Dependant"; break;
case CONFIG_TYPE_LINELIST_V: type = "Virtual"; break;
@@ -6124,3 +6820,58 @@ config_maybe_load_geoip_files_(const or_options_t *options,
config_load_geoip_file_(AF_INET6, options->GeoIPv6File, "geoip6");
}
+/** Initialize cookie authentication (used so far by the ControlPort
+ * and Extended ORPort).
+ *
+ * Allocate memory and create a cookie (of length <b>cookie_len</b>)
+ * in <b>cookie_out</b>.
+ * Then write it down to <b>fname</b> and prepend it with <b>header</b>.
+ *
+ * If the whole procedure was successful, set
+ * <b>cookie_is_set_out</b> to True. */
+int
+init_cookie_authentication(const char *fname, const char *header,
+ int cookie_len,
+ uint8_t **cookie_out, int *cookie_is_set_out)
+{
+ char cookie_file_str_len = strlen(header) + cookie_len;
+ char *cookie_file_str = tor_malloc(cookie_file_str_len);
+ int retval = -1;
+
+ /* We don't want to generate a new cookie every time we call
+ * options_act(). One should be enough. */
+ if (*cookie_is_set_out) {
+ retval = 0; /* we are all set */
+ goto done;
+ }
+
+ /* If we've already set the cookie, free it before re-setting
+ it. This can happen if we previously generated a cookie, but
+ couldn't write it to a disk. */
+ if (*cookie_out)
+ tor_free(*cookie_out);
+
+ /* Generate the cookie */
+ *cookie_out = tor_malloc(cookie_len);
+ if (crypto_rand((char *)*cookie_out, cookie_len) < 0)
+ goto done;
+
+ /* Create the string that should be written on the file. */
+ memcpy(cookie_file_str, header, strlen(header));
+ memcpy(cookie_file_str+strlen(header), *cookie_out, cookie_len);
+ if (write_bytes_to_file(fname, cookie_file_str, cookie_file_str_len, 1)) {
+ log_warn(LD_FS,"Error writing auth cookie to %s.", escaped(fname));
+ goto done;
+ }
+
+ /* Success! */
+ log_info(LD_GENERAL, "Generated auth cookie file in '%s'.", escaped(fname));
+ *cookie_is_set_out = 1;
+ retval = 0;
+
+ done:
+ memwipe(cookie_file_str, 0, cookie_file_str_len);
+ tor_free(cookie_file_str);
+ return retval;
+}
+
diff --git a/src/or/config.h b/src/or/config.h
index ef4acac51..bf386134b 100644
--- a/src/or/config.h
+++ b/src/or/config.h
@@ -12,8 +12,10 @@
#ifndef TOR_CONFIG_H
#define TOR_CONFIG_H
+#include "testsupport.h"
+
const char *get_dirportfrontpage(void);
-const or_options_t *get_options(void);
+MOCK_DECL(const or_options_t *,get_options,(void));
or_options_t *get_options_mutable(void);
int set_options(or_options_t *new_val, char **msg);
void config_free_all(void);
@@ -32,7 +34,11 @@ int resolve_my_address(int warn_severity, const or_options_t *options,
const char **method_out, char **hostname_out);
int is_local_addr(const tor_addr_t *addr);
void options_init(or_options_t *options);
-char *options_dump(const or_options_t *options, int minimal);
+
+#define OPTIONS_DUMP_MINIMAL 1
+#define OPTIONS_DUMP_DEFAULTS 2
+#define OPTIONS_DUMP_ALL 3
+char *options_dump(const or_options_t *options, int how_to_dump);
int options_init_from_torrc(int argc, char **argv);
setopt_err_t options_init_from_string(const char *cf_defaults, const char *cf,
int command, const char *command_arg, char **msg);
@@ -59,6 +65,10 @@ char *options_get_datadir_fname2_suffix(const or_options_t *options,
#define get_datadir_fname_suffix(sub1, suffix) \
get_datadir_fname2_suffix((sub1), NULL, (suffix))
+int check_or_create_data_subdir(const char *subdir);
+int write_to_data_subdir(const char* subdir, const char* fname,
+ const char* str, const char* descr);
+
int get_num_cpus(const or_options_t *options);
const smartlist_t *get_configured_ports(void);
@@ -86,10 +96,15 @@ uint32_t get_effective_bwburst(const or_options_t *options);
char *get_transport_bindaddr_from_config(const char *transport);
-#ifdef CONFIG_PRIVATE
-/* Used only by config.c and test.c */
+int init_cookie_authentication(const char *fname, const char *header,
+ int cookie_len,
+ uint8_t **cookie_out, int *cookie_is_set_out);
+
or_options_t *options_new(void);
-#endif
+
+int config_parse_commandline(int argc, char **argv, int ignore_errors,
+ config_line_t **result,
+ config_line_t **cmdline_result);
void config_register_addressmaps(const or_options_t *options);
/* XXXX024 move to connection_edge.h */
@@ -98,5 +113,34 @@ int addressmap_register_auto(const char *from, const char *to,
addressmap_entry_source_t addrmap_source,
const char **msg);
+/** Represents the information stored in a torrc Bridge line. */
+typedef struct bridge_line_t {
+ tor_addr_t addr; /* The IP address of the bridge. */
+ uint16_t port; /* The TCP port of the bridge. */
+ char *transport_name; /* The name of the pluggable transport that
+ should be used to connect to the bridge. */
+ char digest[DIGEST_LEN]; /* The bridge's identity key digest. */
+ smartlist_t *socks_args; /* SOCKS arguments for the pluggable
+ transport proxy. */
+} bridge_line_t;
+
+void bridge_line_free(bridge_line_t *bridge_line);
+bridge_line_t *parse_bridge_line(const char *line);
+smartlist_t *get_options_from_transport_options_line(const char *line,
+ const char *transport);
+smartlist_t *get_options_for_server_transport(const char *transport);
+
+#ifdef CONFIG_PRIVATE
+#ifdef TOR_UNIT_TESTS
+extern struct config_format_t options_format;
+#endif
+
+STATIC void or_options_free(or_options_t *options);
+STATIC int options_validate(or_options_t *old_options,
+ or_options_t *options,
+ or_options_t *default_options,
+ int from_setconf, char **msg);
+#endif
+
#endif
diff --git a/src/or/confparse.c b/src/or/confparse.c
index 8863d9240..c5400a651 100644
--- a/src/or/confparse.c
+++ b/src/or/confparse.c
@@ -79,6 +79,21 @@ config_line_append(config_line_t **lst,
(*lst) = newline;
}
+/** Return the line in <b>lines</b> whose key is exactly <b>key</b>, or NULL
+ * if no such key exists. For handling commandline-only options only; other
+ * options should be looked up in the appropriate data structure. */
+const config_line_t *
+config_line_find(const config_line_t *lines,
+ const char *key)
+{
+ const config_line_t *cl;
+ for (cl = lines; cl; cl = cl->next) {
+ if (!strcmp(cl->key, key))
+ return cl;
+ }
+ return NULL;
+}
+
/** Helper: parse the config string and strdup into key/value
* strings. Set *result to the list, or NULL if parsing the string
* failed. Return 0 on success, -1 on failure. Warn and ignore any
@@ -223,6 +238,8 @@ config_assign_value(const config_format_t *fmt, void *options,
int i, ok;
const config_var_t *var;
void *lvalue;
+ int *csv_int;
+ smartlist_t *csv_str;
CONFIG_CHECK(fmt, options);
@@ -357,6 +374,36 @@ config_assign_value(const config_format_t *fmt, void *options,
SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
break;
+ case CONFIG_TYPE_CSV_INTERVAL:
+ if (*(smartlist_t**)lvalue) {
+ SMARTLIST_FOREACH(*(smartlist_t**)lvalue, int *, cp, tor_free(cp));
+ smartlist_clear(*(smartlist_t**)lvalue);
+ } else {
+ *(smartlist_t**)lvalue = smartlist_new();
+ }
+ csv_str = smartlist_new();
+ smartlist_split_string(csv_str, c->value, ",",
+ SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
+ SMARTLIST_FOREACH_BEGIN(csv_str, char *, str)
+ {
+ i = config_parse_interval(str, &ok);
+ if (!ok) {
+ tor_asprintf(msg,
+ "Interval in '%s %s' is malformed or out of bounds.",
+ c->key, c->value);
+ SMARTLIST_FOREACH(csv_str, char *, cp, tor_free(cp));
+ smartlist_free(csv_str);
+ return -1;
+ }
+ csv_int = tor_malloc_zero(sizeof(int));
+ *csv_int = i;
+ smartlist_add(*(smartlist_t**)lvalue, csv_int);
+ }
+ SMARTLIST_FOREACH_END(str);
+ SMARTLIST_FOREACH(csv_str, char *, cp, tor_free(cp));
+ smartlist_free(csv_str);
+ break;
+
case CONFIG_TYPE_LINELIST:
case CONFIG_TYPE_LINELIST_S:
{
@@ -555,6 +602,7 @@ config_get_assigned_option(const config_format_t *fmt, const void *options,
const config_var_t *var;
const void *value;
config_line_t *result;
+ smartlist_t *csv_str;
tor_assert(options && key);
CONFIG_CHECK(fmt, options);
@@ -637,6 +685,20 @@ config_get_assigned_option(const config_format_t *fmt, const void *options,
else
result->value = tor_strdup("");
break;
+ case CONFIG_TYPE_CSV_INTERVAL:
+ if (*(smartlist_t**)value) {
+ csv_str = smartlist_new();
+ SMARTLIST_FOREACH_BEGIN(*(smartlist_t**)value, int *, i)
+ {
+ smartlist_add_asprintf(csv_str, "%d", *i);
+ }
+ SMARTLIST_FOREACH_END(i);
+ result->value = smartlist_join_strings(csv_str, ",", 0, NULL);
+ SMARTLIST_FOREACH(csv_str, char *, cp, tor_free(cp));
+ smartlist_free(csv_str);
+ } else
+ result->value = tor_strdup("");
+ break;
case CONFIG_TYPE_OBSOLETE:
log_fn(LOG_INFO, LD_CONFIG,
"You asked me for the value of an obsolete config option '%s'.",
@@ -826,6 +888,13 @@ config_clear(const config_format_t *fmt, void *options,
*(smartlist_t **)lvalue = NULL;
}
break;
+ case CONFIG_TYPE_CSV_INTERVAL:
+ if (*(smartlist_t**)lvalue) {
+ SMARTLIST_FOREACH(*(smartlist_t **)lvalue, int *, cp, tor_free(cp));
+ smartlist_free(*(smartlist_t **)lvalue);
+ *(smartlist_t **)lvalue = NULL;
+ }
+ break;
case CONFIG_TYPE_LINELIST:
case CONFIG_TYPE_LINELIST_S:
config_free_lines(*(config_line_t **)lvalue);
@@ -1005,8 +1074,8 @@ config_dump(const config_format_t *fmt, const void *default_options,
/* XXX use a 1 here so we don't add a new log line while dumping */
if (default_options == NULL) {
- if (fmt->validate_fn(NULL, defaults_tmp, 1, &msg) < 0) {
- log_err(LD_BUG, "Failed to validate default config.");
+ if (fmt->validate_fn(NULL, defaults_tmp, defaults_tmp, 1, &msg) < 0) {
+ log_err(LD_BUG, "Failed to validate default config: %s", msg);
tor_free(msg);
tor_assert(0);
}
@@ -1072,20 +1141,36 @@ static struct unit_table_t memory_units[] = {
{ "kbytes", 1<<10 },
{ "kilobyte", 1<<10 },
{ "kilobytes", 1<<10 },
+ { "kilobits", 1<<7 },
+ { "kilobit", 1<<7 },
+ { "kbits", 1<<7 },
+ { "kbit", 1<<7 },
{ "m", 1<<20 },
{ "mb", 1<<20 },
{ "mbyte", 1<<20 },
{ "mbytes", 1<<20 },
{ "megabyte", 1<<20 },
{ "megabytes", 1<<20 },
+ { "megabits", 1<<17 },
+ { "megabit", 1<<17 },
+ { "mbits", 1<<17 },
+ { "mbit", 1<<17 },
{ "gb", 1<<30 },
{ "gbyte", 1<<30 },
{ "gbytes", 1<<30 },
{ "gigabyte", 1<<30 },
{ "gigabytes", 1<<30 },
+ { "gigabits", 1<<27 },
+ { "gigabit", 1<<27 },
+ { "gbits", 1<<27 },
+ { "gbit", 1<<27 },
{ "tb", U64_LITERAL(1)<<40 },
{ "terabyte", U64_LITERAL(1)<<40 },
{ "terabytes", U64_LITERAL(1)<<40 },
+ { "terabits", U64_LITERAL(1)<<37 },
+ { "terabit", U64_LITERAL(1)<<37 },
+ { "tbits", U64_LITERAL(1)<<37 },
+ { "tbit", U64_LITERAL(1)<<37 },
{ NULL, 0 },
};
diff --git a/src/or/confparse.h b/src/or/confparse.h
index 1b987f3bf..2cd6c49a2 100644
--- a/src/or/confparse.h
+++ b/src/or/confparse.h
@@ -26,6 +26,9 @@ typedef enum config_type_t {
CONFIG_TYPE_ISOTIME, /**< An ISO-formatted time relative to UTC. */
CONFIG_TYPE_CSV, /**< A list of strings, separated by commas and
* optional whitespace. */
+ CONFIG_TYPE_CSV_INTERVAL, /**< A list of strings, separated by commas and
+ * optional whitespace, representing intervals in
+ * seconds, with optional units */
CONFIG_TYPE_LINELIST, /**< Uninterpreted config lines */
CONFIG_TYPE_LINELIST_S, /**< Uninterpreted, context-sensitive config lines,
* mixed with other keywords. */
@@ -68,12 +71,12 @@ typedef struct config_var_description_t {
/** Type of a callback to validate whether a given configuration is
* well-formed and consistent. See options_trial_assign() for documentation
* of arguments. */
-typedef int (*validate_fn_t)(void*,void*,int,char**);
+typedef int (*validate_fn_t)(void*,void*,void*,int,char**);
/** Information on the keys, value types, key-to-struct-member mappings,
* variable descriptions, validation functions, and abbreviations for a
* configuration or storage format. */
-typedef struct {
+typedef struct config_format_t {
size_t size; /**< Size of the struct that everything gets parsed into. */
uint32_t magic; /**< Required 'magic value' to make sure we have a struct
* of the right type. */
@@ -100,6 +103,8 @@ void *config_new(const config_format_t *fmt);
void config_line_append(config_line_t **lst,
const char *key, const char *val);
config_line_t *config_lines_dup(const config_line_t *inp);
+const config_line_t *config_line_find(const config_line_t *lines,
+ const char *key);
void config_free(const config_format_t *fmt, void *options);
int config_lines_eq(config_line_t *a, config_line_t *b);
int config_count_key(const config_line_t *a, const char *key);
diff --git a/src/or/connection.c b/src/or/connection.c
index d99a54c15..0b03092f7 100644
--- a/src/or/connection.c
+++ b/src/or/connection.c
@@ -10,6 +10,7 @@
* on connections.
**/
+#define CONNECTION_PRIVATE
#include "or.h"
#include "buffers.h"
/*
@@ -17,6 +18,7 @@
* part of a subclass (channel_tls_t).
*/
#define TOR_CHANNEL_INTERNAL_
+#define CONNECTION_PRIVATE
#include "channel.h"
#include "channeltls.h"
#include "circuitbuild.h"
@@ -33,6 +35,7 @@
#include "dns.h"
#include "dnsserv.h"
#include "entrynodes.h"
+#include "ext_orport.h"
#include "geoip.h"
#include "main.h"
#include "policies.h"
@@ -44,6 +47,7 @@
#include "router.h"
#include "transports.h"
#include "routerparse.h"
+#include "transports.h"
#ifdef USE_BUFFEREVENTS
#include <event2/event.h>
@@ -97,6 +101,7 @@ static smartlist_t *outgoing_addrs = NULL;
#define CASE_ANY_LISTENER_TYPE \
case CONN_TYPE_OR_LISTENER: \
+ case CONN_TYPE_EXT_OR_LISTENER: \
case CONN_TYPE_AP_LISTENER: \
case CONN_TYPE_DIR_LISTENER: \
case CONN_TYPE_CONTROL_LISTENER: \
@@ -128,6 +133,8 @@ conn_type_to_string(int type)
case CONN_TYPE_CPUWORKER: return "CPU worker";
case CONN_TYPE_CONTROL_LISTENER: return "Control listener";
case CONN_TYPE_CONTROL: return "Control";
+ case CONN_TYPE_EXT_OR: return "Extended OR";
+ case CONN_TYPE_EXT_OR_LISTENER: return "Extended OR listener";
default:
log_warn(LD_BUG, "unknown connection type %d", type);
tor_snprintf(buf, sizeof(buf), "unknown [%d]", type);
@@ -164,6 +171,18 @@ conn_state_to_string(int type, int state)
case OR_CONN_STATE_OPEN: return "open";
}
break;
+ case CONN_TYPE_EXT_OR:
+ switch (state) {
+ case EXT_OR_CONN_STATE_AUTH_WAIT_AUTH_TYPE:
+ return "waiting for authentication type";
+ case EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_NONCE:
+ return "waiting for client nonce";
+ case EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_HASH:
+ return "waiting for client hash";
+ case EXT_OR_CONN_STATE_OPEN: return "open";
+ case EXT_OR_CONN_STATE_FLUSHING: return "flushing final OKAY";
+ }
+ break;
case CONN_TYPE_EXIT:
switch (state) {
case EXIT_CONN_STATE_RESOLVING: return "waiting for dest info";
@@ -228,6 +247,7 @@ connection_type_uses_bufferevent(connection_t *conn)
case CONN_TYPE_DIR:
case CONN_TYPE_CONTROL:
case CONN_TYPE_OR:
+ case CONN_TYPE_EXT_OR:
case CONN_TYPE_CPUWORKER:
return 1;
default:
@@ -249,21 +269,23 @@ dir_connection_new(int socket_family)
/** Allocate and return a new or_connection_t, initialized as by
* connection_init().
*
- * Assign a pseudorandom next_circ_id between 0 and 2**15.
- *
* Initialize active_circuit_pqueue.
*
* Set active_circuit_pqueue_last_recalibrated to current cell_ewma tick.
*/
or_connection_t *
-or_connection_new(int socket_family)
+or_connection_new(int type, int socket_family)
{
or_connection_t *or_conn = tor_malloc_zero(sizeof(or_connection_t));
time_t now = time(NULL);
- connection_init(now, TO_CONN(or_conn), CONN_TYPE_OR, socket_family);
+ tor_assert(type == CONN_TYPE_OR || type == CONN_TYPE_EXT_OR);
+ connection_init(now, TO_CONN(or_conn), type, socket_family);
connection_or_set_canonical(or_conn, 0);
+ if (type == CONN_TYPE_EXT_OR)
+ connection_or_set_ext_or_identifier(or_conn);
+
return or_conn;
}
@@ -309,7 +331,6 @@ control_connection_new(int socket_family)
tor_malloc_zero(sizeof(control_connection_t));
connection_init(time(NULL),
TO_CONN(control_conn), CONN_TYPE_CONTROL, socket_family);
- log_notice(LD_CONTROL, "New control connection opened.");
return control_conn;
}
@@ -332,7 +353,8 @@ connection_new(int type, int socket_family)
{
switch (type) {
case CONN_TYPE_OR:
- return TO_CONN(or_connection_new(socket_family));
+ case CONN_TYPE_EXT_OR:
+ return TO_CONN(or_connection_new(type, socket_family));
case CONN_TYPE_EXIT:
return TO_CONN(edge_connection_new(type, socket_family));
@@ -374,6 +396,7 @@ connection_init(time_t now, connection_t *conn, int type, int socket_family)
switch (type) {
case CONN_TYPE_OR:
+ case CONN_TYPE_EXT_OR:
conn->magic = OR_CONNECTION_MAGIC;
break;
case CONN_TYPE_EXIT:
@@ -432,7 +455,7 @@ connection_link_connections(connection_t *conn_a, connection_t *conn_b)
* necessary, close its socket if necessary, and mark the directory as dirty
* if <b>conn</b> is an OR or OP connection.
*/
-static void
+STATIC void
connection_free_(connection_t *conn)
{
void *mem;
@@ -442,6 +465,7 @@ connection_free_(connection_t *conn)
switch (conn->type) {
case CONN_TYPE_OR:
+ case CONN_TYPE_EXT_OR:
tor_assert(conn->magic == OR_CONNECTION_MAGIC);
mem = TO_OR_CONN(conn);
memlen = sizeof(or_connection_t);
@@ -588,6 +612,13 @@ connection_free_(connection_t *conn)
log_warn(LD_BUG, "called on OR conn with non-zeroed identity_digest");
connection_or_remove_from_identity_map(TO_OR_CONN(conn));
}
+ if (conn->type == CONN_TYPE_OR || conn->type == CONN_TYPE_EXT_OR) {
+ connection_or_remove_from_ext_or_id_map(TO_OR_CONN(conn));
+ tor_free(TO_OR_CONN(conn)->ext_or_conn_id);
+ tor_free(TO_OR_CONN(conn)->ext_or_auth_correct_client_hash);
+ tor_free(TO_OR_CONN(conn)->ext_or_transport);
+ }
+
#ifdef USE_BUFFEREVENTS
if (conn->type == CONN_TYPE_OR && TO_OR_CONN(conn)->bucket_cfg) {
ev_token_bucket_cfg_free(TO_OR_CONN(conn)->bucket_cfg);
@@ -651,6 +682,7 @@ connection_about_to_close_connection(connection_t *conn)
connection_dir_about_to_close(TO_DIR_CONN(conn));
break;
case CONN_TYPE_OR:
+ case CONN_TYPE_EXT_OR:
connection_or_about_to_close(TO_OR_CONN(conn));
break;
case CONN_TYPE_AP:
@@ -890,8 +922,11 @@ check_location_for_unix_socket(const or_options_t *options, const char *path)
int r = -1;
char *p = tor_strdup(path);
cpd_check_t flags = CPD_CHECK_MODE_ONLY;
- if (get_parent_directory(p)<0)
+ if (get_parent_directory(p)<0 || p[0] != '/') {
+ log_warn(LD_GENERAL, "Bad unix socket address '%s'. Tor does not support "
+ "relative paths for unix sockets.", path);
goto done;
+ }
if (options->ControlSocketsGroupWritable)
flags |= CPD_GROUP_OK;
@@ -919,12 +954,14 @@ check_location_for_unix_socket(const or_options_t *options, const char *path)
#endif
/** Tell the TCP stack that it shouldn't wait for a long time after
- * <b>sock</b> has closed before reusing its port. */
-static void
+ * <b>sock</b> has closed before reusing its port. Return 0 on success,
+ * -1 on failure. */
+static int
make_socket_reuseable(tor_socket_t sock)
{
#ifdef _WIN32
(void) sock;
+ return 0;
#else
int one=1;
@@ -934,9 +971,9 @@ make_socket_reuseable(tor_socket_t sock)
* already has it bound_. So, don't do that on Win32. */
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void*) &one,
(socklen_t)sizeof(one)) == -1) {
- log_warn(LD_NET, "Error setting SO_REUSEADDR flag: %s",
- tor_socket_strerror(errno));
+ return -1;
}
+ return 0;
#endif
}
@@ -969,16 +1006,16 @@ tor_listen(tor_socket_t fd)
*/
static connection_t *
connection_listener_new(const struct sockaddr *listensockaddr,
- socklen_t socklen,
- int type, const char *address,
- const port_cfg_t *port_cfg)
+ socklen_t socklen,
+ int type, const char *address,
+ const port_cfg_t *port_cfg)
{
listener_connection_t *lis_conn;
- connection_t *conn;
- tor_socket_t s; /* the socket we're going to make */
+ connection_t *conn = NULL;
+ tor_socket_t s = TOR_INVALID_SOCKET; /* the socket we're going to make */
or_options_t const *options = get_options();
#if defined(HAVE_PWD_H) && defined(HAVE_SYS_UN_H)
- struct passwd *pw = NULL;
+ const struct passwd *pw = NULL;
#endif
uint16_t usePort = 0, gotPort = 0;
int start_reading = 0;
@@ -1001,7 +1038,7 @@ connection_listener_new(const struct sockaddr *listensockaddr,
log_notice(LD_NET, "Opening %s on %s",
conn_type_to_string(type), fmt_addrport(&addr, usePort));
- s = tor_open_socket(tor_addr_family(&addr),
+ s = tor_open_socket_nonblocking(tor_addr_family(&addr),
is_tcp ? SOCK_STREAM : SOCK_DGRAM,
is_tcp ? IPPROTO_TCP: IPPROTO_UDP);
if (!SOCKET_OK(s)) {
@@ -1010,7 +1047,27 @@ connection_listener_new(const struct sockaddr *listensockaddr,
goto err;
}
- make_socket_reuseable(s);
+ if (make_socket_reuseable(s) < 0) {
+ log_warn(LD_NET, "Error setting SO_REUSEADDR flag on %s: %s",
+ conn_type_to_string(type),
+ tor_socket_strerror(errno));
+ }
+
+#if defined USE_TRANSPARENT && defined(IP_TRANSPARENT)
+ if (options->TransProxyType_parsed == TPT_TPROXY &&
+ type == CONN_TYPE_AP_TRANS_LISTENER) {
+ int one = 1;
+ if (setsockopt(s, SOL_IP, IP_TRANSPARENT, &one, sizeof(one)) < 0) {
+ const char *extra = "";
+ int e = tor_socket_errno(s);
+ if (e == EPERM)
+ extra = "TransTPROXY requires root privileges or similar"
+ " capabilities.";
+ log_warn(LD_NET, "Error setting IP_TRANSPARENT flag: %s.%s",
+ tor_socket_strerror(e), extra);
+ }
+ }
+#endif
#ifdef IPV6_V6ONLY
if (listensockaddr->sa_family == AF_INET6) {
@@ -1023,7 +1080,7 @@ connection_listener_new(const struct sockaddr *listensockaddr,
/* We need to set IPV6_V6ONLY so that this socket can't get used for
* IPv4 connections. */
if (setsockopt(s,IPPROTO_IPV6, IPV6_V6ONLY,
- (void*)&one, sizeof(one))<0) {
+ (void*)&one, sizeof(one)) < 0) {
int e = tor_socket_errno(s);
log_warn(LD_NET, "Error setting IPV6_V6ONLY flag: %s",
tor_socket_strerror(e));
@@ -1039,7 +1096,6 @@ connection_listener_new(const struct sockaddr *listensockaddr,
helpfulhint = ". Is Tor already running?";
log_warn(LD_NET, "Could not bind to %s:%u: %s%s", address, usePort,
tor_socket_strerror(e), helpfulhint);
- tor_close_socket(s);
goto err;
}
@@ -1047,7 +1103,6 @@ connection_listener_new(const struct sockaddr *listensockaddr,
if (tor_listen(s) < 0) {
log_warn(LD_NET, "Could not listen on %s:%u: %s", address, usePort,
tor_socket_strerror(tor_socket_errno(s)));
- tor_close_socket(s);
goto err;
}
}
@@ -1087,7 +1142,7 @@ connection_listener_new(const struct sockaddr *listensockaddr,
strerror(errno));
goto err;
}
- s = tor_open_socket(AF_UNIX, SOCK_STREAM, 0);
+ s = tor_open_socket_nonblocking(AF_UNIX, SOCK_STREAM, 0);
if (! SOCKET_OK(s)) {
log_warn(LD_NET,"Socket creation failed: %s.", strerror(errno));
goto err;
@@ -1096,21 +1151,18 @@ connection_listener_new(const struct sockaddr *listensockaddr,
if (bind(s, listensockaddr, (socklen_t)sizeof(struct sockaddr_un)) == -1) {
log_warn(LD_NET,"Bind to %s failed: %s.", address,
tor_socket_strerror(tor_socket_errno(s)));
- tor_close_socket(s);
goto err;
}
#ifdef HAVE_PWD_H
if (options->User) {
- pw = getpwnam(options->User);
+ pw = tor_getpwnam(options->User);
if (pw == NULL) {
log_warn(LD_NET,"Unable to chown() %s socket: user %s not found.",
address, options->User);
- tor_close_socket(s);
goto err;
} else if (chown(address, pw->pw_uid, pw->pw_gid) < 0) {
log_warn(LD_NET,"Unable to chown() %s socket: %s.",
address, strerror(errno));
- tor_close_socket(s);
goto err;
}
}
@@ -1120,35 +1172,29 @@ connection_listener_new(const struct sockaddr *listensockaddr,
* platforms. */
if (chmod(address, 0660) < 0) {
log_warn(LD_FS,"Unable to make %s group-writable.", address);
- tor_close_socket(s);
goto err;
}
}
- if (listen(s,SOMAXCONN) < 0) {
+ if (listen(s, SOMAXCONN) < 0) {
log_warn(LD_NET, "Could not listen on %s: %s", address,
tor_socket_strerror(tor_socket_errno(s)));
- tor_close_socket(s);
goto err;
}
#else
(void)options;
#endif /* HAVE_SYS_UN_H */
} else {
- log_err(LD_BUG,"Got unexpected address family %d.",
- listensockaddr->sa_family);
- tor_assert(0);
- }
-
- if (set_socket_nonblocking(s) == -1) {
- tor_close_socket(s);
- goto err;
+ log_err(LD_BUG, "Got unexpected address family %d.",
+ listensockaddr->sa_family);
+ tor_assert(0);
}
lis_conn = listener_connection_new(type, listensockaddr->sa_family);
conn = TO_CONN(lis_conn);
conn->socket_family = listensockaddr->sa_family;
conn->s = s;
+ s = TOR_INVALID_SOCKET; /* Prevent double-close */
conn->address = tor_strdup(address);
conn->port = gotPort;
tor_addr_copy(&conn->addr, &addr);
@@ -1184,7 +1230,6 @@ connection_listener_new(const struct sockaddr *listensockaddr,
if (connection_add(conn) < 0) { /* no space, forget it */
log_warn(LD_NET,"connection_add for listener failed. Giving up.");
- connection_free(conn);
goto err;
}
@@ -1203,6 +1248,11 @@ connection_listener_new(const struct sockaddr *listensockaddr,
return conn;
err:
+ if (SOCKET_OK(s))
+ tor_close_socket(s);
+ if (conn)
+ connection_free(conn);
+
return NULL;
}
@@ -1287,7 +1337,7 @@ connection_handle_listener_read(connection_t *conn, int new_type)
tor_assert((size_t)remotelen >= sizeof(struct sockaddr_in));
memset(&addrbuf, 0, sizeof(addrbuf));
- news = tor_accept_socket(conn->s,remote,&remotelen);
+ news = tor_accept_socket_nonblocking(conn->s,remote,&remotelen);
if (!SOCKET_OK(news)) { /* accept() error */
int e = tor_socket_errno(conn->s);
if (ERRNO_IS_ACCEPT_EAGAIN(e)) {
@@ -1306,8 +1356,15 @@ connection_handle_listener_read(connection_t *conn, int new_type)
"Connection accepted on socket %d (child of fd %d).",
(int)news,(int)conn->s);
- make_socket_reuseable(news);
- if (set_socket_nonblocking(news) == -1) {
+ if (make_socket_reuseable(news) < 0) {
+ if (tor_socket_errno(news) == EINVAL) {
+ /* This can happen on OSX if we get a badly timed shutdown. */
+ log_debug(LD_NET, "make_socket_reuseable returned EINVAL");
+ } else {
+ log_warn(LD_NET, "Error setting SO_REUSEADDR flag on %s: %s",
+ conn_type_to_string(new_type),
+ tor_socket_strerror(errno));
+ }
tor_close_socket(news);
return 0;
}
@@ -1365,11 +1422,17 @@ connection_handle_listener_read(connection_t *conn, int new_type)
TO_ENTRY_CONN(newconn)->socks_request->socks_prefer_no_auth =
TO_LISTENER_CONN(conn)->socks_prefer_no_auth;
}
+ if (new_type == CONN_TYPE_CONTROL) {
+ log_notice(LD_CONTROL, "New control connection opened from %s.",
+ fmt_and_decorate_addr(&addr));
+ }
} else if (conn->socket_family == AF_UNIX) {
/* For now only control ports can be Unix domain sockets
* and listeners at the same time */
tor_assert(conn->type == CONN_TYPE_CONTROL_LISTENER);
+ tor_assert(new_type == CONN_TYPE_CONTROL);
+ log_notice(LD_CONTROL, "New control connection opened.");
newconn = connection_new(new_type, conn->socket_family);
newconn->s = news;
@@ -1409,6 +1472,9 @@ connection_init_accepted_conn(connection_t *conn,
connection_start_reading(conn);
switch (conn->type) {
+ case CONN_TYPE_EXT_OR:
+ /* Initiate Extended ORPort authentication. */
+ return connection_ext_or_start_auth(TO_OR_CONN(conn));
case CONN_TYPE_OR:
control_event_or_conn_status(TO_OR_CONN(conn), OR_CONN_EVENT_NEW, 0);
rv = connection_tls_start_handshake(TO_OR_CONN(conn), 1);
@@ -1502,7 +1568,7 @@ connection_connect(connection_t *conn, const char *address,
return -1;
}
- s = tor_open_socket(protocol_family,SOCK_STREAM,IPPROTO_TCP);
+ s = tor_open_socket_nonblocking(protocol_family,SOCK_STREAM,IPPROTO_TCP);
if (! SOCKET_OK(s)) {
*socket_error = tor_socket_errno(-1);
log_warn(LD_NET,"Error creating network socket: %s",
@@ -1510,7 +1576,10 @@ connection_connect(connection_t *conn, const char *address,
return -1;
}
- make_socket_reuseable(s);
+ if (make_socket_reuseable(s) < 0) {
+ log_warn(LD_NET, "Error setting SO_REUSEADDR flag on new connection: %s",
+ tor_socket_strerror(errno));
+ }
if (!tor_addr_is_loopback(addr)) {
const tor_addr_t *ext_addr = NULL;
@@ -1544,12 +1613,6 @@ connection_connect(connection_t *conn, const char *address,
}
}
- if (set_socket_nonblocking(s) == -1) {
- *socket_error = tor_socket_errno(s);
- tor_close_socket(s);
- return -1;
- }
-
if (options->ConstrainedSockets)
set_constrained_socket_buffers(s, (int)options->ConstrainedSockSize);
@@ -1615,6 +1678,32 @@ connection_proxy_state_to_string(int state)
return states[state];
}
+/** Returns the global proxy type used by tor. Use this function for
+ * logging or high-level purposes, don't use it to fill the
+ * <b>proxy_type</b> field of or_connection_t; use the actual proxy
+ * protocol instead.*/
+static int
+get_proxy_type(void)
+{
+ const or_options_t *options = get_options();
+
+ if (options->HTTPSProxy)
+ return PROXY_CONNECT;
+ else if (options->Socks4Proxy)
+ return PROXY_SOCKS4;
+ else if (options->Socks5Proxy)
+ return PROXY_SOCKS5;
+ else if (options->ClientTransportPlugin)
+ return PROXY_PLUGGABLE;
+ else
+ return PROXY_NONE;
+}
+
+/* One byte for the version, one for the command, two for the
+ port, and four for the addr... and, one more for the
+ username NUL: */
+#define SOCKS4_STANDARD_BUFFER_SIZE (1 + 1 + 2 + 4 + 1)
+
/** Write a proxy request of <b>type</b> (socks4, socks5, https) to conn
* for conn->addr:conn->port, authenticating with the auth details given
* in the configuration (if available). SOCKS 5 and HTTP CONNECT proxies
@@ -1669,17 +1758,45 @@ connection_proxy_connect(connection_t *conn, int type)
}
case PROXY_SOCKS4: {
- unsigned char buf[9];
+ unsigned char *buf;
uint16_t portn;
uint32_t ip4addr;
+ size_t buf_size = 0;
+ char *socks_args_string = NULL;
- /* Send a SOCKS4 connect request with empty user id */
+ /* Send a SOCKS4 connect request */
if (tor_addr_family(&conn->addr) != AF_INET) {
log_warn(LD_NET, "SOCKS4 client is incompatible with IPv6");
return -1;
}
+ { /* If we are here because we are trying to connect to a
+ pluggable transport proxy, check if we have any SOCKS
+ arguments to transmit. If we do, compress all arguments to
+ a single string in 'socks_args_string': */
+
+ if (get_proxy_type() == PROXY_PLUGGABLE) {
+ socks_args_string =
+ pt_get_socks_args_for_proxy_addrport(&conn->addr, conn->port);
+ if (socks_args_string)
+ log_debug(LD_NET, "Sending out '%s' as our SOCKS argument string.",
+ socks_args_string);
+ }
+ }
+
+ { /* Figure out the buffer size we need for the SOCKS message: */
+
+ buf_size = SOCKS4_STANDARD_BUFFER_SIZE;
+
+ /* If we have a SOCKS argument string, consider its size when
+ calculating the buffer size: */
+ if (socks_args_string)
+ buf_size += strlen(socks_args_string);
+ }
+
+ buf = tor_malloc_zero(buf_size);
+
ip4addr = tor_addr_to_ipv4n(&conn->addr);
portn = htons(conn->port);
@@ -1687,9 +1804,23 @@ connection_proxy_connect(connection_t *conn, int type)
buf[1] = SOCKS_COMMAND_CONNECT; /* command */
memcpy(buf + 2, &portn, 2); /* port */
memcpy(buf + 4, &ip4addr, 4); /* addr */
- buf[8] = 0; /* userid (empty) */
- connection_write_to_buf((char *)buf, sizeof(buf), conn);
+ /* Next packet field is the userid. If we have pluggable
+ transport SOCKS arguments, we have to embed them
+ there. Otherwise, we use an empty userid. */
+ if (socks_args_string) { /* place the SOCKS args string: */
+ tor_assert(strlen(socks_args_string) > 0);
+ tor_assert(buf_size >=
+ SOCKS4_STANDARD_BUFFER_SIZE + strlen(socks_args_string));
+ strlcpy((char *)buf + 8, socks_args_string, buf_size - 8);
+ tor_free(socks_args_string);
+ } else {
+ buf[8] = 0; /* no userid */
+ }
+
+ connection_write_to_buf((char *)buf, buf_size, conn);
+ tor_free(buf);
+
conn->proxy_state = PROXY_SOCKS4_WANT_CONNECT_OK;
break;
}
@@ -1701,8 +1832,13 @@ connection_proxy_connect(connection_t *conn, int type)
buf[0] = 5; /* version */
+ /* We have to use SOCKS5 authentication, if we have a
+ Socks5ProxyUsername or if we want to pass arguments to our
+ pluggable transport proxy: */
+ if ((options->Socks5ProxyUsername) ||
+ (get_proxy_type() == PROXY_PLUGGABLE &&
+ (get_socks_args_by_bridge_addrport(&conn->addr, conn->port)))) {
/* number of auth methods */
- if (options->Socks5ProxyUsername) {
buf[1] = 2;
buf[2] = 0x00; /* no authentication */
buf[3] = 0x02; /* rfc1929 Username/Passwd auth */
@@ -1896,15 +2032,49 @@ connection_read_proxy_handshake(connection_t *conn)
unsigned char buf[1024];
size_t reqsize, usize, psize;
const char *user, *pass;
+ char *socks_args_string = NULL;
+
+ if (get_proxy_type() == PROXY_PLUGGABLE) {
+ socks_args_string =
+ pt_get_socks_args_for_proxy_addrport(&conn->addr, conn->port);
+ if (!socks_args_string) {
+ log_warn(LD_NET, "Could not create SOCKS args string.");
+ ret = -1;
+ break;
+ }
+
+ log_debug(LD_NET, "SOCKS5 arguments: %s", socks_args_string);
+ tor_assert(strlen(socks_args_string) > 0);
+ tor_assert(strlen(socks_args_string) <= MAX_SOCKS5_AUTH_SIZE_TOTAL);
+
+ if (strlen(socks_args_string) > MAX_SOCKS5_AUTH_FIELD_SIZE) {
+ user = socks_args_string;
+ usize = MAX_SOCKS5_AUTH_FIELD_SIZE;
+ pass = socks_args_string + MAX_SOCKS5_AUTH_FIELD_SIZE;
+ psize = strlen(socks_args_string) - MAX_SOCKS5_AUTH_FIELD_SIZE;
+ } else {
+ user = socks_args_string;
+ usize = strlen(socks_args_string);
+ pass = "\0";
+ psize = 1;
+ }
+ } else if (get_options()->Socks5ProxyUsername) {
+ user = get_options()->Socks5ProxyUsername;
+ pass = get_options()->Socks5ProxyPassword;
+ tor_assert(user && pass);
+ usize = strlen(user);
+ psize = strlen(pass);
+ } else {
+ log_err(LD_BUG, "We entered %s for no reason!", __func__);
+ tor_fragile_assert();
+ ret = -1;
+ break;
+ }
- user = get_options()->Socks5ProxyUsername;
- pass = get_options()->Socks5ProxyPassword;
- tor_assert(user && pass);
-
- /* XXX len of user and pass must be <= 255 !!! */
- usize = strlen(user);
- psize = strlen(pass);
- tor_assert(usize <= 255 && psize <= 255);
+ /* Username and password lengths should have been checked
+ above and during torrc parsing. */
+ tor_assert(usize <= MAX_SOCKS5_AUTH_FIELD_SIZE &&
+ psize <= MAX_SOCKS5_AUTH_FIELD_SIZE);
reqsize = 3 + usize + psize;
buf[0] = 1; /* negotiation version */
@@ -1913,6 +2083,9 @@ connection_read_proxy_handshake(connection_t *conn)
buf[2 + usize] = psize;
memcpy(buf + 3 + usize, pass, psize);
+ if (socks_args_string)
+ tor_free(socks_args_string);
+
connection_write_to_buf((char *)buf, reqsize, conn);
conn->proxy_state = PROXY_SOCKS5_WANT_AUTH_RFC1929_OK;
@@ -2070,7 +2243,7 @@ retry_listener_ports(smartlist_t *old_conns,
if (listensockaddr) {
conn = connection_listener_new(listensockaddr, listensocklen,
- port->type, address, port);
+ port->type, address, port);
tor_free(listensockaddr);
tor_free(address);
} else {
@@ -2182,6 +2355,20 @@ connection_mark_all_noncontrol_connections(void)
connection_mark_unattached_ap(TO_ENTRY_CONN(conn),
END_STREAM_REASON_HIBERNATING);
break;
+ case CONN_TYPE_OR:
+ {
+ or_connection_t *orconn = TO_OR_CONN(conn);
+ if (orconn->chan) {
+ connection_or_close_normally(orconn, 0);
+ } else {
+ /*
+ * There should have been one, but mark for close and hope
+ * for the best..
+ */
+ connection_mark_for_close(conn);
+ }
+ }
+ break;
default:
connection_mark_for_close(conn);
break;
@@ -2356,9 +2543,8 @@ connection_bucket_write_limit(connection_t *conn, time_t now)
* shouldn't send <b>attempt</b> bytes of low-priority directory stuff
* out to <b>conn</b>. Else return 0.
- * Priority is 1 for v1 requests (directories and running-routers),
- * and 2 for v2 requests (statuses and descriptors). But see FFFF in
- * directory_handle_command_get() for why we don't use priority 2 yet.
+ * Priority was 1 for v1 requests (directories and running-routers),
+ * and 2 for v2 requests and later (statuses and descriptors).
*
* There are a lot of parameters we could use here:
* - global_relayed_write_bucket. Low is bad.
@@ -2465,6 +2651,35 @@ record_num_bytes_transferred(connection_t *conn,
#endif
#ifndef USE_BUFFEREVENTS
+/** Last time at which the global or relay buckets were emptied in msec
+ * since midnight. */
+static uint32_t global_relayed_read_emptied = 0,
+ global_relayed_write_emptied = 0,
+ global_read_emptied = 0,
+ global_write_emptied = 0;
+
+/** Helper: convert given <b>tvnow</b> time value to milliseconds since
+ * midnight. */
+static uint32_t
+msec_since_midnight(const struct timeval *tvnow)
+{
+ return (uint32_t)(((tvnow->tv_sec % 86400L) * 1000L) +
+ ((uint32_t)tvnow->tv_usec / (uint32_t)1000L));
+}
+
+/** Check if a bucket which had <b>tokens_before</b> tokens and which got
+ * <b>tokens_removed</b> tokens removed at timestamp <b>tvnow</b> has run
+ * out of tokens, and if so, note the milliseconds since midnight in
+ * <b>timestamp_var</b> for the next TB_EMPTY event. */
+void
+connection_buckets_note_empty_ts(uint32_t *timestamp_var,
+ int tokens_before, size_t tokens_removed,
+ const struct timeval *tvnow)
+{
+ if (tokens_before > 0 && (uint32_t)tokens_before <= tokens_removed)
+ *timestamp_var = msec_since_midnight(tvnow);
+}
+
/** We just read <b>num_read</b> and wrote <b>num_written</b> bytes
* onto <b>conn</b>. Decrement buckets appropriately. */
static void
@@ -2487,6 +2702,30 @@ connection_buckets_decrement(connection_t *conn, time_t now,
if (!connection_is_rate_limited(conn))
return; /* local IPs are free */
+ /* If one or more of our token buckets ran dry just now, note the
+ * timestamp for TB_EMPTY events. */
+ if (get_options()->TestingEnableTbEmptyEvent) {
+ struct timeval tvnow;
+ tor_gettimeofday_cached(&tvnow);
+ if (connection_counts_as_relayed_traffic(conn, now)) {
+ connection_buckets_note_empty_ts(&global_relayed_read_emptied,
+ global_relayed_read_bucket, num_read, &tvnow);
+ connection_buckets_note_empty_ts(&global_relayed_write_emptied,
+ global_relayed_write_bucket, num_written, &tvnow);
+ }
+ connection_buckets_note_empty_ts(&global_read_emptied,
+ global_read_bucket, num_read, &tvnow);
+ connection_buckets_note_empty_ts(&global_write_emptied,
+ global_write_bucket, num_written, &tvnow);
+ if (connection_speaks_cells(conn) && conn->state == OR_CONN_STATE_OPEN) {
+ or_connection_t *or_conn = TO_OR_CONN(conn);
+ connection_buckets_note_empty_ts(&or_conn->read_emptied_time,
+ or_conn->read_bucket, num_read, &tvnow);
+ connection_buckets_note_empty_ts(&or_conn->write_emptied_time,
+ or_conn->write_bucket, num_written, &tvnow);
+ }
+ }
+
if (connection_counts_as_relayed_traffic(conn, now)) {
global_relayed_read_bucket -= (int)num_read;
global_relayed_write_bucket -= (int)num_written;
@@ -2506,6 +2745,9 @@ connection_consider_empty_read_buckets(connection_t *conn)
{
const char *reason;
+ if (!connection_is_rate_limited(conn))
+ return; /* Always okay. */
+
if (global_read_bucket <= 0) {
reason = "global read bucket exhausted. Pausing.";
} else if (connection_counts_as_relayed_traffic(conn, approx_time()) &&
@@ -2518,9 +2760,6 @@ connection_consider_empty_read_buckets(connection_t *conn)
} else
return; /* all good, no need to stop it */
- if (conn->type == CONN_TYPE_CPUWORKER)
- return; /* Always okay. */
-
LOG_FN_CONN(conn, (LOG_DEBUG, LD_NET, "%s", reason));
conn->read_blocked_on_bw = 1;
connection_stop_reading(conn);
@@ -2533,6 +2772,9 @@ connection_consider_empty_write_buckets(connection_t *conn)
{
const char *reason;
+ if (!connection_is_rate_limited(conn))
+ return; /* Always okay. */
+
if (global_write_bucket <= 0) {
reason = "global write bucket exhausted. Pausing.";
} else if (connection_counts_as_relayed_traffic(conn, approx_time()) &&
@@ -2545,9 +2787,6 @@ connection_consider_empty_write_buckets(connection_t *conn)
} else
return; /* all good, no need to stop it */
- if (conn->type == CONN_TYPE_CPUWORKER)
- return; /* Always okay. */
-
LOG_FN_CONN(conn, (LOG_DEBUG, LD_NET, "%s", reason));
conn->write_blocked_on_bw = 1;
connection_stop_writing(conn);
@@ -2599,6 +2838,28 @@ connection_bucket_refill_helper(int *bucket, int rate, int burst,
}
}
+/** Helper: return the time in milliseconds since <b>last_empty_time</b>
+ * when a bucket ran empty that previously had <b>tokens_before</b> tokens
+ * now has <b>tokens_after</b> tokens after refilling at timestamp
+ * <b>tvnow</b>, capped at <b>milliseconds_elapsed</b> milliseconds since
+ * last refilling that bucket. Return 0 if the bucket has not been empty
+ * since the last refill or has not been refilled. */
+uint32_t
+bucket_millis_empty(int tokens_before, uint32_t last_empty_time,
+ int tokens_after, int milliseconds_elapsed,
+ const struct timeval *tvnow)
+{
+ uint32_t result = 0, refilled;
+ if (tokens_before <= 0 && tokens_after > tokens_before) {
+ refilled = msec_since_midnight(tvnow);
+ result = (uint32_t)((refilled + 86400L * 1000L - last_empty_time) %
+ (86400L * 1000L));
+ if (result > (uint32_t)milliseconds_elapsed)
+ result = (uint32_t)milliseconds_elapsed;
+ }
+ return result;
+}
+
/** Time has passed; increment buckets appropriately. */
void
connection_bucket_refill(int milliseconds_elapsed, time_t now)
@@ -2607,6 +2868,12 @@ connection_bucket_refill(int milliseconds_elapsed, time_t now)
smartlist_t *conns = get_connection_array();
int bandwidthrate, bandwidthburst, relayrate, relayburst;
+ int prev_global_read = global_read_bucket;
+ int prev_global_write = global_write_bucket;
+ int prev_relay_read = global_relayed_read_bucket;
+ int prev_relay_write = global_relayed_write_bucket;
+ struct timeval tvnow; /*< Only used if TB_EMPTY events are enabled. */
+
bandwidthrate = (int)options->BandwidthRate;
bandwidthburst = (int)options->BandwidthBurst;
@@ -2641,12 +2908,42 @@ connection_bucket_refill(int milliseconds_elapsed, time_t now)
milliseconds_elapsed,
"global_relayed_write_bucket");
+ /* If buckets were empty before and have now been refilled, tell any
+ * interested controllers. */
+ if (get_options()->TestingEnableTbEmptyEvent) {
+ uint32_t global_read_empty_time, global_write_empty_time,
+ relay_read_empty_time, relay_write_empty_time;
+ tor_gettimeofday_cached(&tvnow);
+ global_read_empty_time = bucket_millis_empty(prev_global_read,
+ global_read_emptied, global_read_bucket,
+ milliseconds_elapsed, &tvnow);
+ global_write_empty_time = bucket_millis_empty(prev_global_write,
+ global_write_emptied, global_write_bucket,
+ milliseconds_elapsed, &tvnow);
+ control_event_tb_empty("GLOBAL", global_read_empty_time,
+ global_write_empty_time, milliseconds_elapsed);
+ relay_read_empty_time = bucket_millis_empty(prev_relay_read,
+ global_relayed_read_emptied,
+ global_relayed_read_bucket,
+ milliseconds_elapsed, &tvnow);
+ relay_write_empty_time = bucket_millis_empty(prev_relay_write,
+ global_relayed_write_emptied,
+ global_relayed_write_bucket,
+ milliseconds_elapsed, &tvnow);
+ control_event_tb_empty("RELAY", relay_read_empty_time,
+ relay_write_empty_time, milliseconds_elapsed);
+ }
+
/* refill the per-connection buckets */
SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) {
if (connection_speaks_cells(conn)) {
or_connection_t *or_conn = TO_OR_CONN(conn);
int orbandwidthrate = or_conn->bandwidthrate;
int orbandwidthburst = or_conn->bandwidthburst;
+
+ int prev_conn_read = or_conn->read_bucket;
+ int prev_conn_write = or_conn->write_bucket;
+
if (connection_bucket_should_increase(or_conn->read_bucket, or_conn)) {
connection_bucket_refill_helper(&or_conn->read_bucket,
orbandwidthrate,
@@ -2661,6 +2958,27 @@ connection_bucket_refill(int milliseconds_elapsed, time_t now)
milliseconds_elapsed,
"or_conn->write_bucket");
}
+
+ /* If buckets were empty before and have now been refilled, tell any
+ * interested controllers. */
+ if (get_options()->TestingEnableTbEmptyEvent) {
+ char *bucket;
+ uint32_t conn_read_empty_time, conn_write_empty_time;
+ tor_asprintf(&bucket, "ORCONN ID="U64_FORMAT,
+ U64_PRINTF_ARG(or_conn->base_.global_identifier));
+ conn_read_empty_time = bucket_millis_empty(prev_conn_read,
+ or_conn->read_emptied_time,
+ or_conn->read_bucket,
+ milliseconds_elapsed, &tvnow);
+ conn_write_empty_time = bucket_millis_empty(prev_conn_write,
+ or_conn->write_emptied_time,
+ or_conn->write_bucket,
+ milliseconds_elapsed, &tvnow);
+ control_event_tb_empty(bucket, conn_read_empty_time,
+ conn_write_empty_time,
+ milliseconds_elapsed);
+ tor_free(bucket);
+ }
}
if (conn->read_blocked_on_bw == 1 /* marked to turn reading back on now */
@@ -2817,6 +3135,8 @@ connection_handle_read_impl(connection_t *conn)
switch (conn->type) {
case CONN_TYPE_OR_LISTENER:
return connection_handle_listener_read(conn, CONN_TYPE_OR);
+ case CONN_TYPE_EXT_OR_LISTENER:
+ return connection_handle_listener_read(conn, CONN_TYPE_EXT_OR);
case CONN_TYPE_AP_LISTENER:
case CONN_TYPE_AP_TRANS_LISTENER:
case CONN_TYPE_AP_NATD_LISTENER:
@@ -3069,14 +3389,37 @@ connection_read_to_buf(connection_t *conn, ssize_t *max_to_read,
/* change *max_to_read */
*max_to_read = at_most - n_read;
- /* Update edge_conn->n_read */
+ /* Update edge_conn->n_read and ocirc->n_read_circ_bw */
if (conn->type == CONN_TYPE_AP) {
edge_connection_t *edge_conn = TO_EDGE_CONN(conn);
+ circuit_t *circ = circuit_get_by_edge_conn(edge_conn);
+ origin_circuit_t *ocirc;
+
/* Check for overflow: */
if (PREDICT_LIKELY(UINT32_MAX - edge_conn->n_read > n_read))
edge_conn->n_read += (int)n_read;
else
edge_conn->n_read = UINT32_MAX;
+
+ if (circ && CIRCUIT_IS_ORIGIN(circ)) {
+ ocirc = TO_ORIGIN_CIRCUIT(circ);
+ if (PREDICT_LIKELY(UINT32_MAX - ocirc->n_read_circ_bw > n_read))
+ ocirc->n_read_circ_bw += (int)n_read;
+ else
+ ocirc->n_read_circ_bw = UINT32_MAX;
+ }
+ }
+
+ /* If CONN_BW events are enabled, update conn->n_read_conn_bw for
+ * OR/DIR/EXIT connections, checking for overflow. */
+ if (get_options()->TestingEnableConnBwEvent &&
+ (conn->type == CONN_TYPE_OR ||
+ conn->type == CONN_TYPE_DIR ||
+ conn->type == CONN_TYPE_EXIT)) {
+ if (PREDICT_LIKELY(UINT32_MAX - conn->n_read_conn_bw > n_read))
+ conn->n_read_conn_bw += (int)n_read;
+ else
+ conn->n_read_conn_bw = UINT32_MAX;
}
}
@@ -3329,8 +3672,8 @@ connection_outbuf_too_full(connection_t *conn)
/** Try to flush more bytes onto <b>conn</b>-\>s.
*
- * This function gets called either from conn_write() in main.c
- * when poll() has declared that conn wants to write, or below
+ * This function gets called either from conn_write_callback() in main.c
+ * when libevent tells us that conn wants to write, or below
* from connection_write_to_buf() when an entire TLS record is ready.
*
* Update <b>conn</b>-\>timestamp_lastwritten to now, and call flush_buf
@@ -3516,12 +3859,34 @@ connection_handle_write_impl(connection_t *conn, int force)
if (n_written && conn->type == CONN_TYPE_AP) {
edge_connection_t *edge_conn = TO_EDGE_CONN(conn);
+ circuit_t *circ = circuit_get_by_edge_conn(edge_conn);
+ origin_circuit_t *ocirc;
/* Check for overflow: */
if (PREDICT_LIKELY(UINT32_MAX - edge_conn->n_written > n_written))
edge_conn->n_written += (int)n_written;
else
edge_conn->n_written = UINT32_MAX;
+
+ if (circ && CIRCUIT_IS_ORIGIN(circ)) {
+ ocirc = TO_ORIGIN_CIRCUIT(circ);
+ if (PREDICT_LIKELY(UINT32_MAX - ocirc->n_written_circ_bw > n_written))
+ ocirc->n_written_circ_bw += (int)n_written;
+ else
+ ocirc->n_written_circ_bw = UINT32_MAX;
+ }
+ }
+
+ /* If CONN_BW events are enabled, update conn->n_written_conn_bw for
+ * OR/DIR/EXIT connections, checking for overflow. */
+ if (n_written && get_options()->TestingEnableConnBwEvent &&
+ (conn->type == CONN_TYPE_OR ||
+ conn->type == CONN_TYPE_DIR ||
+ conn->type == CONN_TYPE_EXIT)) {
+ if (PREDICT_LIKELY(UINT32_MAX - conn->n_written_conn_bw > n_written))
+ conn->n_written_conn_bw += (int)n_written;
+ else
+ conn->n_written_conn_bw = UINT32_MAX;
}
connection_buckets_decrement(conn, approx_time(), n_read, n_written);
@@ -3607,9 +3972,9 @@ connection_flush(connection_t *conn)
* it all, so we don't end up with many megabytes of controller info queued at
* once.
*/
-void
-connection_write_to_buf_impl_(const char *string, size_t len,
- connection_t *conn, int zlib)
+MOCK_IMPL(void,
+connection_write_to_buf_impl_,(const char *string, size_t len,
+ connection_t *conn, int zlib))
{
/* XXXX This function really needs to return -1 on failure. */
int r;
@@ -3654,6 +4019,12 @@ connection_write_to_buf_impl_(const char *string, size_t len,
"write_to_buf failed. Closing circuit (fd %d).", (int)conn->s);
circuit_mark_for_close(circuit_get_by_edge_conn(TO_EDGE_CONN(conn)),
END_CIRC_REASON_INTERNAL);
+ } else if (conn->type == CONN_TYPE_OR) {
+ or_connection_t *orconn = TO_OR_CONN(conn);
+ log_warn(LD_NET,
+ "write_to_buf failed on an orconn; notifying of error "
+ "(fd %d)", (int)(conn->s));
+ connection_or_close_for_error(orconn, 0);
} else {
log_warn(LD_NET,
"write_to_buf failed. Closing connection (fd %d).",
@@ -3828,20 +4199,29 @@ connection_dir_get_by_purpose_and_resource(int purpose,
return NULL;
}
-/** Return an open, non-marked connection of a given type and purpose, or NULL
- * if no such connection exists. */
-connection_t *
-connection_get_by_type_purpose(int type, int purpose)
+/** Return 1 if there are any active OR connections apart from
+ * <b>this_conn</b>.
+ *
+ * We use this to guess if we should tell the controller that we
+ * didn't manage to connect to any of our bridges. */
+int
+any_other_active_or_conns(const or_connection_t *this_conn)
{
smartlist_t *conns = get_connection_array();
- SMARTLIST_FOREACH(conns, connection_t *, conn,
- {
- if (conn->type == type &&
- !conn->marked_for_close &&
- (purpose == conn->purpose))
- return conn;
- });
- return NULL;
+ SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) {
+ if (conn == TO_CONN(this_conn)) { /* don't consider this conn */
+ continue;
+ }
+
+ if (conn->type == CONN_TYPE_OR &&
+ !conn->marked_for_close) {
+ log_debug(LD_DIR, "%s: Found an OR connection: %s",
+ __func__, conn->address);
+ return 1;
+ }
+ } SMARTLIST_FOREACH_END(conn);
+
+ return 0;
}
/** Return 1 if <b>conn</b> is a listener conn, else return 0. */
@@ -3849,6 +4229,7 @@ int
connection_is_listener(connection_t *conn)
{
if (conn->type == CONN_TYPE_OR_LISTENER ||
+ conn->type == CONN_TYPE_EXT_OR_LISTENER ||
conn->type == CONN_TYPE_AP_LISTENER ||
conn->type == CONN_TYPE_AP_TRANS_LISTENER ||
conn->type == CONN_TYPE_AP_DNS_LISTENER ||
@@ -3871,6 +4252,7 @@ connection_state_is_open(connection_t *conn)
return 0;
if ((conn->type == CONN_TYPE_OR && conn->state == OR_CONN_STATE_OPEN) ||
+ (conn->type == CONN_TYPE_EXT_OR) ||
(conn->type == CONN_TYPE_AP && conn->state == AP_CONN_STATE_OPEN) ||
(conn->type == CONN_TYPE_EXIT && conn->state == EXIT_CONN_STATE_OPEN) ||
(conn->type == CONN_TYPE_CONTROL &&
@@ -4040,6 +4422,8 @@ connection_process_inbuf(connection_t *conn, int package_partial)
switch (conn->type) {
case CONN_TYPE_OR:
return connection_or_process_inbuf(TO_OR_CONN(conn));
+ case CONN_TYPE_EXT_OR:
+ return connection_ext_or_process_inbuf(TO_OR_CONN(conn));
case CONN_TYPE_EXIT:
case CONN_TYPE_AP:
return connection_edge_process_inbuf(TO_EDGE_CONN(conn),
@@ -4100,6 +4484,8 @@ connection_finished_flushing(connection_t *conn)
switch (conn->type) {
case CONN_TYPE_OR:
return connection_or_finished_flushing(TO_OR_CONN(conn));
+ case CONN_TYPE_EXT_OR:
+ return connection_ext_or_finished_flushing(TO_OR_CONN(conn));
case CONN_TYPE_AP:
case CONN_TYPE_EXIT:
return connection_edge_finished_flushing(TO_EDGE_CONN(conn));
@@ -4155,6 +4541,7 @@ connection_reached_eof(connection_t *conn)
{
switch (conn->type) {
case CONN_TYPE_OR:
+ case CONN_TYPE_EXT_OR:
return connection_or_reached_eof(TO_OR_CONN(conn));
case CONN_TYPE_AP:
case CONN_TYPE_EXIT:
@@ -4241,6 +4628,7 @@ assert_connection_ok(connection_t *conn, time_t now)
switch (conn->type) {
case CONN_TYPE_OR:
+ case CONN_TYPE_EXT_OR:
tor_assert(conn->magic == OR_CONNECTION_MAGIC);
break;
case CONN_TYPE_AP:
@@ -4346,6 +4734,10 @@ assert_connection_ok(connection_t *conn, time_t now)
tor_assert(conn->state >= OR_CONN_STATE_MIN_);
tor_assert(conn->state <= OR_CONN_STATE_MAX_);
break;
+ case CONN_TYPE_EXT_OR:
+ tor_assert(conn->state >= EXT_OR_CONN_STATE_MIN_);
+ tor_assert(conn->state <= EXT_OR_CONN_STATE_MAX_);
+ break;
case CONN_TYPE_EXIT:
tor_assert(conn->state >= EXIT_CONN_STATE_MIN_);
tor_assert(conn->state <= EXIT_CONN_STATE_MAX_);
@@ -4407,7 +4799,7 @@ get_proxy_addrport(tor_addr_t *addr, uint16_t *port, int *proxy_type,
options->Bridges) {
const transport_t *transport = NULL;
int r;
- r = find_transport_by_bridge_addrport(&conn->addr, conn->port, &transport);
+ r = get_transport_by_bridge_addrport(&conn->addr, conn->port, &transport);
if (r<0)
return -1;
if (transport) { /* transport found */
@@ -4418,28 +4810,12 @@ get_proxy_addrport(tor_addr_t *addr, uint16_t *port, int *proxy_type,
}
}
+ tor_addr_make_unspec(addr);
+ *port = 0;
*proxy_type = PROXY_NONE;
return 0;
}
-/** Returns the global proxy type used by tor. */
-static int
-get_proxy_type(void)
-{
- const or_options_t *options = get_options();
-
- if (options->HTTPSProxy)
- return PROXY_CONNECT;
- else if (options->Socks4Proxy)
- return PROXY_SOCKS4;
- else if (options->Socks5Proxy)
- return PROXY_SOCKS5;
- else if (options->ClientTransportPlugin)
- return PROXY_PLUGGABLE;
- else
- return PROXY_NONE;
-}
-
/** Log a failed connection to a proxy server.
* <b>conn</b> is the connection we use the proxy server for. */
void
@@ -4496,6 +4872,7 @@ connection_free_all(void)
/* Unlink everything from the identity map. */
connection_or_clear_identity_map();
+ connection_or_clear_ext_or_id_map();
/* Clear out our list of broken connections */
clear_broken_connection_map(0);
diff --git a/src/or/connection.h b/src/or/connection.h
index c78fe6e65..13dcbcd91 100644
--- a/src/or/connection.h
+++ b/src/or/connection.h
@@ -19,7 +19,7 @@ const char *conn_type_to_string(int type);
const char *conn_state_to_string(int type, int state);
dir_connection_t *dir_connection_new(int socket_family);
-or_connection_t *or_connection_new(int socket_family);
+or_connection_t *or_connection_new(int type, int socket_family);
edge_connection_t *edge_connection_new(int type, int socket_family);
entry_connection_t *entry_connection_new(int type, int socket_family);
control_connection_t *control_connection_new(int socket_family);
@@ -89,6 +89,14 @@ int connection_connect(connection_t *conn, const char *address,
const tor_addr_t *addr,
uint16_t port, int *socket_error);
+/** Maximum size of information that we can fit into SOCKS5 username
+ or password fields. */
+#define MAX_SOCKS5_AUTH_FIELD_SIZE 255
+
+/** Total maximum size of information that we can fit into SOCKS5
+ username and password fields. */
+#define MAX_SOCKS5_AUTH_SIZE_TOTAL 2*MAX_SOCKS5_AUTH_FIELD_SIZE
+
int connection_proxy_connect(connection_t *conn, int type);
int connection_read_proxy_handshake(connection_t *conn);
void log_failed_proxy_connection(connection_t *conn);
@@ -122,8 +130,8 @@ int connection_outbuf_too_full(connection_t *conn);
int connection_handle_write(connection_t *conn, int force);
int connection_flush(connection_t *conn);
-void connection_write_to_buf_impl_(const char *string, size_t len,
- connection_t *conn, int zlib);
+MOCK_DECL(void, connection_write_to_buf_impl_,
+ (const char *string, size_t len, connection_t *conn, int zlib));
/* DOCDOC connection_write_to_buf */
static void connection_write_to_buf(const char *string, size_t len,
connection_t *conn);
@@ -170,7 +178,6 @@ connection_get_outbuf_len(connection_t *conn)
connection_t *connection_get_by_global_id(uint64_t id);
connection_t *connection_get_by_type(int type);
-connection_t *connection_get_by_type_purpose(int type, int purpose);
connection_t *connection_get_by_type_addr_port_purpose(int type,
const tor_addr_t *addr,
uint16_t port, int purpose);
@@ -180,6 +187,8 @@ connection_t *connection_get_by_type_state_rendquery(int type, int state,
dir_connection_t *connection_dir_get_by_purpose_and_resource(
int state, const char *resource);
+int any_other_active_or_conns(const or_connection_t *this_conn);
+
#define connection_speaks_cells(conn) ((conn)->type == CONN_TYPE_OR)
int connection_is_listener(connection_t *conn);
int connection_state_is_open(connection_t *conn);
@@ -206,5 +215,18 @@ void connection_enable_rate_limiting(connection_t *conn);
#define connection_type_uses_bufferevent(c) (0)
#endif
+#ifdef CONNECTION_PRIVATE
+STATIC void connection_free_(connection_t *conn);
+
+/* Used only by connection.c and test*.c */
+uint32_t bucket_millis_empty(int tokens_before, uint32_t last_empty_time,
+ int tokens_after, int milliseconds_elapsed,
+ const struct timeval *tvnow);
+void connection_buckets_note_empty_ts(uint32_t *timestamp_var,
+ int tokens_before,
+ size_t tokens_removed,
+ const struct timeval *tvnow);
+#endif
+
#endif
diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c
index 895c0f7f0..49f9ba497 100644
--- a/src/or/connection_edge.c
+++ b/src/or/connection_edge.c
@@ -14,6 +14,7 @@
#include "addressmap.h"
#include "buffers.h"
#include "channel.h"
+#include "circpathbias.h"
#include "circuitlist.h"
#include "circuituse.h"
#include "config.h"
@@ -61,19 +62,14 @@ static int connection_ap_process_natd(entry_connection_t *conn);
static int connection_exit_connect_dir(edge_connection_t *exitconn);
static int consider_plaintext_ports(entry_connection_t *conn, uint16_t port);
static int connection_ap_supports_optimistic_data(const entry_connection_t *);
-static void connection_ap_handshake_socks_resolved_addr(
- entry_connection_t *conn,
- const tor_addr_t *answer,
- int ttl,
- time_t expires);
/** An AP stream has failed/finished. If it hasn't already sent back
* a socks reply, send one now (based on endreason). Also set
* has_sent_end to 1, and mark the conn.
*/
-void
-connection_mark_unattached_ap_(entry_connection_t *conn, int endreason,
- int line, const char *file)
+MOCK_IMPL(void,
+connection_mark_unattached_ap_,(entry_connection_t *conn, int endreason,
+ int line, const char *file))
{
connection_t *base_conn = ENTRY_TO_CONN(conn);
edge_connection_t *edge_conn = ENTRY_TO_EDGE_CONN(conn);
@@ -412,7 +408,7 @@ connection_edge_finished_flushing(edge_connection_t *conn)
* that the name resolution that led us to <b>addr</b> will be valid for
* <b>ttl</b> seconds. Return -1 on error, or the number of bytes used on
* success. */
-/* private */int
+STATIC int
connected_cell_format_payload(uint8_t *payload_out,
const tor_addr_t *addr,
uint32_t ttl)
@@ -1395,35 +1391,48 @@ get_pf_socket(void)
}
#endif
-/** Fetch the original destination address and port from a
- * system-specific interface and put them into a
- * socks_request_t as if they came from a socks request.
- *
- * Return -1 if an error prevents fetching the destination,
- * else return 0.
- */
+#if defined(TRANS_NETFILTER) || defined(TRANS_PF)
+/** Try fill in the address of <b>req</b> from the socket configured
+ * with <b>conn</b>. */
static int
-connection_ap_get_original_destination(entry_connection_t *conn,
- socks_request_t *req)
+destination_from_socket(entry_connection_t *conn, socks_request_t *req)
{
-#ifdef TRANS_NETFILTER
- /* Linux 2.4+ */
struct sockaddr_storage orig_dst;
socklen_t orig_dst_len = sizeof(orig_dst);
tor_addr_t addr;
+#ifdef TRANS_NETFILTER
if (getsockopt(ENTRY_TO_CONN(conn)->s, SOL_IP, SO_ORIGINAL_DST,
(struct sockaddr*)&orig_dst, &orig_dst_len) < 0) {
int e = tor_socket_errno(ENTRY_TO_CONN(conn)->s);
log_warn(LD_NET, "getsockopt() failed: %s", tor_socket_strerror(e));
return -1;
}
+#elif defined(TRANS_PF)
+ if (getsockname(ENTRY_TO_CONN(conn)->s, (struct sockaddr*)&orig_dst,
+ &orig_dst_len) < 0) {
+ int e = tor_socket_errno(ENTRY_TO_CONN(conn)->s);
+ log_warn(LD_NET, "getsockname() failed: %s", tor_socket_strerror(e));
+ return -1;
+ }
+#else
+ (void)conn;
+ (void)req;
+ log_warn(LD_BUG, "Unable to determine destination from socket.");
+ return -1;
+#endif
tor_addr_from_sockaddr(&addr, (struct sockaddr*)&orig_dst, &req->port);
tor_addr_to_str(req->address, &addr, sizeof(req->address), 1);
return 0;
-#elif defined(TRANS_PF)
+}
+#endif
+
+#ifdef TRANS_PF
+static int
+destination_from_pf(entry_connection_t *conn, socks_request_t *req)
+{
struct sockaddr_storage proxy_addr;
socklen_t proxy_addr_len = sizeof(proxy_addr);
struct sockaddr *proxy_sa = (struct sockaddr*) &proxy_addr;
@@ -1439,6 +1448,21 @@ connection_ap_get_original_destination(entry_connection_t *conn,
return -1;
}
+#ifdef __FreeBSD__
+ if (get_options()->TransProxyType_parsed == TPT_IPFW) {
+ /* ipfw(8) is used and in this case getsockname returned the original
+ destination */
+ if (tor_addr_from_sockaddr(&addr, proxy_sa, &req->port) < 0) {
+ tor_fragile_assert();
+ return -1;
+ }
+
+ tor_addr_to_str(req->address, &addr, sizeof(req->address), 0);
+
+ return 0;
+ }
+#endif
+
memset(&pnl, 0, sizeof(pnl));
pnl.proto = IPPROTO_TCP;
pnl.direction = PF_OUT;
@@ -1485,6 +1509,36 @@ connection_ap_get_original_destination(entry_connection_t *conn,
req->port = ntohs(pnl.rdport);
return 0;
+}
+#endif
+
+/** Fetch the original destination address and port from a
+ * system-specific interface and put them into a
+ * socks_request_t as if they came from a socks request.
+ *
+ * Return -1 if an error prevents fetching the destination,
+ * else return 0.
+ */
+static int
+connection_ap_get_original_destination(entry_connection_t *conn,
+ socks_request_t *req)
+{
+#ifdef TRANS_NETFILTER
+ return destination_from_socket(conn, req);
+#elif defined(TRANS_PF)
+ const or_options_t *options = get_options();
+
+ if (options->TransProxyType_parsed == TPT_PF_DIVERT)
+ return destination_from_socket(conn, req);
+
+ if (options->TransProxyType_parsed == TPT_DEFAULT)
+ return destination_from_pf(conn, req);
+
+ (void)conn;
+ (void)req;
+ log_warn(LD_BUG, "Proxy destination determination mechanism %s unknown.",
+ options->TransProxyType);
+ return -1;
#else
(void)conn;
(void)req;
@@ -2064,7 +2118,7 @@ tell_controller_about_resolved_result(entry_connection_t *conn,
* As connection_ap_handshake_socks_resolved, but take a tor_addr_t to send
* as the answer.
*/
-static void
+void
connection_ap_handshake_socks_resolved_addr(entry_connection_t *conn,
const tor_addr_t *answer,
int ttl,
@@ -2097,13 +2151,13 @@ connection_ap_handshake_socks_resolved_addr(entry_connection_t *conn,
**/
/* XXXX the use of the ttl and expires fields is nutty. Let's make this
* interface and those that use it less ugly. */
-void
-connection_ap_handshake_socks_resolved(entry_connection_t *conn,
+MOCK_IMPL(void,
+connection_ap_handshake_socks_resolved,(entry_connection_t *conn,
int answer_type,
size_t answer_len,
const uint8_t *answer,
int ttl,
- time_t expires)
+ time_t expires))
{
char buf[384];
size_t replylen;
@@ -2241,13 +2295,21 @@ connection_ap_handshake_socks_reply(entry_connection_t *conn, char *reply,
endreason == END_STREAM_REASON_RESOURCELIMIT) {
if (!conn->edge_.on_circuit ||
!CIRCUIT_IS_ORIGIN(conn->edge_.on_circuit)) {
- // DNS remaps can trigger this. So can failed hidden service
- // lookups.
- log_info(LD_BUG,
- "No origin circuit for successful SOCKS stream "U64_FORMAT
- ". Reason: %d",
- U64_PRINTF_ARG(ENTRY_TO_CONN(conn)->global_identifier),
- endreason);
+ if (endreason != END_STREAM_REASON_RESOLVEFAILED) {
+ log_info(LD_BUG,
+ "No origin circuit for successful SOCKS stream "U64_FORMAT
+ ". Reason: %d",
+ U64_PRINTF_ARG(ENTRY_TO_CONN(conn)->global_identifier),
+ endreason);
+ }
+ /*
+ * Else DNS remaps and failed hidden service lookups can send us
+ * here with END_STREAM_REASON_RESOLVEFAILED; ignore it
+ *
+ * Perhaps we could make the test more precise; we can tell hidden
+ * services by conn->edge_.renddata != NULL; anything analogous for
+ * the DNS remap case?
+ */
} else {
// XXX: Hrmm. It looks like optimistic data can't go through this
// codepath, but someone should probably test it and make sure.
@@ -2272,13 +2334,24 @@ connection_ap_handshake_socks_reply(entry_connection_t *conn, char *reply,
/* leave version, destport, destip zero */
connection_write_to_buf(buf, SOCKS4_NETWORK_LEN, ENTRY_TO_CONN(conn));
} else if (conn->socks_request->socks_version == 5) {
- buf[0] = 5; /* version 5 */
- buf[1] = (char)status;
- buf[2] = 0;
- buf[3] = 1; /* ipv4 addr */
- memset(buf+4,0,6); /* Set external addr/port to 0.
- The spec doesn't seem to say what to do here. -RD */
- connection_write_to_buf(buf,10,ENTRY_TO_CONN(conn));
+ size_t buf_len;
+ memset(buf,0,sizeof(buf));
+ if (tor_addr_family(&conn->edge_.base_.addr) == AF_INET) {
+ buf[0] = 5; /* version 5 */
+ buf[1] = (char)status;
+ buf[2] = 0;
+ buf[3] = 1; /* ipv4 addr */
+ /* 4 bytes for the header, 2 bytes for the port, 4 for the address. */
+ buf_len = 10;
+ } else { /* AF_INET6. */
+ buf[0] = 5; /* version 5 */
+ buf[1] = (char)status;
+ buf[2] = 0;
+ buf[3] = 4; /* ipv6 addr */
+ /* 4 bytes for the header, 2 bytes for the port, 16 for the address. */
+ buf_len = 22;
+ }
+ connection_write_to_buf(buf,buf_len,ENTRY_TO_CONN(conn));
}
/* If socks_version isn't 4 or 5, don't send anything.
* This can happen in the case of AP bridges. */
@@ -2294,7 +2367,7 @@ connection_ap_handshake_socks_reply(entry_connection_t *conn, char *reply,
* Return -1 in the case where want to send a RELAY_END cell, and < -1 when
* we don't.
**/
-/* static */ int
+STATIC int
begin_cell_parse(const cell_t *cell, begin_cell_t *bcell,
uint8_t *end_reason_out)
{
diff --git a/src/or/connection_edge.h b/src/or/connection_edge.h
index ea284cbcf..3c0e30a97 100644
--- a/src/or/connection_edge.h
+++ b/src/or/connection_edge.h
@@ -12,11 +12,14 @@
#ifndef TOR_CONNECTION_EDGE_H
#define TOR_CONNECTION_EDGE_H
+#include "testsupport.h"
+
#define connection_mark_unattached_ap(conn, endreason) \
connection_mark_unattached_ap_((conn), (endreason), __LINE__, SHORT_FILE__)
-void connection_mark_unattached_ap_(entry_connection_t *conn, int endreason,
- int line, const char *file);
+MOCK_DECL(void,connection_mark_unattached_ap_,
+ (entry_connection_t *conn, int endreason,
+ int line, const char *file));
int connection_edge_reached_eof(edge_connection_t *conn);
int connection_edge_process_inbuf(edge_connection_t *conn,
int package_partial);
@@ -42,12 +45,17 @@ entry_connection_t *connection_ap_make_link(connection_t *partner,
void connection_ap_handshake_socks_reply(entry_connection_t *conn, char *reply,
size_t replylen,
int endreason);
-void connection_ap_handshake_socks_resolved(entry_connection_t *conn,
- int answer_type,
- size_t answer_len,
- const uint8_t *answer,
- int ttl,
- time_t expires);
+MOCK_DECL(void,connection_ap_handshake_socks_resolved,
+ (entry_connection_t *conn,
+ int answer_type,
+ size_t answer_len,
+ const uint8_t *answer,
+ int ttl,
+ time_t expires));
+void connection_ap_handshake_socks_resolved_addr(entry_connection_t *conn,
+ const tor_addr_t *answer,
+ int ttl,
+ time_t expires);
int connection_exit_begin_conn(cell_t *cell, circuit_t *circ);
int connection_exit_begin_resolve(cell_t *cell, or_circuit_t *circ);
@@ -130,9 +138,9 @@ typedef struct begin_cell_t {
unsigned is_begindir : 1;
} begin_cell_t;
-int begin_cell_parse(const cell_t *cell, begin_cell_t *bcell,
+STATIC int begin_cell_parse(const cell_t *cell, begin_cell_t *bcell,
uint8_t *end_reason_out);
-int connected_cell_format_payload(uint8_t *payload_out,
+STATIC int connected_cell_format_payload(uint8_t *payload_out,
const tor_addr_t *addr,
uint32_t ttl);
#endif
diff --git a/src/or/connection_or.c b/src/or/connection_or.c
index 3d239d480..16f87349f 100644
--- a/src/or/connection_or.c
+++ b/src/or/connection_or.c
@@ -37,7 +37,7 @@
#include "rephist.h"
#include "router.h"
#include "routerlist.h"
-
+#include "ext_orport.h"
#ifdef USE_BUFFEREVENTS
#include <event2/bufferevent_ssl.h>
#endif
@@ -75,6 +75,10 @@ static void connection_or_handle_event_cb(struct bufferevent *bufev,
* they form a linked list, with next_with_same_id as the next pointer. */
static digestmap_t *orconn_identity_map = NULL;
+/** Global map between Extended ORPort identifiers and OR
+ * connections. */
+static digestmap_t *orconn_ext_or_id_map = NULL;
+
/** If conn is listed in orconn_identity_map, remove it, and clear
* conn->identity_digest. Otherwise do nothing. */
void
@@ -174,6 +178,71 @@ connection_or_set_identity_digest(or_connection_t *conn, const char *digest)
#endif
}
+/** Remove the Extended ORPort identifier of <b>conn</b> from the
+ * global identifier list. Also, clear the identifier from the
+ * connection itself. */
+void
+connection_or_remove_from_ext_or_id_map(or_connection_t *conn)
+{
+ or_connection_t *tmp;
+ if (!orconn_ext_or_id_map)
+ return;
+ if (!conn->ext_or_conn_id)
+ return;
+
+ tmp = digestmap_remove(orconn_ext_or_id_map, conn->ext_or_conn_id);
+ if (!tor_digest_is_zero(conn->ext_or_conn_id))
+ tor_assert(tmp == conn);
+
+ memset(conn->ext_or_conn_id, 0, EXT_OR_CONN_ID_LEN);
+}
+
+/** Return the connection whose ext_or_id is <b>id</b>. Return NULL if no such
+ * connection is found. */
+or_connection_t *
+connection_or_get_by_ext_or_id(const char *id)
+{
+ if (!orconn_ext_or_id_map)
+ return NULL;
+ return digestmap_get(orconn_ext_or_id_map, id);
+}
+
+/** Deallocate the global Extended ORPort identifier list */
+void
+connection_or_clear_ext_or_id_map(void)
+{
+ digestmap_free(orconn_ext_or_id_map, NULL);
+ orconn_ext_or_id_map = NULL;
+}
+
+/** Creates an Extended ORPort identifier for <b>conn</b> and deposits
+ * it into the global list of identifiers. */
+void
+connection_or_set_ext_or_identifier(or_connection_t *conn)
+{
+ char random_id[EXT_OR_CONN_ID_LEN];
+ or_connection_t *tmp;
+
+ if (!orconn_ext_or_id_map)
+ orconn_ext_or_id_map = digestmap_new();
+
+ /* Remove any previous identifiers: */
+ if (conn->ext_or_conn_id && !tor_digest_is_zero(conn->ext_or_conn_id))
+ connection_or_remove_from_ext_or_id_map(conn);
+
+ do {
+ crypto_rand(random_id, sizeof(random_id));
+ } while (digestmap_get(orconn_ext_or_id_map, random_id));
+
+ if (!conn->ext_or_conn_id)
+ conn->ext_or_conn_id = tor_malloc_zero(EXT_OR_CONN_ID_LEN);
+
+ memcpy(conn->ext_or_conn_id, random_id, EXT_OR_CONN_ID_LEN);
+
+ tmp = digestmap_set(orconn_ext_or_id_map, random_id, conn);
+ tor_assert(!tmp);
+}
+
/**************************************************************/
/** Map from a string describing what a non-open OR connection was doing when
@@ -228,7 +297,7 @@ connection_or_get_state_description(or_connection_t *orconn,
const char *conn_state;
char tls_state[256];
- tor_assert(conn->type == CONN_TYPE_OR);
+ tor_assert(conn->type == CONN_TYPE_OR || conn->type == CONN_TYPE_EXT_OR);
conn_state = conn_state_to_string(conn->type, conn->state);
tor_tls_get_state_description(orconn->tls, tls_state, sizeof(tls_state));
@@ -645,7 +714,8 @@ connection_or_about_to_close(or_connection_t *or_conn)
reason);
if (!authdir_mode_tests_reachability(options))
control_event_bootstrap_problem(
- orconn_end_reason_to_control_string(reason), reason);
+ orconn_end_reason_to_control_string(reason),
+ reason, or_conn);
}
}
} else if (conn->hold_open_until_flushed) {
@@ -1047,7 +1117,7 @@ connection_or_connect_failed(or_connection_t *conn,
{
control_event_or_conn_status(conn, OR_CONN_EVENT_FAILED, reason);
if (!authdir_mode_tests_reachability(get_options()))
- control_event_bootstrap_problem(msg, reason);
+ control_event_bootstrap_problem(msg, reason, conn);
}
/** <b>conn</b> got an error in connection_handle_read_impl() or
@@ -1121,7 +1191,7 @@ connection_or_connect(const tor_addr_t *_addr, uint16_t port,
return NULL;
}
- conn = or_connection_new(tor_addr_family(&addr));
+ conn = or_connection_new(CONN_TYPE_OR, tor_addr_family(&addr));
/*
* Set up conn so it's got all the data we need to remember for channels
@@ -1164,6 +1234,12 @@ connection_or_connect(const tor_addr_t *_addr, uint16_t port,
"your pluggable transport proxy stopped running.",
fmt_addrport(&TO_CONN(conn)->addr, TO_CONN(conn)->port),
transport_name, transport_name);
+
+ control_event_bootstrap_problem(
+ "Can't connect to bridge",
+ END_OR_CONN_REASON_PT_MISSING,
+ conn);
+
} else {
log_warn(LD_GENERAL, "Tried to connect to '%s' through a proxy, but "
"the proxy address could not be found.",
@@ -1266,8 +1342,8 @@ connection_or_close_for_error(or_connection_t *orconn, int flush)
*
* Return -1 if <b>conn</b> is broken, else return 0.
*/
-int
-connection_tls_start_handshake(or_connection_t *conn, int receiving)
+MOCK_IMPL(int,
+connection_tls_start_handshake,(or_connection_t *conn, int receiving))
{
channel_listener_t *chan_listener;
channel_t *chan;
@@ -1524,7 +1600,8 @@ connection_or_handle_event_cb(struct bufferevent *bufev, short event,
int
connection_or_nonopen_was_started_here(or_connection_t *conn)
{
- tor_assert(conn->base_.type == CONN_TYPE_OR);
+ tor_assert(conn->base_.type == CONN_TYPE_OR ||
+ conn->base_.type == CONN_TYPE_EXT_OR);
if (!conn->tls)
return 1; /* it's still in proxy states or something */
if (conn->handshake_state)
@@ -1677,7 +1754,8 @@ connection_or_client_learned_peer_id(or_connection_t *conn,
if (!authdir_mode_tests_reachability(options))
control_event_bootstrap_problem(
"Unexpected identity in router certificate",
- END_OR_CONN_REASON_OR_IDENTITY);
+ END_OR_CONN_REASON_OR_IDENTITY,
+ conn);
return -1;
}
if (authdir_mode_tests_reachability(options)) {
@@ -1727,13 +1805,11 @@ connection_tls_finish_handshake(or_connection_t *conn)
safe_str_client(conn->base_.address),
tor_tls_get_ciphersuite_name(conn->tls));
- directory_set_dirty();
-
if (connection_or_check_valid_tls_handshake(conn, started_here,
digest_rcvd) < 0)
return -1;
- circuit_build_times_network_is_live(&circ_times);
+ circuit_build_times_network_is_live(get_circuit_build_times_mutable());
if (tor_tls_used_v1_handshake(conn->tls)) {
conn->link_proto = 1;
@@ -1767,7 +1843,7 @@ connection_or_launch_v3_or_handshake(or_connection_t *conn)
tor_assert(connection_or_nonopen_was_started_here(conn));
tor_assert(tor_tls_received_v3_certificate(conn->tls));
- circuit_build_times_network_is_live(&circ_times);
+ circuit_build_times_network_is_live(get_circuit_build_times_mutable());
connection_or_change_state(conn, OR_CONN_STATE_OR_HANDSHAKING_V3);
if (connection_init_or_handshake_state(conn, 1) < 0)
@@ -1995,7 +2071,7 @@ connection_or_process_cells_from_inbuf(or_connection_t *conn)
if (conn->chan)
channel_timestamp_active(TLS_CHAN_TO_BASE(conn->chan));
- circuit_build_times_network_is_live(&circ_times);
+ circuit_build_times_network_is_live(get_circuit_build_times_mutable());
channel_tls_handle_var_cell(var_cell, conn);
var_cell_free(var_cell);
} else {
@@ -2011,7 +2087,7 @@ connection_or_process_cells_from_inbuf(or_connection_t *conn)
if (conn->chan)
channel_timestamp_active(TLS_CHAN_TO_BASE(conn->chan));
- circuit_build_times_network_is_live(&circ_times);
+ circuit_build_times_network_is_live(get_circuit_build_times_mutable());
connection_fetch_from_buf(buf, cell_network_size, TO_CONN(conn));
/* retrieve cell info from buf (create the host-order struct from the
diff --git a/src/or/connection_or.h b/src/or/connection_or.h
index 896556c03..143540edd 100644
--- a/src/or/connection_or.h
+++ b/src/or/connection_or.h
@@ -45,7 +45,8 @@ void connection_or_close_for_error(or_connection_t *orconn, int flush);
void connection_or_report_broken_states(int severity, int domain);
-int connection_tls_start_handshake(or_connection_t *conn, int receiving);
+MOCK_DECL(int,connection_tls_start_handshake,(or_connection_t *conn,
+ int receiving));
int connection_tls_continue_handshake(or_connection_t *conn);
void connection_or_set_canonical(or_connection_t *or_conn,
int is_canonical);
diff --git a/src/or/control.c b/src/or/control.c
index a88de12d6..21504e685 100644..100755
--- a/src/or/control.c
+++ b/src/or/control.c
@@ -19,6 +19,7 @@
#include "circuitlist.h"
#include "circuitstats.h"
#include "circuituse.h"
+#include "command.h"
#include "config.h"
#include "confparse.h"
#include "connection.h"
@@ -52,46 +53,13 @@
* finished authentication and is accepting commands. */
#define STATE_IS_OPEN(s) ((s) == CONTROL_CONN_STATE_OPEN)
-/* Recognized asynchronous event types. It's okay to expand this list
- * because it is used both as a list of v0 event types, and as indices
- * into the bitfield to determine which controllers want which events.
- */
-#define EVENT_MIN_ 0x0001
-#define EVENT_CIRCUIT_STATUS 0x0001
-#define EVENT_STREAM_STATUS 0x0002
-#define EVENT_OR_CONN_STATUS 0x0003
-#define EVENT_BANDWIDTH_USED 0x0004
-#define EVENT_CIRCUIT_STATUS_MINOR 0x0005
-#define EVENT_NEW_DESC 0x0006
-#define EVENT_DEBUG_MSG 0x0007
-#define EVENT_INFO_MSG 0x0008
-#define EVENT_NOTICE_MSG 0x0009
-#define EVENT_WARN_MSG 0x000A
-#define EVENT_ERR_MSG 0x000B
-#define EVENT_ADDRMAP 0x000C
-// #define EVENT_AUTHDIR_NEWDESCS 0x000D
-#define EVENT_DESCCHANGED 0x000E
-// #define EVENT_NS 0x000F
-#define EVENT_STATUS_CLIENT 0x0010
-#define EVENT_STATUS_SERVER 0x0011
-#define EVENT_STATUS_GENERAL 0x0012
-#define EVENT_GUARD 0x0013
-#define EVENT_STREAM_BANDWIDTH_USED 0x0014
-#define EVENT_CLIENTS_SEEN 0x0015
-#define EVENT_NEWCONSENSUS 0x0016
-#define EVENT_BUILDTIMEOUT_SET 0x0017
-#define EVENT_SIGNAL 0x0018
-#define EVENT_CONF_CHANGED 0x0019
-#define EVENT_MAX_ 0x0019
-/* If EVENT_MAX_ ever hits 0x0020, we need to make the mask wider. */
-
/** Bitfield: The bit 1&lt;&lt;e is set if <b>any</b> open control
* connection is interested in events of type <b>e</b>. We use this
* so that we can decide to skip generating event messages that nobody
* has interest in without having to walk over the global connection
* list to find out.
**/
-typedef uint32_t event_mask_t;
+typedef uint64_t event_mask_t;
/** An event mask of all the events that any controller is interested in
* receiving. */
@@ -103,7 +71,7 @@ static int disable_log_messages = 0;
/** Macro: true if any control connection is interested in events of type
* <b>e</b>. */
#define EVENT_IS_INTERESTING(e) \
- (global_event_mask & (1<<(e)))
+ (!! (global_event_mask & (((uint64_t)1)<<(e))))
/** If we're using cookie-type authentication, how long should our cookies be?
*/
@@ -115,7 +83,7 @@ static int authentication_cookie_is_set = 0;
/** If authentication_cookie_is_set, a secret cookie that we've stored to disk
* and which we're using to authenticate controllers. (If the controller can
* read it off disk, it has permission to connect.) */
-static char authentication_cookie[AUTHENTICATION_COOKIE_LEN];
+static uint8_t *authentication_cookie = NULL;
#define SAFECOOKIE_SERVER_TO_CONTROLLER_CONSTANT \
"Tor safe cookie authentication server-to-controller hash"
@@ -130,15 +98,6 @@ static char authentication_cookie[AUTHENTICATION_COOKIE_LEN];
* of this so we can respond to getinfo status/bootstrap-phase queries. */
static char last_sent_bootstrap_message[BOOTSTRAP_MSG_LEN];
-/** Flag for event_format_t. Indicates that we should use the one standard
- format.
- */
-#define ALL_FORMATS 1
-
-/** Bit field of flags to select how to format a controller event. Recognized
- * flag is ALL_FORMATS. */
-typedef int event_format_t;
-
static void connection_printf_to_buf(control_connection_t *conn,
const char *format, ...)
CHECK_PRINTF(2,3);
@@ -201,7 +160,6 @@ static int write_stream_target_to_buf(entry_connection_t *conn, char *buf,
size_t len);
static void orconn_target_get_name(char *buf, size_t len,
or_connection_t *conn);
-static char *get_cookie_file(void);
/** Given a control event code for a message event, return the corresponding
* log severity. */
@@ -232,6 +190,20 @@ log_severity_to_event(int severity)
}
}
+/** Helper: clear bandwidth counters of all origin circuits. */
+static void
+clear_circ_bw_fields(void)
+{
+ circuit_t *circ;
+ origin_circuit_t *ocirc;
+ TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) {
+ if (!CIRCUIT_IS_ORIGIN(circ))
+ continue;
+ ocirc = TO_ORIGIN_CIRCUIT(circ);
+ ocirc->n_written_circ_bw = ocirc->n_read_circ_bw = 0;
+ }
+}
+
/** Set <b>global_event_mask*</b> to the bitwise OR of each live control
* connection's event_mask field. */
void
@@ -257,8 +229,8 @@ control_update_global_event_mask(void)
* we want to hear...*/
control_adjust_event_log_severity();
- /* ...then, if we've started logging stream bw, clear the appropriate
- * fields. */
+ /* ...then, if we've started logging stream or circ bw, clear the
+ * appropriate fields. */
if (! (old_mask & EVENT_STREAM_BANDWIDTH_USED) &&
(new_mask & EVENT_STREAM_BANDWIDTH_USED)) {
SMARTLIST_FOREACH(conns, connection_t *, conn,
@@ -269,6 +241,10 @@ control_update_global_event_mask(void)
}
});
}
+ if (! (old_mask & EVENT_CIRC_BANDWIDTH_USED) &&
+ (new_mask & EVENT_CIRC_BANDWIDTH_USED)) {
+ clear_circ_bw_fields();
+ }
}
/** Adjust the log severities that result in control_event_logmsg being called
@@ -334,7 +310,7 @@ connection_write_str_to_buf(const char *s, control_connection_t *conn)
* the end. Replace all LF characters sequences with CRLF. Return the number
* of bytes in *<b>out</b>.
*/
-/* static */ size_t
+STATIC size_t
write_escaped_data(const char *data, size_t len, char **out)
{
size_t sz_out = len+8;
@@ -382,7 +358,7 @@ write_escaped_data(const char *data, size_t len, char **out)
* that appears at the start of a line, and replacing all CRLF sequences
* with LF. Return the number of
* bytes in *<b>out</b>. */
-/* static */ size_t
+STATIC size_t
read_escaped_data(const char *data, size_t len, char **out)
{
char *outp;
@@ -592,9 +568,9 @@ send_control_done(control_connection_t *conn)
*
* The EXTENDED_FORMAT and NONEXTENDED_FORMAT flags behave similarly with
* respect to the EXTENDED_EVENTS feature. */
-static void
-send_control_event_string(uint16_t event, event_format_t which,
- const char *msg)
+MOCK_IMPL(STATIC void,
+send_control_event_string,(uint16_t event, event_format_t which,
+ const char *msg))
{
smartlist_t *conns = get_connection_array();
(void)which;
@@ -958,6 +934,12 @@ static const struct control_event_t control_event_table[] = {
{ EVENT_BUILDTIMEOUT_SET, "BUILDTIMEOUT_SET" },
{ EVENT_SIGNAL, "SIGNAL" },
{ EVENT_CONF_CHANGED, "CONF_CHANGED"},
+ { EVENT_CONN_BW, "CONN_BW" },
+ { EVENT_CELL_STATS, "CELL_STATS" },
+ { EVENT_TB_EMPTY, "TB_EMPTY" },
+ { EVENT_CIRC_BANDWIDTH_USED, "CIRC_BW" },
+ { EVENT_TRANSPORT_LAUNCHED, "TRANSPORT_LAUNCHED" },
+ { EVENT_HS_DESC, "HS_DESC" },
{ 0, NULL },
};
@@ -1447,7 +1429,7 @@ getinfo_helper_misc(control_connection_t *conn, const char *question,
} else if (!strcmp(question, "config-defaults-file")) {
*answer = tor_strdup(get_torrc_fname(1));
} else if (!strcmp(question, "config-text")) {
- *answer = options_dump(get_options(), 1);
+ *answer = options_dump(get_options(), OPTIONS_DUMP_MINIMAL);
} else if (!strcmp(question, "info/names")) {
*answer = list_getinfo_options();
} else if (!strcmp(question, "dormant")) {
@@ -1509,7 +1491,7 @@ getinfo_helper_misc(control_connection_t *conn, const char *question,
*answer = tor_strdup("");
#else
int myUid = geteuid();
- struct passwd *myPwEntry = getpwuid(myUid);
+ const struct passwd *myPwEntry = tor_getpwuid(myUid);
if (myPwEntry) {
*answer = tor_strdup(myPwEntry->pw_name);
@@ -1521,6 +1503,9 @@ getinfo_helper_misc(control_connection_t *conn, const char *question,
int max_fds=-1;
set_max_file_descriptors(0, &max_fds);
tor_asprintf(answer, "%d", max_fds);
+ } else if (!strcmp(question, "limits/max-mem-in-queues")) {
+ tor_asprintf(answer, U64_FORMAT,
+ U64_PRINTF_ARG(get_options()->MaxMemInQueues));
} else if (!strcmp(question, "dir-usage")) {
*answer = directory_dump_request_log();
} else if (!strcmp(question, "fingerprint")) {
@@ -1567,12 +1552,13 @@ munge_extrainfo_into_routerinfo(const char *ri_body,
outp += router_sig-ri_body;
for (i=0; i < 2; ++i) {
- const char *kwd = i?"\nwrite-history ":"\nread-history ";
+ const char *kwd = i ? "\nwrite-history " : "\nread-history ";
const char *cp, *eol;
if (!(cp = tor_memstr(ei_body, ei_len, kwd)))
continue;
++cp;
- eol = memchr(cp, '\n', ei_len - (cp-ei_body));
+ if (!(eol = memchr(cp, '\n', ei_len - (cp-ei_body))))
+ continue;
memcpy(outp, cp, eol-cp+1);
outp += eol-cp+1;
}
@@ -1764,39 +1750,7 @@ getinfo_helper_dir(control_connection_t *control_conn,
tor_free(url);
smartlist_free(descs);
} else if (!strcmpstart(question, "dir/status/")) {
- if (directory_permits_controller_requests(get_options())) {
- size_t len=0;
- char *cp;
- smartlist_t *status_list = smartlist_new();
- dirserv_get_networkstatus_v2(status_list,
- question+strlen("dir/status/"));
- SMARTLIST_FOREACH(status_list, cached_dir_t *, d, len += d->dir_len);
- cp = *answer = tor_malloc(len+1);
- SMARTLIST_FOREACH(status_list, cached_dir_t *, d, {
- memcpy(cp, d->dir, d->dir_len);
- cp += d->dir_len;
- });
- *cp = '\0';
- smartlist_free(status_list);
- } else {
- smartlist_t *fp_list = smartlist_new();
- smartlist_t *status_list = smartlist_new();
- dirserv_get_networkstatus_v2_fingerprints(
- fp_list, question+strlen("dir/status/"));
- SMARTLIST_FOREACH(fp_list, const char *, fp, {
- char *s;
- char *fname = networkstatus_get_cache_filename(fp);
- s = read_file_to_str(fname, 0, NULL);
- if (s)
- smartlist_add(status_list, s);
- tor_free(fname);
- });
- SMARTLIST_FOREACH(fp_list, char *, fp, tor_free(fp));
- smartlist_free(fp_list);
- *answer = smartlist_join_strings(status_list, "", 0, NULL);
- SMARTLIST_FOREACH(status_list, char *, s, tor_free(s));
- smartlist_free(status_list);
- }
+ *answer = tor_strdup("");
} else if (!strcmp(question, "dir/status-vote/current/consensus")) { /* v3 */
if (directory_caches_dir_info(get_options())) {
const cached_dir_t *consensus = dirserv_get_consensus("ns");
@@ -1927,7 +1881,7 @@ getinfo_helper_events(control_connection_t *control_conn,
if (!strcmp(question, "circuit-status")) {
circuit_t *circ_;
smartlist_t *status = smartlist_new();
- for (circ_ = circuit_get_global_list_(); circ_; circ_ = circ_->next) {
+ TOR_LIST_FOREACH(circ_, circuit_get_global_list(), head) {
origin_circuit_t *circ;
char *circdesc;
const char *state;
@@ -2232,6 +2186,7 @@ static const getinfo_item_t getinfo_items[] = {
ITEM("process/user", misc,
"Username under which the tor process is running."),
ITEM("process/descriptor-limit", misc, "File descriptor limit."),
+ ITEM("limits/max-mem-in-queues", misc, "Actual limit on memory in queues"),
ITEM("dir-usage", misc, "Breakdown of bytes transferred over DirPort."),
PREFIX("desc-annotations/id/", dir, "Router annotations by hexdigest."),
PREFIX("dir/server/", dir,"Router descriptors as retrieved from a DirPort."),
@@ -2241,6 +2196,9 @@ static const getinfo_item_t getinfo_items[] = {
"v3 Networkstatus consensus as retrieved from a DirPort."),
ITEM("exit-policy/default", policies,
"The default value appended to the configured exit policy."),
+ ITEM("exit-policy/full", policies, "The entire exit policy of onion router"),
+ ITEM("exit-policy/ipv4", policies, "IPv4 parts of exit policy"),
+ ITEM("exit-policy/ipv6", policies, "IPv6 parts of exit policy"),
PREFIX("ip-to-country/", geoip, "Perform a GEOIP lookup"),
{ NULL, NULL, NULL, 0 }
};
@@ -2985,7 +2943,7 @@ handle_control_protocolinfo(control_connection_t *conn, uint32_t len,
} else {
const or_options_t *options = get_options();
int cookies = options->CookieAuthentication;
- char *cfile = get_cookie_file();
+ char *cfile = get_controller_cookie_file_name();
char *abs_cfile;
char *esc_cfile;
char *methods;
@@ -3181,6 +3139,30 @@ handle_control_usefeature(control_connection_t *conn,
return 0;
}
+/** Implementation for the DROPGUARDS command. */
+static int
+handle_control_dropguards(control_connection_t *conn,
+ uint32_t len,
+ const char *body)
+{
+ smartlist_t *args;
+ (void) len; /* body is nul-terminated; it's safe to ignore the length */
+ args = smartlist_new();
+ smartlist_split_string(args, body, " ",
+ SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
+
+ if (smartlist_len(args)) {
+ connection_printf_to_buf(conn, "512 Too many arguments to DROPGUARDS\r\n");
+ } else {
+ remove_all_entry_guards();
+ send_control_done(conn);
+ }
+
+ SMARTLIST_FOREACH(args, char *, cp, tor_free(cp));
+ smartlist_free(args);
+ return 0;
+}
+
/** Called when <b>conn</b> has no more bytes left on its outbuf. */
int
connection_control_finished_flushing(control_connection_t *conn)
@@ -3200,27 +3182,22 @@ connection_control_reached_eof(control_connection_t *conn)
return 0;
}
+static void lost_owning_controller(const char *owner_type,
+ const char *loss_manner)
+ ATTR_NORETURN;
+
/** Shut down this Tor instance in the same way that SIGINT would, but
* with a log message appropriate for the loss of an owning controller. */
static void
lost_owning_controller(const char *owner_type, const char *loss_manner)
{
- int shutdown_slowly = server_mode(get_options());
-
- log_notice(LD_CONTROL, "Owning controller %s has %s -- %s.",
- owner_type, loss_manner,
- shutdown_slowly ? "shutting down" : "exiting now");
+ log_notice(LD_CONTROL, "Owning controller %s has %s -- exiting now.",
+ owner_type, loss_manner);
/* XXXX Perhaps this chunk of code should be a separate function,
* called here and by process_signal(SIGINT). */
-
- if (!shutdown_slowly) {
- tor_cleanup();
- exit(0);
- }
- /* XXXX This will close all listening sockets except control-port
- * listeners. Perhaps we should close those too. */
- hibernate_begin_shutdown();
+ tor_cleanup();
+ exit(0);
}
/** Called when <b>conn</b> is being freed. */
@@ -3480,6 +3457,9 @@ connection_control_process_inbuf(control_connection_t *conn)
} else if (!strcasecmp(conn->incoming_cmd, "AUTHCHALLENGE")) {
if (handle_control_authchallenge(conn, cmd_data_len, args))
return -1;
+ } else if (!strcasecmp(conn->incoming_cmd, "DROPGUARDS")) {
+ if (handle_control_dropguards(conn, cmd_data_len, args))
+ return -1;
} else {
connection_printf_to_buf(conn, "510 Unrecognized command \"%s\"\r\n",
conn->incoming_cmd);
@@ -3847,17 +3827,17 @@ control_event_or_conn_status(or_connection_t *conn, or_conn_status_event_t tp,
}
ncircs += connection_or_get_num_circuits(conn);
if (ncircs && (tp == OR_CONN_EVENT_FAILED || tp == OR_CONN_EVENT_CLOSED)) {
- tor_snprintf(ncircs_buf, sizeof(ncircs_buf), "%sNCIRCS=%d",
- reason ? " " : "", ncircs);
+ tor_snprintf(ncircs_buf, sizeof(ncircs_buf), " NCIRCS=%d", ncircs);
}
orconn_target_get_name(name, sizeof(name), conn);
send_control_event(EVENT_OR_CONN_STATUS, ALL_FORMATS,
- "650 ORCONN %s %s %s%s%s\r\n",
+ "650 ORCONN %s %s%s%s%s ID="U64_FORMAT"\r\n",
name, status,
- reason ? "REASON=" : "",
+ reason ? " REASON=" : "",
orconn_end_reason_to_control_string(reason),
- ncircs_buf);
+ ncircs_buf,
+ U64_PRINTF_ARG(conn->base_.global_identifier));
return 0;
}
@@ -3868,6 +3848,8 @@ control_event_or_conn_status(or_connection_t *conn, or_conn_status_event_t tp,
int
control_event_stream_bandwidth(edge_connection_t *edge_conn)
{
+ circuit_t *circ;
+ origin_circuit_t *ocirc;
if (EVENT_IS_INTERESTING(EVENT_STREAM_BANDWIDTH_USED)) {
if (!edge_conn->n_read && !edge_conn->n_written)
return 0;
@@ -3878,6 +3860,12 @@ control_event_stream_bandwidth(edge_connection_t *edge_conn)
(unsigned long)edge_conn->n_read,
(unsigned long)edge_conn->n_written);
+ circ = circuit_get_by_edge_conn(edge_conn);
+ if (circ && CIRCUIT_IS_ORIGIN(circ)) {
+ ocirc = TO_ORIGIN_CIRCUIT(circ);
+ ocirc->n_read_circ_bw += edge_conn->n_read;
+ ocirc->n_written_circ_bw += edge_conn->n_written;
+ }
edge_conn->n_written = edge_conn->n_read = 0;
}
@@ -3915,6 +3903,235 @@ control_event_stream_bandwidth_used(void)
return 0;
}
+/** A second or more has elapsed: tell any interested control connections
+ * how much bandwidth origin circuits have used. */
+int
+control_event_circ_bandwidth_used(void)
+{
+ circuit_t *circ;
+ origin_circuit_t *ocirc;
+ if (!EVENT_IS_INTERESTING(EVENT_CIRC_BANDWIDTH_USED))
+ return 0;
+
+ TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) {
+ if (!CIRCUIT_IS_ORIGIN(circ))
+ continue;
+ ocirc = TO_ORIGIN_CIRCUIT(circ);
+ if (!ocirc->n_read_circ_bw && !ocirc->n_written_circ_bw)
+ continue;
+ send_control_event(EVENT_CIRC_BANDWIDTH_USED, ALL_FORMATS,
+ "650 CIRC_BW ID=%d READ=%lu WRITTEN=%lu\r\n",
+ ocirc->global_identifier,
+ (unsigned long)ocirc->n_read_circ_bw,
+ (unsigned long)ocirc->n_written_circ_bw);
+ ocirc->n_written_circ_bw = ocirc->n_read_circ_bw = 0;
+ }
+
+ return 0;
+}
+
+/** Print out CONN_BW event for a single OR/DIR/EXIT <b>conn</b> and reset
+ * bandwidth counters. */
+int
+control_event_conn_bandwidth(connection_t *conn)
+{
+ const char *conn_type_str;
+ if (!get_options()->TestingEnableConnBwEvent ||
+ !EVENT_IS_INTERESTING(EVENT_CONN_BW))
+ return 0;
+ if (!conn->n_read_conn_bw && !conn->n_written_conn_bw)
+ return 0;
+ switch (conn->type) {
+ case CONN_TYPE_OR:
+ conn_type_str = "OR";
+ break;
+ case CONN_TYPE_DIR:
+ conn_type_str = "DIR";
+ break;
+ case CONN_TYPE_EXIT:
+ conn_type_str = "EXIT";
+ break;
+ default:
+ return 0;
+ }
+ send_control_event(EVENT_CONN_BW, ALL_FORMATS,
+ "650 CONN_BW ID="U64_FORMAT" TYPE=%s "
+ "READ=%lu WRITTEN=%lu\r\n",
+ U64_PRINTF_ARG(conn->global_identifier),
+ conn_type_str,
+ (unsigned long)conn->n_read_conn_bw,
+ (unsigned long)conn->n_written_conn_bw);
+ conn->n_written_conn_bw = conn->n_read_conn_bw = 0;
+ return 0;
+}
+
+/** A second or more has elapsed: tell any interested control
+ * connections how much bandwidth connections have used. */
+int
+control_event_conn_bandwidth_used(void)
+{
+ if (get_options()->TestingEnableConnBwEvent &&
+ EVENT_IS_INTERESTING(EVENT_CONN_BW)) {
+ SMARTLIST_FOREACH(get_connection_array(), connection_t *, conn,
+ control_event_conn_bandwidth(conn));
+ }
+ return 0;
+}
+
+/** Helper: iterate over cell statistics of <b>circ</b> and sum up added
+ * cells, removed cells, and waiting times by cell command and direction.
+ * Store results in <b>cell_stats</b>. Free cell statistics of the
+ * circuit afterwards. */
+void
+sum_up_cell_stats_by_command(circuit_t *circ, cell_stats_t *cell_stats)
+{
+ memset(cell_stats, 0, sizeof(cell_stats_t));
+ SMARTLIST_FOREACH_BEGIN(circ->testing_cell_stats,
+ testing_cell_stats_entry_t *, ent) {
+ tor_assert(ent->command <= CELL_COMMAND_MAX_);
+ if (!ent->removed && !ent->exitward) {
+ cell_stats->added_cells_appward[ent->command] += 1;
+ } else if (!ent->removed && ent->exitward) {
+ cell_stats->added_cells_exitward[ent->command] += 1;
+ } else if (!ent->exitward) {
+ cell_stats->removed_cells_appward[ent->command] += 1;
+ cell_stats->total_time_appward[ent->command] += ent->waiting_time * 10;
+ } else {
+ cell_stats->removed_cells_exitward[ent->command] += 1;
+ cell_stats->total_time_exitward[ent->command] += ent->waiting_time * 10;
+ }
+ tor_free(ent);
+ } SMARTLIST_FOREACH_END(ent);
+ smartlist_free(circ->testing_cell_stats);
+ circ->testing_cell_stats = NULL;
+}
+
+/** Helper: append a cell statistics string to <code>event_parts</code>,
+ * prefixed with <code>key</code>=. Statistics consist of comma-separated
+ * key:value pairs with lower-case command strings as keys and cell
+ * numbers or total waiting times as values. A key:value pair is included
+ * if the entry in <code>include_if_non_zero</code> is not zero, but with
+ * the (possibly zero) entry from <code>number_to_include</code>. Both
+ * arrays are expected to have a length of CELL_COMMAND_MAX_ + 1. If no
+ * entry in <code>include_if_non_zero</code> is positive, no string will
+ * be added to <code>event_parts</code>. */
+void
+append_cell_stats_by_command(smartlist_t *event_parts, const char *key,
+ const uint64_t *include_if_non_zero,
+ const uint64_t *number_to_include)
+{
+ smartlist_t *key_value_strings = smartlist_new();
+ int i;
+ for (i = 0; i <= CELL_COMMAND_MAX_; i++) {
+ if (include_if_non_zero[i] > 0) {
+ smartlist_add_asprintf(key_value_strings, "%s:"U64_FORMAT,
+ cell_command_to_string(i),
+ U64_PRINTF_ARG(number_to_include[i]));
+ }
+ }
+ if (smartlist_len(key_value_strings) > 0) {
+ char *joined = smartlist_join_strings(key_value_strings, ",", 0, NULL);
+ smartlist_add_asprintf(event_parts, "%s=%s", key, joined);
+ SMARTLIST_FOREACH(key_value_strings, char *, cp, tor_free(cp));
+ tor_free(joined);
+ }
+ smartlist_free(key_value_strings);
+}
+
+/** Helper: format <b>cell_stats</b> for <b>circ</b> for inclusion in a
+ * CELL_STATS event and write result string to <b>event_string</b>. */
+void
+format_cell_stats(char **event_string, circuit_t *circ,
+ cell_stats_t *cell_stats)
+{
+ smartlist_t *event_parts = smartlist_new();
+ if (CIRCUIT_IS_ORIGIN(circ)) {
+ origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ);
+ smartlist_add_asprintf(event_parts, "ID=%lu",
+ (unsigned long)ocirc->global_identifier);
+ } else if (TO_OR_CIRCUIT(circ)->p_chan) {
+ or_circuit_t *or_circ = TO_OR_CIRCUIT(circ);
+ smartlist_add_asprintf(event_parts, "InboundQueue=%lu",
+ (unsigned long)or_circ->p_circ_id);
+ smartlist_add_asprintf(event_parts, "InboundConn="U64_FORMAT,
+ U64_PRINTF_ARG(or_circ->p_chan->global_identifier));
+ append_cell_stats_by_command(event_parts, "InboundAdded",
+ cell_stats->added_cells_appward,
+ cell_stats->added_cells_appward);
+ append_cell_stats_by_command(event_parts, "InboundRemoved",
+ cell_stats->removed_cells_appward,
+ cell_stats->removed_cells_appward);
+ append_cell_stats_by_command(event_parts, "InboundTime",
+ cell_stats->removed_cells_appward,
+ cell_stats->total_time_appward);
+ }
+ if (circ->n_chan) {
+ smartlist_add_asprintf(event_parts, "OutboundQueue=%lu",
+ (unsigned long)circ->n_circ_id);
+ smartlist_add_asprintf(event_parts, "OutboundConn="U64_FORMAT,
+ U64_PRINTF_ARG(circ->n_chan->global_identifier));
+ append_cell_stats_by_command(event_parts, "OutboundAdded",
+ cell_stats->added_cells_exitward,
+ cell_stats->added_cells_exitward);
+ append_cell_stats_by_command(event_parts, "OutboundRemoved",
+ cell_stats->removed_cells_exitward,
+ cell_stats->removed_cells_exitward);
+ append_cell_stats_by_command(event_parts, "OutboundTime",
+ cell_stats->removed_cells_exitward,
+ cell_stats->total_time_exitward);
+ }
+ *event_string = smartlist_join_strings(event_parts, " ", 0, NULL);
+ SMARTLIST_FOREACH(event_parts, char *, cp, tor_free(cp));
+ smartlist_free(event_parts);
+}
+
+/** A second or more has elapsed: tell any interested control connection
+ * how many cells have been processed for a given circuit. */
+int
+control_event_circuit_cell_stats(void)
+{
+ circuit_t *circ;
+ cell_stats_t *cell_stats;
+ char *event_string;
+ if (!get_options()->TestingEnableCellStatsEvent ||
+ !EVENT_IS_INTERESTING(EVENT_CELL_STATS))
+ return 0;
+ cell_stats = tor_malloc(sizeof(cell_stats_t));;
+ TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) {
+ if (!circ->testing_cell_stats)
+ continue;
+ sum_up_cell_stats_by_command(circ, cell_stats);
+ format_cell_stats(&event_string, circ, cell_stats);
+ send_control_event(EVENT_CELL_STATS, ALL_FORMATS,
+ "650 CELL_STATS %s\r\n", event_string);
+ tor_free(event_string);
+ }
+ tor_free(cell_stats);
+ return 0;
+}
+
+/** Tokens in <b>bucket</b> have been refilled: the read bucket was empty
+ * for <b>read_empty_time</b> millis, the write bucket was empty for
+ * <b>write_empty_time</b> millis, and buckets were last refilled
+ * <b>milliseconds_elapsed</b> millis ago. Only emit TB_EMPTY event if
+ * either read or write bucket have been empty before. */
+int
+control_event_tb_empty(const char *bucket, uint32_t read_empty_time,
+ uint32_t write_empty_time,
+ int milliseconds_elapsed)
+{
+ if (get_options()->TestingEnableTbEmptyEvent &&
+ EVENT_IS_INTERESTING(EVENT_TB_EMPTY) &&
+ (read_empty_time > 0 || write_empty_time > 0)) {
+ send_control_event(EVENT_TB_EMPTY, ALL_FORMATS,
+ "650 TB_EMPTY %s READ=%d WRITTEN=%d "
+ "LAST=%d\r\n",
+ bucket, read_empty_time, write_empty_time,
+ milliseconds_elapsed);
+ }
+ return 0;
+}
+
/** A second or more has elapsed: tell any interested control
* connections how much bandwidth we used. */
int
@@ -4162,32 +4379,26 @@ control_event_newconsensus(const networkstatus_t *consensus)
/** Called when we compute a new circuitbuildtimeout */
int
-control_event_buildtimeout_set(const circuit_build_times_t *cbt,
- buildtimeout_set_event_t type)
+control_event_buildtimeout_set(buildtimeout_set_event_t type,
+ const char *args)
{
const char *type_string = NULL;
- double qnt;
if (!control_event_is_interesting(EVENT_BUILDTIMEOUT_SET))
return 0;
- qnt = circuit_build_times_quantile_cutoff();
-
switch (type) {
case BUILDTIMEOUT_SET_EVENT_COMPUTED:
type_string = "COMPUTED";
break;
case BUILDTIMEOUT_SET_EVENT_RESET:
type_string = "RESET";
- qnt = 1.0;
break;
case BUILDTIMEOUT_SET_EVENT_SUSPENDED:
type_string = "SUSPENDED";
- qnt = 1.0;
break;
case BUILDTIMEOUT_SET_EVENT_DISCARD:
type_string = "DISCARD";
- qnt = 1.0;
break;
case BUILDTIMEOUT_SET_EVENT_RESUME:
type_string = "RESUME";
@@ -4198,15 +4409,8 @@ control_event_buildtimeout_set(const circuit_build_times_t *cbt,
}
send_control_event(EVENT_BUILDTIMEOUT_SET, ALL_FORMATS,
- "650 BUILDTIMEOUT_SET %s TOTAL_TIMES=%lu "
- "TIMEOUT_MS=%lu XM=%lu ALPHA=%f CUTOFF_QUANTILE=%f "
- "TIMEOUT_RATE=%f CLOSE_MS=%lu CLOSE_RATE=%f\r\n",
- type_string, (unsigned long)cbt->total_build_times,
- (unsigned long)cbt->timeout_ms,
- (unsigned long)cbt->Xm, cbt->alpha, qnt,
- circuit_build_times_timeout_rate(cbt),
- (unsigned long)cbt->close_ms,
- circuit_build_times_close_rate(cbt));
+ "650 BUILDTIMEOUT_SET %s %s\r\n",
+ type_string, args);
return 0;
}
@@ -4434,8 +4638,8 @@ control_event_conf_changed(const smartlist_t *elements)
/** Helper: Return a newly allocated string containing a path to the
* file where we store our authentication cookie. */
-static char *
-get_cookie_file(void)
+char *
+get_controller_cookie_file_name(void)
{
const or_options_t *options = get_options();
if (options->CookieAuthFile && strlen(options->CookieAuthFile)) {
@@ -4445,44 +4649,27 @@ get_cookie_file(void)
}
}
-/** Choose a random authentication cookie and write it to disk.
- * Anybody who can read the cookie from disk will be considered
- * authorized to use the control connection. Return -1 if we can't
- * write the file, or 0 on success. */
+/* Initialize the cookie-based authentication system of the
+ * ControlPort. If <b>enabled</b> is 0, then disable the cookie
+ * authentication system. */
int
-init_cookie_authentication(int enabled)
+init_control_cookie_authentication(int enabled)
{
- char *fname;
+ char *fname = NULL;
+ int retval;
+
if (!enabled) {
authentication_cookie_is_set = 0;
return 0;
}
- /* We don't want to generate a new cookie every time we call
- * options_act(). One should be enough. */
- if (authentication_cookie_is_set)
- return 0; /* all set */
-
- fname = get_cookie_file();
- crypto_rand(authentication_cookie, AUTHENTICATION_COOKIE_LEN);
- authentication_cookie_is_set = 1;
- if (write_bytes_to_file(fname, authentication_cookie,
- AUTHENTICATION_COOKIE_LEN, 1)) {
- log_warn(LD_FS,"Error writing authentication cookie to %s.",
- escaped(fname));
- tor_free(fname);
- return -1;
- }
-#ifndef _WIN32
- if (get_options()->CookieAuthFileGroupReadable) {
- if (chmod(fname, 0640)) {
- log_warn(LD_FS,"Unable to make %s group-readable.", escaped(fname));
- }
- }
-#endif
-
+ fname = get_controller_cookie_file_name();
+ retval = init_cookie_authentication(fname, "", /* no header */
+ AUTHENTICATION_COOKIE_LEN,
+ &authentication_cookie,
+ &authentication_cookie_is_set);
tor_free(fname);
- return 0;
+ return retval;
}
/** A copy of the process specifier of Tor's owning controller, or
@@ -4493,6 +4680,8 @@ static char *owning_controller_process_spec = NULL;
* if this Tor instance is not currently owned by a process. */
static tor_process_monitor_t *owning_controller_process_monitor = NULL;
+static void owning_controller_procmon_cb(void *unused) ATTR_NORETURN;
+
/** Process-termination monitor callback for Tor's owning controller
* process. */
static void
@@ -4636,16 +4825,28 @@ bootstrap_status_to_string(bootstrap_status_t s, const char **tag,
* Tor initializes. */
static int bootstrap_percent = BOOTSTRAP_STATUS_UNDEF;
+/** As bootstrap_percent, but holds the bootstrapping level at which we last
+ * logged a NOTICE-level message. We use this, plus BOOTSTRAP_PCT_INCREMENT,
+ * to avoid flooding the log with a new message every time we get a few more
+ * microdescriptors */
+static int notice_bootstrap_percent = 0;
+
/** How many problems have we had getting to the next bootstrapping phase?
* These include failure to establish a connection to a Tor relay,
* failures to finish the TLS handshake, failures to validate the
* consensus document, etc. */
static int bootstrap_problems = 0;
-/* We only tell the controller once we've hit a threshold of problems
+/** We only tell the controller once we've hit a threshold of problems
* for the current phase. */
#define BOOTSTRAP_PROBLEM_THRESHOLD 10
+/** When our bootstrapping progress level changes, but our bootstrapping
+ * status has not advanced, we only log at NOTICE when we have made at least
+ * this much progress.
+ */
+#define BOOTSTRAP_PCT_INCREMENT 5
+
/** Called when Tor has made progress at bootstrapping its directory
* information and initial circuits.
*
@@ -4665,7 +4866,7 @@ control_event_bootstrap(bootstrap_status_t status, int progress)
* can't distinguish what the connection is going to be for. */
if (status == BOOTSTRAP_STATUS_HANDSHAKE) {
if (bootstrap_percent < BOOTSTRAP_STATUS_CONN_OR) {
- status = BOOTSTRAP_STATUS_HANDSHAKE_DIR;
+ status = BOOTSTRAP_STATUS_HANDSHAKE_DIR;
} else {
status = BOOTSTRAP_STATUS_HANDSHAKE_OR;
}
@@ -4673,9 +4874,19 @@ control_event_bootstrap(bootstrap_status_t status, int progress)
if (status > bootstrap_percent ||
(progress && progress > bootstrap_percent)) {
+ int loglevel = LOG_NOTICE;
bootstrap_status_to_string(status, &tag, &summary);
- tor_log(status ? LOG_NOTICE : LOG_INFO, LD_CONTROL,
- "Bootstrapped %d%%: %s.", progress ? progress : status, summary);
+
+ if (status <= bootstrap_percent &&
+ (progress < notice_bootstrap_percent + BOOTSTRAP_PCT_INCREMENT)) {
+ /* We log the message at info if the status hasn't advanced, and if less
+ * than BOOTSTRAP_PCT_INCREMENT progress has been made.
+ */
+ loglevel = LOG_INFO;
+ }
+
+ tor_log(loglevel, LD_CONTROL,
+ "Bootstrapped %d%%: %s", progress ? progress : status, summary);
tor_snprintf(buf, sizeof(buf),
"BOOTSTRAP PROGRESS=%d TAG=%s SUMMARY=\"%s\"",
progress ? progress : status, tag, summary);
@@ -4691,15 +4902,22 @@ control_event_bootstrap(bootstrap_status_t status, int progress)
bootstrap_percent = progress;
bootstrap_problems = 0; /* Progress! Reset our problem counter. */
}
+ if (loglevel == LOG_NOTICE &&
+ bootstrap_percent > notice_bootstrap_percent) {
+ /* Remember that we gave a notice at this level. */
+ notice_bootstrap_percent = bootstrap_percent;
+ }
}
}
/** Called when Tor has failed to make bootstrapping progress in a way
* that indicates a problem. <b>warn</b> gives a hint as to why, and
- * <b>reason</b> provides an "or_conn_end_reason" tag.
+ * <b>reason</b> provides an "or_conn_end_reason" tag. <b>or_conn</b>
+ * is the connection that caused this problem.
*/
-void
-control_event_bootstrap_problem(const char *warn, int reason)
+MOCK_IMPL(void,
+ control_event_bootstrap_problem, (const char *warn, int reason,
+ or_connection_t *or_conn))
{
int status = bootstrap_percent;
const char *tag, *summary;
@@ -4710,6 +4928,11 @@ control_event_bootstrap_problem(const char *warn, int reason)
/* bootstrap_percent must not be in "undefined" state here. */
tor_assert(status >= 0);
+ if (or_conn->have_noted_bootstrap_problem)
+ return;
+
+ or_conn->have_noted_bootstrap_problem = 1;
+
if (bootstrap_percent == 100)
return; /* already bootstrapped; nothing to be done here. */
@@ -4721,9 +4944,10 @@ control_event_bootstrap_problem(const char *warn, int reason)
if (reason == END_OR_CONN_REASON_NO_ROUTE)
recommendation = "warn";
- if (get_options()->UseBridges &&
- !any_bridge_descriptors_known() &&
- !any_pending_bridge_descriptor_fetches())
+ /* If we are using bridges and all our OR connections are now
+ closed, it means that we totally failed to connect to our
+ bridges. Throw a warning. */
+ if (get_options()->UseBridges && !any_other_active_or_conns(or_conn))
recommendation = "warn";
if (we_are_hibernating())
@@ -4766,3 +4990,159 @@ control_event_clients_seen(const char *controller_str)
"650 CLIENTS_SEEN %s\r\n", controller_str);
}
+/** A new pluggable transport called <b>transport_name</b> was
+ * launched on <b>addr</b>:<b>port</b>. <b>mode</b> is either
+ * "server" or "client" depending on the mode of the pluggable
+ * transport.
+ * "650" SP "TRANSPORT_LAUNCHED" SP Mode SP Name SP Address SP Port
+ */
+void
+control_event_transport_launched(const char *mode, const char *transport_name,
+ tor_addr_t *addr, uint16_t port)
+{
+ send_control_event(EVENT_TRANSPORT_LAUNCHED, ALL_FORMATS,
+ "650 TRANSPORT_LAUNCHED %s %s %s %u\r\n",
+ mode, transport_name, fmt_addr(addr), port);
+}
+
+/** Convert rendezvous auth type to string for HS_DESC control events
+ */
+const char *
+rend_auth_type_to_string(rend_auth_type_t auth_type)
+{
+ const char *str;
+
+ switch (auth_type) {
+ case REND_NO_AUTH:
+ str = "NO_AUTH";
+ break;
+ case REND_BASIC_AUTH:
+ str = "BASIC_AUTH";
+ break;
+ case REND_STEALTH_AUTH:
+ str = "STEALTH_AUTH";
+ break;
+ default:
+ str = "UNKNOWN";
+ }
+
+ return str;
+}
+
+/** Return a longname the node whose identity is <b>id_digest</b>. If
+ * node_get_by_id() returns NULL, base 16 encoding of <b>id_digest</b> is
+ * returned instead.
+ *
+ * This function is not thread-safe. Each call to this function invalidates
+ * previous values returned by this function.
+ */
+MOCK_IMPL(const char *,
+node_describe_longname_by_id,(const char *id_digest))
+{
+ static char longname[MAX_VERBOSE_NICKNAME_LEN+1];
+ node_get_verbose_nickname_by_id(id_digest, longname);
+ return longname;
+}
+
+/** send HS_DESC requested event.
+ *
+ * <b>rend_query</b> is used to fetch requested onion address and auth type.
+ * <b>hs_dir</b> is the description of contacting hs directory.
+ * <b>desc_id_base32</b> is the ID of requested hs descriptor.
+ */
+void
+control_event_hs_descriptor_requested(const rend_data_t *rend_query,
+ const char *id_digest,
+ const char *desc_id_base32)
+{
+ if (!id_digest || !rend_query || !desc_id_base32) {
+ log_warn(LD_BUG, "Called with rend_query==%p, "
+ "id_digest==%p, desc_id_base32==%p",
+ rend_query, id_digest, desc_id_base32);
+ return;
+ }
+
+ send_control_event(EVENT_HS_DESC, ALL_FORMATS,
+ "650 HS_DESC REQUESTED %s %s %s %s\r\n",
+ rend_query->onion_address,
+ rend_auth_type_to_string(rend_query->auth_type),
+ node_describe_longname_by_id(id_digest),
+ desc_id_base32);
+}
+
+/** send HS_DESC event after got response from hs directory.
+ *
+ * NOTE: this is an internal function used by following functions:
+ * control_event_hs_descriptor_received
+ * control_event_hs_descriptor_failed
+ *
+ * So do not call this function directly.
+ */
+void
+control_event_hs_descriptor_receive_end(const char *action,
+ const rend_data_t *rend_query,
+ const char *id_digest)
+{
+ if (!action || !rend_query || !id_digest) {
+ log_warn(LD_BUG, "Called with action==%p, rend_query==%p, "
+ "id_digest==%p", action, rend_query, id_digest);
+ return;
+ }
+
+ send_control_event(EVENT_HS_DESC, ALL_FORMATS,
+ "650 HS_DESC %s %s %s %s\r\n",
+ action,
+ rend_query->onion_address,
+ rend_auth_type_to_string(rend_query->auth_type),
+ node_describe_longname_by_id(id_digest));
+}
+
+/** send HS_DESC RECEIVED event
+ *
+ * called when a we successfully received a hidden service descriptor.
+ */
+void
+control_event_hs_descriptor_received(const rend_data_t *rend_query,
+ const char *id_digest)
+{
+ if (!rend_query || !id_digest) {
+ log_warn(LD_BUG, "Called with rend_query==%p, id_digest==%p",
+ rend_query, id_digest);
+ return;
+ }
+ control_event_hs_descriptor_receive_end("RECEIVED", rend_query, id_digest);
+}
+
+/** send HS_DESC FAILED event
+ *
+ * called when request for hidden service descriptor returned failure.
+ */
+void
+control_event_hs_descriptor_failed(const rend_data_t *rend_query,
+ const char *id_digest)
+{
+ if (!rend_query || !id_digest) {
+ log_warn(LD_BUG, "Called with rend_query==%p, id_digest==%p",
+ rend_query, id_digest);
+ return;
+ }
+ control_event_hs_descriptor_receive_end("FAILED", rend_query, id_digest);
+}
+
+/** Free any leftover allocated memory of the control.c subsystem. */
+void
+control_free_all(void)
+{
+ if (authentication_cookie) /* Free the auth cookie */
+ tor_free(authentication_cookie);
+}
+
+#ifdef TOR_UNIT_TESTS
+/* For testing: change the value of global_event_mask */
+void
+control_testing_set_global_event_mask(uint64_t mask)
+{
+ global_event_mask = mask;
+}
+#endif
+
diff --git a/src/or/control.h b/src/or/control.h
index 61062da2c..68a6c244d 100644
--- a/src/or/control.h
+++ b/src/or/control.h
@@ -50,6 +50,13 @@ int control_event_or_conn_status(or_connection_t *conn,
int control_event_bandwidth_used(uint32_t n_read, uint32_t n_written);
int control_event_stream_bandwidth(edge_connection_t *edge_conn);
int control_event_stream_bandwidth_used(void);
+int control_event_circ_bandwidth_used(void);
+int control_event_conn_bandwidth(connection_t *conn);
+int control_event_conn_bandwidth_used(void);
+int control_event_circuit_cell_stats(void);
+int control_event_tb_empty(const char *bucket, uint32_t read_empty_time,
+ uint32_t write_empty_time,
+ int milliseconds_elapsed);
void control_event_logmsg(int severity, uint32_t domain, const char *msg);
int control_event_descriptors_changed(smartlist_t *routers);
int control_event_address_mapped(const char *from, const char *to,
@@ -73,11 +80,12 @@ int control_event_server_status(int severity, const char *format, ...)
int control_event_guard(const char *nickname, const char *digest,
const char *status);
int control_event_conf_changed(const smartlist_t *elements);
-int control_event_buildtimeout_set(const circuit_build_times_t *cbt,
- buildtimeout_set_event_t type);
+int control_event_buildtimeout_set(buildtimeout_set_event_t type,
+ const char *args);
int control_event_signal(uintptr_t signal);
-int init_cookie_authentication(int enabled);
+int init_control_cookie_authentication(int enabled);
+char *get_controller_cookie_file_name(void);
smartlist_t *decode_hashed_passwords(config_line_t *passwords);
void disable_control_logging(void);
void enable_control_logging(void);
@@ -85,14 +93,114 @@ void enable_control_logging(void);
void monitor_owning_controller_process(const char *process_spec);
void control_event_bootstrap(bootstrap_status_t status, int progress);
-void control_event_bootstrap_problem(const char *warn, int reason);
+MOCK_DECL(void, control_event_bootstrap_problem,(const char *warn,
+ int reason,
+ or_connection_t *or_conn));
void control_event_clients_seen(const char *controller_str);
+void control_event_transport_launched(const char *mode,
+ const char *transport_name,
+ tor_addr_t *addr, uint16_t port);
+const char *rend_auth_type_to_string(rend_auth_type_t auth_type);
+MOCK_DECL(const char *, node_describe_longname_by_id,(const char *id_digest));
+void control_event_hs_descriptor_requested(const rend_data_t *rend_query,
+ const char *desc_id_base32,
+ const char *hs_dir);
+void control_event_hs_descriptor_receive_end(const char *action,
+ const rend_data_t *rend_query,
+ const char *hs_dir);
+void control_event_hs_descriptor_received(const rend_data_t *rend_query,
+ const char *hs_dir);
+void control_event_hs_descriptor_failed(const rend_data_t *rend_query,
+ const char *hs_dir);
+
+void control_free_all(void);
#ifdef CONTROL_PRIVATE
+/* Recognized asynchronous event types. It's okay to expand this list
+ * because it is used both as a list of v0 event types, and as indices
+ * into the bitfield to determine which controllers want which events.
+ */
+#define EVENT_MIN_ 0x0001
+#define EVENT_CIRCUIT_STATUS 0x0001
+#define EVENT_STREAM_STATUS 0x0002
+#define EVENT_OR_CONN_STATUS 0x0003
+#define EVENT_BANDWIDTH_USED 0x0004
+#define EVENT_CIRCUIT_STATUS_MINOR 0x0005
+#define EVENT_NEW_DESC 0x0006
+#define EVENT_DEBUG_MSG 0x0007
+#define EVENT_INFO_MSG 0x0008
+#define EVENT_NOTICE_MSG 0x0009
+#define EVENT_WARN_MSG 0x000A
+#define EVENT_ERR_MSG 0x000B
+#define EVENT_ADDRMAP 0x000C
+/* Exposed above */
+// #define EVENT_AUTHDIR_NEWDESCS 0x000D
+#define EVENT_DESCCHANGED 0x000E
+/* Exposed above */
+// #define EVENT_NS 0x000F
+#define EVENT_STATUS_CLIENT 0x0010
+#define EVENT_STATUS_SERVER 0x0011
+#define EVENT_STATUS_GENERAL 0x0012
+#define EVENT_GUARD 0x0013
+#define EVENT_STREAM_BANDWIDTH_USED 0x0014
+#define EVENT_CLIENTS_SEEN 0x0015
+#define EVENT_NEWCONSENSUS 0x0016
+#define EVENT_BUILDTIMEOUT_SET 0x0017
+#define EVENT_SIGNAL 0x0018
+#define EVENT_CONF_CHANGED 0x0019
+#define EVENT_CONN_BW 0x001A
+#define EVENT_CELL_STATS 0x001B
+#define EVENT_TB_EMPTY 0x001C
+#define EVENT_CIRC_BANDWIDTH_USED 0x001D
+#define EVENT_TRANSPORT_LAUNCHED 0x0020
+#define EVENT_HS_DESC 0x0021
+#define EVENT_MAX_ 0x0021
+/* If EVENT_MAX_ ever hits 0x0040, we need to make the mask into a
+ * different structure. */
+
/* Used only by control.c and test.c */
-size_t write_escaped_data(const char *data, size_t len, char **out);
-size_t read_escaped_data(const char *data, size_t len, char **out);
+STATIC size_t write_escaped_data(const char *data, size_t len, char **out);
+STATIC size_t read_escaped_data(const char *data, size_t len, char **out);
+/** Flag for event_format_t. Indicates that we should use the one standard
+ format. (Other formats previous existed, and are now deprecated)
+ */
+#define ALL_FORMATS 1
+/** Bit field of flags to select how to format a controller event. Recognized
+ * flag is ALL_FORMATS. */
+typedef int event_format_t;
+
+#ifdef TOR_UNIT_TESTS
+MOCK_DECL(STATIC void,
+send_control_event_string,(uint16_t event, event_format_t which,
+ const char *msg));
+
+void control_testing_set_global_event_mask(uint64_t mask);
+#endif
+
+/** Helper structure: temporarily stores cell statistics for a circuit. */
+typedef struct cell_stats_t {
+ /** Number of cells added in app-ward direction by command. */
+ uint64_t added_cells_appward[CELL_COMMAND_MAX_ + 1];
+ /** Number of cells added in exit-ward direction by command. */
+ uint64_t added_cells_exitward[CELL_COMMAND_MAX_ + 1];
+ /** Number of cells removed in app-ward direction by command. */
+ uint64_t removed_cells_appward[CELL_COMMAND_MAX_ + 1];
+ /** Number of cells removed in exit-ward direction by command. */
+ uint64_t removed_cells_exitward[CELL_COMMAND_MAX_ + 1];
+ /** Total waiting time of cells in app-ward direction by command. */
+ uint64_t total_time_appward[CELL_COMMAND_MAX_ + 1];
+ /** Total waiting time of cells in exit-ward direction by command. */
+ uint64_t total_time_exitward[CELL_COMMAND_MAX_ + 1];
+} cell_stats_t;
+void sum_up_cell_stats_by_command(circuit_t *circ,
+ cell_stats_t *cell_stats);
+void append_cell_stats_by_command(smartlist_t *event_parts,
+ const char *key,
+ const uint64_t *include_if_non_zero,
+ const uint64_t *number_to_include);
+void format_cell_stats(char **event_string, circuit_t *circ,
+ cell_stats_t *cell_stats);
#endif
#endif
diff --git a/src/or/cpuworker.c b/src/or/cpuworker.c
index ecf0d2035..61b2c29b3 100644
--- a/src/or/cpuworker.c
+++ b/src/or/cpuworker.c
@@ -436,7 +436,7 @@ cpuworker_main(void *data)
if (req.task == CPUWORKER_TASK_ONION) {
const create_cell_t *cc = &req.create_cell;
created_cell_t *cell_out = &rpl.created_cell;
- struct timeval tv_start, tv_end;
+ struct timeval tv_start = {0,0}, tv_end;
int n;
rpl.timed = req.timed;
rpl.started_at = req.started_at;
@@ -528,7 +528,12 @@ spawn_cpuworker(void)
tor_assert(SOCKET_OK(fdarray[1]));
fd = fdarray[0];
- spawn_func(cpuworker_main, (void*)fdarray);
+ if (spawn_func(cpuworker_main, (void*)fdarray) < 0) {
+ tor_close_socket(fdarray[0]);
+ tor_close_socket(fdarray[1]);
+ tor_free(fdarray);
+ return -1;
+ }
log_debug(LD_OR,"just spawned a cpu worker.");
#ifndef TOR_IS_MULTITHREADED
tor_close_socket(fdarray[1]); /* don't need the worker's side of the pipe */
@@ -686,7 +691,7 @@ assign_onionskin_to_cpuworker(connection_t *cpuworker,
}
if (connection_or_digest_is_known_relay(circ->p_chan->identity_digest))
- rep_hist_note_circuit_handshake_completed(onionskin->handshake_type);
+ rep_hist_note_circuit_handshake_assigned(onionskin->handshake_type);
should_time = should_time_request(onionskin->handshake_type);
memset(&req, 0, sizeof(req));
diff --git a/src/or/directory.c b/src/or/directory.c
index 3752367c4..22ba056ee 100644
--- a/src/or/directory.c
+++ b/src/or/directory.c
@@ -67,15 +67,11 @@ static int purpose_needs_anonymity(uint8_t dir_purpose,
uint8_t router_purpose);
static char *http_get_header(const char *headers, const char *which);
static void http_set_address_origin(const char *headers, connection_t *conn);
-static void connection_dir_download_v2_networkstatus_failed(
- dir_connection_t *conn, int status_code);
static void connection_dir_download_routerdesc_failed(dir_connection_t *conn);
static void connection_dir_bridge_routerdesc_failed(dir_connection_t *conn);
static void connection_dir_download_cert_failed(
dir_connection_t *conn, int status_code);
static void connection_dir_retry_bridges(smartlist_t *descs);
-static void dir_networkstatus_download_failed(smartlist_t *failed,
- int status_code);
static void dir_routerdesc_download_failed(smartlist_t *failed,
int status_code,
int router_purpose,
@@ -86,8 +82,7 @@ static void dir_microdesc_download_failed(smartlist_t *failed,
static void note_client_request(int purpose, int compressed, size_t bytes);
static int client_likes_consensus(networkstatus_t *v, const char *want_url);
-static void directory_initiate_command_rend(const char *address,
- const tor_addr_t *addr,
+static void directory_initiate_command_rend(const tor_addr_t *addr,
uint16_t or_port,
uint16_t dir_port,
const char *digest,
@@ -135,7 +130,6 @@ purpose_needs_anonymity(uint8_t dir_purpose, uint8_t router_purpose)
if (dir_purpose == DIR_PURPOSE_UPLOAD_DIR ||
dir_purpose == DIR_PURPOSE_UPLOAD_VOTE ||
dir_purpose == DIR_PURPOSE_UPLOAD_SIGNATURES ||
- dir_purpose == DIR_PURPOSE_FETCH_V2_NETWORKSTATUS ||
dir_purpose == DIR_PURPOSE_FETCH_STATUS_VOTE ||
dir_purpose == DIR_PURPOSE_FETCH_DETACHED_SIGNATURES ||
dir_purpose == DIR_PURPOSE_FETCH_CONSENSUS ||
@@ -154,16 +148,10 @@ authdir_type_to_string(dirinfo_type_t auth)
{
char *result;
smartlist_t *lst = smartlist_new();
- if (auth & V1_DIRINFO)
- smartlist_add(lst, (void*)"V1");
- if (auth & V2_DIRINFO)
- smartlist_add(lst, (void*)"V2");
if (auth & V3_DIRINFO)
smartlist_add(lst, (void*)"V3");
if (auth & BRIDGE_DIRINFO)
smartlist_add(lst, (void*)"Bridge");
- if (auth & HIDSERV_DIRINFO)
- smartlist_add(lst, (void*)"Hidden service");
if (smartlist_len(lst)) {
result = smartlist_join_strings(lst, ", ", 0, NULL);
} else {
@@ -179,18 +167,12 @@ dir_conn_purpose_to_string(int purpose)
{
switch (purpose)
{
- case DIR_PURPOSE_FETCH_RENDDESC:
- return "hidden-service descriptor fetch";
case DIR_PURPOSE_UPLOAD_DIR:
return "server descriptor upload";
- case DIR_PURPOSE_UPLOAD_RENDDESC:
- return "hidden-service descriptor upload";
case DIR_PURPOSE_UPLOAD_VOTE:
return "server vote upload";
case DIR_PURPOSE_UPLOAD_SIGNATURES:
return "consensus signature upload";
- case DIR_PURPOSE_FETCH_V2_NETWORKSTATUS:
- return "network-status fetch";
case DIR_PURPOSE_FETCH_SERVERDESC:
return "server descriptor fetch";
case DIR_PURPOSE_FETCH_EXTRAINFO:
@@ -258,13 +240,13 @@ directories_have_accepted_server_descriptor(void)
/** Start a connection to every suitable directory authority, using
* connection purpose <b>dir_purpose</b> and uploading <b>payload</b>
* (of length <b>payload_len</b>). The dir_purpose should be one of
- * 'DIR_PURPOSE_UPLOAD_DIR' or 'DIR_PURPOSE_UPLOAD_RENDDESC'.
+ * 'DIR_PURPOSE_UPLOAD_{DIR|VOTE|SIGNATURES}'.
*
* <b>router_purpose</b> describes the type of descriptor we're
* publishing, if we're publishing a descriptor -- e.g. general or bridge.
*
- * <b>type</b> specifies what sort of dir authorities (V1, V2,
- * HIDSERV, BRIDGE) we should upload to.
+ * <b>type</b> specifies what sort of dir authorities (V3,
+ * BRIDGE, etc) we should upload to.
*
* If <b>extrainfo_len</b> is nonzero, the first <b>payload_len</b> bytes of
* <b>payload</b> hold a router descriptor, and the next <b>extrainfo_len</b>
@@ -279,7 +261,7 @@ directory_post_to_dirservers(uint8_t dir_purpose, uint8_t router_purpose,
size_t payload_len, size_t extrainfo_len)
{
const or_options_t *options = get_options();
- int post_via_tor;
+ dir_indirection_t indirection;
const smartlist_t *dirservers = router_get_trusted_dir_servers();
int found = 0;
const int exclude_self = (dir_purpose == DIR_PURPOSE_UPLOAD_VOTE ||
@@ -296,8 +278,12 @@ directory_post_to_dirservers(uint8_t dir_purpose, uint8_t router_purpose,
if ((type & ds->type) == 0)
continue;
- if (exclude_self && router_digest_is_me(ds->digest))
+ if (exclude_self && router_digest_is_me(ds->digest)) {
+ /* we don't upload to ourselves, but at least there's now at least
+ * one authority of this type that has what we wanted to upload. */
+ found = 1;
continue;
+ }
if (options->StrictNodes &&
routerset_contains_routerstatus(options->ExcludeNodes, rs, -1)) {
@@ -319,11 +305,19 @@ directory_post_to_dirservers(uint8_t dir_purpose, uint8_t router_purpose,
(int) extrainfo_len);
}
tor_addr_from_ipv4h(&ds_addr, ds->addr);
- post_via_tor = purpose_needs_anonymity(dir_purpose, router_purpose) ||
- !fascist_firewall_allows_address_dir(&ds_addr, ds->dir_port);
+ if (purpose_needs_anonymity(dir_purpose, router_purpose)) {
+ indirection = DIRIND_ANONYMOUS;
+ } else if (!fascist_firewall_allows_address_dir(&ds_addr,ds->dir_port)) {
+ if (fascist_firewall_allows_address_or(&ds_addr,ds->or_port))
+ indirection = DIRIND_ONEHOP;
+ else
+ indirection = DIRIND_ANONYMOUS;
+ } else {
+ indirection = DIRIND_DIRECT_CONN;
+ }
directory_initiate_command_routerstatus(rs, dir_purpose,
router_purpose,
- post_via_tor,
+ indirection,
NULL, payload, upload_len, 0);
} SMARTLIST_FOREACH_END(ds);
if (!found) {
@@ -350,10 +344,7 @@ should_use_directory_guards(const or_options_t *options)
/* If we're configured to fetch directory info aggressively or of a
* nonstandard type, don't use directory guards. */
if (options->DownloadExtraInfo || options->FetchDirInfoEarly ||
- options->FetchDirInfoExtraEarly || options->FetchUselessDescriptors ||
- options->FetchV2Networkstatus)
- return 0;
- if (! options->PreferTunneledDirConns)
+ options->FetchDirInfoExtraEarly || options->FetchUselessDescriptors)
return 0;
return 1;
}
@@ -414,18 +405,10 @@ directory_get_from_dirserver(uint8_t dir_purpose, uint8_t router_purpose,
(router_purpose == ROUTER_PURPOSE_BRIDGE ? BRIDGE_DIRINFO :
V3_DIRINFO);
break;
- case DIR_PURPOSE_FETCH_V2_NETWORKSTATUS:
- type = V2_DIRINFO;
- prefer_authority = 1; /* Only v2 authorities have these anyway. */
- require_authority = 1; /* Don't fallback to asking a non-authority */
- break;
case DIR_PURPOSE_FETCH_SERVERDESC:
type = (router_purpose == ROUTER_PURPOSE_BRIDGE ? BRIDGE_DIRINFO :
V3_DIRINFO);
break;
- case DIR_PURPOSE_FETCH_RENDDESC:
- type = HIDSERV_DIRINFO;
- break;
case DIR_PURPOSE_FETCH_STATUS_VOTE:
case DIR_PURPOSE_FETCH_DETACHED_SIGNATURES:
case DIR_PURPOSE_FETCH_CERTIFICATE:
@@ -465,7 +448,7 @@ directory_get_from_dirserver(uint8_t dir_purpose, uint8_t router_purpose,
}
}
- if (!options->FetchServerDescriptors && type != HIDSERV_DIRINFO)
+ if (!options->FetchServerDescriptors)
return;
if (!get_via_tor) {
@@ -484,7 +467,7 @@ directory_get_from_dirserver(uint8_t dir_purpose, uint8_t router_purpose,
tor_addr_t addr;
routerinfo_t *ri = node->ri;
node_get_addr(node, &addr);
- directory_initiate_command(ri->address, &addr,
+ directory_initiate_command(&addr,
ri->or_port, 0/*no dirport*/,
ri->cache_info.identity_digest,
dir_purpose,
@@ -536,11 +519,7 @@ directory_get_from_dirserver(uint8_t dir_purpose, uint8_t router_purpose,
}
} else { /* get_via_tor */
/* Never use fascistfirewall; we're going via Tor. */
- if (dir_purpose == DIR_PURPOSE_FETCH_RENDDESC) {
- /* only ask hidserv authorities, any of them will do */
- pds_flags |= PDS_IGNORE_FASCISTFIREWALL|PDS_ALLOW_SELF;
- rs = router_pick_trusteddirserver(HIDSERV_DIRINFO, pds_flags);
- } else {
+ if (1) {
/* anybody with a non-zero dirport will do. Disregard firewalls. */
pds_flags |= PDS_IGNORE_FASCISTFIREWALL;
rs = router_pick_directory_server(type, pds_flags);
@@ -617,9 +596,6 @@ directory_initiate_command_routerstatus_rend(const routerstatus_t *status,
{
const or_options_t *options = get_options();
const node_t *node;
- char address_buf[INET_NTOA_BUF_LEN+1];
- struct in_addr in;
- const char *address;
tor_addr_t addr;
const int anonymized_connection = dirind_is_anon(indirection);
node = node_get_by_id(status->identity_digest);
@@ -629,13 +605,6 @@ directory_initiate_command_routerstatus_rend(const routerstatus_t *status,
"don't have its router descriptor.",
routerstatus_describe(status));
return;
- } else if (node) {
- node_get_address_string(node, address_buf, sizeof(address_buf));
- address = address_buf;
- } else {
- in.s_addr = htonl(status->addr);
- tor_inet_ntoa(&in, address_buf, sizeof(address_buf));
- address = address_buf;
}
tor_addr_from_ipv4h(&addr, status->addr);
@@ -649,7 +618,7 @@ directory_initiate_command_routerstatus_rend(const routerstatus_t *status,
return;
}
- directory_initiate_command_rend(address, &addr,
+ directory_initiate_command_rend(&addr,
status->or_port, status->dir_port,
status->identity_digest,
dir_purpose, router_purpose,
@@ -662,7 +631,7 @@ directory_initiate_command_routerstatus_rend(const routerstatus_t *status,
* upload or download a server or rendezvous
* descriptor. <b>dir_purpose</b> determines what
* kind of directory connection we're launching, and must be one of
- * DIR_PURPOSE_{FETCH|UPLOAD}_{DIR|RENDDESC|RENDDESC_V2}. <b>router_purpose</b>
+ * DIR_PURPOSE_{FETCH|UPLOAD}_{DIR|RENDDESC_V2}. <b>router_purpose</b>
* specifies the descriptor purposes we have in mind (currently only
* used for FETCH_DIR).
*
@@ -719,11 +688,7 @@ connection_dir_request_failed(dir_connection_t *conn)
}
if (!entry_list_is_constrained(get_options()))
router_set_status(conn->identity_digest, 0); /* don't try him again */
- if (conn->base_.purpose == DIR_PURPOSE_FETCH_V2_NETWORKSTATUS) {
- log_info(LD_DIR, "Giving up on directory server at '%s'; retrying",
- conn->base_.address);
- connection_dir_download_v2_networkstatus_failed(conn, -1);
- } else if (conn->base_.purpose == DIR_PURPOSE_FETCH_SERVERDESC ||
+ if (conn->base_.purpose == DIR_PURPOSE_FETCH_SERVERDESC ||
conn->base_.purpose == DIR_PURPOSE_FETCH_EXTRAINFO) {
log_info(LD_DIR, "Giving up on serverdesc/extrainfo fetch from "
"directory server at '%s'; retrying",
@@ -747,48 +712,11 @@ connection_dir_request_failed(dir_connection_t *conn)
conn->base_.address);
} else if (conn->base_.purpose == DIR_PURPOSE_FETCH_MICRODESC) {
log_info(LD_DIR, "Giving up on downloading microdescriptors from "
- " directory server at '%s'; will retry", conn->base_.address);
+ "directory server at '%s'; will retry", conn->base_.address);
connection_dir_download_routerdesc_failed(conn);
}
}
-/** Called when an attempt to download one or more network status
- * documents on connection <b>conn</b> failed. Decide whether to
- * retry the fetch now, later, or never.
- */
-static void
-connection_dir_download_v2_networkstatus_failed(dir_connection_t *conn,
- int status_code)
-{
- if (!conn->requested_resource) {
- /* We never reached directory_send_command, which means that we never
- * opened a network connection. Either we're out of sockets, or the
- * network is down. Either way, retrying would be pointless. */
- return;
- }
- if (!strcmpstart(conn->requested_resource, "all")) {
- /* We're a non-authoritative directory cache; try again. Ignore status
- * code, since we don't want to keep trying forever in a tight loop
- * if all the authorities are shutting us out. */
- const smartlist_t *trusted_dirs = router_get_trusted_dir_servers();
- SMARTLIST_FOREACH(trusted_dirs, dir_server_t *, ds,
- download_status_failed(&ds->v2_ns_dl_status, 0));
- directory_get_from_dirserver(conn->base_.purpose, conn->router_purpose,
- "all.z", 0 /* don't retry_if_no_servers */);
- } else if (!strcmpstart(conn->requested_resource, "fp/")) {
- /* We were trying to download by fingerprint; mark them all as having
- * failed, and possibly retry them later.*/
- smartlist_t *failed = smartlist_new();
- dir_split_resource_into_fingerprints(conn->requested_resource+3,
- failed, NULL, 0);
- if (smartlist_len(failed)) {
- dir_networkstatus_download_failed(failed, status_code);
- SMARTLIST_FOREACH(failed, char *, cp, tor_free(cp));
- }
- smartlist_free(failed);
- }
-}
-
/** Helper: Attempt to fetch directly the descriptors of each bridge
* listed in <b>failed</b>.
*/
@@ -912,6 +840,7 @@ directory_command_should_use_begindir(const or_options_t *options,
int or_port, uint8_t router_purpose,
dir_indirection_t indirection)
{
+ (void) router_purpose;
if (!or_port)
return 0; /* We don't know an ORPort -- no chance. */
if (indirection == DIRIND_DIRECT_CONN || indirection == DIRIND_ANON_DIRPORT)
@@ -920,9 +849,6 @@ directory_command_should_use_begindir(const or_options_t *options,
if (!fascist_firewall_allows_address_or(addr, or_port) ||
directory_fetches_from_authorities(options))
return 0; /* We're firewalled or are acting like a relay -- also no. */
- if (!options->TunnelDirConns &&
- router_purpose != ROUTER_PURPOSE_BRIDGE)
- return 0; /* We prefer to avoid using begindir conns. Fine. */
return 1;
}
@@ -932,7 +858,7 @@ directory_command_should_use_begindir(const or_options_t *options,
* <b>supports_begindir</b>, and whose identity key digest is
* <b>digest</b>. */
void
-directory_initiate_command(const char *address, const tor_addr_t *_addr,
+directory_initiate_command(const tor_addr_t *_addr,
uint16_t or_port, uint16_t dir_port,
const char *digest,
uint8_t dir_purpose, uint8_t router_purpose,
@@ -940,7 +866,7 @@ directory_initiate_command(const char *address, const tor_addr_t *_addr,
const char *payload, size_t payload_len,
time_t if_modified_since)
{
- directory_initiate_command_rend(address, _addr, or_port, dir_port,
+ directory_initiate_command_rend(_addr, or_port, dir_port,
digest, dir_purpose,
router_purpose, indirection,
resource, payload, payload_len,
@@ -954,9 +880,7 @@ directory_initiate_command(const char *address, const tor_addr_t *_addr,
static int
is_sensitive_dir_purpose(uint8_t dir_purpose)
{
- return ((dir_purpose == DIR_PURPOSE_FETCH_RENDDESC) ||
- (dir_purpose == DIR_PURPOSE_HAS_FETCHED_RENDDESC) ||
- (dir_purpose == DIR_PURPOSE_UPLOAD_RENDDESC) ||
+ return ((dir_purpose == DIR_PURPOSE_HAS_FETCHED_RENDDESC_V2) ||
(dir_purpose == DIR_PURPOSE_UPLOAD_RENDDESC_V2) ||
(dir_purpose == DIR_PURPOSE_FETCH_RENDDESC_V2));
}
@@ -964,7 +888,7 @@ is_sensitive_dir_purpose(uint8_t dir_purpose)
/** Same as directory_initiate_command(), but accepts rendezvous data to
* fetch a hidden service descriptor. */
static void
-directory_initiate_command_rend(const char *address, const tor_addr_t *_addr,
+directory_initiate_command_rend(const tor_addr_t *_addr,
uint16_t or_port, uint16_t dir_port,
const char *digest,
uint8_t dir_purpose, uint8_t router_purpose,
@@ -982,7 +906,6 @@ directory_initiate_command_rend(const char *address, const tor_addr_t *_addr,
const int anonymized_connection = dirind_is_anon(indirection);
tor_addr_t addr;
- tor_assert(address);
tor_assert(_addr);
tor_assert(or_port || dir_port);
tor_assert(digest);
@@ -1015,7 +938,7 @@ directory_initiate_command_rend(const char *address, const tor_addr_t *_addr,
/* set up conn so it's got all the data we need to remember */
tor_addr_copy(&conn->base_.addr, &addr);
conn->base_.port = use_begindir ? or_port : dir_port;
- conn->base_.address = tor_strdup(address);
+ conn->base_.address = tor_dup_addr(&addr);
memcpy(conn->identity_digest, digest, DIGEST_LEN);
conn->base_.purpose = dir_purpose;
@@ -1250,11 +1173,6 @@ directory_send_command(dir_connection_t *conn,
}
switch (purpose) {
- case DIR_PURPOSE_FETCH_V2_NETWORKSTATUS:
- tor_assert(resource);
- httpcommand = "GET";
- tor_asprintf(&url, "/tor/status/%s", resource);
- break;
case DIR_PURPOSE_FETCH_CONSENSUS:
/* resource is optional. If present, it's a flavor name */
tor_assert(!payload);
@@ -1326,12 +1244,6 @@ directory_send_command(dir_connection_t *conn,
httpcommand = "GET";
tor_asprintf(&url, "/tor/rendezvous2/%s", resource);
break;
- case DIR_PURPOSE_UPLOAD_RENDDESC:
- tor_assert(!resource);
- tor_assert(payload);
- httpcommand = "POST";
- url = tor_strdup("/tor/rendezvous/publish");
- break;
case DIR_PURPOSE_UPLOAD_RENDDESC_V2:
tor_assert(!resource);
tor_assert(payload);
@@ -1387,7 +1299,7 @@ directory_send_command(dir_connection_t *conn,
* so it does. Return 0.
* Otherwise, return -1.
*/
-static int
+STATIC int
parse_http_url(const char *headers, char **url)
{
char *s, *start, *tmp;
@@ -1416,6 +1328,19 @@ parse_http_url(const char *headers, char **url)
}
}
+ /* Check if the header is well formed (next sequence
+ * should be HTTP/1.X\r\n). Assumes we're supporting 1.0? */
+ {
+ unsigned minor_ver;
+ char ch;
+ char *e = (char *)eat_whitespace_no_nl(s);
+ if (2 != tor_sscanf(e, "HTTP/1.%u%c", &minor_ver, &ch)) {
+ return -1;
+ }
+ if (ch != '\r')
+ return -1;
+ }
+
if (s-start < 5 || strcmpstart(start,"/tor/")) { /* need to rewrite it */
*url = tor_malloc(s - start + 5);
strlcpy(*url,"/tor", s-start+5);
@@ -1462,13 +1387,14 @@ http_set_address_origin(const char *headers, connection_t *conn)
if (!fwd)
fwd = http_get_header(headers, "X-Forwarded-For: ");
if (fwd) {
- struct in_addr in;
- if (!tor_inet_aton(fwd, &in) || is_internal_IP(ntohl(in.s_addr), 0)) {
- log_debug(LD_DIR, "Ignoring unrecognized or internal IP %s",
- escaped(fwd));
+ tor_addr_t toraddr;
+ if (tor_addr_parse(&toraddr,fwd) == -1 ||
+ tor_addr_is_internal(&toraddr,0)) {
+ log_debug(LD_DIR, "Ignoring local/internal IP %s", escaped(fwd));
tor_free(fwd);
return;
}
+
tor_free(conn->address);
conn->address = tor_strdup(fwd);
tor_free(fwd);
@@ -1565,8 +1491,8 @@ parse_http_response(const char *headers, int *code, time_t *date,
}
/** Return true iff <b>body</b> doesn't start with a plausible router or
- * running-list or directory opening. This is a sign of possible compression.
- **/
+ * network-status or microdescriptor opening. This is a sign of possible
+ * compression. */
static int
body_is_plausible(const char *body, size_t len, int purpose)
{
@@ -1578,20 +1504,16 @@ body_is_plausible(const char *body, size_t len, int purpose)
if (purpose == DIR_PURPOSE_FETCH_MICRODESC) {
return (!strcmpstart(body,"onion-key"));
}
- if (purpose != DIR_PURPOSE_FETCH_RENDDESC) {
+ if (1) {
if (!strcmpstart(body,"router") ||
- !strcmpstart(body,"signed-directory") ||
- !strcmpstart(body,"network-status") ||
- !strcmpstart(body,"running-routers"))
- return 1;
+ !strcmpstart(body,"network-status"))
+ return 1;
for (i=0;i<32;++i) {
if (!TOR_ISPRINT(body[i]) && !TOR_ISSPACE(body[i]))
return 0;
}
- return 1;
- } else {
- return 1;
}
+ return 1;
}
/** Called when we've just fetched a bunch of router descriptors in
@@ -1626,8 +1548,9 @@ load_downloaded_routers(const char *body, smartlist_t *which,
added = router_load_routers_from_string(body, NULL, SAVED_NOWHERE, which,
descriptor_digests, buf);
- control_event_bootstrap(BOOTSTRAP_STATUS_LOADING_DESCRIPTORS,
- count_loading_descriptors_progress());
+ if (general)
+ control_event_bootstrap(BOOTSTRAP_STATUS_LOADING_DESCRIPTORS,
+ count_loading_descriptors_progress());
return added;
}
@@ -1646,17 +1569,17 @@ connection_dir_client_reached_eof(dir_connection_t *conn)
char *body;
char *headers;
char *reason = NULL;
- size_t body_len=0, orig_len=0;
+ size_t body_len = 0, orig_len = 0;
int status_code;
- time_t date_header=0;
+ time_t date_header = 0;
long delta;
compress_method_t compression;
int plausible;
- int skewed=0;
+ int skewed = 0;
int allow_partial = (conn->base_.purpose == DIR_PURPOSE_FETCH_SERVERDESC ||
conn->base_.purpose == DIR_PURPOSE_FETCH_EXTRAINFO ||
conn->base_.purpose == DIR_PURPOSE_FETCH_MICRODESC);
- int was_compressed=0;
+ int was_compressed = 0;
time_t now = time(NULL);
int src_code;
@@ -1810,77 +1733,6 @@ connection_dir_client_reached_eof(dir_connection_t *conn)
}
}
- if (conn->base_.purpose == DIR_PURPOSE_FETCH_V2_NETWORKSTATUS) {
- smartlist_t *which = NULL;
- v2_networkstatus_source_t source;
- char *cp;
- log_info(LD_DIR,"Received networkstatus objects (size %d) from server "
- "'%s:%d'", (int)body_len, conn->base_.address, conn->base_.port);
- if (status_code != 200) {
- static ratelim_t warning_limit = RATELIM_INIT(3600);
- char *m;
- if ((m = rate_limit_log(&warning_limit, now))) {
- log_warn(LD_DIR,
- "Received http status code %d (%s) from server "
- "'%s:%d' while fetching \"/tor/status/%s\". "
- "I'll try again soon.%s",
- status_code, escaped(reason), conn->base_.address,
- conn->base_.port, conn->requested_resource, m);
- tor_free(m);
- }
- tor_free(body); tor_free(headers); tor_free(reason);
- connection_dir_download_v2_networkstatus_failed(conn, status_code);
- return -1;
- }
- if (conn->requested_resource &&
- !strcmpstart(conn->requested_resource,"fp/")) {
- source = NS_FROM_DIR_BY_FP;
- which = smartlist_new();
- dir_split_resource_into_fingerprints(conn->requested_resource+3,
- which, NULL, 0);
- } else if (conn->requested_resource &&
- !strcmpstart(conn->requested_resource, "all")) {
- source = NS_FROM_DIR_ALL;
- which = smartlist_new();
- SMARTLIST_FOREACH(router_get_trusted_dir_servers(),
- dir_server_t *, ds,
- {
- char *hex = tor_malloc(HEX_DIGEST_LEN+1);
- base16_encode(hex, HEX_DIGEST_LEN+1, ds->digest, DIGEST_LEN);
- smartlist_add(which, hex);
- });
- } else {
- /* XXXX Can we even end up here? -- weasel*/
- source = NS_FROM_DIR_BY_FP;
- log_warn(LD_BUG, "We received a networkstatus but we didn't ask "
- "for it by fp, nor did we ask for all.");
- }
- cp = body;
- while (*cp) {
- char *next = strstr(cp, "\nnetwork-status-version");
- if (next)
- next[1] = '\0';
- /* learn from it, and then remove it from 'which' */
- if (router_set_networkstatus_v2(cp, now, source, which)<0)
- break;
- if (next) {
- next[1] = 'n';
- cp = next+1;
- } else
- break;
- }
- /* launches router downloads as needed */
- routers_update_all_from_networkstatus(now, 2);
- directory_info_has_arrived(now, 0);
- if (which) {
- if (smartlist_len(which)) {
- dir_networkstatus_download_failed(which, status_code);
- }
- SMARTLIST_FOREACH(which, char *, s, tor_free(s));
- smartlist_free(which);
- }
- }
-
if (conn->base_.purpose == DIR_PURPOSE_FETCH_CONSENSUS) {
int r;
const char *flavname = conn->requested_resource;
@@ -2220,47 +2072,10 @@ connection_dir_client_reached_eof(dir_connection_t *conn)
* dirservers down just because they don't like us. */
}
- if (conn->base_.purpose == DIR_PURPOSE_FETCH_RENDDESC) {
- tor_assert(conn->rend_data);
- log_info(LD_REND,"Received rendezvous descriptor (size %d, status %d "
- "(%s))",
- (int)body_len, status_code, escaped(reason));
- switch (status_code) {
- case 200:
- if (rend_cache_store(body, body_len, 0,
- conn->rend_data->onion_address) < -1) {
- log_warn(LD_REND,"Failed to parse rendezvous descriptor.");
- /* Any pending rendezvous attempts will notice when
- * connection_about_to_close_connection()
- * cleans this dir conn up. */
- /* We could retry. But since v0 descriptors are going out of
- * style, it isn't worth the hassle. We'll do better in v2. */
- } else {
- /* Success, or at least there's a v2 descriptor already
- * present. Notify pending connections about this. */
- conn->base_.purpose = DIR_PURPOSE_HAS_FETCHED_RENDDESC;
- rend_client_desc_trynow(conn->rend_data->onion_address);
- }
- break;
- case 404:
- /* Not there. Pending connections will be notified when
- * connection_about_to_close_connection() cleans this conn up. */
- break;
- case 400:
- log_warn(LD_REND,
- "http status 400 (%s). Dirserver didn't like our "
- "rendezvous query?", escaped(reason));
- break;
- default:
- log_warn(LD_REND,"http status %d (%s) response unexpected while "
- "fetching hidden service descriptor (server '%s:%d').",
- status_code, escaped(reason), conn->base_.address,
- conn->base_.port);
- break;
- }
- }
-
if (conn->base_.purpose == DIR_PURPOSE_FETCH_RENDDESC_V2) {
+ #define SEND_HS_DESC_FAILED_EVENT() ( \
+ control_event_hs_descriptor_failed(conn->rend_data, \
+ conn->identity_digest) )
tor_assert(conn->rend_data);
log_info(LD_REND,"Received rendezvous descriptor (size %d, status %d "
"(%s))",
@@ -2268,24 +2083,22 @@ connection_dir_client_reached_eof(dir_connection_t *conn)
switch (status_code) {
case 200:
switch (rend_cache_store_v2_desc_as_client(body, conn->rend_data)) {
- case -2:
+ case RCS_BADDESC:
+ case RCS_NOTDIR: /* Impossible */
log_warn(LD_REND,"Fetching v2 rendezvous descriptor failed. "
"Retrying at another directory.");
/* We'll retry when connection_about_to_close_connection()
* cleans this dir conn up. */
+ SEND_HS_DESC_FAILED_EVENT();
break;
- case -1:
- /* We already have a v0 descriptor here. Ignoring this one
- * and _not_ performing another request. */
- log_info(LD_REND, "Successfully fetched v2 rendezvous "
- "descriptor, but we already have a v0 descriptor.");
- conn->base_.purpose = DIR_PURPOSE_HAS_FETCHED_RENDDESC;
- break;
+ case RCS_OKAY:
default:
/* success. notify pending connections about this. */
log_info(LD_REND, "Successfully fetched v2 rendezvous "
"descriptor.");
- conn->base_.purpose = DIR_PURPOSE_HAS_FETCHED_RENDDESC;
+ control_event_hs_descriptor_received(conn->rend_data,
+ conn->identity_digest);
+ conn->base_.purpose = DIR_PURPOSE_HAS_FETCHED_RENDDESC_V2;
rend_client_desc_trynow(conn->rend_data->onion_address);
break;
}
@@ -2295,12 +2108,14 @@ connection_dir_client_reached_eof(dir_connection_t *conn)
* connection_about_to_close_connection() cleans this conn up. */
log_info(LD_REND,"Fetching v2 rendezvous descriptor failed: "
"Retrying at another directory.");
+ SEND_HS_DESC_FAILED_EVENT();
break;
case 400:
log_warn(LD_REND, "Fetching v2 rendezvous descriptor failed: "
"http status 400 (%s). Dirserver didn't like our "
"v2 rendezvous query? Retrying at another directory.",
escaped(reason));
+ SEND_HS_DESC_FAILED_EVENT();
break;
default:
log_warn(LD_REND, "Fetching v2 rendezvous descriptor failed: "
@@ -2309,12 +2124,12 @@ connection_dir_client_reached_eof(dir_connection_t *conn)
"Retrying at another directory.",
status_code, escaped(reason), conn->base_.address,
conn->base_.port);
+ SEND_HS_DESC_FAILED_EVENT();
break;
}
}
- if (conn->base_.purpose == DIR_PURPOSE_UPLOAD_RENDDESC ||
- conn->base_.purpose == DIR_PURPOSE_UPLOAD_RENDDESC_V2) {
+ if (conn->base_.purpose == DIR_PURPOSE_UPLOAD_RENDDESC_V2) {
log_info(LD_REND,"Uploaded rendezvous descriptor (status %d "
"(%s))",
status_code, escaped(reason));
@@ -2418,7 +2233,7 @@ connection_dir_about_to_close(dir_connection_t *dir_conn)
}
/* If we were trying to fetch a v2 rend desc and did not succeed,
* retry as needed. (If a fetch is successful, the connection state
- * is changed to DIR_PURPOSE_HAS_FETCHED_RENDDESC to mark that
+ * is changed to DIR_PURPOSE_HAS_FETCHED_RENDDESC_V2 to mark that
* refetching is unnecessary.) */
if (conn->purpose == DIR_PURPOSE_FETCH_RENDDESC_V2 &&
dir_conn->rend_data &&
@@ -2492,7 +2307,7 @@ write_http_response_header_impl(dir_connection_t *conn, ssize_t length,
}
if (cache_lifetime > 0) {
char expbuf[RFC1123_TIME_LEN+1];
- format_rfc1123_time(expbuf, now + cache_lifetime);
+ format_rfc1123_time(expbuf, (time_t)(now + cache_lifetime));
/* We could say 'Cache-control: max-age=%d' here if we start doing
* http/1.1 */
tor_snprintf(cp, sizeof(tmp)-(cp-tmp),
@@ -2549,7 +2364,6 @@ note_client_request(int purpose, int compressed, size_t bytes)
char *key;
const char *kind = NULL;
switch (purpose) {
- case DIR_PURPOSE_FETCH_V2_NETWORKSTATUS: kind = "dl/status"; break;
case DIR_PURPOSE_FETCH_CONSENSUS: kind = "dl/consensus"; break;
case DIR_PURPOSE_FETCH_CERTIFICATE: kind = "dl/cert"; break;
case DIR_PURPOSE_FETCH_STATUS_VOTE: kind = "dl/vote"; break;
@@ -2560,9 +2374,7 @@ note_client_request(int purpose, int compressed, size_t bytes)
case DIR_PURPOSE_UPLOAD_DIR: kind = "dl/ul-dir"; break;
case DIR_PURPOSE_UPLOAD_VOTE: kind = "dl/ul-vote"; break;
case DIR_PURPOSE_UPLOAD_SIGNATURES: kind = "dl/ul-sig"; break;
- case DIR_PURPOSE_FETCH_RENDDESC: kind = "dl/rend"; break;
case DIR_PURPOSE_FETCH_RENDDESC_V2: kind = "dl/rend2"; break;
- case DIR_PURPOSE_UPLOAD_RENDDESC: kind = "dl/ul-rend"; break;
case DIR_PURPOSE_UPLOAD_RENDDESC_V2: kind = "dl/ul-rend2"; break;
}
if (kind) {
@@ -2774,109 +2586,13 @@ directory_handle_command_get(dir_connection_t *conn, const char *headers,
/* if no disclaimer file, fall through and continue */
}
- if (!strcmp(url,"/tor/") || !strcmp(url,"/tor/dir")) { /* v1 dir fetch */
- cached_dir_t *d = dirserv_get_directory();
-
- if (!d) {
- log_info(LD_DIRSERV,"Client asked for the mirrored directory, but we "
- "don't have a good one yet. Sending 503 Dir not available.");
- write_http_status_line(conn, 503, "Directory unavailable");
- goto done;
- }
- if (d->published < if_modified_since) {
- write_http_status_line(conn, 304, "Not modified");
- goto done;
- }
-
- dlen = compressed ? d->dir_z_len : d->dir_len;
-
- if (global_write_bucket_low(TO_CONN(conn), dlen, 1)) {
- log_debug(LD_DIRSERV,
- "Client asked for the mirrored directory, but we've been "
- "writing too many bytes lately. Sending 503 Dir busy.");
- write_http_status_line(conn, 503, "Directory busy, try again later");
- goto done;
- }
-
- note_request(url, dlen);
-
- log_debug(LD_DIRSERV,"Dumping %sdirectory to client.",
- compressed?"compressed ":"");
- write_http_response_header(conn, dlen, compressed,
- FULL_DIR_CACHE_LIFETIME);
- conn->cached_dir = d;
- conn->cached_dir_offset = 0;
- if (!compressed)
- conn->zlib_state = tor_zlib_new(0, ZLIB_METHOD);
- ++d->refcnt;
-
- /* Prime the connection with some data. */
- conn->dir_spool_src = DIR_SPOOL_CACHED_DIR;
- connection_dirserv_flushed_some(conn);
- goto done;
- }
-
- if (!strcmp(url,"/tor/running-routers")) { /* running-routers fetch */
- cached_dir_t *d = dirserv_get_runningrouters();
- if (!d) {
- write_http_status_line(conn, 503, "Directory unavailable");
- goto done;
- }
- if (d->published < if_modified_since) {
- write_http_status_line(conn, 304, "Not modified");
- goto done;
- }
- dlen = compressed ? d->dir_z_len : d->dir_len;
-
- if (global_write_bucket_low(TO_CONN(conn), dlen, 1)) {
- log_info(LD_DIRSERV,
- "Client asked for running-routers, but we've been "
- "writing too many bytes lately. Sending 503 Dir busy.");
- write_http_status_line(conn, 503, "Directory busy, try again later");
- goto done;
- }
- note_request(url, dlen);
- write_http_response_header(conn, dlen, compressed,
- RUNNINGROUTERS_CACHE_LIFETIME);
- connection_write_to_buf(compressed ? d->dir_z : d->dir, dlen,
- TO_CONN(conn));
- goto done;
- }
-
- if (!strcmpstart(url,"/tor/status/")
- || !strcmpstart(url, "/tor/status-vote/current/consensus")) {
- /* v2 or v3 network status fetch. */
+ if (!strcmpstart(url, "/tor/status-vote/current/consensus")) {
+ /* v3 network status fetch. */
smartlist_t *dir_fps = smartlist_new();
- int is_v3 = !strcmpstart(url, "/tor/status-vote");
const char *request_type = NULL;
- const char *key = url + strlen("/tor/status/");
long lifetime = NETWORKSTATUS_CACHE_LIFETIME;
- if (options->DisableV2DirectoryInfo_ && !is_v3) {
- static ratelim_t reject_v2_ratelim = RATELIM_INIT(1800);
- char *m;
- write_http_status_line(conn, 404, "Not found");
- smartlist_free(dir_fps);
- geoip_note_ns_response(GEOIP_REJECT_NOT_FOUND);
- if ((m = rate_limit_log(&reject_v2_ratelim, approx_time()))) {
- log_notice(LD_DIR, "Rejected a v2 networkstatus request.%s", m);
- tor_free(m);
- }
- goto done;
- }
-
- if (!is_v3) {
- dirserv_get_networkstatus_v2_fingerprints(dir_fps, key);
- if (!strcmpstart(key, "fp/"))
- request_type = compressed?"/tor/status/fp.z":"/tor/status/fp";
- else if (!strcmpstart(key, "authority"))
- request_type = compressed?"/tor/status/authority.z":
- "/tor/status/authority";
- else if (!strcmpstart(key, "all"))
- request_type = compressed?"/tor/status/all.z":"/tor/status/all";
- else
- request_type = "/tor/status/?";
- } else {
+ if (1) {
networkstatus_t *v;
time_t now = time(NULL);
const char *want_fps = NULL;
@@ -2929,8 +2645,7 @@ directory_handle_command_get(dir_connection_t *conn, const char *headers,
if (!smartlist_len(dir_fps)) { /* we failed to create/cache cp */
write_http_status_line(conn, 503, "Network status object unavailable");
smartlist_free(dir_fps);
- if (is_v3)
- geoip_note_ns_response(GEOIP_REJECT_UNAVAILABLE);
+ geoip_note_ns_response(GEOIP_REJECT_UNAVAILABLE);
goto done;
}
@@ -2938,15 +2653,13 @@ directory_handle_command_get(dir_connection_t *conn, const char *headers,
write_http_status_line(conn, 404, "Not found");
SMARTLIST_FOREACH(dir_fps, char *, cp, tor_free(cp));
smartlist_free(dir_fps);
- if (is_v3)
- geoip_note_ns_response(GEOIP_REJECT_NOT_FOUND);
+ geoip_note_ns_response(GEOIP_REJECT_NOT_FOUND);
goto done;
} else if (!smartlist_len(dir_fps)) {
write_http_status_line(conn, 304, "Not modified");
SMARTLIST_FOREACH(dir_fps, char *, cp, tor_free(cp));
smartlist_free(dir_fps);
- if (is_v3)
- geoip_note_ns_response(GEOIP_REJECT_NOT_MODIFIED);
+ geoip_note_ns_response(GEOIP_REJECT_NOT_MODIFIED);
goto done;
}
@@ -2958,17 +2671,19 @@ directory_handle_command_get(dir_connection_t *conn, const char *headers,
write_http_status_line(conn, 503, "Directory busy, try again later");
SMARTLIST_FOREACH(dir_fps, char *, fp, tor_free(fp));
smartlist_free(dir_fps);
- if (is_v3)
- geoip_note_ns_response(GEOIP_REJECT_BUSY);
+
+ geoip_note_ns_response(GEOIP_REJECT_BUSY);
goto done;
}
- if (is_v3) {
+ if (1) {
struct in_addr in;
tor_addr_t addr;
if (tor_inet_aton((TO_CONN(conn))->address, &in)) {
tor_addr_from_ipv4h(&addr, ntohl(in.s_addr));
- geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, &addr, time(NULL));
+ geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS,
+ &addr, NULL,
+ time(NULL));
geoip_note_ns_response(GEOIP_SUCCESS);
/* Note that a request for a network status has started, so that we
* can measure the download time later on. */
@@ -3310,32 +3025,6 @@ directory_handle_command_get(dir_connection_t *conn, const char *headers,
goto done;
}
- if (options->HSAuthoritativeDir && !strcmpstart(url,"/tor/rendezvous/")) {
- /* rendezvous descriptor fetch */
- const char *descp;
- size_t desc_len;
- const char *query = url+strlen("/tor/rendezvous/");
-
- log_info(LD_REND, "Handling rendezvous descriptor get");
- switch (rend_cache_lookup_desc(query, 0, &descp, &desc_len)) {
- case 1: /* valid */
- write_http_response_header_impl(conn, desc_len,
- "application/octet-stream",
- NULL, NULL, 0);
- note_request("/tor/rendezvous?/", desc_len);
- /* need to send descp separately, because it may include NULs */
- connection_write_to_buf(descp, desc_len, TO_CONN(conn));
- break;
- case 0: /* well-formed but not present */
- write_http_status_line(conn, 404, "Not found");
- break;
- case -1: /* not well-formed */
- write_http_status_line(conn, 400, "Bad request");
- break;
- }
- goto done;
- }
-
if (options->BridgeAuthoritativeDir &&
options->BridgePassword_AuthDigest_ &&
connection_dir_is_encrypted(conn) &&
@@ -3384,22 +3073,6 @@ directory_handle_command_get(dir_connection_t *conn, const char *headers,
goto done;
}
- if (!strcmp(url,"/tor/dbg-stability.txt")) {
- const char *stability;
- size_t len;
- if (options->BridgeAuthoritativeDir ||
- ! authdir_mode_tests_reachability(options) ||
- ! (stability = rep_hist_get_router_stability_doc(time(NULL)))) {
- write_http_status_line(conn, 404, "Not found.");
- goto done;
- }
-
- len = strlen(stability);
- write_http_response_header(conn, len, 0, 0);
- connection_write_to_buf(stability, len, TO_CONN(conn));
- goto done;
- }
-
#if defined(EXPORTMALLINFO) && defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO)
#define ADD_MALLINFO_LINE(x) do { \
smartlist_add_asprintf(lines, "%s %d\n", #x, mi.x); \
@@ -3474,19 +3147,20 @@ directory_handle_command_post(dir_connection_t *conn, const char *headers,
connection_dir_is_encrypted(conn) &&
!strcmpstart(url,"/tor/rendezvous2/publish")) {
switch (rend_cache_store_v2_desc_as_dir(body)) {
- case -2:
+ case RCS_NOTDIR:
log_info(LD_REND, "Rejected v2 rend descriptor (length %d) from %s "
"since we're not currently a hidden service directory.",
(int)body_len, conn->base_.address);
write_http_status_line(conn, 503, "Currently not acting as v2 "
"hidden service directory");
break;
- case -1:
+ case RCS_BADDESC:
log_warn(LD_REND, "Rejected v2 rend descriptor (length %d) from %s.",
(int)body_len, conn->base_.address);
write_http_status_line(conn, 400,
"Invalid v2 service descriptor rejected");
break;
+ case RCS_OKAY:
default:
write_http_status_line(conn, 200, "Service descriptor (v2) stored");
log_info(LD_REND, "Handled v2 rendezvous descriptor post: accepted");
@@ -3510,8 +3184,6 @@ directory_handle_command_post(dir_connection_t *conn, const char *headers,
was_router_added_t r = dirserv_add_multiple_descriptors(body, purpose,
conn->base_.address, &msg);
tor_assert(msg);
- if (WRA_WAS_ADDED(r))
- dirserv_get_directory(); /* rebuild and write to disk */
if (r == ROUTER_ADDED_NOTIFY_GENERATOR) {
/* Accepted with a message. */
@@ -3535,22 +3207,6 @@ directory_handle_command_post(dir_connection_t *conn, const char *headers,
goto done;
}
- if (options->HSAuthoritativeDir &&
- !strcmpstart(url,"/tor/rendezvous/publish")) {
- /* rendezvous descriptor post */
- log_info(LD_REND, "Handling rendezvous descriptor post.");
- if (rend_cache_store(body, body_len, 1, NULL) < 0) {
- log_fn(LOG_PROTOCOL_WARN, LD_DIRSERV,
- "Rejected rend descriptor (length %d) from %s.",
- (int)body_len, conn->base_.address);
- write_http_status_line(conn, 400,
- "Invalid v0 service descriptor rejected");
- } else {
- write_http_status_line(conn, 200, "Service descriptor (v0) stored");
- }
- goto done;
- }
-
if (authdir_mode_v3(options) &&
!strcmp(url,"/tor/post/vote")) { /* v3 networkstatus vote */
const char *msg = "OK";
@@ -3702,80 +3358,27 @@ connection_dir_finished_connecting(dir_connection_t *conn)
return 0;
}
-/** Called when one or more networkstatus fetches have failed (with uppercase
- * fingerprints listed in <b>failed</b>). Mark those fingerprints as having
- * failed once, unless they failed with status code 503. */
-static void
-dir_networkstatus_download_failed(smartlist_t *failed, int status_code)
-{
- if (status_code == 503)
- return;
- SMARTLIST_FOREACH_BEGIN(failed, const char *, fp) {
- char digest[DIGEST_LEN];
- dir_server_t *dir;
- if (base16_decode(digest, DIGEST_LEN, fp, strlen(fp))<0) {
- log_warn(LD_BUG, "Called with bad fingerprint in list: %s",
- escaped(fp));
- continue;
- }
- dir = router_get_fallback_dirserver_by_digest(digest);
-
- if (dir)
- download_status_failed(&dir->v2_ns_dl_status, status_code);
- } SMARTLIST_FOREACH_END(fp);
-}
-
-/** Schedule for when servers should download things in general. */
-static const int server_dl_schedule[] = {
- 0, 0, 0, 60, 60, 60*2, 60*5, 60*15, INT_MAX
-};
-/** Schedule for when clients should download things in general. */
-static const int client_dl_schedule[] = {
- 0, 0, 60, 60*5, 60*10, INT_MAX
-};
-/** Schedule for when servers should download consensuses. */
-static const int server_consensus_dl_schedule[] = {
- 0, 0, 60, 60*5, 60*10, 60*30, 60*30, 60*30, 60*30, 60*30, 60*60, 60*60*2
-};
-/** Schedule for when clients should download consensuses. */
-static const int client_consensus_dl_schedule[] = {
- 0, 0, 60, 60*5, 60*10, 60*30, 60*60, 60*60, 60*60, 60*60*3, 60*60*6, 60*60*12
-};
-/** Schedule for when clients should download bridge descriptors. */
-static const int bridge_dl_schedule[] = {
- 60*60, 15*60, 15*60, 60*60
-};
-
-/** Decide which download schedule we want to use, and then return a
- * pointer to it along with a pointer to its length. Helper function for
- * download_status_increment_failure() and download_status_reset(). */
-static void
-find_dl_schedule_and_len(download_status_t *dls, int server,
- const int **schedule, size_t *schedule_len)
+/** Decide which download schedule we want to use based on descriptor type
+ * in <b>dls</b> and whether we are acting as directory <b>server</b>, and
+ * then return a list of int pointers defining download delays in seconds.
+ * Helper function for download_status_increment_failure() and
+ * download_status_reset(). */
+static const smartlist_t *
+find_dl_schedule_and_len(download_status_t *dls, int server)
{
switch (dls->schedule) {
case DL_SCHED_GENERIC:
- if (server) {
- *schedule = server_dl_schedule;
- *schedule_len = sizeof(server_dl_schedule)/sizeof(int);
- } else {
- *schedule = client_dl_schedule;
- *schedule_len = sizeof(client_dl_schedule)/sizeof(int);
- }
- break;
+ if (server)
+ return get_options()->TestingServerDownloadSchedule;
+ else
+ return get_options()->TestingClientDownloadSchedule;
case DL_SCHED_CONSENSUS:
- if (server) {
- *schedule = server_consensus_dl_schedule;
- *schedule_len = sizeof(server_consensus_dl_schedule)/sizeof(int);
- } else {
- *schedule = client_consensus_dl_schedule;
- *schedule_len = sizeof(client_consensus_dl_schedule)/sizeof(int);
- }
- break;
+ if (server)
+ return get_options()->TestingServerConsensusDownloadSchedule;
+ else
+ return get_options()->TestingClientConsensusDownloadSchedule;
case DL_SCHED_BRIDGE:
- *schedule = bridge_dl_schedule;
- *schedule_len = sizeof(bridge_dl_schedule)/sizeof(int);
- break;
+ return get_options()->TestingBridgeDownloadSchedule;
default:
tor_assert(0);
}
@@ -3789,8 +3392,7 @@ time_t
download_status_increment_failure(download_status_t *dls, int status_code,
const char *item, int server, time_t now)
{
- const int *schedule;
- size_t schedule_len;
+ const smartlist_t *schedule;
int increment;
tor_assert(dls);
if (status_code != 503 || server) {
@@ -3798,14 +3400,14 @@ download_status_increment_failure(download_status_t *dls, int status_code,
++dls->n_download_failures;
}
- find_dl_schedule_and_len(dls, server, &schedule, &schedule_len);
+ schedule = find_dl_schedule_and_len(dls, server);
- if (dls->n_download_failures < schedule_len)
- increment = schedule[dls->n_download_failures];
+ if (dls->n_download_failures < smartlist_len(schedule))
+ increment = *(int *)smartlist_get(schedule, dls->n_download_failures);
else if (dls->n_download_failures == IMPOSSIBLE_TO_DOWNLOAD)
increment = INT_MAX;
else
- increment = schedule[schedule_len-1];
+ increment = *(int *)smartlist_get(schedule, smartlist_len(schedule) - 1);
if (increment < INT_MAX)
dls->next_attempt_at = now+increment;
@@ -3838,14 +3440,11 @@ download_status_increment_failure(download_status_t *dls, int status_code,
void
download_status_reset(download_status_t *dls)
{
- const int *schedule;
- size_t schedule_len;
-
- find_dl_schedule_and_len(dls, get_options()->DirPort_set,
- &schedule, &schedule_len);
+ const smartlist_t *schedule = find_dl_schedule_and_len(
+ dls, get_options()->DirPort_set);
dls->n_download_failures = 0;
- dls->next_attempt_at = time(NULL) + schedule[0];
+ dls->next_attempt_at = time(NULL) + *(int *)smartlist_get(schedule, 0);
}
/** Return the number of failures on <b>dls</b> since the last success (if
@@ -3890,7 +3489,8 @@ dir_routerdesc_download_failed(smartlist_t *failed, int status_code,
} else {
dls = router_get_dl_status_by_descriptor_digest(digest);
}
- if (!dls || dls->n_download_failures >= MAX_ROUTERDESC_DOWNLOAD_FAILURES)
+ if (!dls || dls->n_download_failures >=
+ get_options()->TestingDescriptorMaxDownloadTries)
continue;
download_status_increment_failure(dls, status_code, cp, server, now);
} SMARTLIST_FOREACH_END(cp);
@@ -3921,7 +3521,8 @@ dir_microdesc_download_failed(smartlist_t *failed,
if (!rs)
continue;
dls = &rs->dl_status;
- if (dls->n_download_failures >= MAX_MICRODESC_DOWNLOAD_FAILURES)
+ if (dls->n_download_failures >=
+ get_options()->TestingMicrodescMaxDownloadTries)
continue;
{
char buf[BASE64_DIGEST256_LEN+1];
diff --git a/src/or/directory.h b/src/or/directory.h
index 41f18a172..bc200797d 100644
--- a/src/or/directory.h
+++ b/src/or/directory.h
@@ -30,7 +30,7 @@ typedef enum {
DIRIND_ONEHOP=0,
/** Connect over a multi-hop anonymizing Tor circuit */
DIRIND_ANONYMOUS=1,
- /** Conncet to the DirPort directly */
+ /** Connect to the DirPort directly */
DIRIND_DIRECT_CONN,
/** Connect over a multi-hop anonymizing Tor circuit to our dirport */
DIRIND_ANON_DIRPORT,
@@ -63,7 +63,7 @@ int connection_dir_process_inbuf(dir_connection_t *conn);
int connection_dir_finished_flushing(dir_connection_t *conn);
int connection_dir_finished_connecting(dir_connection_t *conn);
void connection_dir_about_to_close(dir_connection_t *dir_conn);
-void directory_initiate_command(const char *address, const tor_addr_t *addr,
+void directory_initiate_command(const tor_addr_t *addr,
uint16_t or_port, uint16_t dir_port,
const char *digest,
uint8_t dir_purpose, uint8_t router_purpose,
@@ -118,5 +118,10 @@ download_status_mark_impossible(download_status_t *dl)
int download_status_get_n_failures(const download_status_t *dls);
+#ifdef TOR_UNIT_TESTS
+/* Used only by directory.c and test_dir.c */
+STATIC int parse_http_url(const char *headers, char **url);
+#endif
+
#endif
diff --git a/src/or/dirserv.c b/src/or/dirserv.c
index 3e46153a5..aedd09252 100644
--- a/src/or/dirserv.c
+++ b/src/or/dirserv.c
@@ -26,6 +26,7 @@
#include "router.h"
#include "routerlist.h"
#include "routerparse.h"
+#include "routerset.h"
/**
* \file dirserv.c
@@ -41,31 +42,10 @@
* directory authorities. */
#define MAX_UNTRUSTED_NETWORKSTATUSES 16
-/** If a v1 directory is older than this, discard it. */
-#define MAX_V1_DIRECTORY_AGE (30*24*60*60)
-/** If a v1 running-routers is older than this, discard it. */
-#define MAX_V1_RR_AGE (7*24*60*60)
-
extern time_t time_of_process_start; /* from main.c */
extern long stats_n_seconds_working; /* from main.c */
-/** Do we need to regenerate the v1 directory when someone asks for it? */
-static time_t the_directory_is_dirty = 1;
-/** Do we need to regenerate the v1 runningrouters document when somebody
- * asks for it? */
-static time_t runningrouters_is_dirty = 1;
-/** Do we need to regenerate our v2 networkstatus document when somebody asks
- * for it? */
-static time_t the_v2_networkstatus_is_dirty = 1;
-
-/** Most recently generated encoded signed v1 directory. (v1 auth dirservers
- * only.) */
-static cached_dir_t *the_directory = NULL;
-
-/** For authoritative directories: the current (v1) network status. */
-static cached_dir_t the_runningrouters;
-
/** Total number of routers with measured bandwidth; this is set by
* dirserv_count_measured_bws() before the loop in
* dirserv_generate_networkstatus_vote_obj() and checked by
@@ -74,14 +54,12 @@ static cached_dir_t the_runningrouters;
static int routers_with_measured_bw = 0;
static void directory_remove_invalid(void);
-static cached_dir_t *dirserv_regenerate_directory(void);
static char *format_versions_list(config_line_t *ln);
struct authdir_config_t;
static int add_fingerprint_to_dir(const char *nickname, const char *fp,
struct authdir_config_t *list);
static uint32_t
dirserv_get_status_impl(const char *fp, const char *nickname,
- const char *address,
uint32_t addr, uint16_t or_port,
const char *platform, const char *contact,
const char **msg, int should_log);
@@ -329,7 +307,6 @@ dirserv_router_get_status(const routerinfo_t *router, const char **msg)
}
return dirserv_get_status_impl(d, router->nickname,
- router->address,
router->addr, router->or_port,
router->platform, router->contact_info,
msg, 1);
@@ -343,7 +320,6 @@ dirserv_would_reject_router(const routerstatus_t *rs)
uint32_t res;
res = dirserv_get_status_impl(rs->identity_digest, rs->nickname,
- "", /* address is only used in logs */
rs->addr, rs->or_port,
NULL, NULL,
NULL, 0);
@@ -382,7 +358,6 @@ dirserv_get_name_status(const char *id_digest, const char *nickname)
*/
static uint32_t
dirserv_get_status_impl(const char *id_digest, const char *nickname,
- const char *address,
uint32_t addr, uint16_t or_port,
const char *platform, const char *contact,
const char **msg, int should_log)
@@ -399,13 +374,15 @@ dirserv_get_status_impl(const char *id_digest, const char *nickname,
strmap_size(fingerprint_list->fp_by_name),
digestmap_size(fingerprint_list->status_by_digest));
- /* Versions before Tor 0.2.2.35 have known security issues that
- * make them unsuitable for the current network. */
- if (platform && !tor_version_as_new_as(platform,"0.2.2.35")) {
+ /* Versions before Tor 0.2.3.16-alpha are too old to support, and are
+ * missing some important security fixes too. Disable them. */
+ if (platform && !tor_version_as_new_as(platform,"0.2.3.16-alpha")) {
if (msg)
*msg = "Tor version is insecure or unsupported. Please upgrade!";
return FP_REJECT;
- } else if (platform && tor_version_as_new_as(platform,"0.2.3.0-alpha")) {
+ }
+#if 0
+ else if (platform && tor_version_as_new_as(platform,"0.2.3.0-alpha")) {
/* Versions from 0.2.3-alpha...0.2.3.9-alpha have known security
* issues that make them unusable for the current network */
if (!tor_version_as_new_as(platform, "0.2.3.10-alpha")) {
@@ -414,6 +391,7 @@ dirserv_get_status_impl(const char *id_digest, const char *nickname,
return FP_REJECT;
}
}
+#endif
result = dirserv_get_name_status(id_digest, nickname);
if (result & FP_NAMED) {
@@ -454,14 +432,14 @@ dirserv_get_status_impl(const char *id_digest, const char *nickname,
if (should_log)
log_info(LD_DIRSERV,
"Marking '%s' as bad directory because of address '%s'",
- nickname, address);
+ nickname, fmt_addr32(addr));
result |= FP_BADDIR;
}
if (authdir_policy_badexit_address(addr, or_port)) {
if (should_log)
log_info(LD_DIRSERV, "Marking '%s' as bad exit because of address '%s'",
- nickname, address);
+ nickname, fmt_addr32(addr));
result |= FP_BADEXIT;
}
@@ -469,7 +447,7 @@ dirserv_get_status_impl(const char *id_digest, const char *nickname,
if (!authdir_policy_permits_address(addr, or_port)) {
if (should_log)
log_info(LD_DIRSERV, "Rejecting '%s' because of address '%s'",
- nickname, address);
+ nickname, fmt_addr32(addr));
if (msg)
*msg = "Authdir is rejecting routers in this range.";
return FP_REJECT;
@@ -477,7 +455,7 @@ dirserv_get_status_impl(const char *id_digest, const char *nickname,
if (!authdir_policy_valid_address(addr, or_port)) {
if (should_log)
log_info(LD_DIRSERV, "Not marking '%s' valid because of address '%s'",
- nickname, address);
+ nickname, fmt_addr32(addr));
result |= FP_INVALID;
}
if (reject_unlisted) {
@@ -526,19 +504,15 @@ dirserv_free_fingerprint_list(void)
static int
dirserv_router_has_valid_address(routerinfo_t *ri)
{
- struct in_addr iaddr;
+ tor_addr_t addr;
if (get_options()->DirAllowPrivateAddresses)
return 0; /* whatever it is, we're fine with it */
- if (!tor_inet_aton(ri->address, &iaddr)) {
- log_info(LD_DIRSERV,"Router %s published non-IP address '%s'. Refusing.",
- router_describe(ri),
- ri->address);
- return -1;
- }
- if (is_internal_IP(ntohl(iaddr.s_addr), 0)) {
+ tor_addr_from_ipv4h(&addr, ri->addr);
+
+ if (tor_addr_is_internal(&addr, 0)) {
log_info(LD_DIRSERV,
- "Router %s published internal IP address '%s'. Refusing.",
- router_describe(ri), ri->address);
+ "Router %s published internal IP address. Refusing.",
+ router_describe(ri));
return -1; /* it's a private IP, we should reject it */
}
return 0;
@@ -590,12 +564,10 @@ authdir_wants_to_reject_router(routerinfo_t *ri, const char **msg,
}
if (dirserv_router_has_valid_address(ri) < 0) {
log_fn(severity, LD_DIRSERV,
- "Router %s has invalid address '%s'. "
- "Not adding (%s).",
+ "Router %s has invalid address. Not adding (%s).",
router_describe(ri),
- ri->address,
esc_router_info(ri));
- *msg = "Rejected: Address is not an IP, or IP is a private address.";
+ *msg = "Rejected: Address is a private address.";
return -1;
}
@@ -839,7 +811,6 @@ dirserv_add_extrainfo(extrainfo_t *ei, const char **msg)
static void
directory_remove_invalid(void)
{
- int changed = 0;
routerlist_t *rl = router_get_routerlist();
smartlist_t *nodes = smartlist_new();
smartlist_add_all(nodes, nodelist_get_list());
@@ -857,7 +828,6 @@ directory_remove_invalid(void)
log_info(LD_DIRSERV, "Router %s is now rejected: %s",
description, msg?msg:"");
routerlist_remove(rl, ent, 0, time(NULL));
- changed = 1;
continue;
}
#if 0
@@ -866,72 +836,35 @@ directory_remove_invalid(void)
"Router %s is now %snamed.", description,
(r&FP_NAMED)?"":"un");
ent->is_named = (r&FP_NAMED)?1:0;
- changed = 1;
}
if (bool_neq((r & FP_UNNAMED), ent->auth_says_is_unnamed)) {
log_info(LD_DIRSERV,
"Router '%s' is now %snamed. (FP_UNNAMED)", description,
(r&FP_NAMED)?"":"un");
ent->is_named = (r&FP_NUNAMED)?0:1;
- changed = 1;
}
#endif
if (bool_neq((r & FP_INVALID), !node->is_valid)) {
log_info(LD_DIRSERV, "Router '%s' is now %svalid.", description,
(r&FP_INVALID) ? "in" : "");
node->is_valid = (r&FP_INVALID)?0:1;
- changed = 1;
}
if (bool_neq((r & FP_BADDIR), node->is_bad_directory)) {
log_info(LD_DIRSERV, "Router '%s' is now a %s directory", description,
(r & FP_BADDIR) ? "bad" : "good");
node->is_bad_directory = (r&FP_BADDIR) ? 1: 0;
- changed = 1;
}
if (bool_neq((r & FP_BADEXIT), node->is_bad_exit)) {
log_info(LD_DIRSERV, "Router '%s' is now a %s exit", description,
(r & FP_BADEXIT) ? "bad" : "good");
node->is_bad_exit = (r&FP_BADEXIT) ? 1: 0;
- changed = 1;
}
} SMARTLIST_FOREACH_END(node);
- if (changed)
- directory_set_dirty();
routerlist_assert_ok(rl);
smartlist_free(nodes);
}
-/** Mark the directory as <b>dirty</b> -- when we're next asked for a
- * directory, we will rebuild it instead of reusing the most recently
- * generated one.
- */
-void
-directory_set_dirty(void)
-{
- time_t now = time(NULL);
- int set_v1_dirty=0;
-
- /* Regenerate stubs only every 8 hours.
- * XXXX It would be nice to generate less often, but these are just
- * stubs: it doesn't matter. */
-#define STUB_REGENERATE_INTERVAL (8*60*60)
- if (!the_directory || !the_runningrouters.dir)
- set_v1_dirty = 1;
- else if (the_directory->published < now - STUB_REGENERATE_INTERVAL ||
- the_runningrouters.published < now - STUB_REGENERATE_INTERVAL)
- set_v1_dirty = 1;
-
- if (set_v1_dirty) {
- if (!the_directory_is_dirty)
- the_directory_is_dirty = now;
- if (!runningrouters_is_dirty)
- runningrouters_is_dirty = now;
- }
- if (!the_v2_networkstatus_is_dirty)
- the_v2_networkstatus_is_dirty = now;
-}
-
/**
* Allocate and return a description of the status of the server <b>desc</b>,
* for use in a v1-style router-status line. The server is listed
@@ -1271,14 +1204,6 @@ directory_fetches_dir_info_later(const or_options_t *options)
return options->UseBridges != 0;
}
-/** Return 1 if we want to cache v2 dir info (each status file).
- */
-int
-directory_caches_v2_dir_info(const or_options_t *options)
-{
- return options->DirPort_set;
-}
-
/** Return true iff we want to fetch and keep certificates for authorities
* that we don't acknowledge as aurthorities ourself.
*/
@@ -1313,15 +1238,6 @@ directory_permits_begindir_requests(const or_options_t *options)
return options->BridgeRelay != 0 || options->DirPort_set;
}
-/** Return 1 if we want to allow controllers to ask us directory
- * requests via the controller interface, which doesn't require
- * having any separate port open. */
-int
-directory_permits_controller_requests(const or_options_t *options)
-{
- return options->DirPort_set;
-}
-
/** Return 1 if we have no need to fetch new descriptors. This generally
* happens when we're not a dir cache and we haven't built any circuits
* lately.
@@ -1337,55 +1253,10 @@ directory_too_idle_to_fetch_descriptors(const or_options_t *options,
/********************************************************************/
-/* Used only by non-v1-auth dirservers: The v1 directory and
- * runningrouters we'll serve when requested. */
-
-/** The v1 directory we'll serve (as a cache or as an authority) if
- * requested. */
-static cached_dir_t *cached_directory = NULL;
-/** The v1 runningrouters document we'll serve (as a cache or as an authority)
- * if requested. */
-static cached_dir_t cached_runningrouters;
-
-/** Used for other dirservers' v2 network statuses. Map from hexdigest to
- * cached_dir_t. */
-static digestmap_t *cached_v2_networkstatus = NULL;
-
/** Map from flavor name to the cached_dir_t for the v3 consensuses that we're
* currently serving. */
static strmap_t *cached_consensuses = NULL;
-/** Possibly replace the contents of <b>d</b> with the value of
- * <b>directory</b> published on <b>when</b>, unless <b>when</b> is older than
- * the last value, or too far in the future.
- *
- * Does not copy <b>directory</b>; frees it if it isn't used.
- */
-static void
-set_cached_dir(cached_dir_t *d, char *directory, time_t when)
-{
- time_t now = time(NULL);
- if (when<=d->published) {
- log_info(LD_DIRSERV, "Ignoring old directory; not caching.");
- tor_free(directory);
- } else if (when>=now+ROUTER_MAX_AGE_TO_PUBLISH) {
- log_info(LD_DIRSERV, "Ignoring future directory; not caching.");
- tor_free(directory);
- } else {
- /* if (when>d->published && when<now+ROUTER_MAX_AGE) */
- log_debug(LD_DIRSERV, "Caching directory.");
- tor_free(d->dir);
- d->dir = directory;
- d->dir_len = strlen(directory);
- tor_free(d->dir_z);
- if (tor_gzip_compress(&(d->dir_z), &(d->dir_z_len), d->dir, d->dir_len,
- ZLIB_METHOD)) {
- log_warn(LD_BUG,"Error compressing cached directory");
- }
- d->published = when;
- }
-}
-
/** Decrement the reference count on <b>d</b>, and free it if it no longer has
* any references. */
void
@@ -1435,86 +1306,6 @@ free_cached_dir_(void *_d)
cached_dir_decref(d);
}
-/** If we have no cached v1 directory, or it is older than <b>published</b>,
- * then replace it with <b>directory</b>, published at <b>published</b>.
- *
- * If <b>published</b> is too old, do nothing.
- *
- * If <b>is_running_routers</b>, this is really a v1 running_routers
- * document rather than a v1 directory.
- */
-static void
-dirserv_set_cached_directory(const char *directory, time_t published)
-{
-
- cached_dir_decref(cached_directory);
- cached_directory = new_cached_dir(tor_strdup(directory), published);
-}
-
-/** If <b>networkstatus</b> is non-NULL, we've just received a v2
- * network-status for an authoritative directory with identity digest
- * <b>identity</b> published at <b>published</b> -- store it so we can
- * serve it to others.
- *
- * If <b>networkstatus</b> is NULL, remove the entry with the given
- * identity fingerprint from the v2 cache.
- */
-void
-dirserv_set_cached_networkstatus_v2(const char *networkstatus,
- const char *identity,
- time_t published)
-{
- cached_dir_t *d, *old_d;
- if (!cached_v2_networkstatus)
- cached_v2_networkstatus = digestmap_new();
-
- old_d = digestmap_get(cached_v2_networkstatus, identity);
- if (!old_d && !networkstatus)
- return;
-
- if (networkstatus) {
- if (!old_d || published > old_d->published) {
- d = new_cached_dir(tor_strdup(networkstatus), published);
- digestmap_set(cached_v2_networkstatus, identity, d);
- if (old_d)
- cached_dir_decref(old_d);
- }
- } else {
- if (old_d) {
- digestmap_remove(cached_v2_networkstatus, identity);
- cached_dir_decref(old_d);
- }
- }
-
- /* Now purge old entries. */
-
- if (digestmap_size(cached_v2_networkstatus) >
- get_n_authorities(V2_DIRINFO) + MAX_UNTRUSTED_NETWORKSTATUSES) {
- /* We need to remove the oldest untrusted networkstatus. */
- const char *oldest = NULL;
- time_t oldest_published = TIME_MAX;
- digestmap_iter_t *iter;
-
- for (iter = digestmap_iter_init(cached_v2_networkstatus);
- !digestmap_iter_done(iter);
- iter = digestmap_iter_next(cached_v2_networkstatus, iter)) {
- const char *ident;
- void *val;
- digestmap_iter_get(iter, &ident, &val);
- d = val;
- if (d->published < oldest_published &&
- !router_digest_is_trusted_dir(ident)) {
- oldest = ident;
- oldest_published = d->published;
- }
- }
- tor_assert(oldest);
- d = digestmap_remove(cached_v2_networkstatus, oldest);
- if (d)
- cached_dir_decref(d);
- }
-}
-
/** Replace the v3 consensus networkstatus of type <b>flavor_name</b> that
* we're serving with <b>networkstatus</b>, published at <b>published</b>. No
* validation is performed. */
@@ -1537,186 +1328,6 @@ dirserv_set_cached_consensus_networkstatus(const char *networkstatus,
cached_dir_decref(old_networkstatus);
}
-/** Remove any v2 networkstatus from the directory cache that was published
- * before <b>cutoff</b>. */
-void
-dirserv_clear_old_networkstatuses(time_t cutoff)
-{
- if (!cached_v2_networkstatus)
- return;
-
- DIGESTMAP_FOREACH_MODIFY(cached_v2_networkstatus, id, cached_dir_t *, dir) {
- if (dir->published < cutoff) {
- char *fname;
- fname = networkstatus_get_cache_filename(id);
- if (file_status(fname) == FN_FILE) {
- log_info(LD_DIR, "Removing too-old untrusted networkstatus in %s",
- fname);
- unlink(fname);
- }
- tor_free(fname);
- cached_dir_decref(dir);
- MAP_DEL_CURRENT(id);
- }
- } DIGESTMAP_FOREACH_END
-}
-
-/** Remove any v1 info from the directory cache that was published
- * too long ago. */
-void
-dirserv_clear_old_v1_info(time_t now)
-{
- if (cached_directory &&
- cached_directory->published < (now - MAX_V1_DIRECTORY_AGE)) {
- cached_dir_decref(cached_directory);
- cached_directory = NULL;
- }
- if (cached_runningrouters.published < (now - MAX_V1_RR_AGE)) {
- clear_cached_dir(&cached_runningrouters);
- }
-}
-
-/** Helper: If we're an authority for the right directory version (v1 or v2)
- * (based on <b>auth_type</b>), try to regenerate
- * auth_src as appropriate and return it, falling back to cache_src on
- * failure. If we're a cache, simply return cache_src.
- */
-static cached_dir_t *
-dirserv_pick_cached_dir_obj(cached_dir_t *cache_src,
- cached_dir_t *auth_src,
- time_t dirty, cached_dir_t *(*regenerate)(void),
- const char *name,
- dirinfo_type_t auth_type)
-{
- const or_options_t *options = get_options();
- int authority = (auth_type == V1_DIRINFO && authdir_mode_v1(options)) ||
- (auth_type == V2_DIRINFO && authdir_mode_v2(options));
-
- if (!authority || authdir_mode_bridge(options)) {
- return cache_src;
- } else {
- /* We're authoritative. */
- if (regenerate != NULL) {
- if (dirty && dirty + DIR_REGEN_SLACK_TIME < time(NULL)) {
- if (!(auth_src = regenerate())) {
- log_err(LD_BUG, "Couldn't generate %s?", name);
- exit(1);
- }
- } else {
- log_info(LD_DIRSERV, "The %s is still clean; reusing.", name);
- }
- }
- return auth_src ? auth_src : cache_src;
- }
-}
-
-/** Return the most recently generated encoded signed v1 directory,
- * generating a new one as necessary. If not a v1 authoritative directory
- * may return NULL if no directory is yet cached. */
-cached_dir_t *
-dirserv_get_directory(void)
-{
- return dirserv_pick_cached_dir_obj(cached_directory, the_directory,
- the_directory_is_dirty,
- dirserv_regenerate_directory,
- "v1 server directory", V1_DIRINFO);
-}
-
-/** Only called by v1 auth dirservers.
- * Generate a fresh v1 directory; set the_directory and return a pointer
- * to the new value.
- */
-static cached_dir_t *
-dirserv_regenerate_directory(void)
-{
- /* XXXX 024 Get rid of this function if we can confirm that nobody's
- * fetching these any longer */
- char *new_directory=NULL;
-
- if (dirserv_dump_directory_to_string(&new_directory,
- get_server_identity_key())) {
- log_warn(LD_BUG, "Error creating directory.");
- tor_free(new_directory);
- return NULL;
- }
- cached_dir_decref(the_directory);
- the_directory = new_cached_dir(new_directory, time(NULL));
- log_info(LD_DIRSERV,"New directory (size %d) has been built.",
- (int)the_directory->dir_len);
- log_debug(LD_DIRSERV,"New directory (size %d):\n%s",
- (int)the_directory->dir_len, the_directory->dir);
-
- the_directory_is_dirty = 0;
-
- /* Save the directory to disk so we re-load it quickly on startup.
- */
- dirserv_set_cached_directory(the_directory->dir, time(NULL));
-
- return the_directory;
-}
-
-/** Only called by v1 auth dirservers.
- * Replace the current running-routers list with a newly generated one. */
-static cached_dir_t *
-generate_runningrouters(void)
-{
- char *s=NULL;
- char digest[DIGEST_LEN];
- char published[ISO_TIME_LEN+1];
- size_t len;
- crypto_pk_t *private_key = get_server_identity_key();
- char *identity_pkey; /* Identity key, DER64-encoded. */
- size_t identity_pkey_len;
-
- if (crypto_pk_write_public_key_to_string(private_key,&identity_pkey,
- &identity_pkey_len)<0) {
- log_warn(LD_BUG,"write identity_pkey to string failed!");
- goto err;
- }
- format_iso_time(published, time(NULL));
-
- len = 2048;
- s = tor_malloc_zero(len);
- tor_snprintf(s, len,
- "network-status\n"
- "published %s\n"
- "router-status %s\n"
- "dir-signing-key\n%s"
- "directory-signature %s\n",
- published, "", identity_pkey,
- get_options()->Nickname);
- tor_free(identity_pkey);
- if (router_get_runningrouters_hash(s,digest)) {
- log_warn(LD_BUG,"couldn't compute digest");
- goto err;
- }
- note_crypto_pk_op(SIGN_DIR);
- if (router_append_dirobj_signature(s, len, digest, DIGEST_LEN,
- private_key)<0)
- goto err;
-
- set_cached_dir(&the_runningrouters, s, time(NULL));
- runningrouters_is_dirty = 0;
-
- return &the_runningrouters;
- err:
- tor_free(s);
- return NULL;
-}
-
-/** Set *<b>rr</b> to the most recently generated encoded signed
- * running-routers list, generating a new one as necessary. Return the
- * size of the directory on success, and 0 on failure. */
-cached_dir_t *
-dirserv_get_runningrouters(void)
-{
- return dirserv_pick_cached_dir_obj(
- &cached_runningrouters, &the_runningrouters,
- runningrouters_is_dirty,
- generate_runningrouters,
- "v1 network status list", V1_DIRINFO);
-}
-
/** Return the latest downloaded consensus networkstatus in encoded, signed,
* optionally compressed format, suitable for sending to clients. */
cached_dir_t *
@@ -1727,19 +1338,6 @@ dirserv_get_consensus(const char *flavor_name)
return strmap_get(cached_consensuses, flavor_name);
}
-/** For authoritative directories: the current (v2) network status. */
-static cached_dir_t *the_v2_networkstatus = NULL;
-
-/** Return true iff our opinion of the routers has been stale for long
- * enough that we should generate a new v2 network status doc. */
-static int
-should_generate_v2_networkstatus(void)
-{
- return authdir_mode_v2(get_options()) &&
- the_v2_networkstatus_is_dirty &&
- the_v2_networkstatus_is_dirty + DIR_REGEN_SLACK_TIME < time(NULL);
-}
-
/** If a router's uptime is at least this value, then it is always
* considered stable, regardless of the rest of the network. This
* way we resist attacks where an attacker doubles the size of the
@@ -1907,7 +1505,7 @@ router_counts_toward_thresholds(const node_t *node, time_t now,
* the Weighted Fractional Uptime history, and use them to set thresholds for
* the Stable, Fast, and Guard flags. Update the fields stable_uptime,
* stable_mtbf, enough_mtbf_info, guard_wfu, guard_tk, fast_bandwidth,
- * guard_bandwidh_including_exits, guard_bandwidth_excluding_exits,
+ * guard_bandwidth_including_exits, and guard_bandwidth_excluding_exits.
*
* Also, set the is_exit flag of each router appropriately. */
static void
@@ -1956,6 +1554,10 @@ dirserv_compute_performance_thresholds(routerlist_t *rl,
/* Now, fill in the arrays. */
SMARTLIST_FOREACH_BEGIN(nodelist_get_list(), node_t *, node) {
+ if (options->BridgeAuthoritativeDir &&
+ node->ri &&
+ node->ri->purpose != ROUTER_PURPOSE_BRIDGE)
+ continue;
if (router_counts_toward_thresholds(node, now, omit_as_sybil,
require_mbw)) {
routerinfo_t *ri = node->ri;
@@ -2070,6 +1672,21 @@ dirserv_compute_performance_thresholds(routerlist_t *rl,
tor_free(wfus);
}
+/* Use dirserv_compute_performance_thresholds() to compute the thresholds
+ * for the status flags, specifically for bridges.
+ *
+ * This is only called by a Bridge Authority from
+ * networkstatus_getinfo_by_purpose().
+ */
+void
+dirserv_compute_bridge_flag_thresholds(routerlist_t *rl)
+{
+
+ digestmap_t *omit_as_sybil = digestmap_new();
+ dirserv_compute_performance_thresholds(rl, omit_as_sybil);
+ digestmap_free(omit_as_sybil, NULL);
+}
+
/** Measured bandwidth cache entry */
typedef struct mbw_cache_entry_s {
long mbw_kb;
@@ -2082,7 +1699,7 @@ static digestmap_t *mbw_cache = NULL;
/** Store a measured bandwidth cache entry when reading the measured
* bandwidths file. */
-void
+STATIC void
dirserv_cache_measured_bw(const measured_bw_line_t *parsed_line,
time_t as_of)
{
@@ -2112,7 +1729,7 @@ dirserv_cache_measured_bw(const measured_bw_line_t *parsed_line,
}
/** Clear and free the measured bandwidth cache */
-void
+STATIC void
dirserv_clear_measured_bw_cache(void)
{
if (mbw_cache) {
@@ -2123,7 +1740,7 @@ dirserv_clear_measured_bw_cache(void)
}
/** Scan the measured bandwidth cache and remove expired entries */
-void
+STATIC void
dirserv_expire_measured_bw_cache(time_t now)
{
@@ -2145,7 +1762,7 @@ dirserv_expire_measured_bw_cache(time_t now)
}
/** Get the current size of the measured bandwidth cache */
-int
+STATIC int
dirserv_get_measured_bw_cache_size(void)
{
if (mbw_cache) return digestmap_size(mbw_cache);
@@ -2155,7 +1772,7 @@ dirserv_get_measured_bw_cache_size(void)
/** Query the cache by identity digest, return value indicates whether
* we found it. The bw_out and as_of_out pointers receive the cached
* bandwidth value and the time it was cached if not NULL. */
-int
+STATIC int
dirserv_query_measured_bw_cache_kb(const char *node_id, long *bw_kb_out,
time_t *as_of_out)
{
@@ -2176,7 +1793,7 @@ dirserv_query_measured_bw_cache_kb(const char *node_id, long *bw_kb_out,
}
/** Predicate wrapper for dirserv_query_measured_bw_cache() */
-int
+STATIC int
dirserv_has_measured_bw(const char *node_id)
{
return dirserv_query_measured_bw_cache_kb(node_id, NULL, NULL);
@@ -2391,7 +2008,7 @@ routerstatus_format_entry(const routerstatus_t *rs, const char *version,
rs->is_flagged_running?" Running":"",
rs->is_stable?" Stable":"",
rs->is_unnamed?" Unnamed":"",
- rs->is_v2_dir?" V2Dir":"",
+ (rs->dir_port!=0)?" V2Dir":"",
rs->is_valid?" Valid":"");
/* length of "opt v \n" */
@@ -2705,12 +2322,16 @@ set_routerstatus_from_routerinfo(routerstatus_t *rs,
} else {
rs->is_possible_guard = 0;
}
+ if (options->TestingTorNetwork &&
+ routerset_contains_routerstatus(options->TestingDirAuthVoteGuard,
+ rs, 0)) {
+ rs->is_possible_guard = 1;
+ }
rs->is_bad_directory = listbaddirs && node->is_bad_directory;
rs->is_bad_exit = listbadexits && node->is_bad_exit;
node->is_hs_dir = dirserv_thinks_router_is_hs_dir(ri, node, now);
rs->is_hs_dir = vote_on_hsdirs && node->is_hs_dir;
- rs->is_v2_dir = ri->dir_port != 0;
if (!strcasecmp(ri->nickname, UNNAMED_ROUTER_NICKNAME))
rs->is_named = rs->is_unnamed = 0;
@@ -2741,7 +2362,7 @@ static void
clear_status_flags_on_sybil(routerstatus_t *rs)
{
rs->is_authority = rs->is_exit = rs->is_stable = rs->is_fast =
- rs->is_flagged_running = rs->is_named = rs->is_valid = rs->is_v2_dir =
+ rs->is_flagged_running = rs->is_named = rs->is_valid =
rs->is_hs_dir = rs->is_possible_guard = rs->is_bad_exit =
rs->is_bad_directory = 0;
/* FFFF we might want some mechanism to check later on if we
@@ -2754,7 +2375,7 @@ clear_status_flags_on_sybil(routerstatus_t *rs)
* into a measured_bw_line_t output structure. Returns -1 on failure
* or 0 on success.
*/
-int
+STATIC int
measured_bw_line_parse(measured_bw_line_t *out, const char *orig_line)
{
char *line = tor_strdup(orig_line);
@@ -2835,7 +2456,7 @@ measured_bw_line_parse(measured_bw_line_t *out, const char *orig_line)
* of bandwidth statuses. Returns true if a line is found,
* false otherwise.
*/
-int
+STATIC int
measured_bw_line_apply(measured_bw_line_t *parsed_line,
smartlist_t *routerstatuses)
{
@@ -2886,7 +2507,7 @@ dirserv_read_measured_bandwidths(const char *from_file,
}
line[strlen(line)-1] = '\0';
- file_time = tor_parse_ulong(line, 10, 0, ULONG_MAX, &ok, NULL);
+ file_time = (time_t)tor_parse_ulong(line, 10, 0, ULONG_MAX, &ok, NULL);
if (!ok) {
log_warn(LD_DIRSERV, "Non-integer time in bandwidth file: %s",
escaped(line));
@@ -2957,14 +2578,6 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_t *private_key,
tor_assert(private_key);
tor_assert(cert);
- if (resolve_my_address(LOG_WARN, options, &addr, NULL, &hostname)<0) {
- log_warn(LD_NET, "Couldn't resolve my hostname");
- return NULL;
- }
- if (!hostname || !strchr(hostname, '.')) {
- tor_free(hostname);
- hostname = tor_dup_ip(addr);
- }
if (crypto_pk_get_digest(private_key, signing_key_digest)<0) {
log_err(LD_BUG, "Error computing signing key digest");
return NULL;
@@ -2973,6 +2586,14 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_t *private_key,
log_err(LD_BUG, "Error computing identity key digest");
return NULL;
}
+ if (resolve_my_address(LOG_WARN, options, &addr, NULL, &hostname)<0) {
+ log_warn(LD_NET, "Couldn't resolve my hostname");
+ return NULL;
+ }
+ if (!hostname || !strchr(hostname, '.')) {
+ tor_free(hostname);
+ hostname = tor_dup_ip(addr);
+ }
if (options->VersioningAuthoritativeDir) {
client_versions = format_versions_list(options->RecommendedClientVersions);
@@ -3093,7 +2714,8 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_t *private_key,
else
last_consensus_interval = options->TestingV3AuthInitialVotingInterval;
v3_out->valid_after =
- dirvote_get_start_of_next_interval(now, (int)last_consensus_interval);
+ dirvote_get_start_of_next_interval(now, (int)last_consensus_interval,
+ options->TestingV3AuthVotingStartOffset);
format_iso_time(tbuf, v3_out->valid_after);
log_notice(LD_DIR,"Choosing valid-after time in vote as %s: "
"consensus_set=%d, last_interval=%d",
@@ -3164,270 +2786,6 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_t *private_key,
return v3_out;
}
-/** For v2 authoritative directories only: Replace the contents of
- * <b>the_v2_networkstatus</b> with a newly generated network status
- * object. */
-cached_dir_t *
-generate_v2_networkstatus_opinion(void)
-{
- cached_dir_t *r = NULL;
- size_t identity_pkey_len;
- char *status = NULL, *client_versions = NULL, *server_versions = NULL,
- *identity_pkey = NULL, *hostname = NULL;
- const or_options_t *options = get_options();
- char fingerprint[FINGERPRINT_LEN+1];
- char published[ISO_TIME_LEN+1];
- char digest[DIGEST_LEN];
- uint32_t addr;
- crypto_pk_t *private_key;
- routerlist_t *rl = router_get_routerlist();
- time_t now = time(NULL);
- time_t cutoff = now - ROUTER_MAX_AGE_TO_PUBLISH;
- int naming = options->NamingAuthoritativeDir;
- int versioning = options->VersioningAuthoritativeDir;
- int listbaddirs = options->AuthDirListBadDirs;
- int listbadexits = options->AuthDirListBadExits;
- int vote_on_hsdirs = options->VoteOnHidServDirectoriesV2;
- const char *contact;
- char *version_lines = NULL;
- smartlist_t *routers = NULL;
- digestmap_t *omit_as_sybil = NULL;
- smartlist_t *chunks = NULL;
-
- private_key = get_server_identity_key();
-
- if (resolve_my_address(LOG_WARN, options, &addr, NULL, &hostname)<0) {
- log_warn(LD_NET, "Couldn't resolve my hostname");
- goto done;
- }
- if (!hostname)
- hostname = tor_dup_ip(addr);
-
- format_iso_time(published, now);
-
- client_versions = format_versions_list(options->RecommendedClientVersions);
- server_versions = format_versions_list(options->RecommendedServerVersions);
-
- if (crypto_pk_write_public_key_to_string(private_key, &identity_pkey,
- &identity_pkey_len)<0) {
- log_warn(LD_BUG,"Writing public key to string failed.");
- goto done;
- }
-
- if (crypto_pk_get_fingerprint(private_key, fingerprint, 0)<0) {
- log_err(LD_BUG, "Error computing fingerprint");
- goto done;
- }
-
- contact = options->ContactInfo;
- if (!contact)
- contact = "(none)";
-
- if (versioning) {
- tor_asprintf(&version_lines,
- "client-versions %s\nserver-versions %s\n",
- client_versions, server_versions);
- } else {
- version_lines = tor_strdup("");
- }
-
- chunks = smartlist_new();
- smartlist_add_asprintf(chunks,
- "network-status-version 2\n"
- "dir-source %s %s %d\n"
- "fingerprint %s\n"
- "contact %s\n"
- "published %s\n"
- "dir-options%s%s%s%s\n"
- "%s" /* client version line, server version line. */
- "dir-signing-key\n%s",
- hostname, fmt_addr32(addr),
- (int)router_get_advertised_dir_port(options, 0),
- fingerprint,
- contact,
- published,
- naming ? " Names" : "",
- listbaddirs ? " BadDirectories" : "",
- listbadexits ? " BadExits" : "",
- versioning ? " Versions" : "",
- version_lines,
- identity_pkey);
-
- /* precompute this part, since we need it to decide what "stable"
- * means. */
- SMARTLIST_FOREACH(rl->routers, routerinfo_t *, ri, {
- dirserv_set_router_is_running(ri, now);
- });
-
- routers = smartlist_new();
- smartlist_add_all(routers, rl->routers);
- routers_sort_by_identity(routers);
- omit_as_sybil = get_possible_sybil_list(routers);
-
- dirserv_compute_performance_thresholds(rl, omit_as_sybil);
-
- SMARTLIST_FOREACH_BEGIN(routers, routerinfo_t *, ri) {
- if (ri->cache_info.published_on >= cutoff) {
- routerstatus_t rs;
- char *version = version_from_platform(ri->platform);
- node_t *node = node_get_mutable_by_id(ri->cache_info.identity_digest);
- if (!node) {
- tor_free(version);
- continue;
- }
- set_routerstatus_from_routerinfo(&rs, node, ri, now,
- naming, listbadexits, listbaddirs,
- vote_on_hsdirs);
-
- if (digestmap_get(omit_as_sybil, ri->cache_info.identity_digest))
- clear_status_flags_on_sybil(&rs);
-
- {
- char *rsf = routerstatus_format_entry(&rs, version, NS_V2, NULL);
- if (rsf)
- smartlist_add(chunks, rsf);
- }
- tor_free(version);
- }
- } SMARTLIST_FOREACH_END(ri);
-
- smartlist_add_asprintf(chunks, "directory-signature %s\n",
- options->Nickname);
-
- crypto_digest_smartlist(digest, DIGEST_LEN, chunks, "", DIGEST_SHA1);
-
- note_crypto_pk_op(SIGN_DIR);
- {
- char *sig;
- if (!(sig = router_get_dirobj_signature(digest,DIGEST_LEN,
- private_key))) {
- log_warn(LD_BUG, "Unable to sign router status.");
- goto done;
- }
- smartlist_add(chunks, sig);
- }
-
- status = smartlist_join_strings(chunks, "", 0, NULL);
-
- {
- networkstatus_v2_t *ns;
- if (!(ns = networkstatus_v2_parse_from_string(status))) {
- log_err(LD_BUG,"Generated a networkstatus we couldn't parse.");
- goto done;
- }
- networkstatus_v2_free(ns);
- }
-
- {
- cached_dir_t **ns_ptr = &the_v2_networkstatus;
- if (*ns_ptr)
- cached_dir_decref(*ns_ptr);
- *ns_ptr = new_cached_dir(status, now);
- status = NULL; /* So it doesn't get double-freed. */
- the_v2_networkstatus_is_dirty = 0;
- router_set_networkstatus_v2((*ns_ptr)->dir, now, NS_GENERATED, NULL);
- r = *ns_ptr;
- }
-
- done:
- if (chunks) {
- SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp));
- smartlist_free(chunks);
- }
- tor_free(client_versions);
- tor_free(server_versions);
- tor_free(version_lines);
- tor_free(status);
- tor_free(hostname);
- tor_free(identity_pkey);
- smartlist_free(routers);
- digestmap_free(omit_as_sybil, NULL);
- return r;
-}
-
-/** Given the portion of a networkstatus request URL after "tor/status/" in
- * <b>key</b>, append to <b>result</b> the digests of the identity keys of the
- * networkstatus objects that the client has requested. */
-void
-dirserv_get_networkstatus_v2_fingerprints(smartlist_t *result,
- const char *key)
-{
- tor_assert(result);
-
- if (!cached_v2_networkstatus)
- cached_v2_networkstatus = digestmap_new();
-
- if (should_generate_v2_networkstatus())
- generate_v2_networkstatus_opinion();
-
- if (!strcmp(key,"authority")) {
- if (authdir_mode_v2(get_options())) {
- const routerinfo_t *me = router_get_my_routerinfo();
- if (me)
- smartlist_add(result,
- tor_memdup(me->cache_info.identity_digest, DIGEST_LEN));
- }
- } else if (!strcmp(key, "all")) {
- if (digestmap_size(cached_v2_networkstatus)) {
- digestmap_iter_t *iter;
- iter = digestmap_iter_init(cached_v2_networkstatus);
- while (!digestmap_iter_done(iter)) {
- const char *ident;
- void *val;
- digestmap_iter_get(iter, &ident, &val);
- smartlist_add(result, tor_memdup(ident, DIGEST_LEN));
- iter = digestmap_iter_next(cached_v2_networkstatus, iter);
- }
- } else {
- SMARTLIST_FOREACH(router_get_trusted_dir_servers(),
- dir_server_t *, ds,
- if (ds->type & V2_DIRINFO)
- smartlist_add(result, tor_memdup(ds->digest, DIGEST_LEN)));
- }
- smartlist_sort_digests(result);
- if (smartlist_len(result) == 0)
- log_info(LD_DIRSERV,
- "Client requested 'all' network status objects; we have none.");
- } else if (!strcmpstart(key, "fp/")) {
- dir_split_resource_into_fingerprints(key+3, result, NULL,
- DSR_HEX|DSR_SORT_UNIQ);
- }
-}
-
-/** Look for a network status object as specified by <b>key</b>, which should
- * be either "authority" (to find a network status generated by us), a hex
- * identity digest (to find a network status generated by given directory), or
- * "all" (to return all the v2 network status objects we have).
- */
-void
-dirserv_get_networkstatus_v2(smartlist_t *result,
- const char *key)
-{
- cached_dir_t *cached;
- smartlist_t *fingerprints = smartlist_new();
- tor_assert(result);
-
- if (!cached_v2_networkstatus)
- cached_v2_networkstatus = digestmap_new();
-
- dirserv_get_networkstatus_v2_fingerprints(fingerprints, key);
- SMARTLIST_FOREACH_BEGIN(fingerprints, const char *, fp) {
- if (router_digest_is_me(fp) && should_generate_v2_networkstatus())
- generate_v2_networkstatus_opinion();
- cached = digestmap_get(cached_v2_networkstatus, fp);
- if (cached) {
- smartlist_add(result, cached);
- } else {
- char hexbuf[HEX_DIGEST_LEN+1];
- base16_encode(hexbuf, sizeof(hexbuf), fp, DIGEST_LEN);
- log_info(LD_DIRSERV, "Don't know about any network status with "
- "fingerprint '%s'", hexbuf);
- }
- } SMARTLIST_FOREACH_END(fp);
- SMARTLIST_FOREACH(fingerprints, char *, cp, tor_free(cp));
- smartlist_free(fingerprints);
-}
-
/** As dirserv_get_routerdescs(), but instead of getting signed_descriptor_t
* pointers, adds copies of digests to fps_out, and doesn't use the
* /tor/server/ prefix. For a /d/ request, adds descriptor digests; for other
@@ -3661,7 +3019,7 @@ dirserv_single_reachability_test(time_t now, routerinfo_t *router)
/* IPv4. */
log_debug(LD_OR,"Testing reachability of %s at %s:%u.",
- router->nickname, router->address, router->or_port);
+ router->nickname, fmt_addr32(router->addr), router->or_port);
tor_addr_from_ipv4h(&router_addr, router->addr);
chan = channel_tls_connect(&router_addr, router->or_port,
router->cache_info.identity_digest);
@@ -3727,15 +3085,12 @@ static cached_dir_t *
lookup_cached_dir_by_fp(const char *fp)
{
cached_dir_t *d = NULL;
- if (tor_digest_is_zero(fp) && cached_consensuses)
+ if (tor_digest_is_zero(fp) && cached_consensuses) {
d = strmap_get(cached_consensuses, "ns");
- else if (memchr(fp, '\0', DIGEST_LEN) && cached_consensuses &&
+ } else if (memchr(fp, '\0', DIGEST_LEN) && cached_consensuses &&
(d = strmap_get(cached_consensuses, fp))) {
/* this here interface is a nasty hack XXXX024 */;
- } else if (router_digest_is_me(fp) && the_v2_networkstatus)
- d = the_v2_networkstatus;
- else if (cached_v2_networkstatus)
- d = digestmap_get(cached_v2_networkstatus, fp);
+ }
return d;
}
@@ -3941,8 +3296,6 @@ connection_dirserv_add_servers_to_outbuf(dir_connection_t *conn)
}
body = signed_descriptor_get_body(sd);
if (conn->zlib_state) {
- /* XXXX024 This 'last' business should actually happen on the last
- * routerinfo, not on the last fingerprint. */
int last = ! smartlist_len(conn->fingerprint_stack);
connection_write_to_buf_zlib(body, sd->signed_descriptor_len, conn,
last);
@@ -3959,6 +3312,11 @@ connection_dirserv_add_servers_to_outbuf(dir_connection_t *conn)
if (!smartlist_len(conn->fingerprint_stack)) {
/* We just wrote the last one; finish up. */
+ if (conn->zlib_state) {
+ connection_write_to_buf_zlib("", 0, conn, 1);
+ tor_zlib_free(conn->zlib_state);
+ conn->zlib_state = NULL;
+ }
conn->dir_spool_src = DIR_SPOOL_NONE;
smartlist_free(conn->fingerprint_stack);
conn->fingerprint_stack = NULL;
@@ -3984,8 +3342,6 @@ connection_dirserv_add_microdescs_to_outbuf(dir_connection_t *conn)
if (!md || !md->body)
continue;
if (conn->zlib_state) {
- /* XXXX024 This 'last' business should actually happen on the last
- * routerinfo, not on the last fingerprint. */
int last = !smartlist_len(conn->fingerprint_stack);
connection_write_to_buf_zlib(md->body, md->bodylen, conn, last);
if (last) {
@@ -3997,6 +3353,11 @@ connection_dirserv_add_microdescs_to_outbuf(dir_connection_t *conn)
}
}
if (!smartlist_len(conn->fingerprint_stack)) {
+ if (conn->zlib_state) {
+ connection_write_to_buf_zlib("", 0, conn, 1);
+ tor_zlib_free(conn->zlib_state);
+ conn->zlib_state = NULL;
+ }
conn->dir_spool_src = DIR_SPOOL_NONE;
smartlist_free(conn->fingerprint_stack);
conn->fingerprint_stack = NULL;
@@ -4128,14 +3489,6 @@ dirserv_free_all(void)
{
dirserv_free_fingerprint_list();
- cached_dir_decref(the_directory);
- clear_cached_dir(&the_runningrouters);
- cached_dir_decref(the_v2_networkstatus);
- cached_dir_decref(cached_directory);
- clear_cached_dir(&cached_runningrouters);
-
- digestmap_free(cached_v2_networkstatus, free_cached_dir_);
- cached_v2_networkstatus = NULL;
strmap_free(cached_consensuses, free_cached_dir_);
cached_consensuses = NULL;
diff --git a/src/or/dirserv.h b/src/or/dirserv.h
index f9d36d760..858e6e3a0 100644
--- a/src/or/dirserv.h
+++ b/src/or/dirserv.h
@@ -12,6 +12,8 @@
#ifndef TOR_DIRSERV_H
#define TOR_DIRSERV_H
+#include "testsupport.h"
+
/** What fraction (1 over this number) of the relay ID space do we
* (as a directory authority) launch connections to at each reachability
* test? */
@@ -49,34 +51,23 @@ int list_server_status_v1(smartlist_t *routers, char **router_status_out,
int dirserv_dump_directory_to_string(char **dir_out,
crypto_pk_t *private_key);
char *dirserv_get_flag_thresholds_line(void);
+void dirserv_compute_bridge_flag_thresholds(routerlist_t *rl);
int directory_fetches_from_authorities(const or_options_t *options);
int directory_fetches_dir_info_early(const or_options_t *options);
int directory_fetches_dir_info_later(const or_options_t *options);
-int directory_caches_v2_dir_info(const or_options_t *options);
int directory_caches_unknown_auth_certs(const or_options_t *options);
int directory_caches_dir_info(const or_options_t *options);
int directory_permits_begindir_requests(const or_options_t *options);
-int directory_permits_controller_requests(const or_options_t *options);
int directory_too_idle_to_fetch_descriptors(const or_options_t *options,
time_t now);
-void directory_set_dirty(void);
-cached_dir_t *dirserv_get_directory(void);
-cached_dir_t *dirserv_get_runningrouters(void);
cached_dir_t *dirserv_get_consensus(const char *flavor_name);
-void dirserv_set_cached_networkstatus_v2(const char *directory,
- const char *identity,
- time_t published);
void dirserv_set_cached_consensus_networkstatus(const char *consensus,
const char *flavor_name,
const digests_t *digests,
time_t published);
void dirserv_clear_old_networkstatuses(time_t cutoff);
-void dirserv_clear_old_v1_info(time_t now);
-void dirserv_get_networkstatus_v2(smartlist_t *result, const char *key);
-void dirserv_get_networkstatus_v2_fingerprints(smartlist_t *result,
- const char *key);
int dirserv_get_routerdesc_fingerprints(smartlist_t *fps_out, const char *key,
const char **msg,
int for_unencrypted_conn,
@@ -119,20 +110,20 @@ cached_dir_t *new_cached_dir(char *s, time_t published);
/* Put the MAX_MEASUREMENT_AGE #define here so unit tests can see it */
#define MAX_MEASUREMENT_AGE (3*24*60*60) /* 3 days */
-int measured_bw_line_parse(measured_bw_line_t *out, const char *line);
+STATIC int measured_bw_line_parse(measured_bw_line_t *out, const char *line);
-int measured_bw_line_apply(measured_bw_line_t *parsed_line,
+STATIC int measured_bw_line_apply(measured_bw_line_t *parsed_line,
smartlist_t *routerstatuses);
-void dirserv_cache_measured_bw(const measured_bw_line_t *parsed_line,
+STATIC void dirserv_cache_measured_bw(const measured_bw_line_t *parsed_line,
time_t as_of);
-void dirserv_clear_measured_bw_cache(void);
-void dirserv_expire_measured_bw_cache(time_t now);
-int dirserv_get_measured_bw_cache_size(void);
-int dirserv_query_measured_bw_cache_kb(const char *node_id, long *bw_out,
- time_t *as_of_out);
-int dirserv_has_measured_bw(const char *node_id);
-cached_dir_t *generate_v2_networkstatus_opinion(void);
+STATIC void dirserv_clear_measured_bw_cache(void);
+STATIC void dirserv_expire_measured_bw_cache(time_t now);
+STATIC int dirserv_get_measured_bw_cache_size(void);
+STATIC int dirserv_query_measured_bw_cache_kb(const char *node_id,
+ long *bw_out,
+ time_t *as_of_out);
+STATIC int dirserv_has_measured_bw(const char *node_id);
#endif
int dirserv_read_measured_bandwidths(const char *from_file,
diff --git a/src/or/dirvote.c b/src/or/dirvote.c
index c6d124490..c7be343ca 100644
--- a/src/or/dirvote.c
+++ b/src/or/dirvote.c
@@ -60,7 +60,7 @@ static char *make_consensus_method_list(int low, int high, const char *sep);
/** Return a new string containing the string representation of the vote in
* <b>v3_ns</b>, signed with our v3 signing key <b>private_signing_key</b>.
* For v3 authorities. */
-char *
+STATIC char *
format_networkstatus_vote(crypto_pk_t *private_signing_key,
networkstatus_t *v3_ns)
{
@@ -587,7 +587,7 @@ compute_consensus_versions_list(smartlist_t *lst, int n_versioning)
/** Helper: given a list of valid networkstatus_t, return a new string
* containing the contents of the consensus network parameter set.
*/
-/* private */ char *
+STATIC char *
dirvote_compute_params(smartlist_t *votes, int method, int total_authorities)
{
int i;
@@ -2533,12 +2533,13 @@ dirvote_get_preferred_voting_intervals(vote_timing_t *timing_out)
timing_out->dist_delay = options->V3AuthDistDelay;
}
-/** Return the start of the next interval of size <b>interval</b> (in seconds)
- * after <b>now</b>. Midnight always starts a fresh interval, and if the last
- * interval of a day would be truncated to less than half its size, it is
- * rolled into the previous interval. */
+/** Return the start of the next interval of size <b>interval</b> (in
+ * seconds) after <b>now</b>, plus <b>offset</b>. Midnight always
+ * starts a fresh interval, and if the last interval of a day would be
+ * truncated to less than half its size, it is rolled into the
+ * previous interval. */
time_t
-dirvote_get_start_of_next_interval(time_t now, int interval)
+dirvote_get_start_of_next_interval(time_t now, int interval, int offset)
{
struct tm tm;
time_t midnight_today=0;
@@ -2566,6 +2567,10 @@ dirvote_get_start_of_next_interval(time_t now, int interval)
if (next + interval/2 > midnight_tomorrow)
next = midnight_tomorrow;
+ next += offset;
+ if (next - interval > now)
+ next -= interval;
+
return next;
}
@@ -2629,8 +2634,10 @@ dirvote_recalculate_timing(const or_options_t *options, time_t now)
vote_delay = dist_delay = interval / 4;
start = voting_schedule.interval_starts =
- dirvote_get_start_of_next_interval(now,interval);
- end = dirvote_get_start_of_next_interval(start+1, interval);
+ dirvote_get_start_of_next_interval(now,interval,
+ options->TestingV3AuthVotingStartOffset);
+ end = dirvote_get_start_of_next_interval(start+1, interval,
+ options->TestingV3AuthVotingStartOffset);
tor_assert(end > start);
@@ -3136,7 +3143,7 @@ dirvote_compute_consensuses(void)
});
votefile = get_datadir_fname("v3-status-votes");
- write_chunks_to_file(votefile, votestrings, 0);
+ write_chunks_to_file(votefile, votestrings, 0, 0);
tor_free(votefile);
SMARTLIST_FOREACH(votestrings, sized_chunk_t *, c, tor_free(c));
smartlist_free(votestrings);
@@ -3581,6 +3588,12 @@ dirvote_create_microdescriptor(const routerinfo_t *ri, int consensus_method)
tor_free(p6);
}
+ if (consensus_method >= MIN_METHOD_FOR_ID_HASH_IN_MD) {
+ char idbuf[BASE64_DIGEST_LEN+1];
+ digest_to_base64(idbuf, ri->cache_info.identity_digest);
+ smartlist_add_asprintf(chunks, "id rsa1024 %s\n", idbuf);
+ }
+
output = smartlist_join_strings(chunks, "", 0, NULL);
{
@@ -3650,7 +3663,8 @@ static const struct consensus_method_range_t {
{MIN_METHOD_FOR_MICRODESC, MIN_METHOD_FOR_A_LINES - 1},
{MIN_METHOD_FOR_A_LINES, MIN_METHOD_FOR_P6_LINES - 1},
{MIN_METHOD_FOR_P6_LINES, MIN_METHOD_FOR_NTOR_KEY - 1},
- {MIN_METHOD_FOR_NTOR_KEY, MAX_SUPPORTED_CONSENSUS_METHOD},
+ {MIN_METHOD_FOR_NTOR_KEY, MIN_METHOD_FOR_ID_HASH_IN_MD - 1},
+ {MIN_METHOD_FOR_ID_HASH_IN_MD, MAX_SUPPORTED_CONSENSUS_METHOD},
{-1, -1}
};
diff --git a/src/or/dirvote.h b/src/or/dirvote.h
index b23645212..4c57e4366 100644
--- a/src/or/dirvote.h
+++ b/src/or/dirvote.h
@@ -12,15 +12,17 @@
#ifndef TOR_DIRVOTE_H
#define TOR_DIRVOTE_H
+#include "testsupport.h"
+
/** Lowest allowable value for VoteSeconds. */
-#define MIN_VOTE_SECONDS 20
+#define MIN_VOTE_SECONDS 2
/** Lowest allowable value for DistSeconds. */
-#define MIN_DIST_SECONDS 20
+#define MIN_DIST_SECONDS 2
/** Smallest allowable voting interval. */
#define MIN_VOTE_INTERVAL 300
/** The highest consensus method that we currently support. */
-#define MAX_SUPPORTED_CONSENSUS_METHOD 17
+#define MAX_SUPPORTED_CONSENSUS_METHOD 18
/** Lowest consensus method that contains a 'directory-footer' marker */
#define MIN_METHOD_FOR_FOOTER 9
@@ -59,6 +61,10 @@
* Unmeasured=1 flag for unmeasured bandwidths */
#define MIN_METHOD_TO_CLIP_UNMEASURED_BW 17
+/** Lowest consensus method where authorities may include an "id" line in
+ * microdescriptors. */
+#define MIN_METHOD_FOR_ID_HASH_IN_MD 18
+
/** Default bandwidth to clip unmeasured bandwidths to using method >=
* MIN_METHOD_TO_CLIP_UNMEASURED_BW */
#define DEFAULT_MAX_UNMEASURED_BW_KB 20
@@ -86,7 +92,9 @@ authority_cert_t *authority_cert_dup(authority_cert_t *cert);
/* vote scheduling */
void dirvote_get_preferred_voting_intervals(vote_timing_t *timing_out);
-time_t dirvote_get_start_of_next_interval(time_t now, int interval);
+time_t dirvote_get_start_of_next_interval(time_t now,
+ int interval,
+ int offset);
void dirvote_recalculate_timing(const or_options_t *options, time_t now);
void dirvote_act(const or_options_t *options, time_t now);
@@ -134,9 +142,9 @@ document_signature_t *voter_get_sig_by_algorithm(
digest_algorithm_t alg);
#ifdef DIRVOTE_PRIVATE
-char *format_networkstatus_vote(crypto_pk_t *private_key,
+STATIC char *format_networkstatus_vote(crypto_pk_t *private_key,
networkstatus_t *v3_ns);
-char *dirvote_compute_params(smartlist_t *votes, int method,
+STATIC char *dirvote_compute_params(smartlist_t *votes, int method,
int total_authorities);
#endif
diff --git a/src/or/dns.c b/src/or/dns.c
index f2b7eecc3..a9c431865 100644
--- a/src/or/dns.c
+++ b/src/or/dns.c
@@ -24,6 +24,7 @@
#include "relay.h"
#include "router.h"
#include "ht.h"
+#include "../common/sandbox.h"
#ifdef HAVE_EVENT2_DNS_H
#include <event2/event.h>
#include <event2/dns.h>
@@ -238,7 +239,7 @@ cached_resolves_eq(cached_resolve_t *a, cached_resolve_t *b)
static INLINE unsigned int
cached_resolve_hash(cached_resolve_t *a)
{
- return ht_string_hash(a->address);
+ return (unsigned) siphash24g((const uint8_t*)a->address, strlen(a->address));
}
HT_PROTOTYPE(cache_map, cached_resolve_t, node, cached_resolve_hash,
@@ -1352,6 +1353,7 @@ inform_pending_connections(cached_resolve_t *resolve)
}
resolve->pending_connections = pend->next;
tor_free(pend);
+ tor_free(hostname);
}
}
@@ -1443,13 +1445,14 @@ configure_nameservers(int force)
const or_options_t *options;
const char *conf_fname;
struct stat st;
- int r;
+ int r, flags;
options = get_options();
conf_fname = options->ServerDNSResolvConfFile;
#ifndef _WIN32
if (!conf_fname)
conf_fname = "/etc/resolv.conf";
#endif
+ flags = DNS_OPTIONS_ALL;
if (!the_evdns_base) {
if (!(the_evdns_base = evdns_base_new(tor_libevent_get_base(), 0))) {
@@ -1477,7 +1480,8 @@ configure_nameservers(int force)
evdns_set_log_fn(evdns_log_cb);
if (conf_fname) {
- if (stat(conf_fname, &st)) {
+ log_debug(LD_FS, "stat()ing %s", conf_fname);
+ if (stat(sandbox_intern_string(conf_fname), &st)) {
log_warn(LD_EXIT, "Unable to stat resolver configuration in '%s': %s",
conf_fname, strerror(errno));
goto err;
@@ -1491,9 +1495,17 @@ configure_nameservers(int force)
evdns_base_search_clear(the_evdns_base);
evdns_base_clear_nameservers_and_suspend(the_evdns_base);
}
+#if defined(DNS_OPTION_HOSTSFILE) && defined(USE_LIBSECCOMP)
+ if (flags & DNS_OPTION_HOSTSFILE) {
+ flags ^= DNS_OPTION_HOSTSFILE;
+ log_debug(LD_FS, "Loading /etc/hosts");
+ evdns_base_load_hosts(the_evdns_base,
+ sandbox_intern_string("/etc/hosts"));
+ }
+#endif
log_info(LD_EXIT, "Parsing resolver configuration in '%s'", conf_fname);
- if ((r = evdns_base_resolv_conf_parse(the_evdns_base,
- DNS_OPTIONS_ALL, conf_fname))) {
+ if ((r = evdns_base_resolv_conf_parse(the_evdns_base, flags,
+ sandbox_intern_string(conf_fname)))) {
log_warn(LD_EXIT, "Unable to parse '%s', or no nameservers in '%s' (%d)",
conf_fname, conf_fname, r);
goto err;
@@ -2162,7 +2174,7 @@ static void
assert_cache_ok_(void)
{
cached_resolve_t **resolve;
- int bad_rep = _cache_map_HT_REP_IS_BAD(&cache_root);
+ int bad_rep = HT_REP_IS_BAD_(cache_map, &cache_root);
if (bad_rep) {
log_err(LD_BUG, "Bad rep type %d on dns cache hash table", bad_rep);
tor_assert(!bad_rep);
diff --git a/src/or/dnsserv.c b/src/or/dnsserv.c
index ebff7b524..ecd45be77 100644
--- a/src/or/dnsserv.c
+++ b/src/or/dnsserv.c
@@ -35,7 +35,7 @@ evdns_server_callback(struct evdns_server_request *req, void *data_)
entry_connection_t *entry_conn;
edge_connection_t *conn;
int i = 0;
- struct evdns_server_question *q = NULL;
+ struct evdns_server_question *q = NULL, *supported_q = NULL;
struct sockaddr_storage addr;
struct sockaddr *sa;
int addrlen;
@@ -87,31 +87,37 @@ evdns_server_callback(struct evdns_server_request *req, void *data_)
for (i = 0; i < req->nquestions; ++i) {
if (req->questions[i]->dns_question_class != EVDNS_CLASS_INET)
continue;
+ if (! q)
+ q = req->questions[i];
switch (req->questions[i]->type) {
case EVDNS_TYPE_A:
case EVDNS_TYPE_AAAA:
case EVDNS_TYPE_PTR:
- q = req->questions[i];
+ /* We always pick the first one of these questions, if there is
+ one. */
+ if (! supported_q)
+ supported_q = q;
+ break;
default:
break;
}
}
+ if (supported_q)
+ q = supported_q;
if (!q) {
log_info(LD_APP, "None of the questions we got were ones we're willing "
"to support. Sending NOTIMPL.");
evdns_server_request_respond(req, DNS_ERR_NOTIMPL);
return;
}
- if (q->type != EVDNS_TYPE_A && q->type != EVDNS_TYPE_AAAA) {
- tor_assert(q->type == EVDNS_TYPE_PTR);
- }
/* Make sure the name isn't too long: This should be impossible, I think. */
if (err == DNS_ERR_NONE && strlen(q->name) > MAX_SOCKS_ADDR_LEN-1)
err = DNS_ERR_FORMAT;
- if (err != DNS_ERR_NONE) {
- /* We got an error? Then send back an answer immediately; we're done. */
+ if (err != DNS_ERR_NONE || !supported_q) {
+ /* We got an error? There's no question we're willing to answer? Then
+ * send back an answer immediately; we're done. */
evdns_server_request_respond(req, err);
return;
}
@@ -126,10 +132,23 @@ evdns_server_callback(struct evdns_server_request *req, void *data_)
TO_CONN(conn)->port = port;
TO_CONN(conn)->address = tor_dup_addr(&tor_addr);
- if (q->type == EVDNS_TYPE_A || q->type == EVDNS_TYPE_AAAA)
+ if (q->type == EVDNS_TYPE_A || q->type == EVDNS_TYPE_AAAA ||
+ q->type == EVDNS_QTYPE_ALL) {
entry_conn->socks_request->command = SOCKS_COMMAND_RESOLVE;
- else
+ } else {
+ tor_assert(q->type == EVDNS_TYPE_PTR);
entry_conn->socks_request->command = SOCKS_COMMAND_RESOLVE_PTR;
+ }
+
+ if (q->type == EVDNS_TYPE_A || q->type == EVDNS_QTYPE_ALL) {
+ entry_conn->ipv4_traffic_ok = 1;
+ entry_conn->ipv6_traffic_ok = 0;
+ entry_conn->prefer_ipv6_traffic = 0;
+ } else if (q->type == EVDNS_TYPE_AAAA) {
+ entry_conn->ipv4_traffic_ok = 0;
+ entry_conn->ipv6_traffic_ok = 1;
+ entry_conn->prefer_ipv6_traffic = 1;
+ }
strlcpy(entry_conn->socks_request->address, q->name,
sizeof(entry_conn->socks_request->address));
diff --git a/src/or/entrynodes.c b/src/or/entrynodes.c
index 2aa063cda..957217ac6 100644
--- a/src/or/entrynodes.c
+++ b/src/or/entrynodes.c
@@ -13,6 +13,7 @@
**/
#include "or.h"
+#include "circpathbias.h"
#include "circuitbuild.h"
#include "circuitstats.h"
#include "config.h"
@@ -54,6 +55,10 @@ typedef struct {
/** When should we next try to fetch a descriptor for this bridge? */
download_status_t fetch_status;
+
+ /** A smartlist of k=v values to be passed to the SOCKS proxy, if
+ transports are used for this bridge. */
+ smartlist_t *socks_args;
} bridge_info_t;
/** A list of our chosen entry guards. */
@@ -65,7 +70,9 @@ static int entry_guards_dirty = 0;
static void bridge_free(bridge_info_t *bridge);
static const node_t *choose_random_entry_impl(cpath_build_state_t *state,
int for_directory,
- dirinfo_type_t dirtype);
+ dirinfo_type_t dirtype,
+ int *n_options_out);
+static int num_bridges_usable(void);
/** Return the list of entry guards, creating it if necessary. */
const smartlist_t *
@@ -359,7 +366,7 @@ add_an_entry_guard(const node_t *chosen, int reset_status, int prepend,
entry->can_retry = 1;
}
entry->is_dir_cache = node->rs &&
- node->rs->version_supports_microdesc_cache;
+ node->rs->version_supports_microdesc_cache;
if (get_options()->UseBridges && node_is_a_configured_bridge(node))
entry->is_dir_cache = 1;
return NULL;
@@ -371,7 +378,7 @@ add_an_entry_guard(const node_t *chosen, int reset_status, int prepend,
} else {
const routerstatus_t *rs;
rs = router_pick_directory_server(MICRODESC_DIRINFO|V3_DIRINFO,
- PDS_PREFER_TUNNELED_DIR_CONNS_|PDS_FOR_GUARD);
+ PDS_FOR_GUARD);
if (!rs)
return NULL;
node = node_get_by_id(rs->identity_digest);
@@ -392,8 +399,8 @@ add_an_entry_guard(const node_t *chosen, int reset_status, int prepend,
node_describe(node));
strlcpy(entry->nickname, node_get_nickname(node), sizeof(entry->nickname));
memcpy(entry->identity, node->identity, DIGEST_LEN);
- entry->is_dir_cache = node_is_dir(node) &&
- node->rs && node->rs->version_supports_microdesc_cache;
+ entry->is_dir_cache = node_is_dir(node) && node->rs &&
+ node->rs->version_supports_microdesc_cache;
if (get_options()->UseBridges && node_is_a_configured_bridge(node))
entry->is_dir_cache = 1;
@@ -594,6 +601,25 @@ remove_dead_entry_guards(time_t now)
return changed ? 1 : 0;
}
+/** Remove all currently listed entry guards. So new ones will be chosen. */
+void
+remove_all_entry_guards(void)
+{
+ char dbuf[HEX_DIGEST_LEN+1];
+
+ while (smartlist_len(entry_guards)) {
+ entry_guard_t *entry = smartlist_get(entry_guards, 0);
+ base16_encode(dbuf, sizeof(dbuf), entry->identity, DIGEST_LEN);
+ log_info(LD_CIRC, "Entry guard '%s' (%s) has been dropped.",
+ entry->nickname, dbuf);
+ control_event_guard(entry->nickname, entry->identity, "DROPPED");
+ entry_guard_free(entry);
+ smartlist_del(entry_guards, 0);
+ }
+ log_entry_guards(LOG_INFO);
+ entry_guards_changed();
+}
+
/** A new directory or router-status has arrived; update the down/listed
* status of the entry guards.
*
@@ -958,7 +984,7 @@ node_can_handle_dirinfo(const node_t *node, dirinfo_type_t dirinfo)
const node_t *
choose_random_entry(cpath_build_state_t *state)
{
- return choose_random_entry_impl(state, 0, 0);
+ return choose_random_entry_impl(state, 0, 0, NULL);
}
/** Pick a live (up and listed) directory guard from entry_guards for
@@ -966,13 +992,13 @@ choose_random_entry(cpath_build_state_t *state)
const node_t *
choose_random_dirguard(dirinfo_type_t type)
{
- return choose_random_entry_impl(NULL, 1, type);
+ return choose_random_entry_impl(NULL, 1, type, NULL);
}
/** Helper for choose_random{entry,dirguard}. */
static const node_t *
choose_random_entry_impl(cpath_build_state_t *state, int for_directory,
- dirinfo_type_t dirinfo_type)
+ dirinfo_type_t dirinfo_type, int *n_options_out)
{
const or_options_t *options = get_options();
smartlist_t *live_entry_guards = smartlist_new();
@@ -986,6 +1012,9 @@ choose_random_entry_impl(cpath_build_state_t *state, int for_directory,
int need_descriptor = !for_directory;
const int num_needed = decide_num_guards(options, for_directory);
+ if (n_options_out)
+ *n_options_out = 0;
+
if (chosen_exit) {
nodelist_add_node_and_family(exit_family, chosen_exit);
consider_exit_family = 1;
@@ -1112,6 +1141,8 @@ choose_random_entry_impl(cpath_build_state_t *state, int for_directory,
* *double*-weight our guard selection. */
node = smartlist_choose(live_entry_guards);
}
+ if (n_options_out)
+ *n_options_out = smartlist_len(live_entry_guards);
smartlist_free(live_entry_guards);
smartlist_free(exit_family);
return node;
@@ -1595,6 +1626,11 @@ bridge_free(bridge_info_t *bridge)
return;
tor_free(bridge->transport_name);
+ if (bridge->socks_args) {
+ SMARTLIST_FOREACH(bridge->socks_args, char*, s, tor_free(s));
+ smartlist_free(bridge->socks_args);
+ }
+
tor_free(bridge);
}
@@ -1628,7 +1664,8 @@ get_configured_bridge_by_orports_digest(const char *digest,
/** If we have a bridge configured whose digest matches <b>digest</b>, or a
* bridge with no known digest whose address matches <b>addr</b>:<b>/port</b>,
- * return that bridge. Else return NULL. */
+ * return that bridge. Else return NULL. If <b>digest</b> is NULL, check for
+ * address/port matches only. */
static bridge_info_t *
get_configured_bridge_by_addr_port_digest(const tor_addr_t *addr,
uint16_t port,
@@ -1638,7 +1675,7 @@ get_configured_bridge_by_addr_port_digest(const tor_addr_t *addr,
return NULL;
SMARTLIST_FOREACH_BEGIN(bridge_list, bridge_info_t *, bridge)
{
- if (tor_digest_is_zero(bridge->identity) &&
+ if ((tor_digest_is_zero(bridge->identity) || digest == NULL) &&
!tor_addr_compare(&bridge->addr, addr, CMP_EXACT) &&
bridge->port == port)
return bridge;
@@ -1773,30 +1810,68 @@ bridge_resolve_conflicts(const tor_addr_t *addr, uint16_t port,
} SMARTLIST_FOREACH_END(bridge);
}
-/** Remember a new bridge at <b>addr</b>:<b>port</b>. If <b>digest</b>
- * is set, it tells us the identity key too. If we already had the
- * bridge in our list, unmark it, and don't actually add anything new.
- * If <b>transport_name</b> is non-NULL - the bridge is associated with a
- * pluggable transport - we assign the transport to the bridge. */
+/** Return True if we have a bridge that uses a transport with name
+ * <b>transport_name</b>. */
+int
+transport_is_needed(const char *transport_name)
+{
+ if (!bridge_list)
+ return 0;
+
+ SMARTLIST_FOREACH_BEGIN(bridge_list, const bridge_info_t *, bridge) {
+ if (bridge->transport_name &&
+ !strcmp(bridge->transport_name, transport_name))
+ return 1;
+ } SMARTLIST_FOREACH_END(bridge);
+
+ return 0;
+}
+
+/** Register the bridge information in <b>bridge_line</b> to the
+ * bridge subsystem. Steals reference of <b>bridge_line</b>. */
void
-bridge_add_from_config(const tor_addr_t *addr, uint16_t port,
- const char *digest, const char *transport_name)
+bridge_add_from_config(bridge_line_t *bridge_line)
{
bridge_info_t *b;
- bridge_resolve_conflicts(addr, port, digest, transport_name);
+ { /* Log the bridge we are about to register: */
+ log_debug(LD_GENERAL, "Registering bridge at %s (transport: %s) (%s)",
+ fmt_addrport(&bridge_line->addr, bridge_line->port),
+ bridge_line->transport_name ?
+ bridge_line->transport_name : "no transport",
+ tor_digest_is_zero(bridge_line->digest) ?
+ "no key listed" : hex_str(bridge_line->digest, DIGEST_LEN));
+
+ if (bridge_line->socks_args) { /* print socks arguments */
+ int i = 0;
+
+ tor_assert(smartlist_len(bridge_line->socks_args) > 0);
+
+ log_debug(LD_GENERAL, "Bridge uses %d SOCKS arguments:",
+ smartlist_len(bridge_line->socks_args));
+ SMARTLIST_FOREACH(bridge_line->socks_args, const char *, arg,
+ log_debug(LD_CONFIG, "%d: %s", ++i, arg));
+ }
+ }
+
+ bridge_resolve_conflicts(&bridge_line->addr,
+ bridge_line->port,
+ bridge_line->digest,
+ bridge_line->transport_name);
b = tor_malloc_zero(sizeof(bridge_info_t));
- tor_addr_copy(&b->addr, addr);
- b->port = port;
- if (digest)
- memcpy(b->identity, digest, DIGEST_LEN);
- if (transport_name)
- b->transport_name = tor_strdup(transport_name);
+ tor_addr_copy(&b->addr, &bridge_line->addr);
+ b->port = bridge_line->port;
+ memcpy(b->identity, bridge_line->digest, DIGEST_LEN);
+ if (bridge_line->transport_name)
+ b->transport_name = bridge_line->transport_name;
b->fetch_status.schedule = DL_SCHED_BRIDGE;
+ b->socks_args = bridge_line->socks_args;
if (!bridge_list)
bridge_list = smartlist_new();
+ tor_free(bridge_line); /* Deallocate bridge_line now. */
+
smartlist_add(bridge_list, b);
}
@@ -1857,7 +1932,7 @@ find_transport_name_by_bridge_addrport(const tor_addr_t *addr, uint16_t port)
* transport, but the transport could not be found.
*/
int
-find_transport_by_bridge_addrport(const tor_addr_t *addr, uint16_t port,
+get_transport_by_bridge_addrport(const tor_addr_t *addr, uint16_t port,
const transport_t **transport)
{
*transport = NULL;
@@ -1884,11 +1959,21 @@ find_transport_by_bridge_addrport(const tor_addr_t *addr, uint16_t port,
return 0;
}
+/** Return a smartlist containing all the SOCKS arguments that we
+ * should pass to the SOCKS proxy. */
+const smartlist_t *
+get_socks_args_by_bridge_addrport(const tor_addr_t *addr, uint16_t port)
+{
+ bridge_info_t *bridge = get_configured_bridge_by_addr_port_digest(addr,
+ port,
+ NULL);
+ return bridge ? bridge->socks_args : NULL;
+}
+
/** We need to ask <b>bridge</b> for its server descriptor. */
static void
launch_direct_bridge_descriptor_fetch(bridge_info_t *bridge)
{
- char *address;
const or_options_t *options = get_options();
if (connection_get_by_type_addr_port_purpose(
@@ -1903,15 +1988,12 @@ launch_direct_bridge_descriptor_fetch(bridge_info_t *bridge)
return;
}
- address = tor_dup_addr(&bridge->addr);
-
- directory_initiate_command(address, &bridge->addr,
+ directory_initiate_command(&bridge->addr,
bridge->port, 0/*no dirport*/,
bridge->identity,
DIR_PURPOSE_FETCH_SERVERDESC,
ROUTER_PURPOSE_BRIDGE,
DIRIND_ONEHOP, "authority.z", NULL, 0, 0);
- tor_free(address);
}
/** Fetching the bridge descriptor from the bridge authority returned a
@@ -2029,13 +2111,11 @@ rewrite_node_address_for_bridge(const bridge_info_t *bridge, node_t *node)
} else {
if (tor_addr_family(&bridge->addr) == AF_INET) {
ri->addr = tor_addr_to_ipv4h(&bridge->addr);
- tor_free(ri->address);
- ri->address = tor_dup_ip(ri->addr);
ri->or_port = bridge->port;
log_info(LD_DIR,
"Adjusted bridge routerinfo for '%s' to match configured "
"address %s:%d.",
- ri->nickname, ri->address, ri->or_port);
+ ri->nickname, fmt_addr32(ri->addr), ri->or_port);
} else if (tor_addr_family(&bridge->addr) == AF_INET6) {
tor_addr_copy(&ri->ipv6_addr, &bridge->addr);
ri->ipv6_orport = bridge->port;
@@ -2093,7 +2173,7 @@ learned_bridge_descriptor(routerinfo_t *ri, int from_cache)
tor_assert(ri);
tor_assert(ri->purpose == ROUTER_PURPOSE_BRIDGE);
if (get_options()->UseBridges) {
- int first = !any_bridge_descriptors_known();
+ int first = num_bridges_usable() <= 1;
bridge_info_t *bridge = get_configured_bridge_by_routerinfo(ri);
time_t now = time(NULL);
router_set_status(ri->cache_info.identity_digest, 1);
@@ -2115,14 +2195,15 @@ learned_bridge_descriptor(routerinfo_t *ri, int from_cache)
* our entry node list */
entry_guard_register_connect_status(ri->cache_info.identity_digest,
1, 0, now);
- if (first)
+ if (first) {
routerlist_retry_directory_downloads(now);
+ }
}
}
}
-/** Return 1 if any of our entry guards have descriptors that
- * are marked with purpose 'bridge' and are running. Else return 0.
+/** Return the number of bridges that have descriptors that
+ * are marked with purpose 'bridge' and are running.
*
* We use this function to decide if we're ready to start building
* circuits through our bridges, or if we need to wait until the
@@ -2134,25 +2215,16 @@ any_bridge_descriptors_known(void)
return choose_random_entry(NULL) != NULL;
}
-/** Return 1 if there are any directory conns fetching bridge descriptors
- * that aren't marked for close. We use this to guess if we should tell
- * the controller that we have a problem. */
-int
-any_pending_bridge_descriptor_fetches(void)
+/** Return the number of bridges that have descriptors that are marked with
+ * purpose 'bridge' and are running.
+ */
+static int
+num_bridges_usable(void)
{
- smartlist_t *conns = get_connection_array();
- SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) {
- if (conn->type == CONN_TYPE_DIR &&
- conn->purpose == DIR_PURPOSE_FETCH_SERVERDESC &&
- TO_DIR_CONN(conn)->router_purpose == ROUTER_PURPOSE_BRIDGE &&
- !conn->marked_for_close &&
- conn->linked &&
- conn->linked_conn && !conn->linked_conn->marked_for_close) {
- log_debug(LD_DIR, "found one: %s", conn->address);
- return 1;
- }
- } SMARTLIST_FOREACH_END(conn);
- return 0;
+ int n_options = 0;
+ tor_assert(get_options()->UseBridges);
+ (void) choose_random_entry_impl(NULL, 0, 0, &n_options);
+ return n_options;
}
/** Return 1 if we have at least one descriptor for an entry guard
@@ -2250,6 +2322,6 @@ entry_guards_free_all(void)
clear_bridge_list();
smartlist_free(bridge_list);
bridge_list = NULL;
- circuit_build_times_free_timeouts(&circ_times);
+ circuit_build_times_free_timeouts(get_circuit_build_times_mutable());
}
diff --git a/src/or/entrynodes.h b/src/or/entrynodes.h
index 52b8dc00e..e229f3b79 100644
--- a/src/or/entrynodes.h
+++ b/src/or/entrynodes.h
@@ -5,7 +5,7 @@
/* See LICENSE for licensing information */
/**
- * \file guardnodes.h
+ * \file entrynodes.h
* \brief Header file for circuitbuild.c.
**/
@@ -77,6 +77,8 @@ int num_live_entry_guards(int for_directory);
#endif
+void remove_all_entry_guards(void);
+
void entry_guards_compute_status(const or_options_t *options, time_t now);
int entry_guard_register_connect_status(const char *digest, int succeeded,
int mark_relay_status, time_t now);
@@ -97,27 +99,30 @@ int routerinfo_is_a_configured_bridge(const routerinfo_t *ri);
int node_is_a_configured_bridge(const node_t *node);
void learned_router_identity(const tor_addr_t *addr, uint16_t port,
const char *digest);
-void bridge_add_from_config(const tor_addr_t *addr, uint16_t port,
- const char *digest,
- const char *transport_name);
+struct bridge_line_t;
+void bridge_add_from_config(struct bridge_line_t *bridge_line);
void retry_bridge_descriptor_fetch_directly(const char *digest);
void fetch_bridge_descriptors(const or_options_t *options, time_t now);
void learned_bridge_descriptor(routerinfo_t *ri, int from_cache);
int any_bridge_descriptors_known(void);
-int any_pending_bridge_descriptor_fetches(void);
int entries_known_but_down(const or_options_t *options);
void entries_retry_all(const or_options_t *options);
int any_bridge_supports_microdescriptors(void);
+const smartlist_t *get_socks_args_by_bridge_addrport(const tor_addr_t *addr,
+ uint16_t port);
+
+int any_bridges_dont_support_microdescriptors(void);
void entry_guards_free_all(void);
const char *find_transport_name_by_bridge_addrport(const tor_addr_t *addr,
uint16_t port);
struct transport_t;
-int find_transport_by_bridge_addrport(const tor_addr_t *addr, uint16_t port,
+int get_transport_by_bridge_addrport(const tor_addr_t *addr, uint16_t port,
const struct transport_t **transport);
+int transport_is_needed(const char *transport_name);
int validate_pluggable_transports_config(void);
double pathbias_get_close_success_count(entry_guard_t *guard);
diff --git a/src/or/ext_orport.c b/src/or/ext_orport.c
new file mode 100644
index 000000000..0d28a9199
--- /dev/null
+++ b/src/or/ext_orport.c
@@ -0,0 +1,648 @@
+/* Copyright (c) 2012, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file ext_orport.c
+ * \brief Code implementing the Extended ORPort.
+*/
+
+#define EXT_ORPORT_PRIVATE
+#include "or.h"
+#include "connection.h"
+#include "connection_or.h"
+#include "ext_orport.h"
+#include "control.h"
+#include "config.h"
+#include "util.h"
+#include "main.h"
+
+/** Allocate and return a structure capable of holding an Extended
+ * ORPort message of body length <b>len</b>. */
+ext_or_cmd_t *
+ext_or_cmd_new(uint16_t len)
+{
+ size_t size = STRUCT_OFFSET(ext_or_cmd_t, body) + len;
+ ext_or_cmd_t *cmd = tor_malloc(size);
+ cmd->len = len;
+ return cmd;
+}
+
+/** Deallocate the Extended ORPort message in <b>cmd</b>. */
+void
+ext_or_cmd_free(ext_or_cmd_t *cmd)
+{
+ tor_free(cmd);
+}
+
+/** Get an Extended ORPort message from <b>conn</b>, and place it in
+ * <b>out</b>. Return -1 on fail, 0 if we need more data, and 1 if we
+ * successfully extracted an Extended ORPort command from the
+ * buffer. */
+static int
+connection_fetch_ext_or_cmd_from_buf(connection_t *conn, ext_or_cmd_t **out)
+{
+ IF_HAS_BUFFEREVENT(conn, {
+ struct evbuffer *input = bufferevent_get_input(conn->bufev);
+ return fetch_ext_or_command_from_evbuffer(input, out);
+ }) ELSE_IF_NO_BUFFEREVENT {
+ return fetch_ext_or_command_from_buf(conn->inbuf, out);
+ }
+}
+
+/** Write an Extended ORPort message to <b>conn</b>. Use
+ * <b>command</b> as the command type, <b>bodylen</b> as the body
+ * length, and <b>body</b>, if it's present, as the body of the
+ * message. */
+STATIC int
+connection_write_ext_or_command(connection_t *conn,
+ uint16_t command,
+ const char *body,
+ size_t bodylen)
+{
+ char header[4];
+ if (bodylen > UINT16_MAX)
+ return -1;
+ set_uint16(header, htons(command));
+ set_uint16(header+2, htons(bodylen));
+ connection_write_to_buf(header, 4, conn);
+ if (bodylen) {
+ tor_assert(body);
+ connection_write_to_buf(body, bodylen, conn);
+ }
+ return 0;
+}
+
+/** Transition from an Extended ORPort which accepts Extended ORPort
+ * messages, to an Extended ORport which accepts OR traffic. */
+static void
+connection_ext_or_transition(or_connection_t *conn)
+{
+ tor_assert(conn->base_.type == CONN_TYPE_EXT_OR);
+
+ conn->base_.type = CONN_TYPE_OR;
+ TO_CONN(conn)->state = 0; // set the state to a neutral value
+ control_event_or_conn_status(conn, OR_CONN_EVENT_NEW, 0);
+ connection_tls_start_handshake(conn, 1);
+}
+
+/** Length of authentication cookie. */
+#define EXT_OR_PORT_AUTH_COOKIE_LEN 32
+/** Length of the header of the cookie file. */
+#define EXT_OR_PORT_AUTH_COOKIE_HEADER_LEN 32
+/** Static cookie file header. */
+#define EXT_OR_PORT_AUTH_COOKIE_HEADER "! Extended ORPort Auth Cookie !\x0a"
+/** Length of safe-cookie protocol hashes. */
+#define EXT_OR_PORT_AUTH_HASH_LEN DIGEST256_LEN
+/** Length of safe-cookie protocol nonces. */
+#define EXT_OR_PORT_AUTH_NONCE_LEN 32
+/** Safe-cookie protocol constants. */
+#define EXT_OR_PORT_AUTH_SERVER_TO_CLIENT_CONST \
+ "ExtORPort authentication server-to-client hash"
+#define EXT_OR_PORT_AUTH_CLIENT_TO_SERVER_CONST \
+ "ExtORPort authentication client-to-server hash"
+
+/* Code to indicate cookie authentication */
+#define EXT_OR_AUTHTYPE_SAFECOOKIE 0x01
+
+/** If true, we've set ext_or_auth_cookie to a secret code and stored
+ * it to disk. */
+STATIC int ext_or_auth_cookie_is_set = 0;
+/** If ext_or_auth_cookie_is_set, a secret cookie that we've stored to disk
+ * and which we're using to authenticate controllers. (If the controller can
+ * read it off disk, it has permission to connect.) */
+STATIC uint8_t *ext_or_auth_cookie = NULL;
+
+/** Helper: Return a newly allocated string containing a path to the
+ * file where we store our authentication cookie. */
+char *
+get_ext_or_auth_cookie_file_name(void)
+{
+ const or_options_t *options = get_options();
+ if (options->ExtORPortCookieAuthFile &&
+ strlen(options->ExtORPortCookieAuthFile)) {
+ return tor_strdup(options->ExtORPortCookieAuthFile);
+ } else {
+ return get_datadir_fname("extended_orport_auth_cookie");
+ }
+}
+
+/* Initialize the cookie-based authentication system of the
+ * Extended ORPort. If <b>is_enabled</b> is 0, then disable the cookie
+ * authentication system. */
+int
+init_ext_or_cookie_authentication(int is_enabled)
+{
+ char *fname = NULL;
+ int retval;
+
+ if (!is_enabled) {
+ ext_or_auth_cookie_is_set = 0;
+ return 0;
+ }
+
+ fname = get_ext_or_auth_cookie_file_name();
+ retval = init_cookie_authentication(fname, EXT_OR_PORT_AUTH_COOKIE_HEADER,
+ EXT_OR_PORT_AUTH_COOKIE_HEADER_LEN,
+ &ext_or_auth_cookie,
+ &ext_or_auth_cookie_is_set);
+ tor_free(fname);
+ return retval;
+}
+
+/** Read data from <b>conn</b> and see if the client sent us the
+ * authentication type that she prefers to use in this session.
+ *
+ * Return -1 if we received corrupted data or if we don't support the
+ * authentication type. Return 0 if we need more data in
+ * <b>conn</b>. Return 1 if the authentication type negotiation was
+ * successful. */
+static int
+connection_ext_or_auth_neg_auth_type(connection_t *conn)
+{
+ char authtype[1] = {0};
+
+ if (connection_get_inbuf_len(conn) < 1)
+ return 0;
+
+ if (connection_fetch_from_buf(authtype, 1, conn) < 0)
+ return -1;
+
+ log_debug(LD_GENERAL, "Client wants us to use %d auth type", authtype[0]);
+ if (authtype[0] != EXT_OR_AUTHTYPE_SAFECOOKIE) {
+ /* '1' is the only auth type supported atm */
+ return -1;
+ }
+
+ conn->state = EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_NONCE;
+ return 1;
+}
+
+/** DOCDOC */
+STATIC int
+handle_client_auth_nonce(const char *client_nonce, size_t client_nonce_len,
+ char **client_hash_out,
+ char **reply_out, size_t *reply_len_out)
+{
+ char server_hash[EXT_OR_PORT_AUTH_HASH_LEN] = {0};
+ char server_nonce[EXT_OR_PORT_AUTH_NONCE_LEN] = {0};
+ char *reply;
+ size_t reply_len;
+
+ if (client_nonce_len != EXT_OR_PORT_AUTH_NONCE_LEN)
+ return -1;
+
+ /* Get our nonce */
+ if (crypto_rand(server_nonce, EXT_OR_PORT_AUTH_NONCE_LEN) < 0)
+ return -1;
+
+ { /* set up macs */
+ size_t hmac_s_msg_len = strlen(EXT_OR_PORT_AUTH_SERVER_TO_CLIENT_CONST) +
+ 2*EXT_OR_PORT_AUTH_NONCE_LEN;
+ size_t hmac_c_msg_len = strlen(EXT_OR_PORT_AUTH_CLIENT_TO_SERVER_CONST) +
+ 2*EXT_OR_PORT_AUTH_NONCE_LEN;
+
+ char *hmac_s_msg = tor_malloc_zero(hmac_s_msg_len);
+ char *hmac_c_msg = tor_malloc_zero(hmac_c_msg_len);
+ char *correct_client_hash = tor_malloc_zero(EXT_OR_PORT_AUTH_HASH_LEN);
+
+ memcpy(hmac_s_msg,
+ EXT_OR_PORT_AUTH_SERVER_TO_CLIENT_CONST,
+ strlen(EXT_OR_PORT_AUTH_SERVER_TO_CLIENT_CONST));
+ memcpy(hmac_s_msg + strlen(EXT_OR_PORT_AUTH_SERVER_TO_CLIENT_CONST),
+ client_nonce, EXT_OR_PORT_AUTH_NONCE_LEN);
+ memcpy(hmac_s_msg + strlen(EXT_OR_PORT_AUTH_SERVER_TO_CLIENT_CONST) +
+ EXT_OR_PORT_AUTH_NONCE_LEN,
+ server_nonce, EXT_OR_PORT_AUTH_NONCE_LEN);
+
+ memcpy(hmac_c_msg,
+ EXT_OR_PORT_AUTH_CLIENT_TO_SERVER_CONST,
+ strlen(EXT_OR_PORT_AUTH_CLIENT_TO_SERVER_CONST));
+ memcpy(hmac_c_msg + strlen(EXT_OR_PORT_AUTH_CLIENT_TO_SERVER_CONST),
+ client_nonce, EXT_OR_PORT_AUTH_NONCE_LEN);
+ memcpy(hmac_c_msg + strlen(EXT_OR_PORT_AUTH_CLIENT_TO_SERVER_CONST) +
+ EXT_OR_PORT_AUTH_NONCE_LEN,
+ server_nonce, EXT_OR_PORT_AUTH_NONCE_LEN);
+
+ crypto_hmac_sha256(server_hash,
+ (char*)ext_or_auth_cookie,
+ EXT_OR_PORT_AUTH_COOKIE_LEN,
+ hmac_s_msg,
+ hmac_s_msg_len);
+
+ crypto_hmac_sha256(correct_client_hash,
+ (char*)ext_or_auth_cookie,
+ EXT_OR_PORT_AUTH_COOKIE_LEN,
+ hmac_c_msg,
+ hmac_c_msg_len);
+
+ /* Store the client hash we generated. We will need to compare it
+ with the hash sent by the client. */
+ *client_hash_out = correct_client_hash;
+
+ memwipe(hmac_s_msg, 0, hmac_s_msg_len);
+ memwipe(hmac_c_msg, 0, hmac_c_msg_len);
+
+ tor_free(hmac_s_msg);
+ tor_free(hmac_c_msg);
+ }
+
+ { /* debug logging */ /* XXX disable this codepath if not logging on debug?*/
+ char server_hash_encoded[(2*EXT_OR_PORT_AUTH_HASH_LEN) + 1];
+ char server_nonce_encoded[(2*EXT_OR_PORT_AUTH_NONCE_LEN) + 1];
+ char client_nonce_encoded[(2*EXT_OR_PORT_AUTH_NONCE_LEN) + 1];
+
+ base16_encode(server_hash_encoded, sizeof(server_hash_encoded),
+ server_hash, sizeof(server_hash));
+ base16_encode(server_nonce_encoded, sizeof(server_nonce_encoded),
+ server_nonce, sizeof(server_nonce));
+ base16_encode(client_nonce_encoded, sizeof(client_nonce_encoded),
+ client_nonce, EXT_OR_PORT_AUTH_NONCE_LEN);
+
+ log_debug(LD_GENERAL,
+ "server_hash: '%s'\nserver_nonce: '%s'\nclient_nonce: '%s'",
+ server_hash_encoded, server_nonce_encoded, client_nonce_encoded);
+
+ memwipe(server_hash_encoded, 0, sizeof(server_hash_encoded));
+ memwipe(server_nonce_encoded, 0, sizeof(server_nonce_encoded));
+ memwipe(client_nonce_encoded, 0, sizeof(client_nonce_encoded));
+ }
+
+ { /* write reply: (server_hash, server_nonce) */
+
+ reply_len = EXT_OR_PORT_AUTH_COOKIE_LEN+EXT_OR_PORT_AUTH_NONCE_LEN;
+ reply = tor_malloc_zero(reply_len);
+ memcpy(reply, server_hash, EXT_OR_PORT_AUTH_HASH_LEN);
+ memcpy(reply + EXT_OR_PORT_AUTH_HASH_LEN, server_nonce,
+ EXT_OR_PORT_AUTH_NONCE_LEN);
+ }
+
+ *reply_out = reply;
+ *reply_len_out = reply_len;
+
+ return 0;
+}
+
+/** Read the client's nonce out of <b>conn</b>, setup the safe-cookie
+ * crypto, and then send our own hash and nonce to the client
+ *
+ * Return -1 if there was an error; return 0 if we need more data in
+ * <b>conn</b>, and return 1 if we successfully retrieved the
+ * client's nonce and sent our own. */
+static int
+connection_ext_or_auth_handle_client_nonce(connection_t *conn)
+{
+ char client_nonce[EXT_OR_PORT_AUTH_NONCE_LEN];
+ char *reply=NULL;
+ size_t reply_len=0;
+
+ if (!ext_or_auth_cookie_is_set) { /* this should not happen */
+ log_warn(LD_BUG, "Extended ORPort authentication cookie was not set. "
+ "That's weird since we should have done that on startup. "
+ "This might be a Tor bug, please file a bug report. ");
+ return -1;
+ }
+
+ if (connection_get_inbuf_len(conn) < EXT_OR_PORT_AUTH_NONCE_LEN)
+ return 0;
+
+ if (connection_fetch_from_buf(client_nonce,
+ EXT_OR_PORT_AUTH_NONCE_LEN, conn) < 0)
+ return -1;
+
+ /* We extract the ClientNonce from the received data, and use it to
+ calculate ServerHash and ServerNonce according to proposal 217.
+
+ We also calculate our own ClientHash value and save it in the
+ connection state. We validate it later against the ClientHash
+ sent by the client. */
+ if (handle_client_auth_nonce(client_nonce, sizeof(client_nonce),
+ &TO_OR_CONN(conn)->ext_or_auth_correct_client_hash,
+ &reply, &reply_len) < 0)
+ return -1;
+
+ connection_write_to_buf(reply, reply_len, conn);
+
+ memwipe(reply, 0, reply_len);
+ tor_free(reply);
+
+ log_debug(LD_GENERAL, "Got client nonce, and sent our own nonce and hash.");
+
+ conn->state = EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_HASH;
+ return 1;
+}
+
+#define connection_ext_or_auth_send_result_success(c) \
+ connection_ext_or_auth_send_result(c, 1)
+#define connection_ext_or_auth_send_result_fail(c) \
+ connection_ext_or_auth_send_result(c, 0)
+
+/** Send authentication results to <b>conn</b>. Successful results if
+ * <b>success</b> is set; failure results otherwise. */
+static void
+connection_ext_or_auth_send_result(connection_t *conn, int success)
+{
+ if (success)
+ connection_write_to_buf("\x01", 1, conn);
+ else
+ connection_write_to_buf("\x00", 1, conn);
+}
+
+/** Receive the client's hash from <b>conn</b>, validate that it's
+ * correct, and then send the authentication results to the client.
+ *
+ * Return -1 if there was an error during validation; return 0 if we
+ * need more data in <b>conn</b>, and return 1 if we successfully
+ * validated the client's hash and sent a happy authentication
+ * result. */
+static int
+connection_ext_or_auth_handle_client_hash(connection_t *conn)
+{
+ char provided_client_hash[EXT_OR_PORT_AUTH_HASH_LEN] = {0};
+
+ if (connection_get_inbuf_len(conn) < EXT_OR_PORT_AUTH_HASH_LEN)
+ return 0;
+
+ if (connection_fetch_from_buf(provided_client_hash,
+ EXT_OR_PORT_AUTH_HASH_LEN, conn) < 0)
+ return -1;
+
+ if (tor_memneq(TO_OR_CONN(conn)->ext_or_auth_correct_client_hash,
+ provided_client_hash, EXT_OR_PORT_AUTH_HASH_LEN)) {
+ log_warn(LD_GENERAL, "Incorrect client hash. Authentication failed.");
+ connection_ext_or_auth_send_result_fail(conn);
+ return -1;
+ }
+
+ log_debug(LD_GENERAL, "Got client's hash and it was legit.");
+
+ /* send positive auth result */
+ connection_ext_or_auth_send_result_success(conn);
+ conn->state = EXT_OR_CONN_STATE_OPEN;
+ return 1;
+}
+
+/** Handle data from <b>or_conn</b> received on Extended ORPort.
+ * Return -1 on error. 0 on unsufficient data. 1 on correct. */
+static int
+connection_ext_or_auth_process_inbuf(or_connection_t *or_conn)
+{
+ connection_t *conn = TO_CONN(or_conn);
+
+ /* State transitions of the Extended ORPort authentication protocol:
+
+ EXT_OR_CONN_STATE_AUTH_WAIT_AUTH_TYPE (start state) ->
+ EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_NONCE ->
+ EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_HASH ->
+ EXT_OR_CONN_STATE_OPEN
+
+ During EXT_OR_CONN_STATE_OPEN, data is handled by
+ connection_ext_or_process_inbuf().
+ */
+
+ switch (conn->state) { /* Functionify */
+ case EXT_OR_CONN_STATE_AUTH_WAIT_AUTH_TYPE:
+ return connection_ext_or_auth_neg_auth_type(conn);
+
+ case EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_NONCE:
+ return connection_ext_or_auth_handle_client_nonce(conn);
+
+ case EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_HASH:
+ return connection_ext_or_auth_handle_client_hash(conn);
+
+ default:
+ log_warn(LD_BUG, "Encountered unexpected connection state %d while trying "
+ "to process Extended ORPort authentication data.", conn->state);
+ return -1;
+ }
+}
+
+/** Extended ORPort commands (Transport-to-Bridge) */
+#define EXT_OR_CMD_TB_DONE 0x0000
+#define EXT_OR_CMD_TB_USERADDR 0x0001
+#define EXT_OR_CMD_TB_TRANSPORT 0x0002
+
+/** Extended ORPort commands (Bridge-to-Transport) */
+#define EXT_OR_CMD_BT_OKAY 0x1000
+#define EXT_OR_CMD_BT_DENY 0x1001
+#define EXT_OR_CMD_BT_CONTROL 0x1002
+
+/** Process a USERADDR command from the Extended
+ * ORPort. <b>payload</b> is a payload of size <b>len</b>.
+ *
+ * If the USERADDR command was well formed, change the address of
+ * <b>conn</b> to the address on the USERADDR command.
+ *
+ * Return 0 on success and -1 on error. */
+static int
+connection_ext_or_handle_cmd_useraddr(connection_t *conn,
+ const char *payload, uint16_t len)
+{
+ /* Copy address string. */
+ tor_addr_t addr;
+ uint16_t port;
+ char *addr_str;
+ char *address_part=NULL;
+ int res;
+ if (memchr(payload, '\0', len)) {
+ log_fn(LOG_PROTOCOL_WARN, LD_NET, "Unexpected NUL in ExtORPort UserAddr");
+ return -1;
+ }
+
+ addr_str = tor_memdup_nulterm(payload, len);
+
+ res = tor_addr_port_split(LOG_INFO, addr_str, &address_part, &port);
+ tor_free(addr_str);
+ if (res<0)
+ return -1;
+
+ res = tor_addr_parse(&addr, address_part);
+ tor_free(address_part);
+ if (res<0)
+ return -1;
+
+ { /* do some logging */
+ char *old_address = tor_dup_addr(&conn->addr);
+ char *new_address = tor_dup_addr(&addr);
+
+ log_debug(LD_NET, "Received USERADDR."
+ "We rewrite our address from '%s:%u' to '%s:%u'.",
+ safe_str(old_address), conn->port, safe_str(new_address), port);
+
+ tor_free(old_address);
+ tor_free(new_address);
+ }
+
+ /* record the address */
+ tor_addr_copy(&conn->addr, &addr);
+ conn->port = port;
+ if (conn->address) {
+ tor_free(conn->address);
+ }
+ conn->address = tor_dup_addr(&addr);
+
+ return 0;
+}
+
+/** Process a TRANSPORT command from the Extended
+ * ORPort. <b>payload</b> is a payload of size <b>len</b>.
+ *
+ * If the TRANSPORT command was well formed, register the name of the
+ * transport on <b>conn</b>.
+ *
+ * Return 0 on success and -1 on error. */
+static int
+connection_ext_or_handle_cmd_transport(or_connection_t *conn,
+ const char *payload, uint16_t len)
+{
+ char *transport_str;
+ if (memchr(payload, '\0', len)) {
+ log_fn(LOG_PROTOCOL_WARN, LD_NET, "Unexpected NUL in ExtORPort Transport");
+ return -1;
+ }
+
+ transport_str = tor_memdup_nulterm(payload, len);
+
+ /* Transport names MUST be C-identifiers. */
+ if (!string_is_C_identifier(transport_str)) {
+ tor_free(transport_str);
+ return -1;
+ }
+
+ /* If ext_or_transport is already occupied (because the PT sent two
+ * TRANSPORT commands), deallocate the old name and keep the new
+ * one */
+ if (conn->ext_or_transport)
+ tor_free(conn->ext_or_transport);
+
+ conn->ext_or_transport = transport_str;
+ return 0;
+}
+
+#define EXT_OR_CONN_STATE_IS_AUTHENTICATING(st) \
+ ((st) <= EXT_OR_CONN_STATE_AUTH_MAX)
+
+/** Process Extended ORPort messages from <b>or_conn</b>. */
+int
+connection_ext_or_process_inbuf(or_connection_t *or_conn)
+{
+ connection_t *conn = TO_CONN(or_conn);
+ ext_or_cmd_t *command;
+ int r;
+
+ /* DOCDOC Document the state machine and transitions in this function */
+
+ /* If we are still in the authentication stage, process traffic as
+ authentication data: */
+ while (EXT_OR_CONN_STATE_IS_AUTHENTICATING(conn->state)) {
+ log_debug(LD_GENERAL, "Got Extended ORPort authentication data (%u).",
+ (unsigned int) connection_get_inbuf_len(conn));
+ r = connection_ext_or_auth_process_inbuf(or_conn);
+ if (r < 0) {
+ connection_mark_for_close(conn);
+ return -1;
+ } else if (r == 0) {
+ return 0;
+ }
+ /* if r > 0, loop and process more data (if any). */
+ }
+
+ while (1) {
+ log_debug(LD_GENERAL, "Got Extended ORPort data.");
+ command = NULL;
+ r = connection_fetch_ext_or_cmd_from_buf(conn, &command);
+ if (r < 0)
+ goto err;
+ else if (r == 0)
+ return 0; /* need to wait for more data */
+
+ /* Got a command! */
+ tor_assert(command);
+
+ if (command->cmd == EXT_OR_CMD_TB_DONE) {
+ if (connection_get_inbuf_len(conn)) {
+ /* The inbuf isn't empty; the client is misbehaving. */
+ goto err;
+ }
+
+ log_debug(LD_NET, "Received DONE.");
+
+ /* If the transport proxy did not use the TRANSPORT command to
+ * specify the transport name, mark this as unknown transport. */
+ if (!or_conn->ext_or_transport) {
+ /* We write this string this way to avoid ??>, which is a C
+ * trigraph. */
+ or_conn->ext_or_transport = tor_strdup("<?" "?>");
+ }
+
+ connection_write_ext_or_command(conn, EXT_OR_CMD_BT_OKAY, NULL, 0);
+
+ /* can't transition immediately; need to flush first. */
+ conn->state = EXT_OR_CONN_STATE_FLUSHING;
+ connection_stop_reading(conn);
+ } else if (command->cmd == EXT_OR_CMD_TB_USERADDR) {
+ if (connection_ext_or_handle_cmd_useraddr(conn,
+ command->body, command->len) < 0)
+ goto err;
+ } else if (command->cmd == EXT_OR_CMD_TB_TRANSPORT) {
+ if (connection_ext_or_handle_cmd_transport(or_conn,
+ command->body, command->len) < 0)
+ goto err;
+ } else {
+ log_notice(LD_NET,"Got Extended ORPort command we don't regognize (%u).",
+ command->cmd);
+ }
+
+ ext_or_cmd_free(command);
+ }
+
+ return 0;
+
+ err:
+ ext_or_cmd_free(command);
+ connection_mark_for_close(conn);
+ return -1;
+}
+
+/** <b>conn</b> finished flushing Extended ORPort messages to the
+ * network, and is now ready to accept OR traffic. This function
+ * does the transition. */
+int
+connection_ext_or_finished_flushing(or_connection_t *conn)
+{
+ if (conn->base_.state == EXT_OR_CONN_STATE_FLUSHING) {
+ connection_start_reading(TO_CONN(conn));
+ connection_ext_or_transition(conn);
+ }
+ return 0;
+}
+
+/** Initiate Extended ORPort authentication, by sending the list of
+ * supported authentication types to the client. */
+int
+connection_ext_or_start_auth(or_connection_t *or_conn)
+{
+ connection_t *conn = TO_CONN(or_conn);
+ const uint8_t authtypes[] = {
+ /* We only support authtype '1' for now. */
+ EXT_OR_AUTHTYPE_SAFECOOKIE,
+ /* Marks the end of the list. */
+ 0
+ };
+
+ log_debug(LD_GENERAL,
+ "ExtORPort authentication: Sending supported authentication types");
+
+ connection_write_to_buf((const char *)authtypes, sizeof(authtypes), conn);
+ conn->state = EXT_OR_CONN_STATE_AUTH_WAIT_AUTH_TYPE;
+
+ return 0;
+}
+
+/** Free any leftover allocated memory of the ext_orport.c subsystem. */
+void
+ext_orport_free_all(void)
+{
+ if (ext_or_auth_cookie) /* Free the auth cookie */
+ tor_free(ext_or_auth_cookie);
+}
+
diff --git a/src/or/ext_orport.h b/src/or/ext_orport.h
new file mode 100644
index 000000000..ce45e5f41
--- /dev/null
+++ b/src/or/ext_orport.h
@@ -0,0 +1,42 @@
+/* Copyright (c) 2001 Matej Pfajfar.
+ * Copyright (c) 2001-2004, Roger Dingledine.
+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
+ * Copyright (c) 2007-2013, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#ifndef EXT_ORPORT_H
+#define EXT_ORPORT_H
+
+int connection_ext_or_start_auth(or_connection_t *or_conn);
+
+ext_or_cmd_t *ext_or_cmd_new(uint16_t len);
+void ext_or_cmd_free(ext_or_cmd_t *cmd);
+void connection_or_set_ext_or_identifier(or_connection_t *conn);
+void connection_or_remove_from_ext_or_id_map(or_connection_t *conn);
+void connection_or_clear_ext_or_id_map(void);
+or_connection_t *connection_or_get_by_ext_or_id(const char *id);
+
+int connection_ext_or_finished_flushing(or_connection_t *conn);
+int connection_ext_or_process_inbuf(or_connection_t *or_conn);
+
+int init_ext_or_cookie_authentication(int is_enabled);
+char *get_ext_or_auth_cookie_file_name(void);
+void ext_orport_free_all(void);
+
+#ifdef EXT_ORPORT_PRIVATE
+STATIC int connection_write_ext_or_command(connection_t *conn,
+ uint16_t command,
+ const char *body,
+ size_t bodylen);
+STATIC int handle_client_auth_nonce(const char *client_nonce,
+ size_t client_nonce_len,
+ char **client_hash_out,
+ char **reply_out, size_t *reply_len_out);
+#ifdef TOR_UNIT_TESTS
+extern uint8_t *ext_or_auth_cookie;
+extern int ext_or_auth_cookie_is_set;
+#endif
+#endif
+
+#endif
+
diff --git a/src/or/fp_pair.c b/src/or/fp_pair.c
index 4d8a835c8..55e4c89a4 100644
--- a/src/or/fp_pair.c
+++ b/src/or/fp_pair.c
@@ -32,17 +32,8 @@ fp_pair_map_entries_eq(const fp_pair_map_entry_t *a,
static INLINE unsigned int
fp_pair_map_entry_hash(const fp_pair_map_entry_t *a)
{
- const uint32_t *p;
- unsigned int hash;
-
- p = (const uint32_t *)(a->key.first);
- /* Hashes are 20 bytes long, so 5 times uint32_t */
- hash = p[0] ^ p[1] ^ p[2] ^ p[3] ^ p[4];
- /* Now XOR in the second fingerprint */
- p = (const uint32_t *)(a->key.second);
- hash ^= p[0] ^ p[1] ^ p[2] ^ p[3] ^ p[4];
-
- return hash;
+ tor_assert(sizeof(a->key) == DIGEST_LEN*2);
+ return (unsigned) siphash24g(&a->key, DIGEST_LEN*2);
}
/*
diff --git a/src/or/geoip.c b/src/or/geoip.c
index e2e98e8ec..f722bac46 100644
--- a/src/or/geoip.c
+++ b/src/or/geoip.c
@@ -120,7 +120,7 @@ geoip_add_entry(const tor_addr_t *low, const tor_addr_t *high,
/** Add an entry to the GeoIP table indicated by <b>family</b>,
* parsing it from <b>line</b>. The format is as for geoip_load_file(). */
-/*private*/ int
+STATIC int
geoip_parse_entry(const char *line, sa_family_t family)
{
tor_addr_t low_addr, high_addr;
@@ -363,7 +363,7 @@ geoip_load_file(sa_family_t family, const char *filename)
* be less than geoip_get_n_countries(). To decode it, call
* geoip_get_country_name().
*/
-int
+STATIC int
geoip_get_country_by_ipv4(uint32_t ipaddr)
{
geoip_ipv4_entry_t *ent;
@@ -379,7 +379,7 @@ geoip_get_country_by_ipv4(uint32_t ipaddr)
* 0 for the 'unknown country'. The return value will always be less than
* geoip_get_n_countries(). To decode it, call geoip_get_country_name().
*/
-int
+STATIC int
geoip_get_country_by_ipv6(const struct in6_addr *addr)
{
geoip_ipv6_entry_t *ent;
@@ -461,6 +461,10 @@ geoip_db_digest(sa_family_t family)
typedef struct clientmap_entry_t {
HT_ENTRY(clientmap_entry_t) node;
tor_addr_t addr;
+ /* Name of pluggable transport used by this client. NULL if no
+ pluggable transport was used. */
+ char *transport_name;
+
/** Time when we last saw this IP address, in MINUTES since the epoch.
*
* (This will run out of space around 4011 CE. If Tor is still in use around
@@ -482,12 +486,20 @@ static HT_HEAD(clientmap, clientmap_entry_t) client_history =
static INLINE unsigned
clientmap_entry_hash(const clientmap_entry_t *a)
{
- return ht_improve_hash(tor_addr_hash(&a->addr));
+ unsigned h = (unsigned) tor_addr_hash(&a->addr);
+
+ if (a->transport_name)
+ h += (unsigned) siphash24g(a->transport_name, strlen(a->transport_name));
+
+ return h;
}
/** Hashtable helper: compare two clientmap_entry_t values for equality. */
static INLINE int
clientmap_entries_eq(const clientmap_entry_t *a, const clientmap_entry_t *b)
{
+ if (strcmp_opt(a->transport_name, b->transport_name))
+ return 0;
+
return !tor_addr_compare(&a->addr, &b->addr, CMP_EXACT) &&
a->action == b->action;
}
@@ -497,6 +509,17 @@ HT_PROTOTYPE(clientmap, clientmap_entry_t, node, clientmap_entry_hash,
HT_GENERATE(clientmap, clientmap_entry_t, node, clientmap_entry_hash,
clientmap_entries_eq, 0.6, malloc, realloc, free);
+/** Free all storage held by <b>ent</b>. */
+static void
+clientmap_entry_free(clientmap_entry_t *ent)
+{
+ if (!ent)
+ return;
+
+ tor_free(ent->transport_name);
+ tor_free(ent);
+}
+
/** Clear history of connecting clients used by entry and bridge stats. */
static void
client_history_clear(void)
@@ -507,7 +530,7 @@ client_history_clear(void)
if ((*ent)->action == GEOIP_CLIENT_CONNECT) {
this = *ent;
next = HT_NEXT_RMV(clientmap, &client_history, ent);
- tor_free(this);
+ clientmap_entry_free(this);
} else {
next = HT_NEXT(clientmap, &client_history, ent);
}
@@ -519,27 +542,40 @@ client_history_clear(void)
* configured accordingly. */
void
geoip_note_client_seen(geoip_client_action_t action,
- const tor_addr_t *addr, time_t now)
+ const tor_addr_t *addr,
+ const char *transport_name,
+ time_t now)
{
const or_options_t *options = get_options();
clientmap_entry_t lookup, *ent;
+ memset(&lookup, 0, sizeof(clientmap_entry_t));
+
if (action == GEOIP_CLIENT_CONNECT) {
/* Only remember statistics as entry guard or as bridge. */
if (!options->EntryStatistics &&
(!(options->BridgeRelay && options->BridgeRecordUsageByCountry)))
return;
} else {
- if (options->BridgeRelay || options->BridgeAuthoritativeDir ||
- !options->DirReqStatistics)
+ /* Only gather directory-request statistics if configured, and
+ * forcibly disable them on bridge authorities. */
+ if (!options->DirReqStatistics || options->BridgeAuthoritativeDir)
return;
}
+ log_debug(LD_GENERAL, "Seen client from '%s' with transport '%s'.",
+ safe_str_client(fmt_addr((addr))),
+ transport_name ? transport_name : "<no transport>");
+
tor_addr_copy(&lookup.addr, addr);
lookup.action = (int)action;
+ lookup.transport_name = (char*) transport_name;
ent = HT_FIND(clientmap, &client_history, &lookup);
+
if (! ent) {
ent = tor_malloc_zero(sizeof(clientmap_entry_t));
tor_addr_copy(&ent->addr, addr);
+ if (transport_name)
+ ent->transport_name = tor_strdup(transport_name);
ent->action = (int)action;
HT_INSERT(clientmap, &client_history, ent);
}
@@ -566,7 +602,7 @@ remove_old_client_helper_(struct clientmap_entry_t *ent, void *_cutoff)
{
time_t cutoff = *(time_t*)_cutoff / 60;
if (ent->last_seen_in_minutes < cutoff) {
- tor_free(ent);
+ clientmap_entry_free(ent);
return 1;
} else {
return 0;
@@ -769,6 +805,106 @@ geoip_change_dirreq_state(uint64_t dirreq_id, dirreq_type_t type,
}
}
+/** Return the bridge-ip-transports string that should be inserted in
+ * our extra-info descriptor. Return NULL if the bridge-ip-transports
+ * line should be empty. */
+char *
+geoip_get_transport_history(void)
+{
+ unsigned granularity = IP_GRANULARITY;
+ /** String hash table (name of transport) -> (number of users). */
+ strmap_t *transport_counts = strmap_new();
+
+ /** Smartlist that contains copies of the names of the transports
+ that have been used. */
+ smartlist_t *transports_used = smartlist_new();
+
+ /* Special string to signify that no transport was used for this
+ connection. Pluggable transport names can't have symbols in their
+ names, so this string will never collide with a real transport. */
+ static const char* no_transport_str = "<OR>";
+
+ clientmap_entry_t **ent;
+ const char *transport_name = NULL;
+ smartlist_t *string_chunks = smartlist_new();
+ char *the_string = NULL;
+
+ /* If we haven't seen any clients yet, return NULL. */
+ if (HT_EMPTY(&client_history))
+ goto done;
+
+ /** We do the following steps to form the transport history string:
+ * a) Foreach client that uses a pluggable transport, we increase the
+ * times that transport was used by one. If the client did not use
+ * a transport, we increase the number of times someone connected
+ * without obfuscation.
+ * b) Foreach transport we observed, we write its transport history
+ * string and push it to string_chunks. So, for example, if we've
+ * seen 665 obfs2 clients, we write "obfs2=665".
+ * c) We concatenate string_chunks to form the final string.
+ */
+
+ log_debug(LD_GENERAL,"Starting iteration for transport history. %d clients.",
+ HT_SIZE(&client_history));
+
+ /* Loop through all clients. */
+ HT_FOREACH(ent, clientmap, &client_history) {
+ uintptr_t val;
+ void *ptr;
+ transport_name = (*ent)->transport_name;
+ if (!transport_name)
+ transport_name = no_transport_str;
+
+ /* Increase the count for this transport name. */
+ ptr = strmap_get(transport_counts, transport_name);
+ val = (uintptr_t)ptr;
+ val++;
+ ptr = (void*)val;
+ strmap_set(transport_counts, transport_name, ptr);
+
+ /* If it's the first time we see this transport, note it. */
+ if (val == 1)
+ smartlist_add(transports_used, tor_strdup(transport_name));
+
+ log_debug(LD_GENERAL, "Client from '%s' with transport '%s'. "
+ "I've now seen %d clients.",
+ safe_str_client(fmt_addr(&(*ent)->addr)),
+ transport_name ? transport_name : "<no transport>",
+ (int)val);
+ }
+
+ /* Sort the transport names (helps with unit testing). */
+ smartlist_sort_strings(transports_used);
+
+ /* Loop through all seen transports. */
+ SMARTLIST_FOREACH_BEGIN(transports_used, const char *, transport_name) {
+ void *transport_count_ptr = strmap_get(transport_counts, transport_name);
+ uintptr_t transport_count = (uintptr_t) transport_count_ptr;
+
+ log_debug(LD_GENERAL, "We got "U64_FORMAT" clients with transport '%s'.",
+ U64_PRINTF_ARG((uint64_t)transport_count), transport_name);
+
+ smartlist_add_asprintf(string_chunks, "%s="U64_FORMAT,
+ transport_name,
+ U64_PRINTF_ARG(round_uint64_to_next_multiple_of(
+ (uint64_t)transport_count,
+ granularity)));
+ } SMARTLIST_FOREACH_END(transport_name);
+
+ the_string = smartlist_join_strings(string_chunks, ",", 0, NULL);
+
+ log_debug(LD_GENERAL, "Final bridge-ip-transports string: '%s'", the_string);
+
+ done:
+ strmap_free(transport_counts, NULL);
+ SMARTLIST_FOREACH(transports_used, char *, s, tor_free(s));
+ smartlist_free(transports_used);
+ SMARTLIST_FOREACH(string_chunks, char *, s, tor_free(s));
+ smartlist_free(string_chunks);
+
+ return the_string;
+}
+
/** Return a newly allocated comma-separated string containing statistics
* on network status downloads. The string contains the number of completed
* requests, timeouts, and still running requests as well as the download
@@ -1037,7 +1173,7 @@ geoip_reset_dirreq_stats(time_t now)
if ((*ent)->action == GEOIP_CLIENT_NETWORKSTATUS) {
this = *ent;
next = HT_NEXT_RMV(clientmap, &client_history, ent);
- tor_free(this);
+ clientmap_entry_free(this);
} else {
next = HT_NEXT(clientmap, &client_history, ent);
}
@@ -1132,7 +1268,7 @@ geoip_format_dirreq_stats(time_t now)
time_t
geoip_dirreq_stats_write(time_t now)
{
- char *statsdir = NULL, *filename = NULL, *str = NULL;
+ char *str = NULL;
if (!start_of_dirreq_stats_interval)
return 0; /* Not initialized. */
@@ -1146,21 +1282,13 @@ geoip_dirreq_stats_write(time_t now)
str = geoip_format_dirreq_stats(now);
/* Write dirreq-stats string to disk. */
- statsdir = get_datadir_fname("stats");
- if (check_private_dir(statsdir, CPD_CREATE, get_options()->User) < 0) {
- log_warn(LD_HIST, "Unable to create stats/ directory!");
- goto done;
+ if (!check_or_create_data_subdir("stats")) {
+ write_to_data_subdir("stats", "dirreq-stats", str, "dirreq statistics");
+ /* Reset measurement interval start. */
+ geoip_reset_dirreq_stats(now);
}
- filename = get_datadir_fname2("stats", "dirreq-stats");
- if (write_str_to_file(filename, str, 0) < 0)
- log_warn(LD_HIST, "Unable to write dirreq statistics to disk!");
-
- /* Reset measurement interval start. */
- geoip_reset_dirreq_stats(now);
done:
- tor_free(statsdir);
- tor_free(filename);
tor_free(str);
return start_of_dirreq_stats_interval + WRITE_STATS_INTERVAL;
}
@@ -1197,6 +1325,8 @@ validate_bridge_stats(const char *stats_str, time_t now)
const char *BRIDGE_STATS_END = "bridge-stats-end ";
const char *BRIDGE_IPS = "bridge-ips ";
const char *BRIDGE_IPS_EMPTY_LINE = "bridge-ips\n";
+ const char *BRIDGE_TRANSPORTS = "bridge-ip-transports ";
+ const char *BRIDGE_TRANSPORTS_EMPTY_LINE = "bridge-ip-transports\n";
const char *tmp;
time_t stats_end_time;
int seconds;
@@ -1231,6 +1361,15 @@ validate_bridge_stats(const char *stats_str, time_t now)
return 0;
}
+ /* Parse: "bridge-ip-transports PT=N,PT=N,..." */
+ tmp = find_str_at_start_of_line(stats_str, BRIDGE_TRANSPORTS);
+ if (!tmp) {
+ /* Look if there is an empty "bridge-ip-transports" line */
+ tmp = find_str_at_start_of_line(stats_str, BRIDGE_TRANSPORTS_EMPTY_LINE);
+ if (!tmp)
+ return 0;
+ }
+
return 1;
}
@@ -1244,7 +1383,8 @@ static char *bridge_stats_extrainfo = NULL;
char *
geoip_format_bridge_stats(time_t now)
{
- char *out = NULL, *country_data = NULL, *ipver_data = NULL;
+ char *out = NULL;
+ char *country_data = NULL, *ipver_data = NULL, *transport_data = NULL;
long duration = now - start_of_bridge_stats_interval;
char written[ISO_TIME_LEN+1];
@@ -1255,16 +1395,20 @@ geoip_format_bridge_stats(time_t now)
format_iso_time(written, now);
geoip_get_client_history(GEOIP_CLIENT_CONNECT, &country_data, &ipver_data);
+ transport_data = geoip_get_transport_history();
tor_asprintf(&out,
"bridge-stats-end %s (%ld s)\n"
"bridge-ips %s\n"
- "bridge-ip-versions %s\n",
+ "bridge-ip-versions %s\n"
+ "bridge-ip-transports %s\n",
written, duration,
country_data ? country_data : "",
- ipver_data ? ipver_data : "");
+ ipver_data ? ipver_data : "",
+ transport_data ? transport_data : "");
tor_free(country_data);
tor_free(ipver_data);
+ tor_free(transport_data);
return out;
}
@@ -1297,7 +1441,7 @@ format_bridge_stats_controller(time_t now)
time_t
geoip_bridge_stats_write(time_t now)
{
- char *filename = NULL, *val = NULL, *statsdir = NULL;
+ char *val = NULL;
/* Check if 24 hours have passed since starting measurements. */
if (now < start_of_bridge_stats_interval + WRITE_STATS_INTERVAL)
@@ -1317,24 +1461,20 @@ geoip_bridge_stats_write(time_t now)
start_of_bridge_stats_interval = now;
/* Write it to disk. */
- statsdir = get_datadir_fname("stats");
- if (check_private_dir(statsdir, CPD_CREATE, get_options()->User) < 0)
- goto done;
- filename = get_datadir_fname2("stats", "bridge-stats");
-
- write_str_to_file(filename, bridge_stats_extrainfo, 0);
-
- /* Tell the controller, "hey, there are clients!" */
- {
- char *controller_str = format_bridge_stats_controller(now);
- if (controller_str)
- control_event_clients_seen(controller_str);
- tor_free(controller_str);
+ if (!check_or_create_data_subdir("stats")) {
+ write_to_data_subdir("stats", "bridge-stats",
+ bridge_stats_extrainfo, "bridge statistics");
+
+ /* Tell the controller, "hey, there are clients!" */
+ {
+ char *controller_str = format_bridge_stats_controller(now);
+ if (controller_str)
+ control_event_clients_seen(controller_str);
+ tor_free(controller_str);
+ }
}
- done:
- tor_free(filename);
- tor_free(statsdir);
+ done:
return start_of_bridge_stats_interval + WRITE_STATS_INTERVAL;
}
@@ -1436,7 +1576,7 @@ geoip_format_entry_stats(time_t now)
time_t
geoip_entry_stats_write(time_t now)
{
- char *statsdir = NULL, *filename = NULL, *str = NULL;
+ char *str = NULL;
if (!start_of_entry_stats_interval)
return 0; /* Not initialized. */
@@ -1450,21 +1590,14 @@ geoip_entry_stats_write(time_t now)
str = geoip_format_entry_stats(now);
/* Write entry-stats string to disk. */
- statsdir = get_datadir_fname("stats");
- if (check_private_dir(statsdir, CPD_CREATE, get_options()->User) < 0) {
- log_warn(LD_HIST, "Unable to create stats/ directory!");
- goto done;
- }
- filename = get_datadir_fname2("stats", "entry-stats");
- if (write_str_to_file(filename, str, 0) < 0)
- log_warn(LD_HIST, "Unable to write entry statistics to disk!");
+ if (!check_or_create_data_subdir("stats")) {
+ write_to_data_subdir("stats", "entry-stats", str, "entry statistics");
- /* Reset measurement interval start. */
- geoip_reset_entry_stats(now);
+ /* Reset measurement interval start. */
+ geoip_reset_entry_stats(now);
+ }
done:
- tor_free(statsdir);
- tor_free(filename);
tor_free(str);
return start_of_entry_stats_interval + WRITE_STATS_INTERVAL;
}
@@ -1534,7 +1667,7 @@ geoip_free_all(void)
for (ent = HT_START(clientmap, &client_history); ent != NULL; ent = next) {
this = *ent;
next = HT_NEXT_RMV(clientmap, &client_history, ent);
- tor_free(this);
+ clientmap_entry_free(this);
}
HT_CLEAR(clientmap, &client_history);
}
@@ -1549,5 +1682,6 @@ geoip_free_all(void)
}
clear_geoip_db();
+ tor_free(bridge_stats_extrainfo);
}
diff --git a/src/or/geoip.h b/src/or/geoip.h
index ebefee5f4..b9b53c300 100644
--- a/src/or/geoip.h
+++ b/src/or/geoip.h
@@ -12,10 +12,12 @@
#ifndef TOR_GEOIP_H
#define TOR_GEOIP_H
+#include "testsupport.h"
+
#ifdef GEOIP_PRIVATE
-int geoip_parse_entry(const char *line, sa_family_t family);
-int geoip_get_country_by_ipv4(uint32_t ipaddr);
-int geoip_get_country_by_ipv6(const struct in6_addr *addr);
+STATIC int geoip_parse_entry(const char *line, sa_family_t family);
+STATIC int geoip_get_country_by_ipv4(uint32_t ipaddr);
+STATIC int geoip_get_country_by_ipv6(const struct in6_addr *addr);
#endif
int should_record_bridge_info(const or_options_t *options);
int geoip_load_file(sa_family_t family, const char *filename);
@@ -27,10 +29,12 @@ const char *geoip_db_digest(sa_family_t family);
country_t geoip_get_country(const char *countrycode);
void geoip_note_client_seen(geoip_client_action_t action,
- const tor_addr_t *addr, time_t now);
+ const tor_addr_t *addr, const char *transport_name,
+ time_t now);
void geoip_remove_old_clients(time_t cutoff);
void geoip_note_ns_response(geoip_ns_response_t response);
+char *geoip_get_transport_history(void);
int geoip_get_client_history(geoip_client_action_t action,
char **country_str, char **ipver_str);
char *geoip_get_request_history(void);
diff --git a/src/or/hibernate.c b/src/or/hibernate.c
index a41257133..c433ac1be 100644
--- a/src/or/hibernate.c
+++ b/src/or/hibernate.c
@@ -239,8 +239,8 @@ accounting_parse_options(const or_options_t *options, int validate_only)
/** If we want to manage the accounting system and potentially
* hibernate, return 1, else return 0.
*/
-int
-accounting_is_enabled(const or_options_t *options)
+MOCK_IMPL(int,
+accounting_is_enabled,(const or_options_t *options))
{
if (options->AccountingMax)
return 1;
@@ -255,6 +255,13 @@ accounting_get_interval_length(void)
return (int)(interval_end_time - interval_start_time);
}
+/** Return the time at which the current accounting interval will end. */
+MOCK_IMPL(time_t,
+accounting_get_end_time,(void))
+{
+ return interval_end_time;
+}
+
/** Called from main.c to tell us that <b>seconds</b> seconds have
* passed, <b>n_read</b> bytes have been read, and <b>n_written</b>
* bytes have been written. */
@@ -641,7 +648,15 @@ read_bandwidth_usage(void)
{
char *fname = get_datadir_fname("bw_accounting");
- unlink(fname);
+ int res;
+
+ res = unlink(fname);
+ if (res != 0) {
+ log_warn(LD_FS,
+ "Failed to unlink %s: %s",
+ fname, strerror(errno));
+ }
+
tor_free(fname);
}
@@ -808,8 +823,8 @@ hibernate_begin_shutdown(void)
}
/** Return true iff we are currently hibernating. */
-int
-we_are_hibernating(void)
+MOCK_IMPL(int,
+we_are_hibernating,(void))
{
return hibernate_state != HIBERNATE_STATE_LIVE;
}
@@ -1010,6 +1025,7 @@ getinfo_helper_accounting(control_connection_t *conn,
return 0;
}
+#ifdef TOR_UNIT_TESTS
/**
* Manually change the hibernation state. Private; used only by the unit
* tests.
@@ -1019,4 +1035,5 @@ hibernate_set_state_for_testing_(hibernate_state_t newstate)
{
hibernate_state = newstate;
}
+#endif
diff --git a/src/or/hibernate.h b/src/or/hibernate.h
index d2d6989e1..38ecb7512 100644
--- a/src/or/hibernate.h
+++ b/src/or/hibernate.h
@@ -12,15 +12,18 @@
#ifndef TOR_HIBERNATE_H
#define TOR_HIBERNATE_H
+#include "testsupport.h"
+
int accounting_parse_options(const or_options_t *options, int validate_only);
-int accounting_is_enabled(const or_options_t *options);
+MOCK_DECL(int, accounting_is_enabled, (const or_options_t *options));
int accounting_get_interval_length(void);
+MOCK_DECL(time_t, accounting_get_end_time, (void));
void configure_accounting(time_t now);
void accounting_run_housekeeping(time_t now);
void accounting_add_bytes(size_t n_read, size_t n_written, int seconds);
int accounting_record_bandwidth_usage(time_t now, or_state_t *state);
void hibernate_begin_shutdown(void);
-int we_are_hibernating(void);
+MOCK_DECL(int, we_are_hibernating, (void));
void consider_hibernation(time_t now);
int getinfo_helper_accounting(control_connection_t *conn,
const char *question, char **answer,
@@ -45,8 +48,10 @@ typedef enum {
HIBERNATE_STATE_INITIAL=5
} hibernate_state_t;
+#ifdef TOR_UNIT_TESTS
void hibernate_set_state_for_testing_(hibernate_state_t newstate);
#endif
+#endif
#endif
diff --git a/src/or/include.am b/src/or/include.am
index 65dbeff53..47bdd0990 100644
--- a/src/or/include.am
+++ b/src/or/include.am
@@ -1,5 +1,13 @@
bin_PROGRAMS+= src/or/tor
-noinst_LIBRARIES+= src/or/libtor.a
+noinst_LIBRARIES += \
+ src/or/libtor.a
+if UNITTESTS_ENABLED
+noinst_LIBRARIES += \
+ src/or/libtor-testing.a
+endif
+if COVERAGE_ENABLED
+noinst_PROGRAMS+= src/or/tor-cov
+endif
if BUILD_NT_SERVICES
tor_platform_source=src/or/ntmain.c
@@ -21,11 +29,12 @@ else
onion_ntor_source=
endif
-src_or_libtor_a_SOURCES = \
+LIBTOR_A_SOURCES = \
src/or/addressmap.c \
src/or/buffers.c \
src/or/channel.c \
src/or/channeltls.c \
+ src/or/circpathbias.c \
src/or/circuitbuild.c \
src/or/circuitlist.c \
src/or/circuitmux.c \
@@ -48,6 +57,7 @@ src_or_libtor_a_SOURCES = \
src/or/fp_pair.c \
src/or/geoip.c \
src/or/entrynodes.c \
+ src/or/ext_orport.c \
src/or/hibernate.c \
src/or/main.c \
src/or/microdesc.c \
@@ -77,6 +87,9 @@ src_or_libtor_a_SOURCES = \
$(onion_ntor_source) \
src/or/config_codedigest.c
+src_or_libtor_a_SOURCES = $(LIBTOR_A_SOURCES)
+src_or_libtor_testing_a_SOURCES = $(LIBTOR_A_SOURCES)
+
#libtor_a_LIBADD = ../common/libor.a ../common/libor-crypto.a \
# ../common/libor-event.a
@@ -90,6 +103,9 @@ AM_CPPFLAGS += -DSHARE_DATADIR="\"$(datadir)\"" \
-DLOCALSTATEDIR="\"$(localstatedir)\"" \
-DBINDIR="\"$(bindir)\""
+src_or_libtor_testing_a_CPPFLAGS = -DTOR_UNIT_TESTS $(AM_CPPFLAGS)
+src_or_libtor_testing_a_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS)
+
# -L flags need to go in LDFLAGS. -l flags need to go in LDADD.
# This seems to matter nowhere but on windows, but I assure you that it
# matters a lot there, and is quite hard to debug if you forget to do it.
@@ -102,11 +118,24 @@ src_or_tor_LDADD = src/or/libtor.a src/common/libor.a \
@TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ @TOR_OPENSSL_LIBS@ \
@TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@
+if COVERAGE_ENABLED
+src_or_tor_cov_SOURCES = src/or/tor_main.c
+src_or_tor_cov_CPPFLAGS = -DTOR_UNIT_TESTS $(AM_CPPFLAGS)
+src_or_tor_cov_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS)
+src_or_tor_cov_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ @TOR_LDFLAGS_libevent@
+src_or_tor_cov_LDADD = src/or/libtor-testing.a src/common/libor-testing.a \
+ src/common/libor-crypto-testing.a $(LIBDONNA) \
+ src/common/libor-event-testing.a \
+ @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ @TOR_OPENSSL_LIBS@ \
+ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@
+endif
+
ORHEADERS = \
src/or/addressmap.h \
src/or/buffers.h \
src/or/channel.h \
src/or/channeltls.h \
+ src/or/circpathbias.h \
src/or/circuitbuild.h \
src/or/circuitlist.h \
src/or/circuitmux.h \
@@ -127,6 +156,7 @@ ORHEADERS = \
src/or/dns.h \
src/or/dnsserv.h \
src/or/eventdns_tor.h \
+ src/or/ext_orport.h \
src/or/fp_pair.h \
src/or/geoip.h \
src/or/entrynodes.h \
diff --git a/src/or/main.c b/src/or/main.c
index 70b1340cb..3deab3e52 100644
--- a/src/or/main.c
+++ b/src/or/main.c
@@ -13,6 +13,7 @@
#define MAIN_PRIVATE
#include "or.h"
#include "addressmap.h"
+#include "backtrace.h"
#include "buffers.h"
#include "channel.h"
#include "channeltls.h"
@@ -21,6 +22,7 @@
#include "circuituse.h"
#include "command.h"
#include "config.h"
+#include "confparse.h"
#include "connection.h"
#include "connection_edge.h"
#include "connection_or.h"
@@ -52,11 +54,13 @@
#include "routerparse.h"
#include "statefile.h"
#include "status.h"
+#include "ext_orport.h"
#ifdef USE_DMALLOC
#include <dmalloc.h>
#include <openssl/crypto.h>
#endif
#include "memarea.h"
+#include "../common/sandbox.h"
#ifdef HAVE_EVENT2_EVENT_H
#include <event2/event.h>
@@ -155,8 +159,6 @@ int can_complete_circuit=0;
/** How often do we 'forgive' undownloadable router descriptors and attempt
* to download them again? */
#define DESCRIPTOR_FAILURE_RESET_INTERVAL (60*60)
-/** How long do we let a directory connection stall before expiring it? */
-#define DIR_CONN_MAX_STALL (5*60)
/** Decides our behavior when no logs are configured/before any
* logs have been configured. For 0, we log notice to stdout as normal.
@@ -351,6 +353,8 @@ connection_remove(connection_t *conn)
(int)conn->s, conn_type_to_string(conn->type),
smartlist_len(connection_array));
+ control_event_conn_bandwidth(conn);
+
tor_assert(conn->conn_array_index >= 0);
current_index = conn->conn_array_index;
connection_unregister_events(conn); /* This is redundant, but cheap. */
@@ -414,6 +418,19 @@ connection_unlink(connection_t *conn)
connection_free(conn);
}
+/** Initialize the global connection list, closeable connection list,
+ * and active connection list. */
+STATIC void
+init_connection_lists(void)
+{
+ if (!connection_array)
+ connection_array = smartlist_new();
+ if (!closeable_connection_lst)
+ closeable_connection_lst = smartlist_new();
+ if (!active_linked_connection_lst)
+ active_linked_connection_lst = smartlist_new();
+}
+
/** Schedule <b>conn</b> to be closed. **/
void
add_connection_to_closeable_list(connection_t *conn)
@@ -452,15 +469,15 @@ get_connection_array(void)
/** Provides the traffic read and written over the life of the process. */
-uint64_t
-get_bytes_read(void)
+MOCK_IMPL(uint64_t,
+get_bytes_read,(void))
{
return stats_n_bytes_read;
}
/* DOCDOC get_bytes_written */
-uint64_t
-get_bytes_written(void)
+MOCK_IMPL(uint64_t,
+get_bytes_written,(void))
{
return stats_n_bytes_written;
}
@@ -507,8 +524,8 @@ connection_is_reading(connection_t *conn)
}
/** Tell the main loop to stop notifying <b>conn</b> of any read events. */
-void
-connection_stop_reading(connection_t *conn)
+MOCK_IMPL(void,
+connection_stop_reading,(connection_t *conn))
{
tor_assert(conn);
@@ -532,8 +549,8 @@ connection_stop_reading(connection_t *conn)
}
/** Tell the main loop to start notifying <b>conn</b> of any read events. */
-void
-connection_start_reading(connection_t *conn)
+MOCK_IMPL(void,
+connection_start_reading,(connection_t *conn))
{
tor_assert(conn);
@@ -572,8 +589,8 @@ connection_is_writing(connection_t *conn)
}
/** Tell the main loop to stop notifying <b>conn</b> of any write events. */
-void
-connection_stop_writing(connection_t *conn)
+MOCK_IMPL(void,
+connection_stop_writing,(connection_t *conn))
{
tor_assert(conn);
@@ -598,8 +615,8 @@ connection_stop_writing(connection_t *conn)
}
/** Tell the main loop to start notifying <b>conn</b> of any write events. */
-void
-connection_start_writing(connection_t *conn)
+MOCK_IMPL(void,
+connection_start_writing,(connection_t *conn))
{
tor_assert(conn);
@@ -687,7 +704,7 @@ connection_stop_reading_from_linked_conn(connection_t *conn)
}
/** Close all connections that have been scheduled to get closed. */
-static void
+STATIC void
close_closeable_connections(void)
{
int i;
@@ -902,16 +919,7 @@ conn_close_if_marked(int i)
return 0;
}
if (connection_wants_to_flush(conn)) {
- int severity;
- if (conn->type == CONN_TYPE_EXIT ||
- (conn->type == CONN_TYPE_OR && server_mode(get_options())) ||
- (conn->type == CONN_TYPE_DIR && conn->purpose == DIR_PURPOSE_SERVER))
- severity = LOG_INFO;
- else
- severity = LOG_NOTICE;
- /* XXXX Maybe allow this to happen a certain amount per hour; it usually
- * is meaningless. */
- log_fn(severity, LD_NET, "We stalled too much while trying to write %d "
+ log_fn(LOG_INFO, LD_NET, "We stalled too much while trying to write %d "
"bytes to address %s. If this happens a lot, either "
"something is wrong with your network connection, or "
"something is wrong with theirs. "
@@ -1021,9 +1029,11 @@ run_connection_housekeeping(int i, time_t now)
* if a server or received if a client) for 5 min */
if (conn->type == CONN_TYPE_DIR &&
((DIR_CONN_IS_SERVER(conn) &&
- conn->timestamp_lastwritten + DIR_CONN_MAX_STALL < now) ||
+ conn->timestamp_lastwritten
+ + options->TestingDirConnectionMaxStall < now) ||
(!DIR_CONN_IS_SERVER(conn) &&
- conn->timestamp_lastread + DIR_CONN_MAX_STALL < now))) {
+ conn->timestamp_lastread
+ + options->TestingDirConnectionMaxStall < now))) {
log_info(LD_DIR,"Expiring wedged directory conn (fd %d, purpose %d)",
(int)conn->s, conn->purpose);
/* This check is temporary; it's to let us know whether we should consider
@@ -1149,6 +1159,18 @@ get_signewnym_epoch(void)
return newnym_epoch;
}
+static time_t time_to_check_descriptor = 0;
+/**
+ * Update our schedule so that we'll check whether we need to update our
+ * descriptor immediately, rather than after up to CHECK_DESCRIPTOR_INTERVAL
+ * seconds.
+ */
+void
+reschedule_descriptor_update_check(void)
+{
+ time_to_check_descriptor = 0;
+}
+
/** Perform regular maintenance tasks. This function gets run once per
* second by second_elapsed_callback().
*/
@@ -1158,7 +1180,7 @@ run_scheduled_events(time_t now)
static time_t last_rotated_x509_certificate = 0;
static time_t time_to_check_v3_certificate = 0;
static time_t time_to_check_listeners = 0;
- static time_t time_to_check_descriptor = 0;
+ static time_t time_to_download_networkstatus = 0;
static time_t time_to_shrink_memory = 0;
static time_t time_to_try_getting_descriptors = 0;
static time_t time_to_reset_descriptor_failures = 0;
@@ -1182,22 +1204,12 @@ run_scheduled_events(time_t now)
int i;
int have_dir_info;
- /** 0. See if we've been asked to shut down and our timeout has
+ /* 0. See if we've been asked to shut down and our timeout has
* expired; or if our bandwidth limits are exhausted and we
* should hibernate; or if it's time to wake up from hibernation.
*/
consider_hibernation(now);
-#if 0
- {
- static time_t nl_check_time = 0;
- if (nl_check_time <= now) {
- nodelist_assert_ok();
- nl_check_time = now + 30;
- }
- }
-#endif
-
/* 0b. If we've deferred a signewnym, make sure it gets handled
* eventually. */
if (signewnym_is_pending &&
@@ -1209,7 +1221,7 @@ run_scheduled_events(time_t now)
/* 0c. If we've deferred log messages for the controller, handle them now */
flush_pending_log_callbacks();
- /** 1a. Every MIN_ONION_KEY_LIFETIME seconds, rotate the onion keys,
+ /* 1a. Every MIN_ONION_KEY_LIFETIME seconds, rotate the onion keys,
* shut down and restart all cpuworkers, and update the directory if
* necessary.
*/
@@ -1225,7 +1237,8 @@ run_scheduled_events(time_t now)
router_upload_dir_desc_to_dirservers(0);
}
- if (!options->DisableNetwork && time_to_try_getting_descriptors < now) {
+ if (!should_delay_dir_fetches(options, NULL) &&
+ time_to_try_getting_descriptors < now) {
update_all_descriptor_downloads(now);
update_extrainfo_downloads(now);
if (router_have_minimum_dir_info())
@@ -1240,10 +1253,10 @@ run_scheduled_events(time_t now)
now + DESCRIPTOR_FAILURE_RESET_INTERVAL;
}
- if (options->UseBridges)
+ if (options->UseBridges && !options->DisableNetwork)
fetch_bridge_descriptors(options, now);
- /** 1b. Every MAX_SSL_KEY_LIFETIME_INTERNAL seconds, we change our
+ /* 1b. Every MAX_SSL_KEY_LIFETIME_INTERNAL seconds, we change our
* TLS context. */
if (!last_rotated_x509_certificate)
last_rotated_x509_certificate = now;
@@ -1269,7 +1282,7 @@ run_scheduled_events(time_t now)
time_to_add_entropy = now + ENTROPY_INTERVAL;
}
- /** 1c. If we have to change the accounting interval or record
+ /* 1c. If we have to change the accounting interval or record
* bandwidth used in this accounting interval, do so. */
if (accounting_is_enabled(options))
accounting_run_housekeeping(now);
@@ -1282,7 +1295,7 @@ run_scheduled_events(time_t now)
dirserv_test_reachability(now);
}
- /** 1d. Periodically, we discount older stability information so that new
+ /* 1d. Periodically, we discount older stability information so that new
* stability info counts more, and save the stability information to disk as
* appropriate. */
if (time_to_downrate_stability < now)
@@ -1401,7 +1414,7 @@ run_scheduled_events(time_t now)
dns_init();
}
- /** 2. Periodically, we consider force-uploading our descriptor
+ /* 2. Periodically, we consider force-uploading our descriptor
* (if we've passed our internal checks). */
/** How often do we check whether part of our router info has changed in a
@@ -1444,22 +1457,29 @@ run_scheduled_events(time_t now)
/* If any networkstatus documents are no longer recent, we need to
* update all the descriptors' running status. */
- /* purge obsolete entries */
- networkstatus_v2_list_clean(now);
/* Remove dead routers. */
routerlist_remove_old_routers();
+ }
- /* Also, once per minute, check whether we want to download any
- * networkstatus documents.
- */
+ /* 2c. Every minute (or every second if TestingTorNetwork), check
+ * whether we want to download any networkstatus documents. */
+
+/* How often do we check whether we should download network status
+ * documents? */
+#define networkstatus_dl_check_interval(o) ((o)->TestingTorNetwork ? 1 : 60)
+
+ if (!should_delay_dir_fetches(options, NULL) &&
+ time_to_download_networkstatus < now) {
+ time_to_download_networkstatus =
+ now + networkstatus_dl_check_interval(options);
update_networkstatus_downloads(now);
}
- /** 2c. Let directory voting happen. */
+ /* 2c. Let directory voting happen. */
if (authdir_mode_v3(options))
dirvote_act(options, now);
- /** 3a. Every second, we examine pending circuits and prune the
+ /* 3a. Every second, we examine pending circuits and prune the
* ones which have been pending for more than a few seconds.
* We do this before step 4, so it can try building more if
* it's not comfortable with the number of available circuits.
@@ -1468,24 +1488,24 @@ run_scheduled_events(time_t now)
* it can't, currently), we should do this more often.) */
circuit_expire_building();
- /** 3b. Also look at pending streams and prune the ones that 'began'
+ /* 3b. Also look at pending streams and prune the ones that 'began'
* a long time ago but haven't gotten a 'connected' yet.
* Do this before step 4, so we can put them back into pending
* state to be picked up by the new circuit.
*/
connection_ap_expire_beginning();
- /** 3c. And expire connections that we've held open for too long.
+ /* 3c. And expire connections that we've held open for too long.
*/
connection_expire_held_open();
- /** 3d. And every 60 seconds, we relaunch listeners if any died. */
+ /* 3d. And every 60 seconds, we relaunch listeners if any died. */
if (!net_is_disabled() && time_to_check_listeners < now) {
retry_all_listeners(NULL, NULL, 0);
time_to_check_listeners = now+60;
}
- /** 4. Every second, we try a new circuit if there are no valid
+ /* 4. Every second, we try a new circuit if there are no valid
* circuits. Every NewCircuitPeriod seconds, we expire circuits
* that became dirty more than MaxCircuitDirtiness seconds ago,
* and we make a new circ if there are no clean circuits.
@@ -1498,7 +1518,7 @@ run_scheduled_events(time_t now)
if (now % 10 == 5)
circuit_expire_old_circuits_serverside(now);
- /** 5. We do housekeeping for each connection... */
+ /* 5. We do housekeeping for each connection... */
connection_or_set_bad_connections(NULL, 0);
for (i=0;i<smartlist_len(connection_array);i++) {
run_connection_housekeeping(i, now);
@@ -1510,7 +1530,9 @@ run_scheduled_events(time_t now)
if (conn->inbuf)
buf_shrink(conn->inbuf);
});
+#ifdef ENABLE_MEMPOOL
clean_cell_pool();
+#endif /* ENABLE_MEMPOOL */
buf_shrink_freelists(0);
/** How often do we check buffers and pools for empty space that can be
* deallocated? */
@@ -1518,33 +1540,35 @@ run_scheduled_events(time_t now)
time_to_shrink_memory = now + MEM_SHRINK_INTERVAL;
}
- /** 6. And remove any marked circuits... */
+ /* 6. And remove any marked circuits... */
circuit_close_all_marked();
- /** 7. And upload service descriptors if necessary. */
+ /* 7. And upload service descriptors if necessary. */
if (can_complete_circuit && !net_is_disabled()) {
rend_consider_services_upload(now);
rend_consider_descriptor_republication();
}
- /** 8. and blow away any connections that need to die. have to do this now,
+ /* 8. and blow away any connections that need to die. have to do this now,
* because if we marked a conn for close and left its socket -1, then
* we'll pass it to poll/select and bad things will happen.
*/
close_closeable_connections();
- /** 8b. And if anything in our state is ready to get flushed to disk, we
+ /* 8b. And if anything in our state is ready to get flushed to disk, we
* flush it. */
or_state_save(now);
- /** 8c. Do channel cleanup just like for connections */
+ /* 8c. Do channel cleanup just like for connections */
channel_run_cleanup();
channel_listener_run_cleanup();
- /** 9. and if we're a server, check whether our DNS is telling stories to
- * us. */
+ /* 9. and if we're an exit node, check whether our DNS is telling stories
+ * to us. */
if (!net_is_disabled() &&
- public_server_mode(options) && time_to_check_for_correct_dns < now) {
+ public_server_mode(options) &&
+ time_to_check_for_correct_dns < now &&
+ ! router_my_exit_policy_is_reject_star()) {
if (!time_to_check_for_correct_dns) {
time_to_check_for_correct_dns = now + 60 + crypto_rand_int(120);
} else {
@@ -1554,7 +1578,7 @@ run_scheduled_events(time_t now)
}
}
- /** 10. write bridge networkstatus file to disk */
+ /* 10. write bridge networkstatus file to disk */
if (options->BridgeAuthoritativeDir &&
time_to_write_bridge_status_file < now) {
networkstatus_dump_bridge_status_to_file(now);
@@ -1562,7 +1586,7 @@ run_scheduled_events(time_t now)
time_to_write_bridge_status_file = now+BRIDGE_STATUSFILE_INTERVAL;
}
- /** 11. check the port forwarding app */
+ /* 11. check the port forwarding app */
if (!net_is_disabled() &&
time_to_check_port_forwarding < now &&
options->PortForwarding &&
@@ -1580,11 +1604,11 @@ run_scheduled_events(time_t now)
time_to_check_port_forwarding = now+PORT_FORWARDING_CHECK_INTERVAL;
}
- /** 11b. check pending unconfigured managed proxies */
+ /* 11b. check pending unconfigured managed proxies */
if (!net_is_disabled() && pt_proxies_configuration_pending())
pt_configure_remaining_proxies();
- /** 12. write the heartbeat message */
+ /* 12. write the heartbeat message */
if (options->HeartbeatPeriod &&
time_to_next_heartbeat <= now) {
if (time_to_next_heartbeat) /* don't log the first heartbeat */
@@ -1644,6 +1668,9 @@ second_elapsed_callback(periodic_timer_t *timer, void *arg)
control_event_bandwidth_used((uint32_t)bytes_read,(uint32_t)bytes_written);
control_event_stream_bandwidth_used();
+ control_event_conn_bandwidth_used();
+ control_event_circ_bandwidth_used();
+ control_event_circuit_cell_stats();
if (server_mode(options) &&
!net_is_disabled() &&
@@ -1655,24 +1682,28 @@ second_elapsed_callback(periodic_timer_t *timer, void *arg)
/* every 20 minutes, check and complain if necessary */
const routerinfo_t *me = router_get_my_routerinfo();
if (me && !check_whether_orport_reachable()) {
+ char *address = tor_dup_ip(me->addr);
log_warn(LD_CONFIG,"Your server (%s:%d) has not managed to confirm that "
"its ORPort is reachable. Please check your firewalls, ports, "
"address, /etc/hosts file, etc.",
- me->address, me->or_port);
+ address, me->or_port);
control_event_server_status(LOG_WARN,
"REACHABILITY_FAILED ORADDRESS=%s:%d",
- me->address, me->or_port);
+ address, me->or_port);
+ tor_free(address);
}
if (me && !check_whether_dirport_reachable()) {
+ char *address = tor_dup_ip(me->addr);
log_warn(LD_CONFIG,
"Your server (%s:%d) has not managed to confirm that its "
"DirPort is reachable. Please check your firewalls, ports, "
"address, /etc/hosts file, etc.",
- me->address, me->dir_port);
+ address, me->dir_port);
control_event_server_status(LOG_WARN,
"REACHABILITY_FAILED DIRADDRESS=%s:%d",
- me->address, me->dir_port);
+ address, me->dir_port);
+ tor_free(address);
}
}
@@ -1734,7 +1765,7 @@ refill_callback(periodic_timer_t *timer, void *arg)
accounting_add_bytes(bytes_read, bytes_written, seconds_rolled_over);
if (milliseconds_elapsed > 0)
- connection_bucket_refill(milliseconds_elapsed, now.tv_sec);
+ connection_bucket_refill(milliseconds_elapsed, (time_t)now.tv_sec);
stats_prev_global_read_bucket = global_read_bucket;
stats_prev_global_write_bucket = global_write_bucket;
@@ -1871,7 +1902,7 @@ do_hup(void)
}
/** Tor main loop. */
-/* static */ int
+int
do_main_loop(void)
{
int loop_result;
@@ -1906,8 +1937,10 @@ do_main_loop(void)
}
}
+#ifdef ENABLE_MEMPOOLS
/* Set up the packed_cell_t memory pool. */
init_cell_pool();
+#endif /* ENABLE_MEMPOOLS */
/* Set up our buckets */
connection_bucket_init();
@@ -1923,9 +1956,6 @@ do_main_loop(void)
log_warn(LD_DIR,
"Couldn't load all cached v3 certificates. Starting anyway.");
}
- if (router_reload_v2_networkstatus()) {
- return -1;
- }
if (router_reload_consensus_networkstatus()) {
return -1;
}
@@ -2103,8 +2133,8 @@ process_signal(uintptr_t sig)
}
/** Returns Tor's uptime. */
-long
-get_uptime(void)
+MOCK_IMPL(long,
+get_uptime,(void))
{
return stats_n_seconds_working;
}
@@ -2298,21 +2328,24 @@ handle_signals(int is_parent)
/** Main entry point for the Tor command-line client.
*/
-/* static */ int
+int
tor_init(int argc, char *argv[])
{
- char buf[256];
- int i, quiet = 0;
+ char progname[256];
+ int quiet = 0;
+
time_of_process_start = time(NULL);
- if (!connection_array)
- connection_array = smartlist_new();
- if (!closeable_connection_lst)
- closeable_connection_lst = smartlist_new();
- if (!active_linked_connection_lst)
- active_linked_connection_lst = smartlist_new();
+ init_connection_lists();
/* Have the log set up with our application name. */
- tor_snprintf(buf, sizeof(buf), "Tor %s", get_version());
- log_set_application_name(buf);
+ tor_snprintf(progname, sizeof(progname), "Tor %s", get_version());
+ log_set_application_name(progname);
+
+ /* Set up the crypto nice and early */
+ if (crypto_early_init() < 0) {
+ log_err(LD_GENERAL, "Unable to initialize the crypto subsystem!");
+ return 1;
+ }
+
/* Initialize the history structures. */
rep_hist_init();
/* Initialize the service cache. */
@@ -2320,17 +2353,31 @@ tor_init(int argc, char *argv[])
addressmap_init(); /* Init the client dns cache. Do it always, since it's
* cheap. */
+ {
/* We search for the "quiet" option first, since it decides whether we
* will log anything at all to the command line. */
- for (i=1;i<argc;++i) {
- if (!strcmp(argv[i], "--hush"))
- quiet = 1;
- if (!strcmp(argv[i], "--quiet"))
- quiet = 2;
- /* --version implies --quiet */
- if (!strcmp(argv[i], "--version"))
- quiet = 2;
+ config_line_t *opts = NULL, *cmdline_opts = NULL;
+ const config_line_t *cl;
+ (void) config_parse_commandline(argc, argv, 1, &opts, &cmdline_opts);
+ for (cl = cmdline_opts; cl; cl = cl->next) {
+ if (!strcmp(cl->key, "--hush"))
+ quiet = 1;
+ if (!strcmp(cl->key, "--quiet") ||
+ !strcmp(cl->key, "--dump-config"))
+ quiet = 2;
+ /* --version, --digests, and --help imply --hush */
+ if (!strcmp(cl->key, "--version") || !strcmp(cl->key, "--digests") ||
+ !strcmp(cl->key, "--list-torrc-options") ||
+ !strcmp(cl->key, "--library-versions") ||
+ !strcmp(cl->key, "-h") || !strcmp(cl->key, "--help")) {
+ if (quiet < 1)
+ quiet = 1;
+ }
+ }
+ config_free_lines(opts);
+ config_free_lines(cmdline_opts);
}
+
/* give it somewhere to log to initially */
switch (quiet) {
case 2:
@@ -2352,11 +2399,12 @@ tor_init(int argc, char *argv[])
#else
"";
#endif
- log_notice(LD_GENERAL, "Tor v%s %srunning on %s with Libevent %s "
- "and OpenSSL %s.", version, bev_str,
+ log_notice(LD_GENERAL, "Tor v%s %srunning on %s with Libevent %s, "
+ "OpenSSL %s and Zlib %s.", version, bev_str,
get_uname(),
tor_libevent_get_version_str(),
- crypto_openssl_get_version_str());
+ crypto_openssl_get_version_str(),
+ tor_zlib_get_version_str());
log_notice(LD_GENERAL, "Tor can't help you if you use it wrong! "
"Learn how to be safe at "
@@ -2396,6 +2444,9 @@ tor_init(int argc, char *argv[])
return -1;
}
stream_choice_seed_weak_rng();
+ if (tor_init_libevent_rng() < 0) {
+ log_warn(LD_NET, "Problem initializing libevent RNG.");
+ }
return 0;
}
@@ -2498,15 +2549,23 @@ tor_free_all(int postfork)
memarea_clear_freelist();
nodelist_free_all();
microdesc_free_all();
+ ext_orport_free_all();
+ control_free_all();
+ sandbox_free_getaddrinfo_cache();
if (!postfork) {
config_free_all();
or_state_free_all();
router_free_all();
policies_free_all();
}
+#ifdef ENABLE_MEMPOOLS
free_cell_pool();
+#endif /* ENABLE_MEMPOOLS */
if (!postfork) {
tor_tls_free_all();
+#ifndef _WIN32
+ tor_getpwnam(NULL);
+#endif
}
/* stuff in main.c */
@@ -2538,10 +2597,19 @@ tor_cleanup(void)
time_t now = time(NULL);
/* Remove our pid file. We don't care if there was an error when we
* unlink, nothing we could do about it anyways. */
- if (options->PidFile)
- unlink(options->PidFile);
- if (options->ControlPortWriteToFile)
- unlink(options->ControlPortWriteToFile);
+ if (options->PidFile) {
+ if (unlink(options->PidFile) != 0) {
+ log_warn(LD_FS, "Couldn't unlink pid file %s: %s",
+ options->PidFile, strerror(errno));
+ }
+ }
+ if (options->ControlPortWriteToFile) {
+ if (unlink(options->ControlPortWriteToFile) != 0) {
+ log_warn(LD_FS, "Couldn't unlink control port file %s: %s",
+ options->ControlPortWriteToFile,
+ strerror(errno));
+ }
+ }
if (accounting_is_enabled(options))
accounting_record_bandwidth_usage(now, get_or_state());
or_state_mark_dirty(get_or_state(), 0); /* force an immediate save. */
@@ -2564,7 +2632,7 @@ tor_cleanup(void)
}
/** Read/create keys as needed, and echo our fingerprint to stdout. */
-/* static */ int
+static int
do_list_fingerprint(void)
{
char buf[FINGERPRINT_LEN+1];
@@ -2572,7 +2640,7 @@ do_list_fingerprint(void)
const char *nickname = get_options()->Nickname;
if (!server_mode(get_options())) {
log_err(LD_GENERAL,
- "Clients don't have long-term identity keys. Exiting.\n");
+ "Clients don't have long-term identity keys. Exiting.");
return -1;
}
tor_assert(nickname);
@@ -2594,7 +2662,7 @@ do_list_fingerprint(void)
/** Entry point for password hashing: take the desired password from
* the command line, and print its salted hash to stdout. **/
-/* static */ void
+static void
do_hash_password(void)
{
@@ -2610,6 +2678,34 @@ do_hash_password(void)
printf("16:%s\n",output);
}
+/** Entry point for configuration dumping: write the configuration to
+ * stdout. */
+static int
+do_dump_config(void)
+{
+ const or_options_t *options = get_options();
+ const char *arg = options->command_arg;
+ int how;
+ char *opts;
+ if (!strcmp(arg, "short")) {
+ how = OPTIONS_DUMP_MINIMAL;
+ } else if (!strcmp(arg, "non-builtin")) {
+ how = OPTIONS_DUMP_DEFAULTS;
+ } else if (!strcmp(arg, "full")) {
+ how = OPTIONS_DUMP_ALL;
+ } else {
+ printf("%s is not a recognized argument to --dump-config. "
+ "Please select 'short', 'non-builtin', or 'full'", arg);
+ return -1;
+ }
+
+ opts = options_dump(options, how);
+ printf("%s", opts);
+ tor_free(opts);
+
+ return 0;
+}
+
#if defined (WINCE)
int
find_flashcard_path(PWCHAR path, size_t size)
@@ -2635,6 +2731,226 @@ find_flashcard_path(PWCHAR path, size_t size)
}
#endif
+static void
+init_addrinfo(void)
+{
+ char hname[256];
+
+ // host name to sandbox
+ gethostname(hname, sizeof(hname));
+ sandbox_add_addrinfo(hname);
+}
+
+static sandbox_cfg_t*
+sandbox_init_filter(void)
+{
+ const or_options_t *options = get_options();
+ sandbox_cfg_t *cfg = sandbox_cfg_new();
+ int i;
+
+ sandbox_cfg_allow_openat_filename(&cfg,
+ get_datadir_fname("cached-status"));
+
+ sandbox_cfg_allow_open_filename_array(&cfg,
+ get_datadir_fname("cached-certs"),
+ get_datadir_fname("cached-certs.tmp"),
+ get_datadir_fname("cached-consensus"),
+ get_datadir_fname("cached-consensus.tmp"),
+ get_datadir_fname("unverified-consensus"),
+ get_datadir_fname("unverified-consensus.tmp"),
+ get_datadir_fname("unverified-microdesc-consensus"),
+ get_datadir_fname("unverified-microdesc-consensus.tmp"),
+ get_datadir_fname("cached-microdesc-consensus"),
+ get_datadir_fname("cached-microdesc-consensus.tmp"),
+ get_datadir_fname("cached-microdescs"),
+ get_datadir_fname("cached-microdescs.tmp"),
+ get_datadir_fname("cached-microdescs.new"),
+ get_datadir_fname("cached-microdescs.new.tmp"),
+ get_datadir_fname("cached-descriptors"),
+ get_datadir_fname("cached-descriptors.new"),
+ get_datadir_fname("cached-descriptors.tmp"),
+ get_datadir_fname("cached-descriptors.new.tmp"),
+ get_datadir_fname("cached-descriptors.tmp.tmp"),
+ get_datadir_fname("cached-extrainfo"),
+ get_datadir_fname("cached-extrainfo.new"),
+ get_datadir_fname("cached-extrainfo.tmp"),
+ get_datadir_fname("cached-extrainfo.new.tmp"),
+ get_datadir_fname("cached-extrainfo.tmp.tmp"),
+ get_datadir_fname("state.tmp"),
+ get_datadir_fname("unparseable-desc.tmp"),
+ get_datadir_fname("unparseable-desc"),
+ get_datadir_fname("v3-status-votes"),
+ get_datadir_fname("v3-status-votes.tmp"),
+ tor_strdup("/dev/srandom"),
+ tor_strdup("/dev/urandom"),
+ tor_strdup("/dev/random"),
+ tor_strdup("/etc/hosts"),
+ tor_strdup("/proc/meminfo"),
+ NULL, 0
+ );
+ if (options->ServerDNSResolvConfFile)
+ sandbox_cfg_allow_open_filename(&cfg,
+ tor_strdup(options->ServerDNSResolvConfFile));
+ else
+ sandbox_cfg_allow_open_filename(&cfg, tor_strdup("/etc/resolv.conf"));
+
+ for (i = 0; i < 2; ++i) {
+ if (get_torrc_fname(i)) {
+ sandbox_cfg_allow_open_filename(&cfg, tor_strdup(get_torrc_fname(i)));
+ }
+ }
+
+#define RENAME_SUFFIX(name, suffix) \
+ sandbox_cfg_allow_rename(&cfg, \
+ get_datadir_fname(name suffix), \
+ get_datadir_fname(name))
+
+#define RENAME_SUFFIX2(prefix, name, suffix) \
+ sandbox_cfg_allow_rename(&cfg, \
+ get_datadir_fname2(prefix, name suffix), \
+ get_datadir_fname2(prefix, name))
+
+ RENAME_SUFFIX("cached-certs", ".tmp");
+ RENAME_SUFFIX("cached-consensus", ".tmp");
+ RENAME_SUFFIX("unverified-consensus", ".tmp");
+ RENAME_SUFFIX("unverified-microdesc-consensus", ".tmp");
+ RENAME_SUFFIX("cached-microdesc-consensus", ".tmp");
+ RENAME_SUFFIX("cached-microdescs", ".tmp");
+ RENAME_SUFFIX("cached-microdescs", ".new");
+ RENAME_SUFFIX("cached-microdescs.new", ".tmp");
+ RENAME_SUFFIX("cached-descriptors", ".tmp");
+ RENAME_SUFFIX("cached-descriptors", ".new");
+ RENAME_SUFFIX("cached-descriptors.new", ".tmp");
+ RENAME_SUFFIX("cached-extrainfo", ".tmp");
+ RENAME_SUFFIX("cached-extrainfo", ".new");
+ RENAME_SUFFIX("cached-extrainfo.new", ".tmp");
+ RENAME_SUFFIX("state", ".tmp");
+ RENAME_SUFFIX("unparseable-desc", ".tmp");
+ RENAME_SUFFIX("v3-status-votes", ".tmp");
+
+ sandbox_cfg_allow_stat_filename_array(&cfg,
+ get_datadir_fname(NULL),
+ get_datadir_fname("lock"),
+ get_datadir_fname("state"),
+ get_datadir_fname("router-stability"),
+ get_datadir_fname("cached-extrainfo.new"),
+ NULL, 0
+ );
+
+ {
+ smartlist_t *files = smartlist_new();
+ tor_log_get_logfile_names(files);
+ SMARTLIST_FOREACH(files, char *, file_name, {
+ /* steals reference */
+ sandbox_cfg_allow_open_filename(&cfg, file_name);
+ });
+ smartlist_free(files);
+ }
+
+ {
+ smartlist_t *files = smartlist_new();
+ smartlist_t *dirs = smartlist_new();
+ rend_services_add_filenames_to_lists(files, dirs);
+ SMARTLIST_FOREACH(files, char *, file_name, {
+ char *tmp_name = NULL;
+ tor_asprintf(&tmp_name, "%s.tmp", file_name);
+ sandbox_cfg_allow_rename(&cfg,
+ tor_strdup(tmp_name), tor_strdup(file_name));
+ /* steals references */
+ sandbox_cfg_allow_open_filename_array(&cfg, file_name, tmp_name, NULL);
+ });
+ SMARTLIST_FOREACH(dirs, char *, dir, {
+ /* steals reference */
+ sandbox_cfg_allow_stat_filename(&cfg, dir);
+ });
+ smartlist_free(files);
+ smartlist_free(dirs);
+ }
+
+ {
+ char *fname;
+ if ((fname = get_controller_cookie_file_name())) {
+ sandbox_cfg_allow_open_filename(&cfg, fname);
+ }
+ if ((fname = get_ext_or_auth_cookie_file_name())) {
+ sandbox_cfg_allow_open_filename(&cfg, fname);
+ }
+ }
+
+ if (options->DirPortFrontPage) {
+ sandbox_cfg_allow_open_filename(&cfg,
+ tor_strdup(options->DirPortFrontPage));
+ }
+
+ // orport
+ if (server_mode(get_options())) {
+ sandbox_cfg_allow_open_filename_array(&cfg,
+ get_datadir_fname2("keys", "secret_id_key"),
+ get_datadir_fname2("keys", "secret_onion_key"),
+ get_datadir_fname2("keys", "secret_onion_key_ntor"),
+ get_datadir_fname2("keys", "secret_onion_key_ntor.tmp"),
+ get_datadir_fname2("keys", "secret_id_key.old"),
+ get_datadir_fname2("keys", "secret_onion_key.old"),
+ get_datadir_fname2("keys", "secret_onion_key_ntor.old"),
+ get_datadir_fname2("keys", "secret_onion_key.tmp"),
+ get_datadir_fname2("keys", "secret_id_key.tmp"),
+ get_datadir_fname2("stats", "bridge-stats"),
+ get_datadir_fname2("stats", "bridge-stats.tmp"),
+ get_datadir_fname2("stats", "dirreq-stats"),
+ get_datadir_fname2("stats", "dirreq-stats.tmp"),
+ get_datadir_fname2("stats", "entry-stats"),
+ get_datadir_fname2("stats", "entry-stats.tmp"),
+ get_datadir_fname2("stats", "exit-stats"),
+ get_datadir_fname2("stats", "exit-stats.tmp"),
+ get_datadir_fname2("stats", "buffer-stats"),
+ get_datadir_fname2("stats", "buffer-stats.tmp"),
+ get_datadir_fname2("stats", "conn-stats"),
+ get_datadir_fname2("stats", "conn-stats.tmp"),
+ get_datadir_fname("approved-routers"),
+ get_datadir_fname("fingerprint"),
+ get_datadir_fname("fingerprint.tmp"),
+ get_datadir_fname("hashed-fingerprint"),
+ get_datadir_fname("hashed-fingerprint.tmp"),
+ get_datadir_fname("router-stability"),
+ get_datadir_fname("router-stability.tmp"),
+ tor_strdup("/etc/resolv.conf"),
+ NULL, 0
+ );
+
+ RENAME_SUFFIX("fingerprint", ".tmp");
+ RENAME_SUFFIX2("keys", "secret_onion_key_ntor", ".tmp");
+ RENAME_SUFFIX2("keys", "secret_id_key", ".tmp");
+ RENAME_SUFFIX2("keys", "secret_id_key.old", ".tmp");
+ RENAME_SUFFIX2("keys", "secret_onion_key", ".tmp");
+ RENAME_SUFFIX2("keys", "secret_onion_key.old", ".tmp");
+ RENAME_SUFFIX2("stats", "bridge-stats", ".tmp");
+ RENAME_SUFFIX2("stats", "dirreq-stats", ".tmp");
+ RENAME_SUFFIX2("stats", "entry-stats", ".tmp");
+ RENAME_SUFFIX2("stats", "exit-stats", ".tmp");
+ RENAME_SUFFIX2("stats", "buffer-stats", ".tmp");
+ RENAME_SUFFIX2("stats", "conn-stats", ".tmp");
+ RENAME_SUFFIX("hashed-fingerprint", ".tmp");
+ RENAME_SUFFIX("router-stability", ".tmp");
+
+ sandbox_cfg_allow_rename(&cfg,
+ get_datadir_fname2("keys", "secret_onion_key"),
+ get_datadir_fname2("keys", "secret_onion_key.old"));
+ sandbox_cfg_allow_rename(&cfg,
+ get_datadir_fname2("keys", "secret_onion_key_ntor"),
+ get_datadir_fname2("keys", "secret_onion_key_ntor.old"));
+
+ sandbox_cfg_allow_stat_filename_array(&cfg,
+ get_datadir_fname("keys"),
+ get_datadir_fname2("stats", "dirreq-stats"),
+ NULL, 0
+ );
+ }
+
+ init_addrinfo();
+
+ return cfg;
+}
+
/** Main entry point for the Tor process. Called from main(). */
/* This function is distinct from main() only so we can link main.c into
* the unittest binary without conflicting with the unittests' main. */
@@ -2681,6 +2997,8 @@ tor_main(int argc, char *argv[])
}
#endif
+ configure_backtrace_handler(get_version());
+
update_approx_time(time(NULL));
tor_threads_init();
init_logging();
@@ -2701,6 +3019,22 @@ tor_main(int argc, char *argv[])
#endif
if (tor_init(argc, argv)<0)
return -1;
+
+ if (get_options()->Sandbox && get_options()->command == CMD_RUN_TOR) {
+ sandbox_cfg_t* cfg = sandbox_init_filter();
+
+ if (sandbox_init(cfg)) {
+ log_err(LD_BUG,"Failed to create syscall sandbox filter");
+ return -1;
+ }
+
+ // registering libevent rng
+#ifdef HAVE_EVUTIL_SECURE_RNG_SET_URANDOM_DEVICE_FILE
+ evutil_secure_rng_set_urandom_device_file(
+ (char*) sandbox_intern_string("/dev/urandom"));
+#endif
+ }
+
switch (get_options()->command) {
case CMD_RUN_TOR:
#ifdef NT_SERVICE
@@ -2719,6 +3053,9 @@ tor_main(int argc, char *argv[])
printf("Configuration was valid\n");
result = 0;
break;
+ case CMD_DUMP_CONFIG:
+ result = do_dump_config();
+ break;
case CMD_RUN_UNITTESTS: /* only set by test.c */
default:
log_warn(LD_BUG,"Illegal command number %d: internal error.",
diff --git a/src/or/main.h b/src/or/main.h
index 338449b6a..a3bce3486 100644
--- a/src/or/main.h
+++ b/src/or/main.h
@@ -24,8 +24,8 @@ void add_connection_to_closeable_list(connection_t *conn);
int connection_is_on_closeable_list(connection_t *conn);
smartlist_t *get_connection_array(void);
-uint64_t get_bytes_read(void);
-uint64_t get_bytes_written(void);
+MOCK_DECL(uint64_t,get_bytes_read,(void));
+MOCK_DECL(uint64_t,get_bytes_written,(void));
/** Bitmask for events that we can turn on and off with
* connection_watch_events. */
@@ -36,12 +36,12 @@ typedef enum watchable_events {
} watchable_events_t;
void connection_watch_events(connection_t *conn, watchable_events_t events);
int connection_is_reading(connection_t *conn);
-void connection_stop_reading(connection_t *conn);
-void connection_start_reading(connection_t *conn);
+MOCK_DECL(void,connection_stop_reading,(connection_t *conn));
+MOCK_DECL(void,connection_start_reading,(connection_t *conn));
int connection_is_writing(connection_t *conn);
-void connection_stop_writing(connection_t *conn);
-void connection_start_writing(connection_t *conn);
+MOCK_DECL(void,connection_stop_writing,(connection_t *conn));
+MOCK_DECL(void,connection_start_writing,(connection_t *conn));
void connection_stop_reading_from_linked_conn(connection_t *conn);
@@ -50,8 +50,10 @@ void directory_info_has_arrived(time_t now, int from_cache);
void ip_address_changed(int at_interface);
void dns_servers_relaunch_checks(void);
+void reschedule_descriptor_update_check(void);
+
+MOCK_DECL(long,get_uptime,(void));
-long get_uptime(void);
unsigned get_signewnym_epoch(void);
void handle_signals(int is_parent);
@@ -66,11 +68,12 @@ void tor_free_all(int postfork);
int tor_main(int argc, char *argv[]);
-#ifdef MAIN_PRIVATE
int do_main_loop(void);
-int do_list_fingerprint(void);
-void do_hash_password(void);
int tor_init(int argc, char **argv);
+
+#ifdef MAIN_PRIVATE
+STATIC void init_connection_lists(void);
+STATIC void close_closeable_connections(void);
#endif
#endif
diff --git a/src/or/microdesc.c b/src/or/microdesc.c
index 90ac0ac64..fdb549a9a 100644
--- a/src/or/microdesc.c
+++ b/src/or/microdesc.c
@@ -45,12 +45,7 @@ struct microdesc_cache_t {
static INLINE unsigned int
microdesc_hash_(microdesc_t *md)
{
- unsigned *d = (unsigned*)md->digest;
-#if SIZEOF_INT == 4
- return d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[4] ^ d[5] ^ d[6] ^ d[7];
-#else
- return d[0] ^ d[1] ^ d[2] ^ d[3];
-#endif
+ return (unsigned) siphash24g(md->digest, sizeof(md->digest));
}
/** Helper: compares <b>a</b> and </b> for equality for hash-table purposes. */
@@ -139,7 +134,7 @@ get_microdesc_cache(void)
* ending at <b>eos</b>, and store them in <b>cache</b>. If <b>no_save</b>,
* mark them as non-writable to disk. If <b>where</b> is SAVED_IN_CACHE,
* leave their bodies as pointers to the mmap'd cache. If where is
- * <b>SAVED_NOWHERE</b>, do not allow annotations. If listed_at is positive,
+ * <b>SAVED_NOWHERE</b>, do not allow annotations. If listed_at is not -1,
* set the last_listed field of every microdesc to listed_at. If
* requested_digests is non-null, then it contains a list of digests we mean
* to allow, so we should reject any non-requested microdesc with a different
@@ -158,7 +153,7 @@ microdescs_add_to_cache(microdesc_cache_t *cache,
descriptors = microdescs_parse_from_string(s, eos,
allow_annotations,
where);
- if (listed_at > 0) {
+ if (listed_at != (time_t)-1) {
SMARTLIST_FOREACH(descriptors, microdesc_t *, md,
md->last_listed = listed_at);
}
@@ -280,6 +275,7 @@ void
microdesc_cache_clear(microdesc_cache_t *cache)
{
microdesc_t **entry, **next;
+
for (entry = HT_START(microdesc_map, &cache->map); entry; entry = next) {
microdesc_t *md = *entry;
next = HT_NEXT_RMV(microdesc_map, &cache->map, entry);
@@ -288,7 +284,13 @@ microdesc_cache_clear(microdesc_cache_t *cache)
}
HT_CLEAR(microdesc_map, &cache->map);
if (cache->cache_content) {
- tor_munmap_file(cache->cache_content);
+ int res = tor_munmap_file(cache->cache_content);
+ if (res != 0) {
+ log_warn(LD_FS,
+ "tor_munmap_file() failed clearing microdesc cache; "
+ "we are probably about to leak memory.");
+ /* TODO something smarter? */
+ }
cache->cache_content = NULL;
}
cache->total_len_seen = 0;
@@ -368,7 +370,9 @@ microdesc_cache_clean(microdesc_cache_t *cache, time_t cutoff, int force)
cutoff = now - TOLERATE_MICRODESC_AGE;
for (mdp = HT_START(microdesc_map, &cache->map); mdp != NULL; ) {
- if ((*mdp)->last_listed < cutoff) {
+ const int is_old = (*mdp)->last_listed < cutoff;
+ const unsigned held_by_nodes = (*mdp)->held_by_nodes;
+ if (is_old && !held_by_nodes) {
++dropped;
victim = *mdp;
mdp = HT_NEXT_RMV(microdesc_map, &cache->map, mdp);
@@ -376,6 +380,57 @@ microdesc_cache_clean(microdesc_cache_t *cache, time_t cutoff, int force)
bytes_dropped += victim->bodylen;
microdesc_free(victim);
} else {
+ if (is_old) {
+ /* It's old, but it has held_by_nodes set. That's not okay. */
+ /* Let's try to diagnose and fix #7164 . */
+ smartlist_t *nodes = nodelist_find_nodes_with_microdesc(*mdp);
+ const networkstatus_t *ns = networkstatus_get_latest_consensus();
+ long networkstatus_age = -1;
+ const int ht_badness = HT_REP_IS_BAD_(microdesc_map, &cache->map);
+ if (ns) {
+ networkstatus_age = now - ns->valid_after;
+ }
+ log_warn(LD_BUG, "Microdescriptor seemed very old "
+ "(last listed %d hours ago vs %d hour cutoff), but is still "
+ "marked as being held by %d node(s). I found %d node(s) "
+ "holding it. Current networkstatus is %ld hours old. "
+ "Hashtable badness is %d.",
+ (int)((now - (*mdp)->last_listed) / 3600),
+ (int)((now - cutoff) / 3600),
+ held_by_nodes,
+ smartlist_len(nodes),
+ networkstatus_age / 3600,
+ ht_badness);
+
+ SMARTLIST_FOREACH_BEGIN(nodes, const node_t *, node) {
+ const char *rs_match = "No RS";
+ const char *rs_present = "";
+ if (node->rs) {
+ if (tor_memeq(node->rs->descriptor_digest,
+ (*mdp)->digest, DIGEST256_LEN)) {
+ rs_match = "Microdesc digest in RS matches";
+ } else {
+ rs_match = "Microdesc digest in RS does match";
+ }
+ if (ns) {
+ /* This should be impossible, but let's see! */
+ rs_present = " RS not present in networkstatus.";
+ SMARTLIST_FOREACH(ns->routerstatus_list, routerstatus_t *,rs, {
+ if (rs == node->rs) {
+ rs_present = " RS okay in networkstatus.";
+ }
+ });
+ }
+ }
+ log_warn(LD_BUG, " [%d]: ID=%s. md=%p, rs=%p, ri=%p. %s.%s",
+ node_sl_idx,
+ hex_str(node->identity, DIGEST_LEN),
+ node->md, node->rs, node->ri, rs_match, rs_present);
+ } SMARTLIST_FOREACH_END(node);
+ smartlist_free(nodes);
+ (*mdp)->last_listed = now;
+ }
+
++kept;
mdp = HT_NEXT(microdesc_map, &cache->map, mdp);
}
@@ -434,7 +489,7 @@ int
microdesc_cache_rebuild(microdesc_cache_t *cache, int force)
{
open_file_t *open_file;
- int fd = -1;
+ int fd = -1, res;
microdesc_t **mdp;
smartlist_t *wrote;
ssize_t size;
@@ -489,7 +544,8 @@ microdesc_cache_rebuild(microdesc_cache_t *cache, int force)
"By my count, I'm at "I64_FORMAT
", but I should be at "I64_FORMAT,
I64_PRINTF_ARG(off), I64_PRINTF_ARG(off_real));
- off = off_real;
+ if (off_real >= 0)
+ off = off_real;
}
if (md->saved_location != SAVED_IN_CACHE) {
tor_free(md->body);
@@ -500,8 +556,14 @@ microdesc_cache_rebuild(microdesc_cache_t *cache, int force)
/* We must do this unmap _before_ we call finish_writing_to_file(), or
* windows will not actually replace the file. */
- if (cache->cache_content)
- tor_munmap_file(cache->cache_content);
+ if (cache->cache_content) {
+ res = tor_munmap_file(cache->cache_content);
+ if (res != 0) {
+ log_warn(LD_FS,
+ "Failed to unmap old microdescriptor cache while rebuilding");
+ }
+ cache->cache_content = NULL;
+ }
if (finish_writing_to_file(open_file) < 0) {
log_warn(LD_DIR, "Error rebuilding microdescriptor cache: %s",
@@ -605,8 +667,10 @@ microdesc_free_(microdesc_t *md, const char *fname, int lineno)
tor_fragile_assert();
}
if (md->held_by_nodes) {
+ microdesc_cache_t *cache = get_microdesc_cache();
int found=0;
const smartlist_t *nodes = nodelist_get_list();
+ const int ht_badness = HT_REP_IS_BAD_(microdesc_map, &cache->map);
SMARTLIST_FOREACH(nodes, node_t *, node, {
if (node->md == md) {
++found;
@@ -615,12 +679,13 @@ microdesc_free_(microdesc_t *md, const char *fname, int lineno)
});
if (found) {
log_warn(LD_BUG, "microdesc_free() called from %s:%d, but md was still "
- "referenced %d node(s); held_by_nodes == %u",
- fname, lineno, found, md->held_by_nodes);
+ "referenced %d node(s); held_by_nodes == %u, ht_badness == %d",
+ fname, lineno, found, md->held_by_nodes, ht_badness);
} else {
log_warn(LD_BUG, "microdesc_free() called from %s:%d with held_by_nodes "
- "set to %u, but md was not referenced by any nodes",
- fname, lineno, md->held_by_nodes);
+ "set to %u, but md was not referenced by any nodes. "
+ "ht_badness == %d",
+ fname, lineno, md->held_by_nodes, ht_badness);
}
tor_fragile_assert();
}
@@ -696,7 +761,7 @@ microdesc_list_missing_digest256(networkstatus_t *ns, microdesc_cache_t *cache,
continue;
if (downloadable_only &&
!download_status_is_ready(&rs->dl_status, now,
- MAX_MICRODESC_DOWNLOAD_FAILURES))
+ get_options()->TestingMicrodescMaxDownloadTries))
continue;
if (skip && digestmap_get(skip, rs->descriptor_digest))
continue;
@@ -725,7 +790,7 @@ update_microdesc_downloads(time_t now)
smartlist_t *missing;
digestmap_t *pending;
- if (should_delay_dir_fetches(options))
+ if (should_delay_dir_fetches(options, NULL))
return;
if (directory_too_idle_to_fetch_descriptors(options, now))
return;
diff --git a/src/or/networkstatus.c b/src/or/networkstatus.c
index 1b5c6dbb3..890da0ad1 100644
--- a/src/or/networkstatus.c
+++ b/src/or/networkstatus.c
@@ -10,6 +10,7 @@
* client or cache.
*/
+#define NETWORKSTATUS_PRIVATE
#include "or.h"
#include "channel.h"
#include "circuitmux.h"
@@ -31,18 +32,7 @@
#include "router.h"
#include "routerlist.h"
#include "routerparse.h"
-
-/* For tracking v2 networkstatus documents. Only caches do this now. */
-
-/** Map from descriptor digest of routers listed in the v2 networkstatus
- * documents to download_status_t* */
-static digestmap_t *v2_download_status_map = NULL;
-/** Global list of all of the current v2 network_status documents that we know
- * about. This list is kept sorted by published_on. */
-static smartlist_t *networkstatus_v2_list = NULL;
-/** True iff any member of networkstatus_v2_list has changed since the last
- * time we called download_status_map_update_from_v2_networkstatus() */
-static int networkstatus_v2_list_has_changed = 0;
+#include "transports.h"
/** Map from lowercase nickname to identity digest of named server, if any. */
static strmap_t *named_server_map = NULL;
@@ -88,11 +78,6 @@ typedef struct consensus_waiting_for_certs_t {
static consensus_waiting_for_certs_t
consensus_waiting_for_certs[N_CONSENSUS_FLAVORS];
-/** The last time we tried to download a networkstatus, or 0 for "never". We
- * use this to rate-limit download attempts for directory caches (including
- * mirrors). Clients don't use this now. */
-static time_t last_networkstatus_download_attempted = 0;
-
/** A time before which we shouldn't try to replace the current consensus:
* this will be at some point after the next consensus becomes valid, but
* before the current consensus becomes invalid. */
@@ -107,7 +92,6 @@ static int have_warned_about_old_version = 0;
* listed by the authorities. */
static int have_warned_about_new_version = 0;
-static void download_status_map_update_from_v2_networkstatus(void);
static void routerstatus_list_update_named_server_map(void);
/** Forget that we've warned about anything networkstatus-related, so we will
@@ -131,86 +115,9 @@ void
networkstatus_reset_download_failures(void)
{
int i;
- const smartlist_t *networkstatus_v2_list = networkstatus_get_v2_list();
- SMARTLIST_FOREACH_BEGIN(networkstatus_v2_list, networkstatus_v2_t *, ns) {
- SMARTLIST_FOREACH_BEGIN(ns->entries, routerstatus_t *, rs) {
- if (!router_get_by_descriptor_digest(rs->descriptor_digest))
- rs->need_to_mirror = 1;
- } SMARTLIST_FOREACH_END(rs);
- } SMARTLIST_FOREACH_END(ns);
for (i=0; i < N_CONSENSUS_FLAVORS; ++i)
download_status_reset(&consensus_dl_status[i]);
- if (v2_download_status_map) {
- digestmap_iter_t *iter;
- digestmap_t *map = v2_download_status_map;
- const char *key;
- void *val;
- download_status_t *dls;
- for (iter = digestmap_iter_init(map); !digestmap_iter_done(iter);
- iter = digestmap_iter_next(map, iter) ) {
- digestmap_iter_get(iter, &key, &val);
- dls = val;
- download_status_reset(dls);
- }
- }
-}
-
-/** Repopulate our list of network_status_t objects from the list cached on
- * disk. Return 0 on success, -1 on failure. */
-int
-router_reload_v2_networkstatus(void)
-{
- smartlist_t *entries;
- struct stat st;
- char *s;
- char *filename = get_datadir_fname("cached-status");
- int maybe_delete = !directory_caches_v2_dir_info(get_options());
- time_t now = time(NULL);
- if (!networkstatus_v2_list)
- networkstatus_v2_list = smartlist_new();
-
- entries = tor_listdir(filename);
- if (!entries) { /* dir doesn't exist */
- tor_free(filename);
- return 0;
- } else if (!smartlist_len(entries) && maybe_delete) {
- rmdir(filename);
- tor_free(filename);
- smartlist_free(entries);
- return 0;
- }
- tor_free(filename);
- SMARTLIST_FOREACH_BEGIN(entries, const char *, fn) {
- char buf[DIGEST_LEN];
- if (maybe_delete) {
- filename = get_datadir_fname2("cached-status", fn);
- remove_file_if_very_old(filename, now);
- tor_free(filename);
- continue;
- }
- if (strlen(fn) != HEX_DIGEST_LEN ||
- base16_decode(buf, sizeof(buf), fn, strlen(fn))) {
- log_info(LD_DIR,
- "Skipping cached-status file with unexpected name \"%s\"",fn);
- continue;
- }
- filename = get_datadir_fname2("cached-status", fn);
- s = read_file_to_str(filename, 0, &st);
- if (s) {
- if (router_set_networkstatus_v2(s, st.st_mtime, NS_FROM_CACHE,
- NULL)<0) {
- log_warn(LD_FS, "Couldn't load networkstatus from \"%s\"",filename);
- }
- tor_free(s);
- }
- tor_free(filename);
- } SMARTLIST_FOREACH_END(fn);
- SMARTLIST_FOREACH(entries, char *, fn, tor_free(fn));
- smartlist_free(entries);
- networkstatus_v2_list_clean(time(NULL));
- routers_update_all_from_networkstatus(time(NULL), 2);
- return 0;
}
/** Read every cached v3 consensus networkstatus from the disk. */
@@ -277,7 +184,7 @@ router_reload_consensus_networkstatus(void)
}
/** Free all storage held by the vote_routerstatus object <b>rs</b>. */
-static void
+STATIC void
vote_routerstatus_free(vote_routerstatus_t *rs)
{
vote_microdesc_hash_t *h, *next;
@@ -303,26 +210,6 @@ routerstatus_free(routerstatus_t *rs)
tor_free(rs);
}
-/** Free all storage held by the networkstatus object <b>ns</b>. */
-void
-networkstatus_v2_free(networkstatus_v2_t *ns)
-{
- if (!ns)
- return;
- tor_free(ns->source_address);
- tor_free(ns->contact);
- if (ns->signing_key)
- crypto_pk_free(ns->signing_key);
- tor_free(ns->client_versions);
- tor_free(ns->server_versions);
- if (ns->entries) {
- SMARTLIST_FOREACH(ns->entries, routerstatus_t *, rs,
- routerstatus_free(rs));
- smartlist_free(ns->entries);
- }
- tor_free(ns);
-}
-
/** Free all storage held in <b>sig</b> */
void
document_signature_free(document_signature_t *sig)
@@ -436,6 +323,17 @@ networkstatus_check_document_signature(const networkstatus_t *consensus,
DIGEST_LEN))
return -1;
+ if (authority_cert_is_blacklisted(cert)) {
+ /* We implement blacklisting for authority signing keys by treating
+ * all their signatures as always bad. That way we don't get into
+ * crazy loops of dropping and re-fetching signatures. */
+ log_warn(LD_DIR, "Ignoring a consensus signature made with deprecated"
+ " signing key %s",
+ hex_str(cert->signing_key_digest, DIGEST_LEN));
+ sig->bad_signature = 1;
+ return 0;
+ }
+
signed_digest_len = crypto_pk_keysize(cert->signing_key);
signed_digest = tor_malloc(signed_digest_len);
if (crypto_pk_public_checksig(cert->signing_key,
@@ -637,296 +535,10 @@ networkstatus_check_consensus_signature(networkstatus_t *consensus,
return -2;
}
-/** Helper: return a newly allocated string containing the name of the filename
- * where we plan to cache the network status with the given identity digest. */
-char *
-networkstatus_get_cache_filename(const char *identity_digest)
-{
- char fp[HEX_DIGEST_LEN+1];
- base16_encode(fp, HEX_DIGEST_LEN+1, identity_digest, DIGEST_LEN);
- return get_datadir_fname2("cached-status", fp);
-}
-
-/** Helper for smartlist_sort: Compare two networkstatus objects by
- * publication date. */
-static int
-compare_networkstatus_v2_published_on_(const void **_a, const void **_b)
-{
- const networkstatus_v2_t *a = *_a, *b = *_b;
- if (a->published_on < b->published_on)
- return -1;
- else if (a->published_on > b->published_on)
- return 1;
- else
- return 0;
-}
-
-/** Add the parsed v2 networkstatus in <b>ns</b> (with original document in
- * <b>s</b>) to the disk cache (and the in-memory directory server cache) as
- * appropriate. */
-static int
-add_networkstatus_to_cache(const char *s,
- v2_networkstatus_source_t source,
- networkstatus_v2_t *ns)
-{
- if (source != NS_FROM_CACHE) {
- char *fn = networkstatus_get_cache_filename(ns->identity_digest);
- if (write_str_to_file(fn, s, 0)<0) {
- log_notice(LD_FS, "Couldn't write cached network status to \"%s\"", fn);
- }
- tor_free(fn);
- }
-
- if (directory_caches_v2_dir_info(get_options()))
- dirserv_set_cached_networkstatus_v2(s,
- ns->identity_digest,
- ns->published_on);
-
- return 0;
-}
-
/** How far in the future do we allow a network-status to get before removing
* it? (seconds) */
#define NETWORKSTATUS_ALLOW_SKEW (24*60*60)
-/** Given a string <b>s</b> containing a network status that we received at
- * <b>arrived_at</b> from <b>source</b>, try to parse it, see if we want to
- * store it, and put it into our cache as necessary.
- *
- * If <b>source</b> is NS_FROM_DIR or NS_FROM_CACHE, do not replace our
- * own networkstatus_t (if we're an authoritative directory server).
- *
- * If <b>source</b> is NS_FROM_CACHE, do not write our networkstatus_t to the
- * cache.
- *
- * If <b>requested_fingerprints</b> is provided, it must contain a list of
- * uppercased identity fingerprints. Do not update any networkstatus whose
- * fingerprint is not on the list; after updating a networkstatus, remove its
- * fingerprint from the list.
- *
- * Return 0 on success, -1 on failure.
- *
- * Callers should make sure that routers_update_all_from_networkstatus() is
- * invoked after this function succeeds.
- */
-int
-router_set_networkstatus_v2(const char *s, time_t arrived_at,
- v2_networkstatus_source_t source,
- smartlist_t *requested_fingerprints)
-{
- networkstatus_v2_t *ns;
- int i, found;
- time_t now;
- int skewed = 0;
- dir_server_t *trusted_dir = NULL;
- const char *source_desc = NULL;
- char fp[HEX_DIGEST_LEN+1];
- char published[ISO_TIME_LEN+1];
-
- if (!directory_caches_v2_dir_info(get_options()))
- return 0; /* Don't bother storing it. */
-
- ns = networkstatus_v2_parse_from_string(s);
- if (!ns) {
- log_warn(LD_DIR, "Couldn't parse network status.");
- return -1;
- }
- base16_encode(fp, HEX_DIGEST_LEN+1, ns->identity_digest, DIGEST_LEN);
- if (!(trusted_dir =
- router_get_trusteddirserver_by_digest(ns->identity_digest)) ||
- !(trusted_dir->type & V2_DIRINFO)) {
- log_info(LD_DIR, "Network status was signed, but not by an authoritative "
- "directory we recognize.");
- source_desc = fp;
- } else {
- source_desc = trusted_dir->description;
- }
- now = time(NULL);
- if (arrived_at > now)
- arrived_at = now;
-
- ns->received_on = arrived_at;
-
- format_iso_time(published, ns->published_on);
-
- if (ns->published_on > now + NETWORKSTATUS_ALLOW_SKEW) {
- char dbuf[64];
- long delta = now - ns->published_on;
- format_time_interval(dbuf, sizeof(dbuf), delta);
- log_warn(LD_GENERAL, "Network status from %s was published %s in the "
- "future (%s UTC). Check your time and date settings! "
- "Not caching.",
- source_desc, dbuf, published);
- control_event_general_status(LOG_WARN,
- "CLOCK_SKEW MIN_SKEW=%ld SOURCE=NETWORKSTATUS:%s:%d",
- delta, ns->source_address, ns->source_dirport);
- skewed = 1;
- }
-
- if (!networkstatus_v2_list)
- networkstatus_v2_list = smartlist_new();
-
- if ( (source == NS_FROM_DIR_BY_FP || source == NS_FROM_DIR_ALL) &&
- router_digest_is_me(ns->identity_digest)) {
- /* Don't replace our own networkstatus when we get it from somebody else.*/
- networkstatus_v2_free(ns);
- return 0;
- }
-
- if (requested_fingerprints) {
- if (smartlist_contains_string(requested_fingerprints, fp)) {
- smartlist_string_remove(requested_fingerprints, fp);
- } else {
- if (source != NS_FROM_DIR_ALL) {
- char *requested =
- smartlist_join_strings(requested_fingerprints," ",0,NULL);
- log_warn(LD_DIR,
- "We received a network status with a fingerprint (%s) that we "
- "never requested. (We asked for: %s.) Dropping.",
- fp, requested);
- tor_free(requested);
- return 0;
- }
- }
- }
-
- if (!trusted_dir) {
- if (!skewed) {
- /* We got a non-trusted networkstatus, and we're a directory cache.
- * This means that we asked an authority, and it told us about another
- * authority we didn't recognize. */
- log_info(LD_DIR,
- "We do not recognize authority (%s) but we are willing "
- "to cache it.", fp);
- add_networkstatus_to_cache(s, source, ns);
- networkstatus_v2_free(ns);
- }
- return 0;
- }
-
- found = 0;
- for (i=0; i < smartlist_len(networkstatus_v2_list); ++i) {
- networkstatus_v2_t *old_ns = smartlist_get(networkstatus_v2_list, i);
-
- if (tor_memeq(old_ns->identity_digest, ns->identity_digest, DIGEST_LEN)) {
- if (tor_memeq(old_ns->networkstatus_digest,
- ns->networkstatus_digest, DIGEST_LEN)) {
- /* Same one we had before. */
- networkstatus_v2_free(ns);
- tor_assert(trusted_dir);
- log_info(LD_DIR,
- "Not replacing network-status from %s (published %s); "
- "we already have it.",
- trusted_dir->description, published);
- if (old_ns->received_on < arrived_at) {
- if (source != NS_FROM_CACHE) {
- char *fn;
- fn = networkstatus_get_cache_filename(old_ns->identity_digest);
- /* We use mtime to tell when it arrived, so update that. */
- touch_file(fn);
- tor_free(fn);
- }
- old_ns->received_on = arrived_at;
- }
- download_status_failed(&trusted_dir->v2_ns_dl_status, 0);
- return 0;
- } else if (old_ns->published_on >= ns->published_on) {
- char old_published[ISO_TIME_LEN+1];
- format_iso_time(old_published, old_ns->published_on);
- tor_assert(trusted_dir);
- log_info(LD_DIR,
- "Not replacing network-status from %s (published %s);"
- " we have a newer one (published %s) for this authority.",
- trusted_dir->description, published,
- old_published);
- networkstatus_v2_free(ns);
- download_status_failed(&trusted_dir->v2_ns_dl_status, 0);
- return 0;
- } else {
- networkstatus_v2_free(old_ns);
- smartlist_set(networkstatus_v2_list, i, ns);
- found = 1;
- break;
- }
- }
- }
-
- if (source != NS_FROM_CACHE && trusted_dir) {
- download_status_reset(&trusted_dir->v2_ns_dl_status);
- }
-
- if (!found)
- smartlist_add(networkstatus_v2_list, ns);
-
-/** Retain any routerinfo mentioned in a V2 networkstatus for at least this
- * long. */
-#define V2_NETWORKSTATUS_ROUTER_LIFETIME (3*60*60)
-
- {
- time_t live_until = ns->published_on + V2_NETWORKSTATUS_ROUTER_LIFETIME;
- SMARTLIST_FOREACH_BEGIN(ns->entries, routerstatus_t *, rs) {
- signed_descriptor_t *sd =
- router_get_by_descriptor_digest(rs->descriptor_digest);
- if (sd) {
- if (sd->last_listed_as_valid_until < live_until)
- sd->last_listed_as_valid_until = live_until;
- } else {
- rs->need_to_mirror = 1;
- }
- } SMARTLIST_FOREACH_END(rs);
- }
-
- log_info(LD_DIR, "Setting networkstatus %s %s (published %s)",
- source == NS_FROM_CACHE?"cached from":
- ((source == NS_FROM_DIR_BY_FP || source == NS_FROM_DIR_ALL) ?
- "downloaded from":"generated for"),
- trusted_dir->description, published);
- networkstatus_v2_list_has_changed = 1;
-
- smartlist_sort(networkstatus_v2_list,
- compare_networkstatus_v2_published_on_);
-
- if (!skewed)
- add_networkstatus_to_cache(s, source, ns);
-
- return 0;
-}
-
-/** Remove all very-old network_status_t objects from memory and from the
- * disk cache. */
-void
-networkstatus_v2_list_clean(time_t now)
-{
- int i;
- if (!networkstatus_v2_list)
- return;
-
- for (i = 0; i < smartlist_len(networkstatus_v2_list); ++i) {
- networkstatus_v2_t *ns = smartlist_get(networkstatus_v2_list, i);
- char *fname = NULL;
- if (ns->published_on + MAX_NETWORKSTATUS_AGE > now)
- continue;
- /* Okay, this one is too old. Remove it from the list, and delete it
- * from the cache. */
- smartlist_del(networkstatus_v2_list, i--);
- fname = networkstatus_get_cache_filename(ns->identity_digest);
- if (file_status(fname) == FN_FILE) {
- log_info(LD_DIR, "Removing too-old networkstatus in %s", fname);
- unlink(fname);
- }
- tor_free(fname);
- if (directory_caches_v2_dir_info(get_options())) {
- dirserv_set_cached_networkstatus_v2(NULL, ns->identity_digest, 0);
- }
- networkstatus_v2_free(ns);
- }
-
- /* And now go through the directory cache for any cached untrusted
- * networkstatuses and other network info. */
- dirserv_clear_old_networkstatuses(now - MAX_NETWORKSTATUS_AGE);
- dirserv_clear_old_v1_info(now);
-}
-
/** Helper for bsearching a list of routerstatus_t pointers: compare a
* digest in the key to the identity digest of a routerstatus_t. */
int
@@ -948,22 +560,6 @@ compare_digest_to_vote_routerstatus_entry(const void *_key,
return tor_memcmp(key, vrs->status.identity_digest, DIGEST_LEN);
}
-/** As networkstatus_v2_find_entry, but do not return a const pointer */
-routerstatus_t *
-networkstatus_v2_find_mutable_entry(networkstatus_v2_t *ns, const char *digest)
-{
- return smartlist_bsearch(ns->entries, digest,
- compare_digest_to_routerstatus_entry);
-}
-
-/** Return the entry in <b>ns</b> for the identity digest <b>digest</b>, or
- * NULL if none was found. */
-const routerstatus_t *
-networkstatus_v2_find_entry(networkstatus_v2_t *ns, const char *digest)
-{
- return networkstatus_v2_find_mutable_entry(ns, digest);
-}
-
/** As networkstatus_find_entry, but do not return a const pointer */
routerstatus_t *
networkstatus_vote_find_mutable_entry(networkstatus_t *ns, const char *digest)
@@ -993,15 +589,6 @@ networkstatus_vote_find_entry_idx(networkstatus_t *ns,
found_out);
}
-/** Return a list of the v2 networkstatus documents. */
-const smartlist_t *
-networkstatus_get_v2_list(void)
-{
- if (!networkstatus_v2_list)
- networkstatus_v2_list = smartlist_new();
- return networkstatus_v2_list;
-}
-
/** As router_get_consensus_status_by_descriptor_digest, but does not return
* a const pointer. */
routerstatus_t *
@@ -1046,8 +633,6 @@ router_get_dl_status_by_descriptor_digest(const char *d)
if ((rs = router_get_mutable_consensus_status_by_descriptor_digest(
current_ns_consensus, d)))
return &rs->dl_status;
- if (v2_download_status_map)
- return digestmap_get(v2_download_status_map, d);
return NULL;
}
@@ -1113,72 +698,6 @@ networkstatus_nickname_is_unnamed(const char *nickname)
* networkstatus documents? */
#define NONAUTHORITY_NS_CACHE_INTERVAL (60*60)
-/** We are a directory server, and so cache network_status documents.
- * Initiate downloads as needed to update them. For v2 authorities,
- * this means asking each trusted directory for its network-status.
- * For caches, this means asking a random v2 authority for all
- * network-statuses.
- */
-static void
-update_v2_networkstatus_cache_downloads(time_t now)
-{
- int authority = authdir_mode_v2(get_options());
- int interval =
- authority ? AUTHORITY_NS_CACHE_INTERVAL : NONAUTHORITY_NS_CACHE_INTERVAL;
- const smartlist_t *trusted_dir_servers = router_get_trusted_dir_servers();
-
- if (last_networkstatus_download_attempted + interval >= now)
- return;
-
- last_networkstatus_download_attempted = now;
-
- if (authority) {
- /* An authority launches a separate connection for everybody. */
- SMARTLIST_FOREACH_BEGIN(trusted_dir_servers, dir_server_t *, ds)
- {
- char resource[HEX_DIGEST_LEN+6]; /* fp/hexdigit.z\0 */
- tor_addr_t addr;
- if (!(ds->type & V2_DIRINFO))
- continue;
- if (router_digest_is_me(ds->digest))
- continue;
- tor_addr_from_ipv4h(&addr, ds->addr);
- /* Is this quite sensible with IPv6 or multiple addresses? */
- if (connection_get_by_type_addr_port_purpose(
- CONN_TYPE_DIR, &addr, ds->dir_port,
- DIR_PURPOSE_FETCH_V2_NETWORKSTATUS)) {
- /* XXX the above dir_port won't be accurate if we're
- * doing a tunneled conn. In that case it should be or_port.
- * How to guess from here? Maybe make the function less general
- * and have it know that it's looking for dir conns. -RD */
- /* Only directory caches download v2 networkstatuses, and they
- * don't use tunneled connections. I think it's okay to ignore
- * this. */
- continue;
- }
- strlcpy(resource, "fp/", sizeof(resource));
- base16_encode(resource+3, sizeof(resource)-3, ds->digest, DIGEST_LEN);
- strlcat(resource, ".z", sizeof(resource));
- directory_initiate_command_routerstatus(
- &ds->fake_status, DIR_PURPOSE_FETCH_V2_NETWORKSTATUS,
- ROUTER_PURPOSE_GENERAL,
- DIRIND_ONEHOP,
- resource,
- NULL, 0 /* No payload. */,
- 0 /* No I-M-S. */);
- }
- SMARTLIST_FOREACH_END(ds);
- } else {
- /* A non-authority cache launches one connection to a random authority. */
- /* (Check whether we're currently fetching network-status objects.) */
- if (!connection_get_by_type_purpose(CONN_TYPE_DIR,
- DIR_PURPOSE_FETCH_V2_NETWORKSTATUS))
- directory_get_from_dirserver(DIR_PURPOSE_FETCH_V2_NETWORKSTATUS,
- ROUTER_PURPOSE_GENERAL, "all.z",
- PDS_RETRY_IF_NO_SERVERS);
- }
-}
-
/** Return true iff, given the options listed in <b>options</b>, <b>flavor</b>
* is the flavor of a consensus networkstatus that we would like to fetch. */
static int
@@ -1203,8 +722,6 @@ we_want_to_fetch_flavor(const or_options_t *options, int flavor)
return flavor == usable_consensus_flavor();
}
-/** How many times will we try to fetch a consensus before we give up? */
-#define CONSENSUS_NETWORKSTATUS_MAX_DL_TRIES 8
/** How long will we hang onto a possibly live consensus for which we're
* fetching certs before we check whether there is a better one? */
#define DELAY_WHILE_FETCHING_CERTS (20*60)
@@ -1238,7 +755,7 @@ update_consensus_networkstatus_downloads(time_t now)
resource = networkstatus_get_flavor_name(i);
if (!download_status_is_ready(&consensus_dl_status[i], now,
- CONSENSUS_NETWORKSTATUS_MAX_DL_TRIES))
+ options->TestingConsensusMaxDownloadTries))
continue; /* We failed downloading a consensus too recently. */
if (connection_dir_get_by_purpose_and_resource(
DIR_PURPOSE_FETCH_CONSENSUS, resource))
@@ -1313,7 +830,7 @@ update_consensus_networkstatus_fetch_time_impl(time_t now, int flav)
if (directory_fetches_dir_info_early(options)) {
/* We want to cache the next one at some point after this one
* is no longer fresh... */
- start = c->fresh_until + min_sec_before_caching;
+ start = (time_t)(c->fresh_until + min_sec_before_caching);
/* Some clients may need the consensus sooner than others. */
if (options->FetchDirInfoExtraEarly || authdir_mode_v3(options)) {
dl_interval = 60;
@@ -1326,7 +843,7 @@ update_consensus_networkstatus_fetch_time_impl(time_t now, int flav)
} else {
/* We're an ordinary client or a bridge. Give all the caches enough
* time to download the consensus. */
- start = c->fresh_until + (interval*3)/4;
+ start = (time_t)(c->fresh_until + (interval*3)/4);
/* But download the next one well before this one is expired. */
dl_interval = ((c->valid_until - start) * 7 )/ 8;
@@ -1334,7 +851,7 @@ update_consensus_networkstatus_fetch_time_impl(time_t now, int flav)
* to choose the rest of the interval *after* them. */
if (directory_fetches_dir_info_later(options)) {
/* Give all the *clients* enough time to download the consensus. */
- start = start + dl_interval + min_sec_before_caching;
+ start = (time_t)(start + dl_interval + min_sec_before_caching);
/* But try to get it before ours actually expires. */
dl_interval = (c->valid_until - start) - min_sec_before_caching;
}
@@ -1380,14 +897,45 @@ update_consensus_networkstatus_fetch_time(time_t now)
/** Return 1 if there's a reason we shouldn't try any directory
* fetches yet (e.g. we demand bridges and none are yet known).
- * Else return 0. */
+ * Else return 0.
+
+ * If we return 1 and <b>msg_out</b> is provided, set <b>msg_out</b>
+ * to an explanation of why directory fetches are delayed. (If we
+ * return 0, we set msg_out to NULL.)
+ */
int
-should_delay_dir_fetches(const or_options_t *options)
+should_delay_dir_fetches(const or_options_t *options, const char **msg_out)
{
- if (options->UseBridges && !any_bridge_descriptors_known()) {
- log_info(LD_DIR, "delaying dir fetches (no running bridges known)");
+ if (msg_out) {
+ *msg_out = NULL;
+ }
+
+ if (options->DisableNetwork) {
+ if (msg_out) {
+ *msg_out = "DisableNetwork is set.";
+ }
+ log_info(LD_DIR, "Delaying dir fetches (DisableNetwork is set)");
return 1;
}
+
+ if (options->UseBridges) {
+ if (!any_bridge_descriptors_known()) {
+ if (msg_out) {
+ *msg_out = "No running bridges";
+ }
+ log_info(LD_DIR, "Delaying dir fetches (no running bridges known)");
+ return 1;
+ }
+
+ if (pt_proxies_configuration_pending()) {
+ if (msg_out) {
+ *msg_out = "Pluggable transport proxies still configuring";
+ }
+ log_info(LD_DIR, "Delaying dir fetches (pt proxies still configuring)");
+ return 1;
+ }
+ }
+
return 0;
}
@@ -1397,10 +945,8 @@ void
update_networkstatus_downloads(time_t now)
{
const or_options_t *options = get_options();
- if (should_delay_dir_fetches(options))
+ if (should_delay_dir_fetches(options, NULL))
return;
- if (authdir_mode_any_main(options) || options->FetchV2Networkstatus)
- update_v2_networkstatus_cache_downloads(now);
update_consensus_networkstatus_downloads(now);
update_certificate_downloads(now);
}
@@ -1507,7 +1053,6 @@ routerstatus_has_changed(const routerstatus_t *a, const routerstatus_t *b)
a->is_named != b->is_named ||
a->is_unnamed != b->is_unnamed ||
a->is_valid != b->is_valid ||
- a->is_v2_dir != b->is_v2_dir ||
a->is_possible_guard != b->is_possible_guard ||
a->is_bad_exit != b->is_bad_exit ||
a->is_bad_directory != b->is_bad_directory ||
@@ -1729,7 +1274,11 @@ networkstatus_set_current_consensus(const char *consensus,
/* Even if we had enough signatures, we'd never use this as the
* latest consensus. */
if (was_waiting_for_certs && from_cache)
- unlink(unverified_fname);
+ if (unlink(unverified_fname) != 0) {
+ log_warn(LD_FS,
+ "Failed to unlink %s: %s",
+ unverified_fname, strerror(errno));
+ }
}
goto done;
} else {
@@ -1739,8 +1288,13 @@ networkstatus_set_current_consensus(const char *consensus,
"consensus");
result = -2;
}
- if (was_waiting_for_certs && (r < -1) && from_cache)
- unlink(unverified_fname);
+ if (was_waiting_for_certs && (r < -1) && from_cache) {
+ if (unlink(unverified_fname) != 0) {
+ log_warn(LD_FS,
+ "Failed to unlink %s: %s",
+ unverified_fname, strerror(errno));
+ }
+ }
goto done;
}
}
@@ -1788,7 +1342,11 @@ networkstatus_set_current_consensus(const char *consensus,
waiting->body = NULL;
waiting->set_at = 0;
waiting->dl_failed = 0;
- unlink(unverified_fname);
+ if (unlink(unverified_fname) != 0) {
+ log_warn(LD_FS,
+ "Failed to unlink %s: %s",
+ unverified_fname, strerror(errno));
+ }
}
/* Reset the failure count only if this consensus is actually valid. */
@@ -1824,7 +1382,8 @@ networkstatus_set_current_consensus(const char *consensus,
* current consensus really alter our view of any OR's rate limits? */
connection_or_update_token_buckets(get_connection_array(), options);
- circuit_build_times_new_consensus_params(&circ_times, current_consensus);
+ circuit_build_times_new_consensus_params(get_circuit_build_times_mutable(),
+ current_consensus);
}
if (directory_caches_dir_info(options)) {
@@ -1901,9 +1460,6 @@ routers_update_all_from_networkstatus(time_t now, int dir_version)
networkstatus_t *consensus = networkstatus_get_reasonably_live_consensus(now,
FLAV_NS);
- if (networkstatus_v2_list_has_changed)
- download_status_map_update_from_v2_networkstatus();
-
if (!consensus || dir_version < 3) /* nothing more we should do */
return;
@@ -1958,35 +1514,6 @@ routers_update_all_from_networkstatus(time_t now, int dir_version)
}
}
-/** Update v2_download_status_map to contain an entry for every router
- * descriptor listed in the v2 networkstatuses. */
-static void
-download_status_map_update_from_v2_networkstatus(void)
-{
- digestmap_t *dl_status;
- if (!networkstatus_v2_list)
- return;
- if (!v2_download_status_map)
- v2_download_status_map = digestmap_new();
-
- dl_status = digestmap_new();
- SMARTLIST_FOREACH_BEGIN(networkstatus_v2_list, networkstatus_v2_t *, ns) {
- SMARTLIST_FOREACH_BEGIN(ns->entries, const routerstatus_t *, rs) {
- const char *d = rs->descriptor_digest;
- download_status_t *s;
- if (digestmap_get(dl_status, d))
- continue;
- if (!(s = digestmap_remove(v2_download_status_map, d))) {
- s = tor_malloc_zero(sizeof(download_status_t));
- }
- digestmap_set(dl_status, d, s);
- } SMARTLIST_FOREACH_END(rs);
- } SMARTLIST_FOREACH_END(ns);
- digestmap_free(v2_download_status_map, tor_free_);
- v2_download_status_map = dl_status;
- networkstatus_v2_list_has_changed = 0;
-}
-
/** Update our view of the list of named servers from the most recently
* retrieved networkstatus consensus. */
static void
@@ -2018,14 +1545,11 @@ void
routers_update_status_from_consensus_networkstatus(smartlist_t *routers,
int reset_failures)
{
- dir_server_t *ds;
const or_options_t *options = get_options();
- int authdir = authdir_mode_v2(options) || authdir_mode_v3(options);
+ int authdir = authdir_mode_v3(options);
networkstatus_t *ns = current_consensus;
if (!ns || !smartlist_len(ns->routerstatus_list))
return;
- if (!networkstatus_v2_list)
- networkstatus_v2_list = smartlist_new();
routers_sort_by_identity(routers);
@@ -2035,11 +1559,6 @@ routers_update_status_from_consensus_networkstatus(smartlist_t *routers,
router->cache_info.identity_digest, DIGEST_LEN),
{
}) {
- /* We have a routerstatus for this router. */
- const char *digest = router->cache_info.identity_digest;
-
- ds = router_get_fallback_dirserver_by_digest(digest);
-
/* Is it the same descriptor, or only the same identity? */
if (tor_memeq(router->cache_info.signed_descriptor_digest,
rs->descriptor_digest, DIGEST_LEN)) {
@@ -2057,30 +1576,11 @@ routers_update_status_from_consensus_networkstatus(smartlist_t *routers,
dirserv_should_launch_reachability_test(router, old_router);
}
}
- if (rs->is_flagged_running && ds) {
- download_status_reset(&ds->v2_ns_dl_status);
- }
if (reset_failures) {
download_status_reset(&rs->dl_status);
}
} SMARTLIST_FOREACH_JOIN_END(rs, router);
- /* Now update last_listed_as_valid_until from v2 networkstatuses. */
- SMARTLIST_FOREACH_BEGIN(networkstatus_v2_list, networkstatus_v2_t *, ns) {
- time_t live_until = ns->published_on + V2_NETWORKSTATUS_ROUTER_LIFETIME;
- SMARTLIST_FOREACH_JOIN(ns->entries, const routerstatus_t *, rs,
- routers, routerinfo_t *, ri,
- tor_memcmp(rs->identity_digest,
- ri->cache_info.identity_digest, DIGEST_LEN),
- STMT_NIL) {
- if (tor_memeq(ri->cache_info.signed_descriptor_digest,
- rs->descriptor_digest, DIGEST_LEN)) {
- if (live_until > ri->cache_info.last_listed_as_valid_until)
- ri->cache_info.last_listed_as_valid_until = live_until;
- }
- } SMARTLIST_FOREACH_JOIN_END(rs, ri);
- } SMARTLIST_FOREACH_END(ns);
-
router_dir_info_changed();
}
@@ -2172,9 +1672,17 @@ networkstatus_dump_bridge_status_to_file(time_t now)
char *status = networkstatus_getinfo_by_purpose("bridge", now);
const or_options_t *options = get_options();
char *fname = NULL;
+ char *thresholds = NULL, *thresholds_and_status = NULL;
+ routerlist_t *rl = router_get_routerlist();
+ dirserv_compute_bridge_flag_thresholds(rl);
+ thresholds = dirserv_get_flag_thresholds_line();
+ tor_asprintf(&thresholds_and_status, "flag-thresholds %s\n%s",
+ thresholds, status);
tor_asprintf(&fname, "%s"PATH_SEPARATOR"networkstatus-bridges",
options->DataDirectory);
- write_str_to_file(fname,status,0);
+ write_str_to_file(fname,thresholds_and_status,0);
+ tor_free(thresholds);
+ tor_free(thresholds_and_status);
tor_free(fname);
tor_free(status);
}
@@ -2391,15 +1899,6 @@ void
networkstatus_free_all(void)
{
int i;
- if (networkstatus_v2_list) {
- SMARTLIST_FOREACH(networkstatus_v2_list, networkstatus_v2_t *, ns,
- networkstatus_v2_free(ns));
- smartlist_free(networkstatus_v2_list);
- networkstatus_v2_list = NULL;
- }
-
- digestmap_free(v2_download_status_map, tor_free_);
- v2_download_status_map = NULL;
networkstatus_vote_free(current_ns_consensus);
networkstatus_vote_free(current_md_consensus);
current_md_consensus = current_ns_consensus = NULL;
diff --git a/src/or/networkstatus.h b/src/or/networkstatus.h
index 761f8e7f0..be0a86cdd 100644
--- a/src/or/networkstatus.h
+++ b/src/or/networkstatus.h
@@ -12,16 +12,10 @@
#ifndef TOR_NETWORKSTATUS_H
#define TOR_NETWORKSTATUS_H
-/** How old do we allow a v2 network-status to get before removing it
- * completely? */
-#define MAX_NETWORKSTATUS_AGE (10*24*60*60)
-
void networkstatus_reset_warnings(void);
void networkstatus_reset_download_failures(void);
-int router_reload_v2_networkstatus(void);
int router_reload_consensus_networkstatus(void);
void routerstatus_free(routerstatus_t *rs);
-void networkstatus_v2_free(networkstatus_v2_t *ns);
void networkstatus_vote_free(networkstatus_t *ns);
networkstatus_voter_info_t *networkstatus_get_voter_by_id(
networkstatus_t *vote,
@@ -31,26 +25,16 @@ int networkstatus_check_consensus_signature(networkstatus_t *consensus,
int networkstatus_check_document_signature(const networkstatus_t *consensus,
document_signature_t *sig,
const authority_cert_t *cert);
-char *networkstatus_get_cache_filename(const char *identity_digest);
-int router_set_networkstatus_v2(const char *s, time_t arrived_at,
- v2_networkstatus_source_t source,
- smartlist_t *requested_fingerprints);
-void networkstatus_v2_list_clean(time_t now);
int compare_digest_to_routerstatus_entry(const void *_key,
const void **_member);
int compare_digest_to_vote_routerstatus_entry(const void *_key,
const void **_member);
-const routerstatus_t *networkstatus_v2_find_entry(networkstatus_v2_t *ns,
- const char *digest);
const routerstatus_t *networkstatus_vote_find_entry(networkstatus_t *ns,
const char *digest);
-routerstatus_t *networkstatus_v2_find_mutable_entry(networkstatus_v2_t *ns,
- const char *digest);
routerstatus_t *networkstatus_vote_find_mutable_entry(networkstatus_t *ns,
const char *digest);
int networkstatus_vote_find_entry_idx(networkstatus_t *ns,
const char *digest, int *found_out);
-const smartlist_t *networkstatus_get_v2_list(void);
download_status_t *router_get_dl_status_by_descriptor_digest(const char *d);
const routerstatus_t *router_get_consensus_status_by_id(const char *digest);
routerstatus_t *router_get_mutable_consensus_status_by_id(
@@ -69,7 +53,7 @@ int networkstatus_nickname_is_unnamed(const char *nickname);
void networkstatus_consensus_download_failed(int status_code,
const char *flavname);
void update_consensus_networkstatus_fetch_time(time_t now);
-int should_delay_dir_fetches(const or_options_t *options);
+int should_delay_dir_fetches(const or_options_t *options,const char **msg_out);
void update_networkstatus_downloads(time_t now);
void update_certificate_downloads(time_t now);
int consensus_is_waiting_for_certs(void);
@@ -115,5 +99,9 @@ document_signature_t *document_signature_dup(const document_signature_t *sig);
void networkstatus_free_all(void);
int networkstatus_get_weight_scale_param(networkstatus_t *ns);
+#ifdef NETWORKSTATUS_PRIVATE
+STATIC void vote_routerstatus_free(vote_routerstatus_t *rs);
+#endif
+
#endif
diff --git a/src/or/nodelist.c b/src/or/nodelist.c
index 178f084b6..8f870816d 100644
--- a/src/or/nodelist.c
+++ b/src/or/nodelist.c
@@ -25,6 +25,8 @@
static void nodelist_drop_node(node_t *node, int remove_from_ht);
static void node_free(node_t *node);
static void update_router_have_minimum_dir_info(void);
+static double get_frac_paths_needed_for_circs(const or_options_t *options,
+ const networkstatus_t *ns);
/** A nodelist_t holds a node_t object for every router we're "willing to use
* for something". Specifically, it should hold a node_t for every node that
@@ -41,14 +43,7 @@ typedef struct nodelist_t {
static INLINE unsigned int
node_id_hash(const node_t *node)
{
-#if SIZEOF_INT == 4
- const uint32_t *p = (const uint32_t*)node->identity;
- return p[0] ^ p[1] ^ p[2] ^ p[3] ^ p[4];
-#elif SIZEOF_INT == 8
- const uint64_t *p = (const uint32_t*)node->identity;
- const uint32_t *p32 = (const uint32_t*)node->identity;
- return p[0] ^ p[1] ^ p32[4];
-#endif
+ return (unsigned) siphash24g(node->identity, DIGEST_LEN);
}
static INLINE unsigned int
@@ -90,8 +85,8 @@ node_get_mutable_by_id(const char *identity_digest)
/** Return the node_t whose identity is <b>identity_digest</b>, or NULL
* if no such node exists. */
-const node_t *
-node_get_by_id(const char *identity_digest)
+MOCK_IMPL(const node_t *,
+node_get_by_id,(const char *identity_digest))
{
return node_get_mutable_by_id(identity_digest);
}
@@ -211,7 +206,7 @@ void
nodelist_set_consensus(networkstatus_t *ns)
{
const or_options_t *options = get_options();
- int authdir = authdir_mode_v2(options) || authdir_mode_v3(options);
+ int authdir = authdir_mode_v3(options);
int client = !server_mode(options);
init_nodelist();
@@ -337,6 +332,25 @@ nodelist_drop_node(node_t *node, int remove_from_ht)
node->nodelist_idx = -1;
}
+/** Return a newly allocated smartlist of the nodes that have <b>md</b> as
+ * their microdescriptor. */
+smartlist_t *
+nodelist_find_nodes_with_microdesc(const microdesc_t *md)
+{
+ smartlist_t *result = smartlist_new();
+
+ if (the_nodelist == NULL)
+ return result;
+
+ SMARTLIST_FOREACH_BEGIN(the_nodelist->nodes, node_t *, node) {
+ if (node->md == md) {
+ smartlist_add(result, node);
+ }
+ } SMARTLIST_FOREACH_END(node);
+
+ return result;
+}
+
/** Release storage held by <b>node</b> */
static void
node_free(node_t *node)
@@ -644,7 +658,7 @@ node_get_purpose(const node_t *node)
/** Compute the verbose ("extended") nickname of <b>node</b> and store it
* into the MAX_VERBOSE_NICKNAME_LEN+1 character buffer at
- * <b>verbose_nickname_out</b> */
+ * <b>verbose_name_out</b> */
void
node_get_verbose_nickname(const node_t *node,
char *verbose_name_out)
@@ -660,6 +674,25 @@ node_get_verbose_nickname(const node_t *node,
strlcpy(verbose_name_out+1+HEX_DIGEST_LEN+1, nickname, MAX_NICKNAME_LEN+1);
}
+/** Compute the verbose ("extended") nickname of node with
+ * given <b>id_digest</b> and store it into the MAX_VERBOSE_NICKNAME_LEN+1
+ * character buffer at <b>verbose_name_out</b>
+ *
+ * If node_get_by_id() returns NULL, base 16 encoding of
+ * <b>id_digest</b> is returned instead. */
+void
+node_get_verbose_nickname_by_id(const char *id_digest,
+ char *verbose_name_out)
+{
+ const node_t *node = node_get_by_id(id_digest);
+ if (!node) {
+ verbose_name_out[0] = '$';
+ base16_encode(verbose_name_out+1, HEX_DIGEST_LEN+1, id_digest, DIGEST_LEN);
+ } else {
+ node_get_verbose_nickname(node, verbose_name_out);
+ }
+}
+
/** Return true iff it seems that <b>node</b> allows circuits to exit
* through it directlry from the client. */
int
@@ -771,7 +804,7 @@ void
node_get_address_string(const node_t *node, char *buf, size_t len)
{
if (node->ri) {
- strlcpy(buf, node->ri->address, len);
+ strlcpy(buf, fmt_addr32(node->ri->addr), len);
} else if (node->rs) {
tor_addr_t addr;
tor_addr_from_ipv4h(&addr, node->rs->addr);
@@ -1216,10 +1249,12 @@ router_set_status(const char *digest, int up)
if (!up && node_is_me(node) && !net_is_disabled())
log_warn(LD_NET, "We just marked ourself as down. Are your external "
"addresses reachable?");
+
+ if (bool_neq(node->is_running, up))
+ router_dir_info_changed();
+
node->is_running = up;
}
-
- router_dir_info_changed();
}
/** True iff, the last time we checked whether we had enough directory info
@@ -1317,7 +1352,7 @@ count_usable_descriptors(int *num_present, int *num_usable,
md ? "microdesc" : "desc", exit_only ? " exits" : "s");
}
-/** Return an extimate of which fraction of usable paths through the Tor
+/** Return an estimate of which fraction of usable paths through the Tor
* network we have available for use. */
static double
compute_frac_paths_available(const networkstatus_t *consensus,
@@ -1329,9 +1364,10 @@ compute_frac_paths_available(const networkstatus_t *consensus,
smartlist_t *mid = smartlist_new();
smartlist_t *exits = smartlist_new();
smartlist_t *myexits= smartlist_new();
- double f_guard, f_mid, f_exit, f_myexit;
+ smartlist_t *myexits_unflagged = smartlist_new();
+ double f_guard, f_mid, f_exit, f_myexit, f_myexit_unflagged;
int np, nu; /* Ignored */
- const int authdir = authdir_mode_v2(options) || authdir_mode_v3(options);
+ const int authdir = authdir_mode_v3(options);
count_usable_descriptors(num_present_out, num_usable_out,
mid, consensus, options, now, NULL, 0);
@@ -1350,20 +1386,42 @@ compute_frac_paths_available(const networkstatus_t *consensus,
});
}
+ /* All nodes with exit flag */
count_usable_descriptors(&np, &nu, exits, consensus, options, now,
NULL, 1);
+ /* All nodes with exit flag in ExitNodes option */
count_usable_descriptors(&np, &nu, myexits, consensus, options, now,
options->ExitNodes, 1);
+ /* Now compute the nodes in the ExitNodes option where which we don't know
+ * what their exit policy is, or we know it permits something. */
+ count_usable_descriptors(&np, &nu, myexits_unflagged,
+ consensus, options, now,
+ options->ExitNodes, 0);
+ SMARTLIST_FOREACH_BEGIN(myexits_unflagged, const node_t *, node) {
+ if (node_has_descriptor(node) && node_exit_policy_rejects_all(node))
+ SMARTLIST_DEL_CURRENT(myexits_unflagged, node);
+ } SMARTLIST_FOREACH_END(node);
f_guard = frac_nodes_with_descriptors(guards, WEIGHT_FOR_GUARD);
f_mid = frac_nodes_with_descriptors(mid, WEIGHT_FOR_MID);
f_exit = frac_nodes_with_descriptors(exits, WEIGHT_FOR_EXIT);
f_myexit= frac_nodes_with_descriptors(myexits,WEIGHT_FOR_EXIT);
+ f_myexit_unflagged=
+ frac_nodes_with_descriptors(myexits_unflagged,WEIGHT_FOR_EXIT);
+
+ /* If our ExitNodes list has eliminated every possible Exit node, and there
+ * were some possible Exit nodes, then instead consider nodes that permit
+ * exiting to some ports. */
+ if (smartlist_len(myexits) == 0 &&
+ smartlist_len(myexits_unflagged)) {
+ f_myexit = f_myexit_unflagged;
+ }
smartlist_free(guards);
smartlist_free(mid);
smartlist_free(exits);
smartlist_free(myexits);
+ smartlist_free(myexits_unflagged);
/* This is a tricky point here: we don't want to make it easy for a
* directory to trickle exits to us until it learns which exits we have
@@ -1372,13 +1430,14 @@ compute_frac_paths_available(const networkstatus_t *consensus,
if (f_myexit < f_exit)
f_exit = f_myexit;
- tor_asprintf(status_out,
- "%d%% of guards bw, "
- "%d%% of midpoint bw, and "
- "%d%% of exit bw",
- (int)(f_guard*100),
- (int)(f_mid*100),
- (int)(f_exit*100));
+ if (status_out)
+ tor_asprintf(status_out,
+ "%d%% of guards bw, "
+ "%d%% of midpoint bw, and "
+ "%d%% of exit bw",
+ (int)(f_guard*100),
+ (int)(f_mid*100),
+ (int)(f_exit*100));
return f_guard * f_mid * f_exit;
}
@@ -1391,19 +1450,19 @@ count_loading_descriptors_progress(void)
{
int num_present = 0, num_usable=0;
time_t now = time(NULL);
+ const or_options_t *options = get_options();
const networkstatus_t *consensus =
networkstatus_get_reasonably_live_consensus(now,usable_consensus_flavor());
- double fraction;
+ double paths, fraction;
if (!consensus)
return 0; /* can't count descriptors if we have no list of them */
- count_usable_descriptors(&num_present, &num_usable, NULL,
- consensus, get_options(), now, NULL, 0);
+ paths = compute_frac_paths_available(consensus, options, now,
+ &num_present, &num_usable,
+ NULL);
- if (num_usable == 0)
- return 0; /* don't div by 0 */
- fraction = num_present / (num_usable/4.);
+ fraction = paths / get_frac_paths_needed_for_circs(options,consensus);
if (fraction > 1.0)
return 0; /* it's not the number of descriptors holding us back */
return BOOTSTRAP_STATUS_LOADING_DESCRIPTORS + (int)
@@ -1439,6 +1498,7 @@ update_router_have_minimum_dir_info(void)
const networkstatus_t *consensus =
networkstatus_get_reasonably_live_consensus(now,usable_consensus_flavor());
int using_md;
+ const char *delay_fetches_msg = NULL;
if (!consensus) {
if (!networkstatus_get_latest_consensus())
@@ -1451,10 +1511,9 @@ update_router_have_minimum_dir_info(void)
goto done;
}
- if (should_delay_dir_fetches(get_options())) {
- log_notice(LD_DIR, "no known bridge descriptors running yet; stalling");
- strlcpy(dir_info_status, "No live bridge descriptors.",
- sizeof(dir_info_status));
+ if (should_delay_dir_fetches(get_options(), &delay_fetches_msg)) {
+ log_notice(LD_DIR, "Delaying directory fetches: %s", delay_fetches_msg);
+ strlcpy(dir_info_status, delay_fetches_msg, sizeof(dir_info_status));
res = 0;
goto done;
}
diff --git a/src/or/nodelist.h b/src/or/nodelist.h
index 8a4665a8b..8e719e012 100644
--- a/src/or/nodelist.h
+++ b/src/or/nodelist.h
@@ -17,7 +17,7 @@
} STMT_END
node_t *node_get_mutable_by_id(const char *identity_digest);
-const node_t *node_get_by_id(const char *identity_digest);
+MOCK_DECL(const node_t *, node_get_by_id, (const char *identity_digest));
const node_t *node_get_by_hex_id(const char *identity_digest);
node_t *nodelist_set_routerinfo(routerinfo_t *ri, routerinfo_t **ri_old_out);
node_t *nodelist_add_microdesc(microdesc_t *md);
@@ -26,6 +26,7 @@ void nodelist_set_consensus(networkstatus_t *ns);
void nodelist_remove_microdesc(const char *identity_digest, microdesc_t *md);
void nodelist_remove_routerinfo(routerinfo_t *ri);
void nodelist_purge(void);
+smartlist_t *nodelist_find_nodes_with_microdesc(const microdesc_t *md);
void nodelist_free_all(void);
void nodelist_assert_ok(void);
@@ -33,6 +34,8 @@ void nodelist_assert_ok(void);
const node_t *node_get_by_nickname(const char *nickname, int warn_if_unnamed);
void node_get_verbose_nickname(const node_t *node,
char *verbose_name_out);
+void node_get_verbose_nickname_by_id(const char *id_digest,
+ char *verbose_name_out);
int node_is_named(const node_t *node);
int node_is_dir(const node_t *node);
int node_has_descriptor(const node_t *node);
diff --git a/src/or/ntmain.c b/src/or/ntmain.c
index 8b67b8682..e84831404 100644
--- a/src/or/ntmain.c
+++ b/src/or/ntmain.c
@@ -3,7 +3,6 @@
* Copyright (c) 2007-2013, The Tor Project, Inc. */
/* See LICENSE for licensing information */
-#define MAIN_PRIVATE
#include "or.h"
#include "config.h"
#include "main.h"
@@ -315,6 +314,7 @@ nt_service_main(void)
case CMD_LIST_FINGERPRINT:
case CMD_HASH_PASSWORD:
case CMD_VERIFY_CONFIG:
+ case CMD_DUMP_CONFIG:
log_err(LD_CONFIG, "Unsupported command (--list-fingerprint, "
"--hash-password, or --verify-config) in NT service.");
break;
diff --git a/src/or/onion.c b/src/or/onion.c
index 1a0bcf106..ae39f451f 100644
--- a/src/or/onion.c
+++ b/src/or/onion.c
@@ -22,7 +22,6 @@
#include "relay.h"
#include "rephist.h"
#include "router.h"
-#include "tor_queue.h"
/** Type for a linked list of circuits that are waiting for a free CPU worker
* to process a waiting onion handshake. */
@@ -59,7 +58,7 @@ static void onion_queue_entry_remove(onion_queue_t *victim);
* MAX_ONIONSKIN_CHALLENGE/REPLY_LEN." Also, make sure that we can pass
* over-large values via EXTEND2/EXTENDED2, for future-compatibility.*/
-/** Return true iff we have room to queue another oninoskin of type
+/** Return true iff we have room to queue another onionskin of type
* <b>type</b>. */
static int
have_room_for_onionskin(uint16_t type)
@@ -330,12 +329,14 @@ onion_queue_entry_remove(onion_queue_t *victim)
void
clear_pending_onions(void)
{
- onion_queue_t *victim;
+ onion_queue_t *victim, *next;
int i;
for (i=0; i<=MAX_ONION_HANDSHAKE_TYPE; i++) {
- while ((victim = TOR_TAILQ_FIRST(&ol_list[i]))) {
+ for (victim = TOR_TAILQ_FIRST(&ol_list[i]); victim; victim = next) {
+ next = TOR_TAILQ_NEXT(victim,next);
onion_queue_entry_remove(victim);
}
+ tor_assert(TOR_TAILQ_EMPTY(&ol_list[i]));
}
memset(ol_entries, 0, sizeof(ol_entries));
}
@@ -553,8 +554,10 @@ onion_skin_client_handshake(int type,
switch (type) {
case ONION_HANDSHAKE_TYPE_TAP:
- if (reply_len != TAP_ONIONSKIN_REPLY_LEN)
+ if (reply_len != TAP_ONIONSKIN_REPLY_LEN) {
+ log_warn(LD_CIRC, "TAP reply was not of the correct length.");
return -1;
+ }
if (onion_skin_TAP_client_handshake(handshake_state->u.tap,
(const char*)reply,
(char *)keys_out, keys_out_len) < 0)
@@ -564,8 +567,10 @@ onion_skin_client_handshake(int type,
return 0;
case ONION_HANDSHAKE_TYPE_FAST:
- if (reply_len != CREATED_FAST_LEN)
+ if (reply_len != CREATED_FAST_LEN) {
+ log_warn(LD_CIRC, "CREATED_FAST reply was not of the correct length.");
return -1;
+ }
if (fast_client_handshake(handshake_state->u.fast, reply,
keys_out, keys_out_len) < 0)
return -1;
@@ -574,8 +579,10 @@ onion_skin_client_handshake(int type,
return 0;
#ifdef CURVE25519_ENABLED
case ONION_HANDSHAKE_TYPE_NTOR:
- if (reply_len < NTOR_REPLY_LEN)
+ if (reply_len < NTOR_REPLY_LEN) {
+ log_warn(LD_CIRC, "ntor reply was not of the correct length.");
return -1;
+ }
{
size_t keys_tmp_len = keys_out_len + DIGEST_LEN;
uint8_t *keys_tmp = tor_malloc(keys_tmp_len);
@@ -861,16 +868,19 @@ extend_cell_parse(extend_cell_t *cell_out, const uint8_t command,
}
case RELAY_COMMAND_EXTEND2:
{
- uint8_t n_specs = *payload, spectype, speclen;
+ uint8_t n_specs, spectype, speclen;
int i;
int found_ipv4 = 0, found_ipv6 = 0, found_id = 0;
tor_addr_make_unspec(&cell_out->orport_ipv4.addr);
tor_addr_make_unspec(&cell_out->orport_ipv6.addr);
+ if (payload_length == 0)
+ return -1;
+
cell_out->cell_type = RELAY_COMMAND_EXTEND2;
- ++payload;
+ n_specs = *payload++;
/* Parse the specifiers. We'll only take the first IPv4 and first IPv6
- * addres, and the node ID, and ignore everything else */
+ * address, and the node ID, and ignore everything else */
for (i = 0; i < n_specs; ++i) {
if (eop - payload < 2)
return -1;
diff --git a/src/or/onion_fast.c b/src/or/onion_fast.c
index aa034a8bd..38b62decc 100644
--- a/src/or/onion_fast.c
+++ b/src/or/onion_fast.c
@@ -22,7 +22,7 @@ fast_handshake_state_free(fast_handshake_state_t *victim)
tor_free(victim);
}
-/** Create the state needed to perform a CREATE_FAST hasnshake. Return 0
+/** Create the state needed to perform a CREATE_FAST handshake. Return 0
* on success, -1 on failure. */
int
fast_onionskin_create(fast_handshake_state_t **handshake_state_out,
@@ -104,6 +104,7 @@ fast_client_handshake(const fast_handshake_state_t *handshake_state,
out_len = key_out_len+DIGEST_LEN;
out = tor_malloc(out_len);
if (crypto_expand_key_material_TAP(tmp, sizeof(tmp), out, out_len)) {
+ log_warn(LD_CIRC, "Failed to expand key material");
goto done;
}
if (tor_memneq(out, handshake_reply_out+DIGEST_LEN, DIGEST_LEN)) {
diff --git a/src/or/onion_ntor.c b/src/or/onion_ntor.c
index 9cf7d5dd6..ef501f69d 100644
--- a/src/or/onion_ntor.c
+++ b/src/or/onion_ntor.c
@@ -256,7 +256,7 @@ onion_skin_ntor_client_handshake(
si += CURVE25519_OUTPUT_LEN;
curve25519_handshake(si, &handshake_state->seckey_x,
&handshake_state->pubkey_B);
- bad |= safe_mem_is_zero(si, CURVE25519_OUTPUT_LEN);
+ bad |= (safe_mem_is_zero(si, CURVE25519_OUTPUT_LEN) << 1);
si += CURVE25519_OUTPUT_LEN;
APPEND(si, handshake_state->router_id, DIGEST_LEN);
APPEND(si, handshake_state->pubkey_B.public_key, CURVE25519_PUBKEY_LEN);
@@ -281,7 +281,7 @@ onion_skin_ntor_client_handshake(
/* Compute auth */
h_tweak(s.auth, s.auth_input, sizeof(s.auth_input), T->t_mac);
- bad |= tor_memneq(s.auth, auth_candidate, DIGEST256_LEN);
+ bad |= (tor_memneq(s.auth, auth_candidate, DIGEST256_LEN) << 2);
crypto_expand_key_material_rfc5869_sha256(
s.secret_input, sizeof(s.secret_input),
@@ -290,6 +290,11 @@ onion_skin_ntor_client_handshake(
key_out, key_out_len);
memwipe(&s, 0, sizeof(s));
+
+ if (bad) {
+ log_warn(LD_PROTOCOL, "Invalid result from curve25519 handshake: %d", bad);
+ }
+
return bad ? -1 : 0;
}
diff --git a/src/or/onion_tap.c b/src/or/onion_tap.c
index 3782e75ab..9a9f374b9 100644
--- a/src/or/onion_tap.c
+++ b/src/or/onion_tap.c
@@ -194,8 +194,10 @@ onion_skin_TAP_client_handshake(crypto_dh_t *handshake_state,
len = crypto_dh_compute_secret(LOG_PROTOCOL_WARN, handshake_state,
handshake_reply, DH_KEY_LEN, key_material,
key_material_len);
- if (len < 0)
+ if (len < 0) {
+ log_warn(LD_PROTOCOL,"DH computation failed.");
goto err;
+ }
if (tor_memneq(key_material, handshake_reply+DH_KEY_LEN, DIGEST_LEN)) {
/* H(K) does *not* match. Something fishy. */
diff --git a/src/or/or.h b/src/or/or.h
index 3ed9f9f58..f1d68b766 100644
--- a/src/or/or.h
+++ b/src/or/or.h
@@ -99,6 +99,7 @@
#include "ht.h"
#include "replaycache.h"
#include "crypto_curve25519.h"
+#include "tor_queue.h"
/* These signals are defined to help handle_control_signal work.
*/
@@ -195,6 +196,7 @@ typedef enum {
* and let it use any circuit ID it wants. */
CIRC_ID_TYPE_NEITHER=2
} circ_id_type_t;
+#define circ_id_type_bitfield_t ENUM_BF(circ_id_type_t)
#define CONN_TYPE_MIN_ 3
/** Type for sockets listening for OR connections. */
@@ -227,8 +229,14 @@ typedef enum {
#define CONN_TYPE_AP_NATD_LISTENER 14
/** Type for sockets listening for DNS requests. */
#define CONN_TYPE_AP_DNS_LISTENER 15
-#define CONN_TYPE_MAX_ 15
-/* !!!! If CONN_TYPE_MAX_ is ever over 15, we must grow the type field in
+
+/** Type for connections from the Extended ORPort. */
+#define CONN_TYPE_EXT_OR 16
+/** Type for sockets listening for Extended ORPort connections. */
+#define CONN_TYPE_EXT_OR_LISTENER 17
+
+#define CONN_TYPE_MAX_ 17
+/* !!!! If _CONN_TYPE_MAX is ever over 31, we must grow the type field in
* connection_t. */
/* Proxy client types */
@@ -238,7 +246,9 @@ typedef enum {
#define PROXY_SOCKS5 3
/* !!!! If there is ever a PROXY_* type over 2, we must grow the proxy_type
* field in or_connection_t */
-/* pluggable transports proxy type */
+
+/* Pluggable transport proxy type. Don't use this in or_connection_t,
+ * instead use the actual underlying proxy type (see above). */
#define PROXY_PLUGGABLE 4
/* Proxy client handshake states */
@@ -306,6 +316,25 @@ typedef enum {
#define OR_CONN_STATE_OPEN 8
#define OR_CONN_STATE_MAX_ 8
+/** States of the Extended ORPort protocol. Be careful before changing
+ * the numbers: they matter. */
+#define EXT_OR_CONN_STATE_MIN_ 1
+/** Extended ORPort authentication is waiting for the authentication
+ * type selected by the client. */
+#define EXT_OR_CONN_STATE_AUTH_WAIT_AUTH_TYPE 1
+/** Extended ORPort authentication is waiting for the client nonce. */
+#define EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_NONCE 2
+/** Extended ORPort authentication is waiting for the client hash. */
+#define EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_HASH 3
+#define EXT_OR_CONN_STATE_AUTH_MAX 3
+/** Authentication finished and the Extended ORPort is now accepting
+ * traffic. */
+#define EXT_OR_CONN_STATE_OPEN 4
+/** Extended ORPort is flushing its last messages and preparing to
+ * start accepting OR connections. */
+#define EXT_OR_CONN_STATE_FLUSHING 5
+#define EXT_OR_CONN_STATE_MAX_ 5
+
#define EXIT_CONN_STATE_MIN_ 1
/** State for an exit connection: waiting for response from DNS farm. */
#define EXIT_CONN_STATE_RESOLVING 1
@@ -372,16 +401,10 @@ typedef enum {
#define CONTROL_CONN_STATE_NEEDAUTH 2
#define CONTROL_CONN_STATE_MAX_ 2
-#define DIR_PURPOSE_MIN_ 3
-/** A connection to a directory server: download a rendezvous
- * descriptor. */
-#define DIR_PURPOSE_FETCH_RENDDESC 3
-/** A connection to a directory server: set after a rendezvous
+#define DIR_PURPOSE_MIN_ 4
+/** A connection to a directory server: set after a v2 rendezvous
* descriptor is downloaded. */
-#define DIR_PURPOSE_HAS_FETCHED_RENDDESC 4
-/** A connection to a directory server: download one or more v2
- * network-status objects */
-#define DIR_PURPOSE_FETCH_V2_NETWORKSTATUS 5
+#define DIR_PURPOSE_HAS_FETCHED_RENDDESC_V2 4
/** A connection to a directory server: download one or more server
* descriptors. */
#define DIR_PURPOSE_FETCH_SERVERDESC 6
@@ -390,9 +413,6 @@ typedef enum {
#define DIR_PURPOSE_FETCH_EXTRAINFO 7
/** A connection to a directory server: upload a server descriptor. */
#define DIR_PURPOSE_UPLOAD_DIR 8
-/** A connection to a directory server: upload a rendezvous
- * descriptor. */
-#define DIR_PURPOSE_UPLOAD_RENDDESC 9
/** A connection to a directory server: upload a v3 networkstatus vote. */
#define DIR_PURPOSE_UPLOAD_VOTE 10
/** A connection to a directory server: upload a v3 consensus signature */
@@ -426,7 +446,6 @@ typedef enum {
* directory server. */
#define DIR_PURPOSE_IS_UPLOAD(p) \
((p)==DIR_PURPOSE_UPLOAD_DIR || \
- (p)==DIR_PURPOSE_UPLOAD_RENDDESC || \
(p)==DIR_PURPOSE_UPLOAD_VOTE || \
(p)==DIR_PURPOSE_UPLOAD_SIGNATURES)
@@ -585,7 +604,8 @@ typedef enum {
#define END_OR_CONN_REASON_NO_ROUTE 6 /* no route to host/net */
#define END_OR_CONN_REASON_IO_ERROR 7 /* read/write error */
#define END_OR_CONN_REASON_RESOURCE_LIMIT 8 /* sockets, buffers, etc */
-#define END_OR_CONN_REASON_MISC 9
+#define END_OR_CONN_REASON_PT_MISSING 9 /* PT failed or not available */
+#define END_OR_CONN_REASON_MISC 10
/* Reasons why we (or a remote OR) might close a stream. See tor-spec.txt for
* documentation of these. The values must match. */
@@ -823,9 +843,15 @@ typedef enum {
/** Maximum number of queued cells on a circuit for which we are the
* midpoint before we give up and kill it. This must be >= circwindow
* to avoid killing innocent circuits, and >= circwindow*2 to give
- * leaky-pipe a chance for being useful someday.
+ * leaky-pipe a chance of working someday. The ORCIRC_MAX_MIDDLE_KILL_THRESH
+ * ratio controls the margin of error between emitting a warning and
+ * killing the circuit.
*/
-#define ORCIRC_MAX_MIDDLE_CELLS (21*(CIRCWINDOW_START_MAX)/10)
+#define ORCIRC_MAX_MIDDLE_CELLS (CIRCWINDOW_START_MAX*2)
+/** Ratio of hard (circuit kill) to soft (warning) thresholds for the
+ * ORCIRC_MAX_MIDDLE_CELLS tests.
+ */
+#define ORCIRC_MAX_MIDDLE_KILL_THRESH (1.1f)
/* Cell commands. These values are defined in tor-spec.txt. */
#define CELL_PADDING 0
@@ -846,6 +872,7 @@ typedef enum {
#define CELL_AUTH_CHALLENGE 130
#define CELL_AUTHENTICATE 131
#define CELL_AUTHORIZE 132
+#define CELL_COMMAND_MAX_ 132
/** How long to test reachability before complaining to the user. */
#define TIMEOUT_UNTIL_UNREACHABILITY_COMPLAINT (20*60)
@@ -1073,9 +1100,17 @@ typedef struct var_cell_t {
uint8_t payload[FLEXIBLE_ARRAY_MEMBER];
} var_cell_t;
+/** A parsed Extended ORPort message. */
+typedef struct ext_or_cmd_t {
+ uint16_t cmd; /** Command type */
+ uint16_t len; /** Body length */
+ char body[FLEXIBLE_ARRAY_MEMBER]; /** Message body */
+} ext_or_cmd_t;
+
/** A cell as packed for writing to the network. */
typedef struct packed_cell_t {
- struct packed_cell_t *next; /**< Next cell queued on this circuit. */
+ /** Next cell queued on this circuit. */
+ TOR_SIMPLEQ_ENTRY(packed_cell_t) next;
char body[CELL_MAX_NETWORK_SIZE]; /**< Cell as packed for network. */
uint32_t inserted_time; /**< Time (in milliseconds since epoch, with high
* bits truncated) when this cell was inserted. */
@@ -1084,8 +1119,8 @@ typedef struct packed_cell_t {
/** A queue of cells on a circuit, waiting to be added to the
* or_connection_t's outbuf. */
typedef struct cell_queue_t {
- packed_cell_t *head; /**< The first cell, or NULL if the queue is empty. */
- packed_cell_t *tail; /**< The last cell, or NULL if the queue is empty. */
+ /** Linked list of packed_cell_t*/
+ TOR_SIMPLEQ_HEAD(cell_simpleq, packed_cell_t) head;
int n; /**< The number of cells in the queue. */
} cell_queue_t;
@@ -1139,7 +1174,7 @@ typedef struct connection_t {
* *_CONNECTION_MAGIC. */
uint8_t state; /**< Current state of this connection. */
- unsigned int type:4; /**< What kind of connection is this? */
+ unsigned int type:5; /**< What kind of connection is this? */
unsigned int purpose:5; /**< Only used for DIR and EXIT types currently. */
/* The next fields are all one-bit booleans. Some are only applicable to
@@ -1223,6 +1258,14 @@ typedef struct connection_t {
/** Unique identifier for this connection on this Tor instance. */
uint64_t global_identifier;
+
+ /** Bytes read since last call to control_event_conn_bandwidth_used().
+ * Only used if we're configured to emit CONN_BW events. */
+ uint32_t n_read_conn_bw;
+
+ /** Bytes written since last call to control_event_conn_bandwidth_used().
+ * Only used if we're configured to emit CONN_BW events. */
+ uint32_t n_written_conn_bw;
} connection_t;
/** Subtype of connection_t; used for a listener socket. */
@@ -1384,6 +1427,9 @@ typedef struct or_handshake_state_t {
/**@}*/
} or_handshake_state_t;
+/** Length of Extended ORPort connection identifier. */
+#define EXT_OR_CONN_ID_LEN DIGEST_LEN /* 20 */
+
/** Subtype of connection_t for an "OR connection" -- that is, one that speaks
* cells over TLS. */
typedef struct or_connection_t {
@@ -1392,6 +1438,20 @@ typedef struct or_connection_t {
/** Hash of the public RSA key for the other side's identity key, or zeroes
* if the other side hasn't shown us a valid identity key. */
char identity_digest[DIGEST_LEN];
+
+ /** Extended ORPort connection identifier. */
+ char *ext_or_conn_id;
+ /** This is the ClientHash value we expect to receive from the
+ * client during the Extended ORPort authentication protocol. We
+ * compute it upon receiving the ClientNoce from the client, and we
+ * compare it with the acual ClientHash value sent by the
+ * client. */
+ char *ext_or_auth_correct_client_hash;
+ /** String carrying the name of the pluggable transport
+ * (e.g. "obfs2") that is obfuscating this connection. If no
+ * pluggable transports are used, it's NULL. */
+ char *ext_or_transport;
+
char *nickname; /**< Nickname of OR on other side (if any). */
tor_tls_t *tls; /**< TLS connection state. */
@@ -1422,6 +1482,10 @@ typedef struct or_connection_t {
unsigned int is_outgoing:1;
unsigned int proxy_type:2; /**< One of PROXY_NONE...PROXY_SOCKS5 */
unsigned int wide_circ_ids:1;
+ /** True iff this connection has had its bootstrap failure logged with
+ * control_event_bootstrap_problem. */
+ unsigned int have_noted_bootstrap_problem:1;
+
uint16_t link_proto; /**< What protocol version are we using? 0 for
* "none negotiated yet." */
uint16_t idle_timeout; /**< How long can this connection sit with no
@@ -1450,6 +1514,12 @@ typedef struct or_connection_t {
struct or_connection_t *next_with_same_id; /**< Next connection with same
* identity digest as this one. */
+ /** Last emptied read token bucket in msec since midnight; only used if
+ * TB_EMPTY events are enabled. */
+ uint32_t read_emptied_time;
+ /** Last emptied write token bucket in msec since midnight; only used if
+ * TB_EMPTY events are enabled. */
+ uint32_t write_emptied_time;
} or_connection_t;
/** Subtype of connection_t for an "edge connection" -- that is, an entry (ap)
@@ -1620,6 +1690,7 @@ typedef enum {
DIR_SPOOL_CACHED_DIR, DIR_SPOOL_NETWORKSTATUS,
DIR_SPOOL_MICRODESC, /* NOTE: if we add another entry, add another bit. */
} dir_spool_source_t;
+#define dir_spool_source_bitfield_t ENUM_BF(dir_spool_source_t)
/** Subtype of connection_t for an "directory connection" -- that is, an HTTP
* connection to retrieve or serve directory material. */
@@ -1639,7 +1710,7 @@ typedef struct dir_connection_t {
* "spooling" of directory material to the outbuf. Otherwise, we'd have
* to append everything to the outbuf in one enormous chunk. */
/** What exactly are we spooling right now? */
- ENUM_BF(dir_spool_source_t) dir_spool_src : 3;
+ dir_spool_source_bitfield_t dir_spool_src : 3;
/** If we're fetching descriptors, what router purpose shall we assign
* to them? */
@@ -1812,12 +1883,13 @@ typedef enum {
ADDR_POLICY_ACCEPT=1,
ADDR_POLICY_REJECT=2,
} addr_policy_action_t;
+#define addr_policy_action_bitfield_t ENUM_BF(addr_policy_action_t)
/** A reference-counted address policy rule. */
typedef struct addr_policy_t {
int refcnt; /**< Reference count */
/** What to do when the policy matches.*/
- ENUM_BF(addr_policy_action_t) policy_type:2;
+ addr_policy_action_bitfield_t policy_type:2;
unsigned int is_private:1; /**< True iff this is the pseudo-address,
* "private". */
unsigned int is_canonical:1; /**< True iff this policy is the canonical
@@ -1869,6 +1941,7 @@ typedef enum {
*/
SAVED_IN_JOURNAL
} saved_location_t;
+#define saved_location_bitfield_t ENUM_BF(saved_location_t)
/** Enumeration: what kind of download schedule are we using for a given
* object? */
@@ -1877,6 +1950,7 @@ typedef enum {
DL_SCHED_CONSENSUS = 1,
DL_SCHED_BRIDGE = 2,
} download_schedule_t;
+#define download_schedule_bitfield_t ENUM_BF(download_schedule_t)
/** Information about our plans for retrying downloads for a downloadable
* object. */
@@ -1885,7 +1959,7 @@ typedef struct download_status_t {
* again? */
uint8_t n_download_failures; /**< Number of failures trying to download the
* most recent descriptor. */
- ENUM_BF(download_schedule_t) schedule : 8;
+ download_schedule_bitfield_t schedule : 8;
} download_status_t;
/** If n_download_failures is this high, the download can never happen. */
@@ -1927,9 +2001,7 @@ typedef struct signed_descriptor_t {
* routerlist->old_routers? -1 for none. */
int routerlist_index;
/** The valid-until time of the most recent consensus that listed this
- * descriptor, or a bit after the publication time of the most recent v2
- * networkstatus that listed it. 0 for "never listed in a consensus or
- * status, so far as we know." */
+ * descriptor. 0 for "never listed in a consensus, so far as we know." */
time_t last_listed_as_valid_until;
/* If true, we do not ever try to save this object in the cache. */
unsigned int do_not_cache : 1;
@@ -1948,7 +2020,6 @@ typedef int16_t country_t;
/** Information about another onion router in the network. */
typedef struct {
signed_descriptor_t cache_info;
- char *address; /**< Location of OR: either a hostname or an IP address. */
char *nickname; /**< Human-readable OR name. */
uint32_t addr; /**< IPv4 address of OR, in host order. */
@@ -2066,10 +2137,6 @@ typedef struct routerstatus_t {
unsigned int is_unnamed:1; /**< True iff "nickname" belongs to another
* router. */
unsigned int is_valid:1; /**< True iff this router isn't invalid. */
- unsigned int is_v2_dir:1; /**< True iff this router can serve directory
- * information with v2 of the directory
- * protocol. (All directory caches cache v1
- * directories.) */
unsigned int is_possible_guard:1; /**< True iff this router would be a good
* choice as an entry guard. */
unsigned int is_bad_exit:1; /**< True iff this node is a bad choice for
@@ -2106,12 +2173,6 @@ typedef struct routerstatus_t {
/* ---- The fields below aren't derived from the networkstatus; they
* hold local information only. */
- /** True if we, as a directory mirror, want to download the corresponding
- * routerinfo from the authority who gave us this routerstatus. (That is,
- * if we don't have the routerinfo, and if we haven't already tried to get it
- * from this authority.) Applies in v2 networkstatus document only.
- */
- unsigned int need_to_mirror:1;
time_t last_dir_503_at; /**< When did this router last tell us that it
* was too busy to serve directory info? */
download_status_t dl_status;
@@ -2153,7 +2214,7 @@ typedef struct microdesc_t {
*/
time_t last_listed;
/** Where is this microdescriptor currently stored? */
- ENUM_BF(saved_location_t) saved_location : 3;
+ saved_location_bitfield_t saved_location : 3;
/** If true, do not attempt to cache this microdescriptor on disk. */
unsigned int no_save : 1;
/** If true, this microdesc has an entry in the microdesc_map */
@@ -2276,52 +2337,6 @@ typedef struct node_t {
} node_t;
-/** How many times will we try to download a router's descriptor before giving
- * up? */
-#define MAX_ROUTERDESC_DOWNLOAD_FAILURES 8
-
-/** How many times will we try to download a microdescriptor before giving
- * up? */
-#define MAX_MICRODESC_DOWNLOAD_FAILURES 8
-
-/** Contents of a v2 (non-consensus, non-vote) network status object. */
-typedef struct networkstatus_v2_t {
- /** When did we receive the network-status document? */
- time_t received_on;
-
- /** What was the digest of the document? */
- char networkstatus_digest[DIGEST_LEN];
-
- /* These fields come from the actual network-status document.*/
- time_t published_on; /**< Declared publication date. */
-
- char *source_address; /**< Canonical directory server hostname. */
- uint32_t source_addr; /**< Canonical directory server IP. */
- uint16_t source_dirport; /**< Canonical directory server dirport. */
-
- unsigned int binds_names:1; /**< True iff this directory server binds
- * names. */
- unsigned int recommends_versions:1; /**< True iff this directory server
- * recommends client and server software
- * versions. */
- unsigned int lists_bad_exits:1; /**< True iff this directory server marks
- * malfunctioning exits as bad. */
- /** True iff this directory server marks malfunctioning directories as
- * bad. */
- unsigned int lists_bad_directories:1;
-
- char identity_digest[DIGEST_LEN]; /**< Digest of signing key. */
- char *contact; /**< How to contact directory admin? (may be NULL). */
- crypto_pk_t *signing_key; /**< Key used to sign this directory. */
- char *client_versions; /**< comma-separated list of recommended client
- * versions. */
- char *server_versions; /**< comma-separated list of recommended server
- * versions. */
-
- smartlist_t *entries; /**< List of routerstatus_t*. This list is kept
- * sorted by identity_digest. */
-} networkstatus_v2_t;
-
/** Linked list of microdesc hash lines for a single router in a directory
* vote.
*/
@@ -2409,8 +2424,8 @@ typedef enum {
/** A common structure to hold a v3 network status vote, or a v3 network
* status consensus. */
typedef struct networkstatus_t {
- ENUM_BF(networkstatus_type_t) type : 8; /**< Vote, consensus, or opinion? */
- ENUM_BF(consensus_flavor_t) flavor : 8; /**< If a consensus, what kind? */
+ networkstatus_type_t type; /**< Vote, consensus, or opinion? */
+ consensus_flavor_t flavor; /**< If a consensus, what kind? */
unsigned int has_measured_bws : 1;/**< True iff this networkstatus contains
* measured= bandwidth values. */
@@ -2493,10 +2508,6 @@ typedef struct desc_store_t {
* filename for a temporary file when rebuilding the store, and .new to this
* filename for the journal. */
const char *fname_base;
- /** Alternative (obsolete) value for fname_base: if the file named by
- * fname_base isn't present, we read from here instead, but we never write
- * here. */
- const char *fname_alt_base;
/** Human-readable description of what this store contains. */
const char *description;
@@ -2573,9 +2584,6 @@ typedef struct authority_cert_t {
uint32_t addr;
/** This authority's directory port. */
uint16_t dir_port;
- /** True iff this certificate was cross-certified by signing the identity
- * key with the signing key. */
- uint8_t is_cross_certified;
} authority_cert_t;
/** Bitfield enum type listing types of information that directory authorities
@@ -2589,15 +2597,8 @@ typedef struct authority_cert_t {
*/
typedef enum {
NO_DIRINFO = 0,
- /** Serves/signs v1 directory information: Big lists of routers, and short
- * routerstatus documents. */
- V1_DIRINFO = 1 << 0,
- /** Serves/signs v2 directory information: i.e. v2 networkstatus documents */
- V2_DIRINFO = 1 << 1,
/** Serves/signs v3 directory information: votes, consensuses, certs */
V3_DIRINFO = 1 << 2,
- /** Serves hidden service descriptors. */
- HIDSERV_DIRINFO = 1 << 3,
/** Serves bridge descriptors. */
BRIDGE_DIRINFO = 1 << 4,
/** Serves extrainfo documents. */
@@ -2725,6 +2726,19 @@ typedef struct {
struct create_cell_t;
+/** Entry in the cell stats list of a circuit; used only if CELL_STATS
+ * events are enabled. */
+typedef struct testing_cell_stats_entry_t {
+ uint8_t command; /**< cell command number. */
+ /** Waiting time in centiseconds if this event is for a removed cell,
+ * or 0 if this event is for adding a cell to the queue. 22 bits can
+ * store more than 11 hours, enough to assume that a circuit with this
+ * delay would long have been closed. */
+ unsigned int waiting_time:22;
+ unsigned int removed:1; /**< 0 for added to, 1 for removed from queue. */
+ unsigned int exitward:1; /**< 0 for app-ward, 1 for exit-ward. */
+} testing_cell_stats_entry_t;
+
/**
* A circuit is a path over the onion routing
* network. Applications can connect to one end of the circuit, and can
@@ -2786,6 +2800,16 @@ typedef struct circuit_t {
* allowing n_streams to add any more cells. (OR circuit only.) */
unsigned int streams_blocked_on_p_chan : 1;
+ /** True iff we have queued a delete backwards on this circuit, but not put
+ * it on the output buffer. */
+ unsigned int p_delete_pending : 1;
+ /** True iff we have queued a delete forwards on this circuit, but not put
+ * it on the output buffer. */
+ unsigned int n_delete_pending : 1;
+
+ /** True iff this circuit has received a DESTROY cell in either direction */
+ unsigned int received_destroy : 1;
+
uint8_t state; /**< Current status of this circuit. */
uint8_t purpose; /**< Why are we creating this circuit? */
@@ -2799,6 +2823,9 @@ typedef struct circuit_t {
* more. */
int deliver_window;
+ /** Temporary field used during circuits_handle_oom. */
+ uint32_t age_tmp;
+
/** For storage while n_chan is pending (state CIRCUIT_STATE_CHAN_WAIT). */
struct create_cell_t *n_chan_create_cell;
@@ -2840,7 +2867,8 @@ typedef struct circuit_t {
/** Unique ID for measuring tunneled network status requests. */
uint64_t dirreq_id;
- struct circuit_t *next; /**< Next circuit in linked list of all circuits. */
+ /** Next circuit in linked list of all circuits (global_circuitlist). */
+ TOR_LIST_ENTRY(circuit_t) head;
/** Next circuit in the doubly-linked ring of circuits waiting to add
* cells to n_conn. NULL if we have no cells pending, or if we're not
@@ -2850,6 +2878,11 @@ typedef struct circuit_t {
* cells to n_conn. NULL if we have no cells pending, or if we're not
* linked to an OR connection. */
struct circuit_t *prev_active_on_n_chan;
+
+ /** Various statistics about cells being added to or removed from this
+ * circuit's queues; used only if CELL_STATS events are enabled and
+ * cleared after being sent to control port. */
+ smartlist_t *testing_cell_stats;
} circuit_t;
/** Largest number of relay_early cells that we can send on a given
@@ -2911,6 +2944,7 @@ typedef enum {
*/
PATH_STATE_ALREADY_COUNTED = 6,
} path_state_t;
+#define path_state_bitfield_t ENUM_BF(path_state_t)
/** An origin_circuit_t holds data necessary to build and use a circuit.
*/
@@ -2920,6 +2954,17 @@ typedef struct origin_circuit_t {
/** Linked list of AP streams (or EXIT streams if hidden service)
* associated with this circuit. */
edge_connection_t *p_streams;
+
+ /** Bytes read from any attached stream since last call to
+ * control_event_circ_bandwidth_used(). Only used if we're configured
+ * to emit CIRC_BW events. */
+ uint32_t n_read_circ_bw;
+
+ /** Bytes written to any attached stream since last call to
+ * control_event_circ_bandwidth_used(). Only used if we're configured
+ * to emit CIRC_BW events. */
+ uint32_t n_written_circ_bw;
+
/** Build state for this circuit. It includes the intended path
* length, the chosen exit router, rendezvous information, etc.
*/
@@ -2950,7 +2995,7 @@ typedef struct origin_circuit_t {
* circuit building and usage accounting. See path_state_t
* for more details.
*/
- ENUM_BF(path_state_t) path_state : 3;
+ path_state_bitfield_t path_state : 3;
/* If this flag is set, we should not consider attaching any more
* connections to this circuit. */
@@ -3134,20 +3179,8 @@ typedef struct or_circuit_t {
* is not marked for close. */
struct or_circuit_t *rend_splice;
-#if REND_COOKIE_LEN >= DIGEST_LEN
-#define REND_TOKEN_LEN REND_COOKIE_LEN
-#else
-#define REND_TOKEN_LEN DIGEST_LEN
-#endif
+ struct or_circuit_rendinfo_s *rendinfo;
- /** A hash of location-hidden service's PK if purpose is INTRO_POINT, or a
- * rendezvous cookie if purpose is REND_POINT_WAITING. Filled with zeroes
- * otherwise.
- * ???? move to a subtype or adjunct structure? Wastes 20 bytes. -NM
- */
- char rend_token[REND_TOKEN_LEN];
-
- /* ???? move to a subtype or adjunct structure? Wastes 20 bytes -NM */
/** Stores KH for the handshake. */
char rend_circ_nonce[DIGEST_LEN];/* KH in tor-spec.txt */
@@ -3166,28 +3199,66 @@ typedef struct or_circuit_t {
* exit-ward queues of this circuit; reset every time when writing
* buffer stats to disk. */
uint64_t total_cell_waiting_time;
+
+ /** Maximum cell queue size for a middle relay; this is stored per circuit
+ * so append_cell_to_circuit_queue() can adjust it if it changes. If set
+ * to zero, it is initialized to the default value.
+ */
+ uint32_t max_middle_cells;
} or_circuit_t;
+typedef struct or_circuit_rendinfo_s {
+
+#if REND_COOKIE_LEN != DIGEST_LEN
+#error "The REND_TOKEN_LEN macro assumes REND_COOKIE_LEN == DIGEST_LEN"
+#endif
+#define REND_TOKEN_LEN DIGEST_LEN
+
+ /** A hash of location-hidden service's PK if purpose is INTRO_POINT, or a
+ * rendezvous cookie if purpose is REND_POINT_WAITING. Filled with zeroes
+ * otherwise.
+ */
+ char rend_token[REND_TOKEN_LEN];
+
+ /** True if this is a rendezvous point circuit; false if this is an
+ * introduction point. */
+ unsigned is_rend_circ;
+
+} or_circuit_rendinfo_t;
+
/** Convert a circuit subtype to a circuit_t. */
#define TO_CIRCUIT(x) (&((x)->base_))
/** Convert a circuit_t* to a pointer to the enclosing or_circuit_t. Assert
* if the cast is impossible. */
static or_circuit_t *TO_OR_CIRCUIT(circuit_t *);
+static const or_circuit_t *CONST_TO_OR_CIRCUIT(const circuit_t *);
/** Convert a circuit_t* to a pointer to the enclosing origin_circuit_t.
* Assert if the cast is impossible. */
static origin_circuit_t *TO_ORIGIN_CIRCUIT(circuit_t *);
+static const origin_circuit_t *CONST_TO_ORIGIN_CIRCUIT(const circuit_t *);
static INLINE or_circuit_t *TO_OR_CIRCUIT(circuit_t *x)
{
tor_assert(x->magic == OR_CIRCUIT_MAGIC);
return DOWNCAST(or_circuit_t, x);
}
+static INLINE const or_circuit_t *CONST_TO_OR_CIRCUIT(const circuit_t *x)
+{
+ tor_assert(x->magic == OR_CIRCUIT_MAGIC);
+ return DOWNCAST(or_circuit_t, x);
+}
static INLINE origin_circuit_t *TO_ORIGIN_CIRCUIT(circuit_t *x)
{
tor_assert(x->magic == ORIGIN_CIRCUIT_MAGIC);
return DOWNCAST(origin_circuit_t, x);
}
+static INLINE const origin_circuit_t *CONST_TO_ORIGIN_CIRCUIT(
+ const circuit_t *x)
+{
+ tor_assert(x->magic == ORIGIN_CIRCUIT_MAGIC);
+ return DOWNCAST(origin_circuit_t, x);
+}
/** Bitfield type: things that we're willing to use invalid routers for. */
typedef enum invalid_router_usage_t {
@@ -3324,9 +3395,9 @@ typedef struct {
/** What should the tor process actually do? */
enum {
CMD_RUN_TOR=0, CMD_LIST_FINGERPRINT, CMD_HASH_PASSWORD,
- CMD_VERIFY_CONFIG, CMD_RUN_UNITTESTS
+ CMD_VERIFY_CONFIG, CMD_RUN_UNITTESTS, CMD_DUMP_CONFIG
} command;
- const char *command_arg; /**< Argument for command-line option. */
+ char *command_arg; /**< Argument for command-line option. */
config_line_t *Logs; /**< New-style list of configuration lines
* for logs */
@@ -3407,10 +3478,21 @@ typedef struct {
char *User; /**< Name of user to run Tor as. */
char *Group; /**< Name of group to run Tor as. */
config_line_t *ORPort_lines; /**< Ports to listen on for OR connections. */
+ /** Ports to listen on for extended OR connections. */
+ config_line_t *ExtORPort_lines;
/** Ports to listen on for SOCKS connections. */
config_line_t *SocksPort_lines;
/** Ports to listen on for transparent pf/netfilter connections. */
config_line_t *TransPort_lines;
+ const char *TransProxyType; /**< What kind of transparent proxy
+ * implementation are we using? */
+ /** Parsed value of TransProxyType. */
+ enum {
+ TPT_DEFAULT,
+ TPT_PF_DIVERT,
+ TPT_IPFW,
+ TPT_TPROXY,
+ } TransProxyType_parsed;
config_line_t *NATDPort_lines; /**< Ports to listen on for transparent natd
* connections. */
config_line_t *ControlPort_lines; /**< Ports to listen on for control
@@ -3423,9 +3505,11 @@ typedef struct {
config_line_t *DirPort_lines;
config_line_t *DNSPort_lines; /**< Ports to listen on for DNS requests. */
- uint64_t MaxMemInCellQueues; /**< If we have more memory than this allocated
- * for circuit cell queues, run the OOM handler
- */
+ /* MaxMemInQueues value as input by the user. We clean this up to be
+ * MaxMemInQueues. */
+ uint64_t MaxMemInQueues_raw;
+ uint64_t MaxMemInQueues;/**< If we have more memory than this allocated
+ * for queues and buffers, run the OOM handler */
/** @name port booleans
*
@@ -3442,18 +3526,13 @@ typedef struct {
unsigned int ControlPort_set : 1;
unsigned int DirPort_set : 1;
unsigned int DNSPort_set : 1;
+ unsigned int ExtORPort_set : 1;
/**@}*/
int AssumeReachable; /**< Whether to publish our descriptor regardless. */
int AuthoritativeDir; /**< Boolean: is this an authoritative directory? */
- int V1AuthoritativeDir; /**< Boolean: is this an authoritative directory
- * for version 1 directories? */
- int V2AuthoritativeDir; /**< Boolean: is this an authoritative directory
- * for version 2 directories? */
int V3AuthoritativeDir; /**< Boolean: is this an authoritative directory
* for version 3 directories? */
- int HSAuthoritativeDir; /**< Boolean: does this an authoritative directory
- * handle hidden service requests? */
int NamingAuthoritativeDir; /**< Boolean: is this an authoritative directory
* that's willing to bind names? */
int VersioningAuthoritativeDir; /**< Boolean: is this an authoritative
@@ -3481,6 +3560,9 @@ typedef struct {
/** List of TCP/IP addresses that transports should listen at. */
config_line_t *ServerTransportListenAddr;
+ /** List of options that must be passed to pluggable transports. */
+ config_line_t *ServerTransportOptions;
+
int BridgeRelay; /**< Boolean: are we acting as a bridge relay? We make
* this explicit so we can change how we behave in the
* future. */
@@ -3501,8 +3583,6 @@ typedef struct {
int PublishHidServDescriptors;
int FetchServerDescriptors; /**< Do we fetch server descriptors as normal? */
int FetchHidServDescriptors; /**< and hidden service descriptors? */
- int FetchV2Networkstatus; /**< Do we fetch v2 networkstatus documents when
- * we don't need to? */
int HidServDirectoryV2; /**< Do we participate in the HS DHT? */
int VoteOnHidServDirectoriesV2; /**< As a directory authority, vote on
@@ -3593,6 +3673,10 @@ typedef struct {
* a new one? */
int MaxCircuitDirtiness; /**< Never use circs that were first used more than
this interval ago. */
+ int PredictedPortsRelevanceTime; /** How long after we've requested a
+ * connection for a given port, do we want
+ * to continue to pick exits that support
+ * that port? */
uint64_t BandwidthRate; /**< How much bandwidth, on average, are we willing
* to use in a second? */
uint64_t BandwidthBurst; /**< How much bandwidth, at maximum, are we willing
@@ -3656,9 +3740,6 @@ typedef struct {
/** If set, use these bridge authorities and not the default one. */
config_line_t *AlternateBridgeAuthority;
- /** If set, use these HS authorities and not the default ones. */
- config_line_t *AlternateHSAuthority;
-
char *MyFamily; /**< Declared family for this OR. */
config_line_t *NodeFamilies; /**< List of config lines for
* node families */
@@ -3718,7 +3799,10 @@ typedef struct {
int CookieAuthentication; /**< Boolean: do we enable cookie-based auth for
* the control system? */
- char *CookieAuthFile; /**< Location of a cookie authentication file. */
+ char *CookieAuthFile; /**< Filesystem location of a ControlPort
+ * authentication cookie. */
+ char *ExtORPortCookieAuthFile; /**< Filesystem location of Extended
+ * ORPort authentication cookie. */
int CookieAuthFileGroupReadable; /**< Boolean: Is the CookieAuthFile g+r? */
int LeaveStreamsUnattached; /**< Boolean: Does Tor attach new streams to
* circuits itself (0), or does it expect a controller
@@ -3740,6 +3824,7 @@ typedef struct {
SAFELOG_SCRUB_ALL, SAFELOG_SCRUB_RELAY, SAFELOG_SCRUB_NONE
} SafeLogging_;
+ int Sandbox; /**< Boolean: should sandboxing be enabled? */
int SafeSocks; /**< Boolean: should we outright refuse application
* connections that use socks4 or socks5-with-local-dns? */
#define LOG_PROTOCOL_WARN (get_options()->ProtocolWarnings ? \
@@ -3802,10 +3887,6 @@ typedef struct {
* testing our DNS server. */
int EnforceDistinctSubnets; /**< If true, don't allow multiple routers in the
* same network zone in the same circuit. */
- int TunnelDirConns; /**< If true, use BEGIN_DIR rather than BEGIN when
- * possible. */
- int PreferTunneledDirConns; /**< If true, avoid dirservers that don't
- * support BEGIN_DIR, when possible. */
int PortForwarding; /**< If true, use NAT-PMP or UPnP to automatically
* forward the DirPort and ORPort on the NAT device */
char *PortForwardingHelper; /** < Filename or full path of the port
@@ -3911,6 +3992,10 @@ typedef struct {
* signatures. Only altered on testing networks.*/
int TestingV3AuthInitialDistDelay;
+ /** Offset in seconds added to the starting time for consensus
+ voting. Only altered on testing networks. */
+ int TestingV3AuthVotingStartOffset;
+
/** If an authority has been around for less than this amount of time, it
* does not believe its reachability information is accurate. Only
* altered on testing networks. */
@@ -3921,6 +4006,51 @@ typedef struct {
* networks. */
int TestingEstimatedDescriptorPropagationTime;
+ /** Schedule for when servers should download things in general. Only
+ * altered on testing networks. */
+ smartlist_t *TestingServerDownloadSchedule;
+
+ /** Schedule for when clients should download things in general. Only
+ * altered on testing networks. */
+ smartlist_t *TestingClientDownloadSchedule;
+
+ /** Schedule for when servers should download consensuses. Only altered
+ * on testing networks. */
+ smartlist_t *TestingServerConsensusDownloadSchedule;
+
+ /** Schedule for when clients should download consensuses. Only altered
+ * on testing networks. */
+ smartlist_t *TestingClientConsensusDownloadSchedule;
+
+ /** Schedule for when clients should download bridge descriptors. Only
+ * altered on testing networks. */
+ smartlist_t *TestingBridgeDownloadSchedule;
+
+ /** When directory clients have only a few descriptors to request, they
+ * batch them until they have more, or until this amount of time has
+ * passed. Only altered on testing networks. */
+ int TestingClientMaxIntervalWithoutRequest;
+
+ /** How long do we let a directory connection stall before expiring
+ * it? Only altered on testing networks. */
+ int TestingDirConnectionMaxStall;
+
+ /** How many times will we try to fetch a consensus before we give
+ * up? Only altered on testing networks. */
+ int TestingConsensusMaxDownloadTries;
+
+ /** How many times will we try to download a router's descriptor before
+ * giving up? Only altered on testing networks. */
+ int TestingDescriptorMaxDownloadTries;
+
+ /** How many times will we try to download a microdescriptor before
+ * giving up? Only altered on testing networks. */
+ int TestingMicrodescMaxDownloadTries;
+
+ /** How many times will we try to fetch a certificate before giving
+ * up? Only altered on testing networks. */
+ int TestingCertMaxDownloadTries;
+
/** If true, we take part in a testing network. Change the defaults of a
* couple of other configuration options and allow to change the values
* of certain configuration options. */
@@ -3932,6 +4062,19 @@ typedef struct {
/** Minimum value for the Fast flag threshold on testing networks. */
uint64_t TestingMinFastFlagThreshold;
+ /** Relays in a testing network which should be voted Guard
+ * regardless of uptime and bandwidth. */
+ routerset_t *TestingDirAuthVoteGuard;
+
+ /** Enable CONN_BW events. Only altered on testing networks. */
+ int TestingEnableConnBwEvent;
+
+ /** Enable CELL_STATS events. Only altered on testing networks. */
+ int TestingEnableCellStatsEvent;
+
+ /** Enable TB_EMPTY events. Only altered on testing networks. */
+ int TestingEnableTbEmptyEvent;
+
/** If true, and we have GeoIP data, and we're a bridge, keep a per-country
* count of how many client addresses have contacted us so that we can help
* the bridge authority guess which countries have blocked access to us. */
@@ -4070,16 +4213,6 @@ typedef struct {
/** Fraction: */
double PathsNeededToBuildCircuits;
- /** Do we serve v2 directory info at all? This is a temporary option, since
- * we'd like to disable v2 directory serving entirely, but we need a way to
- * make it temporarily disableable, in order to do fast testing and be
- * able to turn it back on if it turns out to be non-workable.
- *
- * XXXX025 Make this always-on, or always-off. Right now, it's only
- * enableable for authorities.
- */
- int DisableV2DirectoryInfo_;
-
/** What expiry time shall we place on our SSL certs? "0" means we
* should guess a suitable value. */
int SSLKeyLifetime;
@@ -4344,30 +4477,7 @@ typedef struct {
int after_firsthop_idx;
} network_liveness_t;
-/** Structure for circuit build times history */
-typedef struct {
- /** The circular array of recorded build times in milliseconds */
- build_time_t circuit_build_times[CBT_NCIRCUITS_TO_OBSERVE];
- /** Current index in the circuit_build_times circular array */
- int build_times_idx;
- /** Total number of build times accumulated. Max CBT_NCIRCUITS_TO_OBSERVE */
- int total_build_times;
- /** Information about the state of our local network connection */
- network_liveness_t liveness;
- /** Last time we built a circuit. Used to decide to build new test circs */
- time_t last_circ_at;
- /** "Minimum" value of our pareto distribution (actually mode) */
- build_time_t Xm;
- /** alpha exponent for pareto dist. */
- double alpha;
- /** Have we computed a timeout? */
- int have_computed_timeout;
- /** The exact value for that timeout in milliseconds. Stored as a double
- * to maintain precision from calculations to and from quantile value. */
- double timeout_ms;
- /** How long we wait before actually closing the circuit. */
- double close_ms;
-} circuit_build_times_t;
+typedef struct circuit_build_times_s circuit_build_times_t;
/********************************* config.c ***************************/
@@ -4404,6 +4514,7 @@ typedef enum {
* did this remapping happen." */
ADDRMAPSRC_NONE
} addressmap_entry_source_t;
+#define addressmap_entry_source_bitfield_t ENUM_BF(addressmap_entry_source_t)
/********************************* control.c ***************************/
@@ -4555,8 +4666,6 @@ typedef enum {
GEOIP_CLIENT_CONNECT = 0,
/** We've served a networkstatus consensus as a directory server. */
GEOIP_CLIENT_NETWORKSTATUS = 1,
- /** We've served a v2 networkstatus consensus as a directory server. */
- GEOIP_CLIENT_NETWORKSTATUS_V2 = 2,
} geoip_client_action_t;
/** Indicates either a positive reply or a reason for rejectng a network
* status request that will be included in geoip statistics. */
@@ -4614,11 +4723,6 @@ typedef struct microdesc_cache_t microdesc_cache_t;
/********************************* networkstatus.c *********************/
-/** Location where we found a v2 networkstatus. */
-typedef enum {
- NS_FROM_CACHE, NS_FROM_DIR_BY_FP, NS_FROM_DIR_ALL, NS_GENERATED
-} v2_networkstatus_source_t;
-
/** Possible statuses of a version of Tor, given opinions from the directory
* servers. */
typedef enum version_status_t {
@@ -4769,9 +4873,9 @@ typedef struct rend_service_descriptor_t {
crypto_pk_t *pk; /**< This service's public key. */
int version; /**< Version of the descriptor format: 0 or 2. */
time_t timestamp; /**< Time when the descriptor was generated. */
- /** Bitmask: which rendezvous protocols are supported?
- * (We allow bits '0', '1', and '2' to be set.) */
- int protocols : REND_PROTOCOL_VERSION_BITMASK_WIDTH;
+ /** Bitmask: which introduce/rendezvous protocols are supported?
+ * (We allow bits '0', '1', '2' and '3' to be set.) */
+ unsigned protocols : REND_PROTOCOL_VERSION_BITMASK_WIDTH;
/** List of the service's introduction points. Elements are removed if
* introduction attempts fail. */
smartlist_t *intro_nodes;
@@ -4819,8 +4923,6 @@ typedef struct dir_server_t {
/** What kind of authority is this? (Bitfield.) */
dirinfo_type_t type;
- download_status_t v2_ns_dl_status; /**< Status of downloading this server's
- * v2 network status. */
time_t addr_current_at; /**< When was the document that we derived the
* address information from published? */
@@ -4869,8 +4971,6 @@ typedef struct dir_server_t {
* node that's currently a guard. */
#define PDS_FOR_GUARD (1<<5)
-#define PDS_PREFER_TUNNELED_DIR_CONNS_ (1<<16)
-
/** Possible ways to weight routers when choosing one randomly. See
* routerlist_sl_choose_by_bandwidth() for more information.*/
typedef enum bandwidth_weight_rule_t {
diff --git a/src/or/policies.c b/src/or/policies.c
index be4da5506..8a91509a7 100644
--- a/src/or/policies.c
+++ b/src/or/policies.c
@@ -13,6 +13,7 @@
#include "dirserv.h"
#include "nodelist.h"
#include "policies.h"
+#include "router.h"
#include "routerparse.h"
#include "geoip.h"
#include "ht.h"
@@ -438,7 +439,7 @@ validate_addr_policies(const or_options_t *options, char **msg)
if (policies_parse_exit_policy(options->ExitPolicy, &addr_policy,
options->IPv6Exit,
- options->ExitPolicyRejectPrivate, NULL,
+ options->ExitPolicyRejectPrivate, 0,
!options->BridgeRelay))
REJECT("Error in ExitPolicy entry.");
@@ -482,10 +483,12 @@ validate_addr_policies(const or_options_t *options, char **msg)
* Ignore port specifiers.
*/
static int
-load_policy_from_option(config_line_t *config, smartlist_t **policy,
+load_policy_from_option(config_line_t *config, const char *option_name,
+ smartlist_t **policy,
int assume_action)
{
int r;
+ int killed_any_ports = 0;
addr_policy_list_free(*policy);
*policy = NULL;
r = parse_addr_policy(config, policy, assume_action);
@@ -504,9 +507,13 @@ load_policy_from_option(config_line_t *config, smartlist_t **policy,
c = addr_policy_get_canonical_entry(&newp);
SMARTLIST_REPLACE_CURRENT(*policy, n, c);
addr_policy_free(n);
+ killed_any_ports = 1;
}
} SMARTLIST_FOREACH_END(n);
}
+ if (killed_any_ports) {
+ log_warn(LD_CONFIG, "Ignoring ports in %s option.", option_name);
+ }
return 0;
}
@@ -516,20 +523,22 @@ int
policies_parse_from_options(const or_options_t *options)
{
int ret = 0;
- if (load_policy_from_option(options->SocksPolicy, &socks_policy, -1) < 0)
+ if (load_policy_from_option(options->SocksPolicy, "SocksPolicy",
+ &socks_policy, -1) < 0)
ret = -1;
- if (load_policy_from_option(options->DirPolicy, &dir_policy, -1) < 0)
+ if (load_policy_from_option(options->DirPolicy, "DirPolicy",
+ &dir_policy, -1) < 0)
ret = -1;
- if (load_policy_from_option(options->AuthDirReject,
+ if (load_policy_from_option(options->AuthDirReject, "AuthDirReject",
&authdir_reject_policy, ADDR_POLICY_REJECT) < 0)
ret = -1;
- if (load_policy_from_option(options->AuthDirInvalid,
+ if (load_policy_from_option(options->AuthDirInvalid, "AuthDirInvalid",
&authdir_invalid_policy, ADDR_POLICY_REJECT) < 0)
ret = -1;
- if (load_policy_from_option(options->AuthDirBadDir,
+ if (load_policy_from_option(options->AuthDirBadDir, "AuthDirBadDir",
&authdir_baddir_policy, ADDR_POLICY_REJECT) < 0)
ret = -1;
- if (load_policy_from_option(options->AuthDirBadExit,
+ if (load_policy_from_option(options->AuthDirBadExit, "AuthDirBadExit",
&authdir_badexit_policy, ADDR_POLICY_REJECT) < 0)
ret = -1;
if (parse_reachable_addresses() < 0)
@@ -597,21 +606,25 @@ policy_eq(policy_map_ent_t *a, policy_map_ent_t *b)
/** Return a hashcode for <b>ent</b> */
static unsigned int
-policy_hash(policy_map_ent_t *ent)
+policy_hash(const policy_map_ent_t *ent)
{
- addr_policy_t *a = ent->policy;
- unsigned int r;
- if (a->is_private)
- r = 0x1234abcd;
- else
- r = tor_addr_hash(&a->addr);
- r += a->prt_min << 8;
- r += a->prt_max << 16;
- r += a->maskbits;
- if (a->policy_type == ADDR_POLICY_REJECT)
- r ^= 0xffffffff;
+ const addr_policy_t *a = ent->policy;
+ addr_policy_t aa;
+ memset(&aa, 0, sizeof(aa));
+
+ aa.prt_min = a->prt_min;
+ aa.prt_max = a->prt_max;
+ aa.maskbits = a->maskbits;
+ aa.policy_type = a->policy_type;
+ aa.is_private = a->is_private;
+
+ if (a->is_private) {
+ aa.is_private = 1;
+ } else {
+ tor_addr_copy_tight(&aa.addr, &a->addr);
+ }
- return r;
+ return (unsigned) siphash24g(&aa, sizeof(aa));
}
HT_PROTOTYPE(policy_map, policy_map_ent_t, node, policy_hash,
@@ -958,7 +971,7 @@ exit_policy_remove_redundancies(smartlist_t *dest)
int
policies_parse_exit_policy(config_line_t *cfg, smartlist_t **dest,
int ipv6_exit,
- int rejectprivate, const char *local_address,
+ int rejectprivate, uint32_t local_address,
int add_default_policy)
{
if (!ipv6_exit) {
@@ -968,7 +981,7 @@ policies_parse_exit_policy(config_line_t *cfg, smartlist_t **dest,
append_exit_policy_string(dest, "reject private:*");
if (local_address) {
char buf[POLICY_BUF_LEN];
- tor_snprintf(buf, sizeof(buf), "reject %s:*", local_address);
+ tor_snprintf(buf, sizeof(buf), "reject %s:*", fmt_addr32(local_address));
append_exit_policy_string(dest, buf);
}
}
@@ -1680,6 +1693,28 @@ getinfo_helper_policies(control_connection_t *conn,
(void) errmsg;
if (!strcmp(question, "exit-policy/default")) {
*answer = tor_strdup(DEFAULT_EXIT_POLICY);
+ } else if (!strcmpstart(question, "exit-policy/")) {
+ const routerinfo_t *me = router_get_my_routerinfo();
+
+ int include_ipv4 = 0;
+ int include_ipv6 = 0;
+
+ if (!strcmp(question, "exit-policy/ipv4")) {
+ include_ipv4 = 1;
+ } else if (!strcmp(question, "exit-policy/ipv6")) {
+ include_ipv6 = 1;
+ } else if (!strcmp(question, "exit-policy/full")) {
+ include_ipv4 = include_ipv6 = 1;
+ } else {
+ return 0; /* No such key. */
+ }
+
+ if (!me) {
+ *errmsg = "router_get_my_routerinfo returned NULL";
+ return -1;
+ }
+
+ *answer = router_dump_exit_policy_to_string(me,include_ipv4,include_ipv6);
}
return 0;
}
diff --git a/src/or/policies.h b/src/or/policies.h
index facbbb6b5..91ac42749 100644
--- a/src/or/policies.h
+++ b/src/or/policies.h
@@ -45,7 +45,7 @@ addr_policy_result_t compare_tor_addr_to_node_policy(const tor_addr_t *addr,
int policies_parse_exit_policy(config_line_t *cfg, smartlist_t **dest,
int ipv6exit,
- int rejectprivate, const char *local_address,
+ int rejectprivate, uint32_t local_address,
int add_default_policy);
void policies_exit_policy_append_reject_star(smartlist_t **dest);
void addr_policy_append_reject_addr(smartlist_t **dest,
diff --git a/src/or/reasons.c b/src/or/reasons.c
index 0674474e7..750e89bbe 100644
--- a/src/or/reasons.c
+++ b/src/or/reasons.c
@@ -231,6 +231,8 @@ orconn_end_reason_to_control_string(int r)
return "RESOURCELIMIT";
case END_OR_CONN_REASON_MISC:
return "MISC";
+ case END_OR_CONN_REASON_PT_MISSING:
+ return "PT_MISSING";
case 0:
return "";
default:
diff --git a/src/or/relay.c b/src/or/relay.c
index 7f06c6e14..66d1251eb 100644
--- a/src/or/relay.c
+++ b/src/or/relay.c
@@ -15,6 +15,7 @@
#include "addressmap.h"
#include "buffers.h"
#include "channel.h"
+#include "circpathbias.h"
#include "circuitbuild.h"
#include "circuitlist.h"
#include "circuituse.h"
@@ -25,7 +26,9 @@
#include "control.h"
#include "geoip.h"
#include "main.h"
+#ifdef ENABLE_MEMPOOLS
#include "mempool.h"
+#endif
#include "networkstatus.h"
#include "nodelist.h"
#include "onion.h"
@@ -58,6 +61,9 @@ static void adjust_exit_policy_from_exitpolicy_failure(origin_circuit_t *circ,
entry_connection_t *conn,
node_t *node,
const tor_addr_t *addr);
+#if 0
+static int get_max_middle_cells(void);
+#endif
/** Stop reading on edge connections when we have this many cells
* waiting on the appropriate queue. */
@@ -105,14 +111,14 @@ relay_set_digest(crypto_digest_t *digest, cell_t *cell)
static int
relay_digest_matches(crypto_digest_t *digest, cell_t *cell)
{
- char received_integrity[4], calculated_integrity[4];
+ uint32_t received_integrity, calculated_integrity;
relay_header_t rh;
crypto_digest_t *backup_digest=NULL;
backup_digest = crypto_digest_dup(digest);
relay_header_unpack(&rh, cell->payload);
- memcpy(received_integrity, rh.integrity, 4);
+ memcpy(&received_integrity, rh.integrity, 4);
memset(rh.integrity, 0, 4);
relay_header_pack(cell->payload, &rh);
@@ -121,15 +127,15 @@ relay_digest_matches(crypto_digest_t *digest, cell_t *cell)
// received_integrity[2], received_integrity[3]);
crypto_digest_add_bytes(digest, (char*) cell->payload, CELL_PAYLOAD_SIZE);
- crypto_digest_get_digest(digest, calculated_integrity, 4);
+ crypto_digest_get_digest(digest, (char*) &calculated_integrity, 4);
- if (tor_memneq(received_integrity, calculated_integrity, 4)) {
+ if (calculated_integrity != received_integrity) {
// log_fn(LOG_INFO,"Recognized=0 but bad digest. Not recognizing.");
// (%d vs %d).", received_integrity, calculated_integrity);
/* restore digest to its old form */
crypto_digest_assign(digest, backup_digest);
/* restore the relay header */
- memcpy(rh.integrity, received_integrity, 4);
+ memcpy(rh.integrity, &received_integrity, 4);
relay_header_pack(cell->payload, &rh);
crypto_digest_free(backup_digest);
return 0;
@@ -968,7 +974,7 @@ remap_event_helper(entry_connection_t *conn, const tor_addr_t *new_addr)
* <b>addr_out</b> to the address we're connected to, and <b>ttl_out</b> to
* the ttl of that address, in seconds, and return 0. On failure, return
* -1. */
-int
+STATIC int
connected_cell_parse(const relay_header_t *rh, const cell_t *cell,
tor_addr_t *addr_out, int *ttl_out)
{
@@ -1005,6 +1011,254 @@ connected_cell_parse(const relay_header_t *rh, const cell_t *cell,
return 0;
}
+/** Drop all storage held by <b>addr</b>. */
+STATIC void
+address_ttl_free(address_ttl_t *addr)
+{
+ if (!addr)
+ return;
+ tor_free(addr->hostname);
+ tor_free(addr);
+}
+
+/** Parse a resolved cell in <b>cell</b>, with parsed header in <b>rh</b>.
+ * Return -1 on parse error. On success, add one or more newly allocated
+ * address_ttl_t to <b>addresses_out</b>; set *<b>errcode_out</b> to
+ * one of 0, RESOLVED_TYPE_ERROR, or RESOLVED_TYPE_ERROR_TRANSIENT, and
+ * return 0. */
+STATIC int
+resolved_cell_parse(const cell_t *cell, const relay_header_t *rh,
+ smartlist_t *addresses_out, int *errcode_out)
+{
+ const uint8_t *cp;
+ uint8_t answer_type;
+ size_t answer_len;
+ address_ttl_t *addr;
+ size_t remaining;
+ int errcode = 0;
+ smartlist_t *addrs;
+
+ tor_assert(cell);
+ tor_assert(rh);
+ tor_assert(addresses_out);
+ tor_assert(errcode_out);
+
+ *errcode_out = 0;
+
+ if (rh->length > RELAY_PAYLOAD_SIZE)
+ return -1;
+
+ addrs = smartlist_new();
+
+ cp = cell->payload + RELAY_HEADER_SIZE;
+
+ remaining = rh->length;
+ while (remaining) {
+ const uint8_t *cp_orig = cp;
+ if (remaining < 2)
+ goto err;
+ answer_type = *cp++;
+ answer_len = *cp++;
+ if (remaining < 2 + answer_len + 4) {
+ goto err;
+ }
+ if (answer_type == RESOLVED_TYPE_IPV4) {
+ if (answer_len != 4) {
+ goto err;
+ }
+ addr = tor_malloc_zero(sizeof(*addr));
+ tor_addr_from_ipv4n(&addr->addr, get_uint32(cp));
+ cp += 4;
+ addr->ttl = ntohl(get_uint32(cp));
+ cp += 4;
+ smartlist_add(addrs, addr);
+ } else if (answer_type == RESOLVED_TYPE_IPV6) {
+ if (answer_len != 16)
+ goto err;
+ addr = tor_malloc_zero(sizeof(*addr));
+ tor_addr_from_ipv6_bytes(&addr->addr, (const char*) cp);
+ cp += 16;
+ addr->ttl = ntohl(get_uint32(cp));
+ cp += 4;
+ smartlist_add(addrs, addr);
+ } else if (answer_type == RESOLVED_TYPE_HOSTNAME) {
+ if (answer_len == 0) {
+ goto err;
+ }
+ addr = tor_malloc_zero(sizeof(*addr));
+ addr->hostname = tor_memdup_nulterm(cp, answer_len);
+ cp += answer_len;
+ addr->ttl = ntohl(get_uint32(cp));
+ cp += 4;
+ smartlist_add(addrs, addr);
+ } else if (answer_type == RESOLVED_TYPE_ERROR_TRANSIENT ||
+ answer_type == RESOLVED_TYPE_ERROR) {
+ errcode = answer_type;
+ /* Ignore the error contents */
+ cp += answer_len + 4;
+ } else {
+ cp += answer_len + 4;
+ }
+ tor_assert(((ssize_t)remaining) >= (cp - cp_orig));
+ remaining -= (cp - cp_orig);
+ }
+
+ if (errcode && smartlist_len(addrs) == 0) {
+ /* Report an error only if there were no results. */
+ *errcode_out = errcode;
+ }
+
+ smartlist_add_all(addresses_out, addrs);
+ smartlist_free(addrs);
+
+ return 0;
+
+ err:
+ /* On parse error, don't report any results */
+ SMARTLIST_FOREACH(addrs, address_ttl_t *, a, address_ttl_free(a));
+ smartlist_free(addrs);
+ return -1;
+}
+
+/** Helper for connection_edge_process_resolved_cell: given an error code,
+ * an entry_connection, and a list of address_ttl_t *, report the best answer
+ * to the entry_connection. */
+static void
+connection_ap_handshake_socks_got_resolved_cell(entry_connection_t *conn,
+ int error_code,
+ smartlist_t *results)
+{
+ address_ttl_t *addr_ipv4 = NULL;
+ address_ttl_t *addr_ipv6 = NULL;
+ address_ttl_t *addr_hostname = NULL;
+ address_ttl_t *addr_best = NULL;
+
+ /* If it's an error code, that's easy. */
+ if (error_code) {
+ tor_assert(error_code == RESOLVED_TYPE_ERROR ||
+ error_code == RESOLVED_TYPE_ERROR_TRANSIENT);
+ connection_ap_handshake_socks_resolved(conn,
+ error_code,0,NULL,-1,-1);
+ return;
+ }
+
+ /* Get the first answer of each type. */
+ SMARTLIST_FOREACH_BEGIN(results, address_ttl_t *, addr) {
+ if (addr->hostname) {
+ if (!addr_hostname) {
+ addr_hostname = addr;
+ }
+ } else if (tor_addr_family(&addr->addr) == AF_INET) {
+ if (!addr_ipv4 && conn->ipv4_traffic_ok) {
+ addr_ipv4 = addr;
+ }
+ } else if (tor_addr_family(&addr->addr) == AF_INET6) {
+ if (!addr_ipv6 && conn->ipv6_traffic_ok) {
+ addr_ipv6 = addr;
+ }
+ }
+ } SMARTLIST_FOREACH_END(addr);
+
+ /* Now figure out which type we wanted to deliver. */
+ if (conn->socks_request->command == SOCKS_COMMAND_RESOLVE_PTR) {
+ if (addr_hostname) {
+ connection_ap_handshake_socks_resolved(conn,
+ RESOLVED_TYPE_HOSTNAME,
+ strlen(addr_hostname->hostname),
+ (uint8_t*)addr_hostname->hostname,
+ addr_hostname->ttl,-1);
+ } else {
+ connection_ap_handshake_socks_resolved(conn,
+ RESOLVED_TYPE_ERROR,0,NULL,-1,-1);
+ }
+ return;
+ }
+
+ if (conn->prefer_ipv6_traffic) {
+ addr_best = addr_ipv6 ? addr_ipv6 : addr_ipv4;
+ } else {
+ addr_best = addr_ipv4 ? addr_ipv4 : addr_ipv6;
+ }
+
+ /* Now convert it to the ugly old interface */
+ if (! addr_best) {
+ connection_ap_handshake_socks_resolved(conn,
+ RESOLVED_TYPE_ERROR,0,NULL,-1,-1);
+ return;
+ }
+
+ connection_ap_handshake_socks_resolved_addr(conn,
+ &addr_best->addr,
+ addr_best->ttl,
+ -1);
+
+ remap_event_helper(conn, &addr_best->addr);
+}
+
+/** Handle a RELAY_COMMAND_RESOLVED cell that we received on a non-open AP
+ * stream. */
+STATIC int
+connection_edge_process_resolved_cell(edge_connection_t *conn,
+ const cell_t *cell,
+ const relay_header_t *rh)
+{
+ entry_connection_t *entry_conn = EDGE_TO_ENTRY_CONN(conn);
+ smartlist_t *resolved_addresses = NULL;
+ int errcode = 0;
+
+ if (conn->base_.state != AP_CONN_STATE_RESOLVE_WAIT) {
+ log_fn(LOG_PROTOCOL_WARN, LD_APP, "Got a 'resolved' cell while "
+ "not in state resolve_wait. Dropping.");
+ return 0;
+ }
+ tor_assert(SOCKS_COMMAND_IS_RESOLVE(entry_conn->socks_request->command));
+
+ resolved_addresses = smartlist_new();
+ if (resolved_cell_parse(cell, rh, resolved_addresses, &errcode)) {
+ log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
+ "Dropping malformed 'resolved' cell");
+ connection_mark_unattached_ap(entry_conn, END_STREAM_REASON_TORPROTOCOL);
+ goto done;
+ }
+
+ if (get_options()->ClientDNSRejectInternalAddresses) {
+ int orig_len = smartlist_len(resolved_addresses);
+ SMARTLIST_FOREACH_BEGIN(resolved_addresses, address_ttl_t *, addr) {
+ if (addr->hostname == NULL && tor_addr_is_internal(&addr->addr, 0)) {
+ log_info(LD_APP, "Got a resolved cell with answer %s; dropping that "
+ "answer.",
+ safe_str_client(fmt_addr(&addr->addr)));
+ address_ttl_free(addr);
+ SMARTLIST_DEL_CURRENT(resolved_addresses, addr);
+ }
+ } SMARTLIST_FOREACH_END(addr);
+ if (orig_len && smartlist_len(resolved_addresses) == 0) {
+ log_info(LD_APP, "Got a resolved cell with only private addresses; "
+ "dropping it.");
+ connection_ap_handshake_socks_resolved(entry_conn,
+ RESOLVED_TYPE_ERROR_TRANSIENT,
+ 0, NULL, 0, TIME_MAX);
+ connection_mark_unattached_ap(entry_conn,
+ END_STREAM_REASON_TORPROTOCOL);
+ goto done;
+ }
+ }
+
+ connection_ap_handshake_socks_got_resolved_cell(entry_conn,
+ errcode,
+ resolved_addresses);
+
+ connection_mark_unattached_ap(entry_conn,
+ END_STREAM_REASON_DONE |
+ END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED);
+
+ done:
+ SMARTLIST_FOREACH(resolved_addresses, address_ttl_t *, addr,
+ address_ttl_free(addr));
+ smartlist_free(resolved_addresses);
+ return 0;
+}
+
/** An incoming relay cell has arrived from circuit <b>circ</b> to
* stream <b>conn</b>.
*
@@ -1106,8 +1360,9 @@ connection_edge_process_relay_cell_not_open(
break;
case DIR_PURPOSE_FETCH_SERVERDESC:
case DIR_PURPOSE_FETCH_MICRODESC:
- control_event_bootstrap(BOOTSTRAP_STATUS_LOADING_DESCRIPTORS,
- count_loading_descriptors_progress());
+ if (TO_DIR_CONN(dirconn)->router_purpose == ROUTER_PURPOSE_GENERAL)
+ control_event_bootstrap(BOOTSTRAP_STATUS_LOADING_DESCRIPTORS,
+ count_loading_descriptors_progress());
break;
}
}
@@ -1128,67 +1383,7 @@ connection_edge_process_relay_cell_not_open(
}
if (conn->base_.type == CONN_TYPE_AP &&
rh->command == RELAY_COMMAND_RESOLVED) {
- int ttl;
- int answer_len;
- uint8_t answer_type;
- entry_connection_t *entry_conn = EDGE_TO_ENTRY_CONN(conn);
- if (conn->base_.state != AP_CONN_STATE_RESOLVE_WAIT) {
- log_fn(LOG_PROTOCOL_WARN, LD_APP, "Got a 'resolved' cell while "
- "not in state resolve_wait. Dropping.");
- return 0;
- }
- tor_assert(SOCKS_COMMAND_IS_RESOLVE(entry_conn->socks_request->command));
- answer_len = cell->payload[RELAY_HEADER_SIZE+1];
- if (rh->length < 2 || answer_len+2>rh->length) {
- log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
- "Dropping malformed 'resolved' cell");
- connection_mark_unattached_ap(entry_conn, END_STREAM_REASON_TORPROTOCOL);
- return 0;
- }
- answer_type = cell->payload[RELAY_HEADER_SIZE];
- if (rh->length >= answer_len+6)
- ttl = (int)ntohl(get_uint32(cell->payload+RELAY_HEADER_SIZE+
- 2+answer_len));
- else
- ttl = -1;
- if (answer_type == RESOLVED_TYPE_IPV4 ||
- answer_type == RESOLVED_TYPE_IPV6) {
- tor_addr_t addr;
- if (decode_address_from_payload(&addr, cell->payload+RELAY_HEADER_SIZE,
- rh->length) &&
- tor_addr_is_internal(&addr, 0) &&
- get_options()->ClientDNSRejectInternalAddresses) {
- log_info(LD_APP,"Got a resolve with answer %s. Rejecting.",
- fmt_addr(&addr));
- connection_ap_handshake_socks_resolved(entry_conn,
- RESOLVED_TYPE_ERROR_TRANSIENT,
- 0, NULL, 0, TIME_MAX);
- connection_mark_unattached_ap(entry_conn,
- END_STREAM_REASON_TORPROTOCOL);
- return 0;
- }
- }
- connection_ap_handshake_socks_resolved(entry_conn,
- answer_type,
- cell->payload[RELAY_HEADER_SIZE+1], /*answer_len*/
- cell->payload+RELAY_HEADER_SIZE+2, /*answer*/
- ttl,
- -1);
- if (answer_type == RESOLVED_TYPE_IPV4 && answer_len == 4) {
- tor_addr_t addr;
- tor_addr_from_ipv4n(&addr,
- get_uint32(cell->payload+RELAY_HEADER_SIZE+2));
- remap_event_helper(entry_conn, &addr);
- } else if (answer_type == RESOLVED_TYPE_IPV6 && answer_len == 16) {
- tor_addr_t addr;
- tor_addr_from_ipv6_bytes(&addr,
- (char*)(cell->payload+RELAY_HEADER_SIZE+2));
- remap_event_helper(entry_conn, &addr);
- }
- connection_mark_unattached_ap(entry_conn,
- END_STREAM_REASON_DONE |
- END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED);
- return 0;
+ return connection_edge_process_resolved_cell(conn, cell, rh);
}
log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
@@ -1242,7 +1437,6 @@ connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ,
switch (rh.command) {
case RELAY_COMMAND_BEGIN:
case RELAY_COMMAND_CONNECTED:
- case RELAY_COMMAND_DATA:
case RELAY_COMMAND_END:
case RELAY_COMMAND_RESOLVE:
case RELAY_COMMAND_RESOLVED:
@@ -1267,6 +1461,9 @@ connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ,
* EXIT_CONN_STATE_CONNECTING or EXIT_CONN_STATE_RESOLVING.
* This speeds up HTTP, for example. */
optimistic_data = 1;
+ } else if (rh.stream_id == 0 && rh.command == RELAY_COMMAND_DATA) {
+ log_warn(LD_BUG, "Somehow I had a connection that matched a "
+ "data cell with stream ID 0.");
} else {
return connection_edge_process_relay_cell_not_open(
&rh, cell, circ, conn, layer_hint);
@@ -1327,7 +1524,11 @@ connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ,
circuit_consider_sending_sendme(circ, layer_hint);
- if (!conn) {
+ if (rh.stream_id == 0) {
+ log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, "Relay data cell with zero "
+ "stream_id. Dropping.");
+ return 0;
+ } else if (!conn) {
log_info(domain,"data cell dropped, unknown stream (streamid %d).",
rh.stream_id);
return 0;
@@ -1497,7 +1698,8 @@ connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ,
if (layer_hint) {
if (layer_hint->package_window + CIRCWINDOW_INCREMENT >
CIRCWINDOW_START_MAX) {
- log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
+ static struct ratelim_t exit_warn_ratelim = RATELIM_INIT(600);
+ log_fn_ratelim(&exit_warn_ratelim, LOG_WARN, LD_PROTOCOL,
"Unexpected sendme cell from exit relay. "
"Closing circ.");
return -END_CIRC_REASON_TORPROTOCOL;
@@ -1509,7 +1711,8 @@ connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ,
} else {
if (circ->package_window + CIRCWINDOW_INCREMENT >
CIRCWINDOW_START_MAX) {
- log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
+ static struct ratelim_t client_warn_ratelim = RATELIM_INIT(600);
+ log_fn_ratelim(&client_warn_ratelim, LOG_WARN, LD_PROTOCOL,
"Unexpected sendme cell from client. "
"Closing circ (window %d).",
circ->package_window);
@@ -2036,9 +2239,10 @@ circuit_consider_sending_sendme(circuit_t *circ, crypt_path_t *layer_hint)
#define assert_cmux_ok_paranoid(chan)
#endif
-/** The total number of cells we have allocated from the memory pool. */
+/** The total number of cells we have allocated. */
static size_t total_cells_allocated = 0;
+#ifdef ENABLE_MEMPOOLS
/** A memory pool to allocate packed_cell_t objects. */
static mp_pool_t *cell_pool = NULL;
@@ -2050,8 +2254,8 @@ init_cell_pool(void)
cell_pool = mp_pool_new(sizeof(packed_cell_t), 128*1024);
}
-/** Free all storage used to hold cells (and insertion times if we measure
- * cell statistics). */
+/** Free all storage used to hold cells (and insertion times/commands if we
+ * measure cell statistics and/or if CELL_STATS events are enabled). */
void
free_cell_pool(void)
{
@@ -2070,26 +2274,46 @@ clean_cell_pool(void)
mp_pool_clean(cell_pool, 0, 1);
}
+#define relay_alloc_cell() \
+ mp_pool_get(cell_pool)
+#define relay_free_cell(cell) \
+ mp_pool_release(cell)
+
+#define RELAY_CELL_MEM_COST (sizeof(packed_cell_t) + MP_POOL_ITEM_OVERHEAD)
+
+#else /* !ENABLE_MEMPOOLS case */
+
+#define relay_alloc_cell() \
+ tor_malloc_zero(sizeof(packed_cell_t))
+#define relay_free_cell(cell) \
+ tor_free(cell)
+
+#define RELAY_CELL_MEM_COST (sizeof(packed_cell_t))
+
+#endif /* ENABLE_MEMPOOLS */
+
/** Release storage held by <b>cell</b>. */
static INLINE void
packed_cell_free_unchecked(packed_cell_t *cell)
{
--total_cells_allocated;
- mp_pool_release(cell);
+ relay_free_cell(cell);
}
/** Allocate and return a new packed_cell_t. */
-static INLINE packed_cell_t *
+STATIC packed_cell_t *
packed_cell_new(void)
{
++total_cells_allocated;
- return mp_pool_get(cell_pool);
+ return relay_alloc_cell();
}
/** Return a packed cell used outside by channel_t lower layer */
void
packed_cell_free(packed_cell_t *cell)
{
+ if (!cell)
+ return;
packed_cell_free_unchecked(cell);
}
@@ -2101,7 +2325,7 @@ dump_cell_pool_usage(int severity)
circuit_t *c;
int n_circs = 0;
int n_cells = 0;
- for (c = circuit_get_global_list_(); c; c = c->next) {
+ TOR_LIST_FOREACH(c, circuit_get_global_list(), head) {
n_cells += c->n_chan_cells.n;
if (!CIRCUIT_IS_ORIGIN(c))
n_cells += TO_OR_CIRCUIT(c)->p_chan_cells.n;
@@ -2110,7 +2334,9 @@ dump_cell_pool_usage(int severity)
tor_log(severity, LD_MM,
"%d cells allocated on %d circuits. %d cells leaked.",
n_cells, n_circs, (int)total_cells_allocated - n_cells);
+#ifdef ENABLE_MEMPOOLS
mp_pool_log_status(cell_pool, severity);
+#endif
}
/** Allocate a new copy of packed <b>cell</b>. */
@@ -2119,7 +2345,6 @@ packed_cell_copy(const cell_t *cell, int wide_circ_ids)
{
packed_cell_t *c = packed_cell_new();
cell_pack(c, cell, wide_circ_ids);
- c->next = NULL;
return c;
}
@@ -2127,58 +2352,61 @@ packed_cell_copy(const cell_t *cell, int wide_circ_ids)
void
cell_queue_append(cell_queue_t *queue, packed_cell_t *cell)
{
- if (queue->tail) {
- tor_assert(!queue->tail->next);
- queue->tail->next = cell;
- } else {
- queue->head = cell;
- }
- queue->tail = cell;
- cell->next = NULL;
+ TOR_SIMPLEQ_INSERT_TAIL(&queue->head, cell, next);
++queue->n;
}
-/** Append a newly allocated copy of <b>cell</b> to the end of <b>queue</b> */
+/** Append a newly allocated copy of <b>cell</b> to the end of the
+ * <b>exitward</b> (or app-ward) <b>queue</b> of <b>circ</b>. If
+ * <b>use_stats</b> is true, record statistics about the cell.
+ */
void
-cell_queue_append_packed_copy(cell_queue_t *queue, const cell_t *cell,
- int wide_circ_ids)
+cell_queue_append_packed_copy(circuit_t *circ, cell_queue_t *queue,
+ int exitward, const cell_t *cell,
+ int wide_circ_ids, int use_stats)
{
struct timeval now;
packed_cell_t *copy = packed_cell_copy(cell, wide_circ_ids);
- tor_gettimeofday_cached(&now);
+ (void)circ;
+ (void)exitward;
+ (void)use_stats;
+ tor_gettimeofday_cached_monotonic(&now);
+
copy->inserted_time = (uint32_t)tv_to_msec(&now);
cell_queue_append(queue, copy);
}
+/** Initialize <b>queue</b> as an empty cell queue. */
+void
+cell_queue_init(cell_queue_t *queue)
+{
+ memset(queue, 0, sizeof(cell_queue_t));
+ TOR_SIMPLEQ_INIT(&queue->head);
+}
+
/** Remove and free every cell in <b>queue</b>. */
void
cell_queue_clear(cell_queue_t *queue)
{
- packed_cell_t *cell, *next;
- cell = queue->head;
- while (cell) {
- next = cell->next;
+ packed_cell_t *cell;
+ while ((cell = TOR_SIMPLEQ_FIRST(&queue->head))) {
+ TOR_SIMPLEQ_REMOVE_HEAD(&queue->head, next);
packed_cell_free_unchecked(cell);
- cell = next;
}
- queue->head = queue->tail = NULL;
+ TOR_SIMPLEQ_INIT(&queue->head);
queue->n = 0;
}
/** Extract and return the cell at the head of <b>queue</b>; return NULL if
* <b>queue</b> is empty. */
-static INLINE packed_cell_t *
+STATIC packed_cell_t *
cell_queue_pop(cell_queue_t *queue)
{
- packed_cell_t *cell = queue->head;
+ packed_cell_t *cell = TOR_SIMPLEQ_FIRST(&queue->head);
if (!cell)
return NULL;
- queue->head = cell->next;
- if (cell == queue->tail) {
- tor_assert(!queue->head);
- queue->tail = NULL;
- }
+ TOR_SIMPLEQ_REMOVE_HEAD(&queue->head, next);
--queue->n;
return cell;
}
@@ -2188,16 +2416,24 @@ cell_queue_pop(cell_queue_t *queue)
size_t
packed_cell_mem_cost(void)
{
- return sizeof(packed_cell_t) + MP_POOL_ITEM_OVERHEAD;
+ return RELAY_CELL_MEM_COST;
+}
+
+/** DOCDOC */
+STATIC size_t
+cell_queues_get_total_allocation(void)
+{
+ return total_cells_allocated * packed_cell_mem_cost();
}
/** Check whether we've got too much space used for cells. If so,
* call the OOM handler and return 1. Otherwise, return 0. */
-static int
+STATIC int
cell_queues_check_size(void)
{
- size_t alloc = total_cells_allocated * packed_cell_mem_cost();
- if (alloc >= get_options()->MaxMemInCellQueues) {
+ size_t alloc = cell_queues_get_total_allocation();
+ alloc += buf_get_total_allocation();
+ if (alloc >= get_options()->MaxMemInQueues) {
circuits_handle_oom(alloc);
return 1;
}
@@ -2252,14 +2488,18 @@ update_circuit_on_cmux_(circuit_t *circ, cell_direction_t direction,
assert_cmux_ok_paranoid(chan);
}
-/** Remove all circuits from the cmux on <b>chan</b>. */
+/** Remove all circuits from the cmux on <b>chan</b>.
+ *
+ * If <b>circuits_out</b> is non-NULL, add all detached circuits to
+ * <b>circuits_out</b>.
+ **/
void
-channel_unlink_all_circuits(channel_t *chan)
+channel_unlink_all_circuits(channel_t *chan, smartlist_t *circuits_out)
{
tor_assert(chan);
tor_assert(chan->cmux);
- circuitmux_detach_all_circuits(chan->cmux);
+ circuitmux_detach_all_circuits(chan->cmux, circuits_out);
chan->num_n_circuits = 0;
chan->num_p_circuits = 0;
}
@@ -2318,6 +2558,17 @@ set_streams_blocked_on_circ(circuit_t *circ, channel_t *chan,
return n;
}
+/** Extract the command from a packed cell. */
+static uint8_t
+packed_cell_get_command(const packed_cell_t *cell, int wide_circ_ids)
+{
+ if (wide_circ_ids) {
+ return get_uint8(cell->body+4);
+ } else {
+ return get_uint8(cell->body+2);
+ }
+}
+
/** Pull as many cells as possible (but no more than <b>max</b>) from the
* queue of the first active circuit on <b>chan</b>, and write them to
* <b>chan</b>-&gt;outbuf. Return the number of cells written. Advance
@@ -2327,7 +2578,7 @@ channel_flush_from_first_active_circuit(channel_t *chan, int max)
{
circuitmux_t *cmux = NULL;
int n_flushed = 0;
- cell_queue_t *queue;
+ cell_queue_t *queue, *destroy_queue=NULL;
circuit_t *circ;
or_circuit_t *or_circ;
int streams_blocked;
@@ -2340,7 +2591,18 @@ channel_flush_from_first_active_circuit(channel_t *chan, int max)
/* Main loop: pick a circuit, send a cell, update the cmux */
while (n_flushed < max) {
- circ = circuitmux_get_first_active_circuit(cmux);
+ circ = circuitmux_get_first_active_circuit(cmux, &destroy_queue);
+ if (destroy_queue) {
+ /* this code is duplicated from some of the logic below. Ugly! XXXX */
+ tor_assert(destroy_queue->n > 0);
+ cell = cell_queue_pop(destroy_queue);
+ channel_write_packed_cell(chan, cell);
+ /* Update the cmux destroy counter */
+ circuitmux_notify_xmit_destroy(cmux);
+ cell = NULL;
+ ++n_flushed;
+ continue;
+ }
/* If it returns NULL, no cells left to send */
if (!circ) break;
assert_cmux_ok_paranoid(chan);
@@ -2366,15 +2628,33 @@ channel_flush_from_first_active_circuit(channel_t *chan, int max)
cell = cell_queue_pop(queue);
/* Calculate the exact time that this cell has spent in the queue. */
- if (get_options()->CellStatistics && !CIRCUIT_IS_ORIGIN(circ)) {
+ if (get_options()->CellStatistics ||
+ get_options()->TestingEnableCellStatsEvent) {
uint32_t msec_waiting;
struct timeval tvnow;
- or_circ = TO_OR_CIRCUIT(circ);
tor_gettimeofday_cached(&tvnow);
msec_waiting = ((uint32_t)tv_to_msec(&tvnow)) - cell->inserted_time;
- or_circ->total_cell_waiting_time += msec_waiting;
- or_circ->processed_cells++;
+ if (get_options()->CellStatistics && !CIRCUIT_IS_ORIGIN(circ)) {
+ or_circ = TO_OR_CIRCUIT(circ);
+ or_circ->total_cell_waiting_time += msec_waiting;
+ or_circ->processed_cells++;
+ }
+
+ if (get_options()->TestingEnableCellStatsEvent) {
+ uint8_t command = packed_cell_get_command(cell, chan->wide_circ_ids);
+
+ testing_cell_stats_entry_t *ent =
+ tor_malloc_zero(sizeof(testing_cell_stats_entry_t));
+ ent->command = command;
+ ent->waiting_time = msec_waiting / 10;
+ ent->removed = 1;
+ if (circ->n_chan == chan)
+ ent->exitward = 1;
+ if (!circ->testing_cell_stats)
+ circ->testing_cell_stats = smartlist_new();
+ smartlist_add(circ->testing_cell_stats, ent);
+ }
}
/* If we just flushed our queue and this circuit is used for a
@@ -2420,6 +2700,20 @@ channel_flush_from_first_active_circuit(channel_t *chan, int max)
return n_flushed;
}
+#if 0
+/** Indicate the current preferred cap for middle circuits; zero disables
+ * the cap. Right now it's just a constant, ORCIRC_MAX_MIDDLE_CELLS, but
+ * the logic in append_cell_to_circuit_queue() is written to be correct
+ * if we want to base it on a consensus param or something that might change
+ * in the future.
+ */
+static int
+get_max_middle_cells(void)
+{
+ return ORCIRC_MAX_MIDDLE_CELLS;
+}
+#endif
+
/** Add <b>cell</b> to the queue of <b>circ</b> writing to <b>chan</b>
* transmitting in <b>direction</b>. */
void
@@ -2430,11 +2724,16 @@ append_cell_to_circuit_queue(circuit_t *circ, channel_t *chan,
or_circuit_t *orcirc = NULL;
cell_queue_t *queue;
int streams_blocked;
+#if 0
+ uint32_t tgt_max_middle_cells, p_len, n_len, tmp, hard_max_middle_cells;
+#endif
+ int exitward;
if (circ->marked_for_close)
return;
- if (direction == CELL_DIRECTION_OUT) {
+ exitward = (direction == CELL_DIRECTION_OUT);
+ if (exitward) {
queue = &circ->n_chan_cells;
streams_blocked = circ->streams_blocked_on_n_chan;
} else {
@@ -2451,28 +2750,82 @@ append_cell_to_circuit_queue(circuit_t *circ, channel_t *chan,
if ((circ->n_chan != NULL) && CIRCUIT_IS_ORCIRC(circ)) {
orcirc = TO_OR_CIRCUIT(circ);
if (orcirc->p_chan) {
- if (queue->n + 1 >= ORCIRC_MAX_MIDDLE_CELLS) {
- /* Queueing this cell would put queue over the cap */
- log_warn(LD_CIRC,
- "Got a cell exceeding the cap of %u in the %s direction "
- "on middle circ ID %u on chan ID " U64_FORMAT
- "; killing the circuit.",
- ORCIRC_MAX_MIDDLE_CELLS,
- (direction == CELL_DIRECTION_OUT) ? "n" : "p",
- (direction == CELL_DIRECTION_OUT) ?
- circ->n_circ_id : orcirc->p_circ_id,
- U64_PRINTF_ARG(
+ /* We are a middle circuit if we have both n_chan and p_chan */
+ /* We'll need to know the current preferred maximum */
+ tgt_max_middle_cells = get_max_middle_cells();
+ if (tgt_max_middle_cells > 0) {
+ /* Do we need to initialize middle_max_cells? */
+ if (orcirc->max_middle_cells == 0) {
+ orcirc->max_middle_cells = tgt_max_middle_cells;
+ } else {
+ if (tgt_max_middle_cells > orcirc->max_middle_cells) {
+ /* If we want to increase the cap, we can do so right away */
+ orcirc->max_middle_cells = tgt_max_middle_cells;
+ } else if (tgt_max_middle_cells < orcirc->max_middle_cells) {
+ /*
+ * If we're shrinking the cap, we can't shrink past either queue;
+ * compare tgt_max_middle_cells rather than tgt_max_middle_cells *
+ * ORCIRC_MAX_MIDDLE_KILL_THRESH so the queues don't shrink enough
+ * to generate spurious warnings, either.
+ */
+ n_len = circ->n_chan_cells.n;
+ p_len = orcirc->p_chan_cells.n;
+ tmp = tgt_max_middle_cells;
+ if (tmp < n_len) tmp = n_len;
+ if (tmp < p_len) tmp = p_len;
+ orcirc->max_middle_cells = tmp;
+ }
+ /* else no change */
+ }
+ } else {
+ /* tgt_max_middle_cells == 0 indicates we should disable the cap */
+ orcirc->max_middle_cells = 0;
+ }
+
+ /* Now we know orcirc->max_middle_cells is set correctly */
+ if (orcirc->max_middle_cells > 0) {
+ hard_max_middle_cells =
+ (uint32_t)(((double)orcirc->max_middle_cells) *
+ ORCIRC_MAX_MIDDLE_KILL_THRESH);
+
+ if ((unsigned)queue->n + 1 >= hard_max_middle_cells) {
+ /* Queueing this cell would put queue over the kill theshold */
+ log_warn(LD_CIRC,
+ "Got a cell exceeding the hard cap of %u in the "
+ "%s direction on middle circ ID %u on chan ID "
+ U64_FORMAT "; killing the circuit.",
+ hard_max_middle_cells,
+ (direction == CELL_DIRECTION_OUT) ? "n" : "p",
(direction == CELL_DIRECTION_OUT) ?
- circ->n_chan->global_identifier :
- orcirc->p_chan->global_identifier));
- circuit_mark_for_close(circ, END_CIRC_REASON_RESOURCELIMIT);
- return;
+ circ->n_circ_id : orcirc->p_circ_id,
+ U64_PRINTF_ARG(
+ (direction == CELL_DIRECTION_OUT) ?
+ circ->n_chan->global_identifier :
+ orcirc->p_chan->global_identifier));
+ circuit_mark_for_close(circ, END_CIRC_REASON_RESOURCELIMIT);
+ return;
+ } else if ((unsigned)queue->n + 1 == orcirc->max_middle_cells) {
+ /* Only use ==, not >= for this test so we don't spam the log */
+ log_warn(LD_CIRC,
+ "While trying to queue a cell, reached the soft cap of %u "
+ "in the %s direction on middle circ ID %u "
+ "on chan ID " U64_FORMAT ".",
+ orcirc->max_middle_cells,
+ (direction == CELL_DIRECTION_OUT) ? "n" : "p",
+ (direction == CELL_DIRECTION_OUT) ?
+ circ->n_circ_id : orcirc->p_circ_id,
+ U64_PRINTF_ARG(
+ (direction == CELL_DIRECTION_OUT) ?
+ circ->n_chan->global_identifier :
+ orcirc->p_chan->global_identifier));
+ }
}
}
}
#endif
- cell_queue_append_packed_copy(queue, cell, chan->wide_circ_ids);
+ cell_queue_append_packed_copy(circ, queue, exitward, cell,
+ chan->wide_circ_ids, 1);
if (PREDICT_UNLIKELY(cell_queues_check_size())) {
/* We ran the OOM handler */
diff --git a/src/or/relay.h b/src/or/relay.h
index 1fef10a7d..479d474b3 100644
--- a/src/or/relay.h
+++ b/src/or/relay.h
@@ -42,24 +42,28 @@ extern uint64_t stats_n_data_bytes_packaged;
extern uint64_t stats_n_data_cells_received;
extern uint64_t stats_n_data_bytes_received;
+#ifdef ENABLE_MEMPOOLS
void init_cell_pool(void);
void free_cell_pool(void);
void clean_cell_pool(void);
+#endif /* ENABLE_MEMPOOLS */
void dump_cell_pool_usage(int severity);
size_t packed_cell_mem_cost(void);
/* For channeltls.c */
void packed_cell_free(packed_cell_t *cell);
+void cell_queue_init(cell_queue_t *queue);
void cell_queue_clear(cell_queue_t *queue);
void cell_queue_append(cell_queue_t *queue, packed_cell_t *cell);
-void cell_queue_append_packed_copy(cell_queue_t *queue, const cell_t *cell,
- int wide_circ_ids);
+void cell_queue_append_packed_copy(circuit_t *circ, cell_queue_t *queue,
+ int exitward, const cell_t *cell,
+ int wide_circ_ids, int use_stats);
void append_cell_to_circuit_queue(circuit_t *circ, channel_t *chan,
cell_t *cell, cell_direction_t direction,
streamid_t fromstream);
-void channel_unlink_all_circuits(channel_t *chan);
+void channel_unlink_all_circuits(channel_t *chan, smartlist_t *detached_out);
int channel_flush_from_first_active_circuit(channel_t *chan, int max);
void assert_circuit_mux_okay(channel_t *chan);
void update_circuit_on_cmux_(circuit_t *circ, cell_direction_t direction,
@@ -75,11 +79,28 @@ void circuit_clear_cell_queue(circuit_t *circ, channel_t *chan);
void stream_choice_seed_weak_rng(void);
-#ifdef RELAY_PRIVATE
int relay_crypt(circuit_t *circ, cell_t *cell, cell_direction_t cell_direction,
crypt_path_t **layer_hint, char *recognized);
-int connected_cell_parse(const relay_header_t *rh, const cell_t *cell,
+
+#ifdef RELAY_PRIVATE
+STATIC int connected_cell_parse(const relay_header_t *rh, const cell_t *cell,
tor_addr_t *addr_out, int *ttl_out);
+/** An address-and-ttl tuple as yielded by resolved_cell_parse */
+typedef struct address_ttl_s {
+ tor_addr_t addr;
+ char *hostname;
+ int ttl;
+} address_ttl_t;
+STATIC void address_ttl_free(address_ttl_t *addr);
+STATIC int resolved_cell_parse(const cell_t *cell, const relay_header_t *rh,
+ smartlist_t *addresses_out, int *errcode_out);
+STATIC int connection_edge_process_resolved_cell(edge_connection_t *conn,
+ const cell_t *cell,
+ const relay_header_t *rh);
+STATIC packed_cell_t *packed_cell_new(void);
+STATIC packed_cell_t *cell_queue_pop(cell_queue_t *queue);
+STATIC size_t cell_queues_get_total_allocation(void);
+STATIC int cell_queues_check_size(void);
#endif
#endif
diff --git a/src/or/rendclient.c b/src/or/rendclient.c
index bb4bd9bfd..d42024010 100644
--- a/src/or/rendclient.c
+++ b/src/or/rendclient.c
@@ -8,6 +8,7 @@
**/
#include "or.h"
+#include "circpathbias.h"
#include "circuitbuild.h"
#include "circuitlist.h"
#include "circuituse.h"
@@ -25,6 +26,7 @@
#include "router.h"
#include "routerlist.h"
#include "routerset.h"
+#include "control.h"
static extend_info_t *rend_client_get_random_intro_impl(
const rend_cache_entry_t *rend_query,
@@ -376,7 +378,7 @@ rend_client_close_other_intros(const char *onion_address)
{
circuit_t *c;
/* abort parallel intro circs, if any */
- for (c = circuit_get_global_list_(); c; c = c->next) {
+ TOR_LIST_FOREACH(c, circuit_get_global_list(), head) {
if ((c->purpose == CIRCUIT_PURPOSE_C_INTRODUCING ||
c->purpose == CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT) &&
!c->marked_for_close && CIRCUIT_IS_ORIGIN(c)) {
@@ -617,11 +619,14 @@ static int
directory_get_from_hs_dir(const char *desc_id, const rend_data_t *rend_query)
{
smartlist_t *responsible_dirs = smartlist_new();
+ smartlist_t *usable_responsible_dirs = smartlist_new();
+ const or_options_t *options = get_options();
routerstatus_t *hs_dir;
char desc_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1];
time_t now = time(NULL);
char descriptor_cookie_base64[3*REND_DESC_COOKIE_LEN_BASE64];
- int tor2web_mode = get_options()->Tor2webMode;
+ const int tor2web_mode = options->Tor2webMode;
+ int excluded_some;
tor_assert(desc_id);
tor_assert(rend_query);
/* Determine responsible dirs. Even if we can't get all we want,
@@ -642,16 +647,33 @@ directory_get_from_hs_dir(const char *desc_id, const rend_data_t *rend_query)
dir, desc_id_base32, rend_query, 0, 0);
const node_t *node = node_get_by_id(dir->identity_digest);
if (last + REND_HID_SERV_DIR_REQUERY_PERIOD >= now ||
- !node || !node_has_descriptor(node))
- SMARTLIST_DEL_CURRENT(responsible_dirs, dir);
+ !node || !node_has_descriptor(node)) {
+ SMARTLIST_DEL_CURRENT(responsible_dirs, dir);
+ continue;
+ }
+ if (! routerset_contains_node(options->ExcludeNodes, node)) {
+ smartlist_add(usable_responsible_dirs, dir);
+ }
});
- hs_dir = smartlist_choose(responsible_dirs);
+ excluded_some =
+ smartlist_len(usable_responsible_dirs) < smartlist_len(responsible_dirs);
+
+ hs_dir = smartlist_choose(usable_responsible_dirs);
+ if (! hs_dir && ! options->StrictNodes)
+ hs_dir = smartlist_choose(responsible_dirs);
+
smartlist_free(responsible_dirs);
+ smartlist_free(usable_responsible_dirs);
if (!hs_dir) {
log_info(LD_REND, "Could not pick one of the responsible hidden "
"service directories, because we requested them all "
"recently without success.");
+ if (options->StrictNodes && excluded_some) {
+ log_warn(LD_REND, "Could not pick a hidden service directory for the "
+ "requested hidden service: they are all either down or "
+ "excluded, and StrictNodes is set.");
+ }
return 0;
}
@@ -693,6 +715,9 @@ directory_get_from_hs_dir(const char *desc_id, const rend_data_t *rend_query)
(rend_query->auth_type == REND_NO_AUTH ? "[none]" :
escaped_safe_str_client(descriptor_cookie_base64)),
routerstatus_describe(hs_dir));
+ control_event_hs_descriptor_requested(rend_query,
+ hs_dir->identity_digest,
+ desc_id_base32);
return 1;
}
@@ -772,8 +797,7 @@ rend_client_cancel_descriptor_fetches(void)
SMARTLIST_FOREACH_BEGIN(connection_array, connection_t *, conn) {
if (conn->type == CONN_TYPE_DIR &&
- (conn->purpose == DIR_PURPOSE_FETCH_RENDDESC ||
- conn->purpose == DIR_PURPOSE_FETCH_RENDDESC_V2)) {
+ conn->purpose == DIR_PURPOSE_FETCH_RENDDESC_V2) {
/* It's a rendezvous descriptor fetch in progress -- cancel it
* by marking the connection for close.
*
diff --git a/src/or/rendcommon.c b/src/or/rendcommon.c
index d1b49411c..a664b5d50 100644
--- a/src/or/rendcommon.c
+++ b/src/or/rendcommon.c
@@ -672,79 +672,6 @@ rend_encode_v2_descriptors(smartlist_t *descs_out,
return seconds_valid;
}
-/** Parse a service descriptor at <b>str</b> (<b>len</b> bytes). On
- * success, return a newly alloced service_descriptor_t. On failure,
- * return NULL.
- */
-rend_service_descriptor_t *
-rend_parse_service_descriptor(const char *str, size_t len)
-{
- rend_service_descriptor_t *result = NULL;
- int i, n_intro_points;
- size_t keylen, asn1len;
- const char *end, *cp, *eos;
- rend_intro_point_t *intro;
-
- result = tor_malloc_zero(sizeof(rend_service_descriptor_t));
- cp = str;
- end = str+len;
- if (end-cp<2) goto truncated;
- result->version = 0;
- if (end-cp < 2) goto truncated;
- asn1len = ntohs(get_uint16(cp));
- cp += 2;
- if ((size_t)(end-cp) < asn1len) goto truncated;
- result->pk = crypto_pk_asn1_decode(cp, asn1len);
- if (!result->pk) goto truncated;
- cp += asn1len;
- if (end-cp < 4) goto truncated;
- result->timestamp = (time_t) ntohl(get_uint32(cp));
- cp += 4;
- result->protocols = 1<<2; /* always use intro format 2 */
- if (end-cp < 2) goto truncated;
- n_intro_points = ntohs(get_uint16(cp));
- cp += 2;
-
- result->intro_nodes = smartlist_new();
- for (i=0;i<n_intro_points;++i) {
- if (end-cp < 2) goto truncated;
- eos = (const char *)memchr(cp,'\0',end-cp);
- if (!eos) goto truncated;
- /* Write nickname to extend info, but postpone the lookup whether
- * we know that router. It's not part of the parsing process. */
- intro = tor_malloc_zero(sizeof(rend_intro_point_t));
- intro->extend_info = tor_malloc_zero(sizeof(extend_info_t));
- strlcpy(intro->extend_info->nickname, cp,
- sizeof(intro->extend_info->nickname));
- smartlist_add(result->intro_nodes, intro);
- cp = eos+1;
- }
- keylen = crypto_pk_keysize(result->pk);
- tor_assert(end-cp >= 0);
- if ((size_t)(end-cp) < keylen) goto truncated;
- if ((size_t)(end-cp) > keylen) {
- log_warn(LD_PROTOCOL,
- "Signature is %d bytes too long on service descriptor.",
- (int)((size_t)(end-cp) - keylen));
- goto error;
- }
- note_crypto_pk_op(REND_CLIENT);
- if (crypto_pk_public_checksig_digest(result->pk,
- (char*)str,cp-str, /* data */
- (char*)cp,end-cp /* signature*/
- )<0) {
- log_warn(LD_PROTOCOL, "Bad signature on service descriptor.");
- goto error;
- }
-
- return result;
- truncated:
- log_warn(LD_PROTOCOL, "Truncated service descriptor.");
- error:
- rend_service_descriptor_free(result);
- return NULL;
-}
-
/** Sets <b>out</b> to the first 10 bytes of the digest of <b>pk</b>,
* base32 encoded. NUL-terminates out. (We use this string to
* identify services in directory requests and .onion URLs.)
@@ -843,7 +770,7 @@ void
rend_cache_purge(void)
{
if (rend_cache) {
- log_info(LD_REND, "Purging client/v0-HS-authority HS descriptor cache");
+ log_info(LD_REND, "Purging HS descriptor cache");
strmap_free(rend_cache, rend_cache_entry_free_);
}
rend_cache = strmap_new();
@@ -954,27 +881,6 @@ rend_cache_lookup_entry(const char *query, int version, rend_cache_entry_t **e)
return 1;
}
-/** <b>query</b> is a base32'ed service id. If it's malformed, return -1.
- * Else look it up.
- * - If it is found, point *desc to it, and write its length into
- * *desc_len, and return 1.
- * - If it is not found, return 0.
- * Note: calls to rend_cache_clean or rend_cache_store may invalidate
- * *desc.
- */
-int
-rend_cache_lookup_desc(const char *query, int version, const char **desc,
- size_t *desc_len)
-{
- rend_cache_entry_t *e;
- int r;
- r = rend_cache_lookup_entry(query,version,&e);
- if (r <= 0) return r;
- *desc = e->desc;
- *desc_len = e->len;
- return 1;
-}
-
/** Lookup the v2 service descriptor with base32-encoded <b>desc_id</b> and
* copy the pointer to it to *<b>desc</b>. Return 1 on success, 0 on
* well-formed-but-not-found, and -1 on failure.
@@ -1006,130 +912,16 @@ rend_cache_lookup_v2_desc_as_dir(const char *desc_id, const char **desc)
* descriptor */
#define MAX_INTRO_POINTS 10
-/** Parse *desc, calculate its service id, and store it in the cache.
- * If we have a newer v0 descriptor with the same ID, ignore this one.
- * If we have an older descriptor with the same ID, replace it.
- * If we are acting as client due to the published flag and have any v2
- * descriptor with the same ID, reject this one in order to not get
- * confused with having both versions for the same service.
- *
- * Return -2 if it's malformed or otherwise rejected; return -1 if we
- * already have a v2 descriptor here; return 0 if it's the same or older
- * than one we've already got; return 1 if it's novel.
- *
- * The published flag tells us if we store the descriptor
- * in our role as directory (1) or if we cache it as client (0).
- *
- * If <b>service_id</b> is non-NULL and the descriptor is not for that
- * service ID, reject it. <b>service_id</b> must be specified if and
- * only if <b>published</b> is 0 (we fetched this descriptor).
- */
-int
-rend_cache_store(const char *desc, size_t desc_len, int published,
- const char *service_id)
-{
- rend_cache_entry_t *e;
- rend_service_descriptor_t *parsed;
- char query[REND_SERVICE_ID_LEN_BASE32+1];
- char key[REND_SERVICE_ID_LEN_BASE32+2]; /* 0<query>\0 */
- time_t now;
- tor_assert(rend_cache);
- parsed = rend_parse_service_descriptor(desc,desc_len);
- if (!parsed) {
- log_warn(LD_PROTOCOL,"Couldn't parse service descriptor.");
- return -2;
- }
- if (rend_get_service_id(parsed->pk, query)<0) {
- log_warn(LD_BUG,"Couldn't compute service ID.");
- rend_service_descriptor_free(parsed);
- return -2;
- }
- if ((service_id != NULL) && strcmp(query, service_id)) {
- log_warn(LD_REND, "Received service descriptor for service ID %s; "
- "expected descriptor for service ID %s.",
- query, safe_str(service_id));
- rend_service_descriptor_free(parsed);
- return -2;
- }
- now = time(NULL);
- if (parsed->timestamp < now-REND_CACHE_MAX_AGE-REND_CACHE_MAX_SKEW) {
- log_fn(LOG_PROTOCOL_WARN, LD_REND,
- "Service descriptor %s is too old.",
- safe_str_client(query));
- rend_service_descriptor_free(parsed);
- return -2;
- }
- if (parsed->timestamp > now+REND_CACHE_MAX_SKEW) {
- log_fn(LOG_PROTOCOL_WARN, LD_REND,
- "Service descriptor %s is too far in the future.",
- safe_str_client(query));
- rend_service_descriptor_free(parsed);
- return -2;
- }
- /* Do we have a v2 descriptor and fetched this descriptor as a client? */
- tor_snprintf(key, sizeof(key), "2%s", query);
- if (!published && strmap_get_lc(rend_cache, key)) {
- log_info(LD_REND, "We already have a v2 descriptor for service %s.",
- safe_str_client(query));
- rend_service_descriptor_free(parsed);
- return -1;
- }
- if (parsed->intro_nodes &&
- smartlist_len(parsed->intro_nodes) > MAX_INTRO_POINTS) {
- log_warn(LD_REND, "Found too many introduction points on a hidden "
- "service descriptor for %s. This is probably a (misguided) "
- "attempt to improve reliability, but it could also be an "
- "attempt to do a guard enumeration attack. Rejecting.",
- safe_str_client(query));
- rend_service_descriptor_free(parsed);
- return -2;
- }
- tor_snprintf(key, sizeof(key), "0%s", query);
- e = (rend_cache_entry_t*) strmap_get_lc(rend_cache, key);
- if (e && e->parsed->timestamp > parsed->timestamp) {
- log_info(LD_REND,"We already have a newer service descriptor %s with the "
- "same ID and version.",
- safe_str_client(query));
- rend_service_descriptor_free(parsed);
- return 0;
- }
- if (e && e->len == desc_len && tor_memeq(desc,e->desc,desc_len)) {
- log_info(LD_REND,"We already have this service descriptor %s.",
- safe_str_client(query));
- e->received = time(NULL);
- rend_service_descriptor_free(parsed);
- return 0;
- }
- if (!e) {
- e = tor_malloc_zero(sizeof(rend_cache_entry_t));
- strmap_set_lc(rend_cache, key, e);
- } else {
- rend_service_descriptor_free(e->parsed);
- tor_free(e->desc);
- }
- e->received = time(NULL);
- e->parsed = parsed;
- e->len = desc_len;
- e->desc = tor_malloc(desc_len);
- memcpy(e->desc, desc, desc_len);
-
- log_debug(LD_REND,"Successfully stored rend desc '%s', len %d.",
- safe_str_client(query), (int)desc_len);
- return 1;
-}
-
/** Parse the v2 service descriptor(s) in <b>desc</b> and store it/them to the
* local rend cache. Don't attempt to decrypt the included list of introduction
* points (as we don't have a descriptor cookie for it).
*
* If we have a newer descriptor with the same ID, ignore this one.
* If we have an older descriptor with the same ID, replace it.
- * Return -2 if we are not acting as hidden service directory;
- * return -1 if the descriptor(s) were not parsable; return 0 if all
- * descriptors are the same or older than those we've already got;
- * return a positive number for the number of novel stored descriptors.
+ *
+ * Return an appropriate rend_cache_store_status_t.
*/
-int
+rend_cache_store_status_t
rend_cache_store_v2_desc_as_dir(const char *desc)
{
rend_service_descriptor_t *parsed;
@@ -1149,7 +941,7 @@ rend_cache_store_v2_desc_as_dir(const char *desc)
/* Cannot store descs, because we are (currently) not acting as
* hidden service directory. */
log_info(LD_REND, "Cannot store descs: Not acting as hs dir");
- return -2;
+ return RCS_NOTDIR;
}
while (rend_parse_v2_service_descriptor(&parsed, desc_id, &intro_content,
&intro_size, &encoded_size,
@@ -1225,11 +1017,11 @@ rend_cache_store_v2_desc_as_dir(const char *desc)
}
if (!number_parsed) {
log_info(LD_REND, "Could not parse any descriptor.");
- return -1;
+ return RCS_BADDESC;
}
log_info(LD_REND, "Parsed %d and added %d descriptor%s.",
number_parsed, number_stored, number_stored != 1 ? "s" : "");
- return number_stored;
+ return RCS_OKAY;
}
/** Parse the v2 service descriptor in <b>desc</b>, decrypt the included list
@@ -1239,15 +1031,12 @@ rend_cache_store_v2_desc_as_dir(const char *desc)
*
* If we have a newer v2 descriptor with the same ID, ignore this one.
* If we have an older descriptor with the same ID, replace it.
- * If we have any v0 descriptor with the same ID, reject this one in order
- * to not get confused with having both versions for the same service.
* If the descriptor's service ID does not match
* <b>rend_query</b>-\>onion_address, reject it.
- * Return -2 if it's malformed or otherwise rejected; return -1 if we
- * already have a v0 descriptor here; return 0 if it's the same or older
- * than one we've already got; return 1 if it's novel.
+ *
+ * Return an appropriate rend_cache_store_status_t.
*/
-int
+rend_cache_store_status_t
rend_cache_store_v2_desc_as_client(const char *desc,
const rend_data_t *rend_query)
{
@@ -1276,7 +1065,7 @@ rend_cache_store_v2_desc_as_client(const char *desc,
char key[REND_SERVICE_ID_LEN_BASE32+2];
char service_id[REND_SERVICE_ID_LEN_BASE32+1];
rend_cache_entry_t *e;
- int retval;
+ rend_cache_store_status_t retval = RCS_BADDESC;
tor_assert(rend_cache);
tor_assert(desc);
/* Parse the descriptor. */
@@ -1284,20 +1073,17 @@ rend_cache_store_v2_desc_as_client(const char *desc,
&intro_size, &encoded_size,
&next_desc, desc) < 0) {
log_warn(LD_REND, "Could not parse descriptor.");
- retval = -2;
goto err;
}
/* Compute service ID from public key. */
if (rend_get_service_id(parsed->pk, service_id)<0) {
log_warn(LD_REND, "Couldn't compute service ID.");
- retval = -2;
goto err;
}
if (strcmp(rend_query->onion_address, service_id)) {
log_warn(LD_REND, "Received service descriptor for service ID %s; "
"expected descriptor for service ID %s.",
service_id, safe_str(rend_query->onion_address));
- retval = -2;
goto err;
}
/* Decode/decrypt introduction points. */
@@ -1329,7 +1115,6 @@ rend_cache_store_v2_desc_as_client(const char *desc,
log_warn(LD_REND, "Failed to parse introduction points. Either the "
"service has published a corrupt descriptor or you have "
"provided invalid authorization data.");
- retval = -2;
goto err;
} else if (n_intro_points > MAX_INTRO_POINTS) {
log_warn(LD_REND, "Found too many introduction points on a hidden "
@@ -1337,7 +1122,7 @@ rend_cache_store_v2_desc_as_client(const char *desc,
"attempt to improve reliability, but it could also be an "
"attempt to do a guard enumeration attack. Rejecting.",
safe_str_client(rend_query->onion_address));
- retval = -2;
+
goto err;
}
} else {
@@ -1350,22 +1135,12 @@ rend_cache_store_v2_desc_as_client(const char *desc,
if (parsed->timestamp < now - REND_CACHE_MAX_AGE-REND_CACHE_MAX_SKEW) {
log_warn(LD_REND, "Service descriptor with service ID %s is too old.",
safe_str_client(service_id));
- retval = -2;
goto err;
}
/* Is descriptor too far in the future? */
if (parsed->timestamp > now + REND_CACHE_MAX_SKEW) {
log_warn(LD_REND, "Service descriptor with service ID %s is too far in "
"the future.", safe_str_client(service_id));
- retval = -2;
- goto err;
- }
- /* Do we have a v0 descriptor? */
- tor_snprintf(key, sizeof(key), "0%s", service_id);
- if (strmap_get_lc(rend_cache, key)) {
- log_info(LD_REND, "We already have a v0 descriptor for service ID %s.",
- safe_str_client(service_id));
- retval = -1;
goto err;
}
/* Do we already have a newer descriptor? */
@@ -1375,16 +1150,14 @@ rend_cache_store_v2_desc_as_client(const char *desc,
log_info(LD_REND, "We already have a newer service descriptor for "
"service ID %s with the same desc ID and version.",
safe_str_client(service_id));
- retval = 0;
- goto err;
+ goto okay;
}
/* Do we already have this descriptor? */
if (e && !strcmp(desc, e->desc)) {
log_info(LD_REND,"We already have this service descriptor %s.",
safe_str_client(service_id));
e->received = time(NULL);
- retval = 0;
- goto err;
+ goto okay;
}
if (!e) {
e = tor_malloc_zero(sizeof(rend_cache_entry_t));
@@ -1400,7 +1173,10 @@ rend_cache_store_v2_desc_as_client(const char *desc,
e->len = encoded_size;
log_debug(LD_REND,"Successfully stored rend desc '%s', len %d.",
safe_str_client(service_id), (int)encoded_size);
- return 1;
+ return RCS_OKAY;
+
+ okay:
+ retval = RCS_OKAY;
err:
rend_service_descriptor_free(parsed);
diff --git a/src/or/rendcommon.h b/src/or/rendcommon.h
index f476593d2..07a47accf 100644
--- a/src/or/rendcommon.h
+++ b/src/or/rendcommon.h
@@ -26,8 +26,6 @@ void rend_process_relay_cell(circuit_t *circ, const crypt_path_t *layer_hint,
const uint8_t *payload);
void rend_service_descriptor_free(rend_service_descriptor_t *desc);
-rend_service_descriptor_t *rend_parse_service_descriptor(const char *str,
- size_t len);
int rend_get_service_id(crypto_pk_t *pk, char *out);
void rend_encoded_v2_service_descriptor_free(
rend_encoded_v2_service_descriptor_t *desc);
@@ -39,16 +37,20 @@ void rend_cache_clean_v2_descs_as_dir(time_t now);
void rend_cache_purge(void);
void rend_cache_free_all(void);
int rend_valid_service_id(const char *query);
-int rend_cache_lookup_desc(const char *query, int version, const char **desc,
- size_t *desc_len);
int rend_cache_lookup_entry(const char *query, int version,
rend_cache_entry_t **entry_out);
int rend_cache_lookup_v2_desc_as_dir(const char *query, const char **desc);
-int rend_cache_store(const char *desc, size_t desc_len, int published,
- const char *service_id);
-int rend_cache_store_v2_desc_as_client(const char *desc,
+/** Return value from rend_cache_store_v2_desc_as_{dir,client}. */
+typedef enum {
+ RCS_NOTDIR = -2, /**< We're not a directory */
+ RCS_BADDESC = -1, /**< This descriptor is no good. */
+ RCS_OKAY = 0 /**< All worked as expected */
+} rend_cache_store_status_t;
+
+rend_cache_store_status_t rend_cache_store_v2_desc_as_dir(const char *desc);
+rend_cache_store_status_t rend_cache_store_v2_desc_as_client(const char *desc,
const rend_data_t *rend_query);
-int rend_cache_store_v2_desc_as_dir(const char *desc);
+
int rend_encode_v2_descriptors(smartlist_t *descs_out,
rend_service_descriptor_t *desc, time_t now,
uint8_t period, rend_auth_type_t auth_type,
diff --git a/src/or/rendmid.c b/src/or/rendmid.c
index 1bd11f6dc..110381680 100644
--- a/src/or/rendmid.c
+++ b/src/or/rendmid.c
@@ -94,7 +94,7 @@ rend_mid_establish_intro(or_circuit_t *circ, const uint8_t *request,
/* Close any other intro circuits with the same pk. */
c = NULL;
- while ((c = circuit_get_intro_point(pk_digest))) {
+ while ((c = circuit_get_intro_point((const uint8_t *)pk_digest))) {
log_info(LD_REND, "Replacing old circuit for service %s",
safe_str(serviceid));
circuit_mark_for_close(TO_CIRCUIT(c), END_CIRC_REASON_FINISHED);
@@ -111,7 +111,7 @@ rend_mid_establish_intro(or_circuit_t *circ, const uint8_t *request,
/* Now, set up this circuit. */
circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_INTRO_POINT);
- memcpy(circ->rend_token, pk_digest, DIGEST_LEN);
+ circuit_set_intro_point_digest(circ, (uint8_t *)pk_digest);
log_info(LD_REND,
"Established introduction point on circuit %u for service %s",
@@ -165,7 +165,7 @@ rend_mid_introduce(or_circuit_t *circ, const uint8_t *request,
(char*)request, REND_SERVICE_ID_LEN);
/* The first 20 bytes are all we look at: they have a hash of Bob's PK. */
- intro_circ = circuit_get_intro_point((char*)request);
+ intro_circ = circuit_get_intro_point((const uint8_t*)request);
if (!intro_circ) {
log_info(LD_REND,
"No intro circ found for INTRODUCE1 cell (%s) from circuit %u; "
@@ -231,11 +231,12 @@ rend_mid_establish_rendezvous(or_circuit_t *circ, const uint8_t *request,
}
if (request_len != REND_COOKIE_LEN) {
- log_warn(LD_PROTOCOL, "Invalid length on ESTABLISH_RENDEZVOUS.");
+ log_fn(LOG_PROTOCOL_WARN,
+ LD_PROTOCOL, "Invalid length on ESTABLISH_RENDEZVOUS.");
goto err;
}
- if (circuit_get_rendezvous((char*)request)) {
+ if (circuit_get_rendezvous(request)) {
log_warn(LD_PROTOCOL,
"Duplicate rendezvous cookie in ESTABLISH_RENDEZVOUS.");
goto err;
@@ -251,7 +252,7 @@ rend_mid_establish_rendezvous(or_circuit_t *circ, const uint8_t *request,
}
circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_REND_POINT_WAITING);
- memcpy(circ->rend_token, request, REND_COOKIE_LEN);
+ circuit_set_rendezvous_cookie(circ, request);
base16_encode(hexid,9,(char*)request,4);
@@ -299,7 +300,7 @@ rend_mid_rendezvous(or_circuit_t *circ, const uint8_t *request,
"Got request for rendezvous from circuit %u to cookie %s.",
(unsigned)circ->p_circ_id, hexid);
- rend_circ = circuit_get_rendezvous((char*)request);
+ rend_circ = circuit_get_rendezvous(request);
if (!rend_circ) {
log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
"Rejecting RENDEZVOUS1 cell with unrecognized rendezvous cookie %s.",
@@ -327,7 +328,7 @@ rend_mid_rendezvous(or_circuit_t *circ, const uint8_t *request,
circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_REND_ESTABLISHED);
circuit_change_purpose(TO_CIRCUIT(rend_circ),
CIRCUIT_PURPOSE_REND_ESTABLISHED);
- memset(circ->rend_token, 0, REND_COOKIE_LEN);
+ circuit_set_rendezvous_cookie(circ, NULL);
rend_circ->rend_splice = circ;
circ->rend_splice = rend_circ;
diff --git a/src/or/rendservice.c b/src/or/rendservice.c
index 8a4a11e47..a7c1e32f1 100644
--- a/src/or/rendservice.c
+++ b/src/or/rendservice.c
@@ -10,6 +10,7 @@
#define RENDSERVICE_PRIVATE
#include "or.h"
+#include "circpathbias.h"
#include "circuitbuild.h"
#include "circuitlist.h"
#include "circuituse.h"
@@ -81,7 +82,7 @@ typedef struct rend_service_port_config_t {
#define MAX_INTRO_CIRCS_PER_PERIOD 10
/** How many times will a hidden service operator attempt to connect to
* a requested rendezvous point before giving up? */
-#define MAX_REND_FAILURES 30
+#define MAX_REND_FAILURES 8
/** How many seconds should we spend trying to connect to a requested
* rendezvous point before giving up? */
#define MAX_REND_TIMEOUT 30
@@ -543,7 +544,7 @@ rend_config_services(const or_options_t *options, int validate_only)
/* XXXX it would be nicer if we had a nicer abstraction to use here,
* so we could just iterate over the list of services to close, but
* once again, this isn't critical-path code. */
- for (circ = circuit_get_global_list_(); circ; circ = circ->next) {
+ TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) {
if (!circ->marked_for_close &&
circ->state == CIRCUIT_STATE_OPEN &&
(circ->purpose == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO ||
@@ -655,6 +656,35 @@ rend_service_load_all_keys(void)
return 0;
}
+/** Add to <b>lst</b> every filename used by <b>s</b>. */
+static void
+rend_service_add_filenames_to_list(smartlist_t *lst, const rend_service_t *s)
+{
+ tor_assert(lst);
+ tor_assert(s);
+ smartlist_add_asprintf(lst, "%s"PATH_SEPARATOR"private_key",
+ s->directory);
+ smartlist_add_asprintf(lst, "%s"PATH_SEPARATOR"hostname",
+ s->directory);
+ smartlist_add_asprintf(lst, "%s"PATH_SEPARATOR"client_keys",
+ s->directory);
+}
+
+/** Add to <b>open_lst</b> every filename used by a configured hidden service,
+ * and to <b>stat_lst</b> every directory used by a configured hidden
+ * service */
+void
+rend_services_add_filenames_to_lists(smartlist_t *open_lst,
+ smartlist_t *stat_lst)
+{
+ if (!rend_service_list)
+ return;
+ SMARTLIST_FOREACH_BEGIN(rend_service_list, rend_service_t *, s) {
+ rend_service_add_filenames_to_list(open_lst, s);
+ smartlist_add(stat_lst, tor_strdup(s->directory));
+ } SMARTLIST_FOREACH_END(s);
+}
+
/** Load and/or generate private keys for the hidden service <b>s</b>,
* possibly including keys for client authorization. Return 0 on success, -1
* on failure. */
@@ -1208,7 +1238,7 @@ rend_service_introduce(origin_circuit_t *circuit, const uint8_t *request,
/* check for replay of PK-encrypted portion. */
replay = replaycache_add_test_and_elapsed(
intro_point->accepted_intro_rsa_parts,
- parsed_req->ciphertext, (int)parsed_req->ciphertext_len,
+ parsed_req->ciphertext, parsed_req->ciphertext_len,
&elapsed);
if (replay) {
@@ -1502,27 +1532,6 @@ find_rp_for_intro(const rend_intro_cell_t *intro,
return rp;
}
-/** Remove unnecessary parts from a rend_intro_cell_t - the ciphertext if
- * already decrypted, the plaintext too if already parsed
- */
-
-void
-rend_service_compact_intro(rend_intro_cell_t *request)
-{
- if (!request) return;
-
- if ((request->plaintext && request->plaintext_len > 0) ||
- request->parsed) {
- tor_free(request->ciphertext);
- request->ciphertext_len = 0;
- }
-
- if (request->parsed) {
- tor_free(request->plaintext);
- request->plaintext_len = 0;
- }
-}
-
/** Free a parsed INTRODUCE1 or INTRODUCE2 cell that was allocated by
* rend_service_parse_intro().
*/
@@ -2061,7 +2070,7 @@ rend_service_decrypt_intro(
if (err_msg_out && !err_msg) {
tor_asprintf(&err_msg,
"unknown INTRODUCE%d error decrypting encrypted part",
- (int)(intro->type));
+ intro ? (int)(intro->type) : -1);
}
if (status >= 0) status = -1;
@@ -2167,7 +2176,7 @@ rend_service_parse_intro_plaintext(
if (err_msg_out && !err_msg) {
tor_asprintf(&err_msg,
"unknown INTRODUCE%d error parsing encrypted part",
- (int)(intro->type));
+ intro ? (int)(intro->type) : -1);
}
if (status >= 0) status = -1;
@@ -2376,7 +2385,7 @@ count_established_intro_points(const char *query)
{
int num_ipos = 0;
circuit_t *circ;
- for (circ = circuit_get_global_list_(); circ; circ = circ->next) {
+ TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) {
if (!circ->marked_for_close &&
circ->state == CIRCUIT_STATE_OPEN &&
(circ->purpose == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO ||
diff --git a/src/or/rendservice.h b/src/or/rendservice.h
index caf88a3d6..40198b07e 100644
--- a/src/or/rendservice.h
+++ b/src/or/rendservice.h
@@ -71,6 +71,8 @@ struct rend_intro_cell_s {
int num_rend_services(void);
int rend_config_services(const or_options_t *options, int validate_only);
int rend_service_load_all_keys(void);
+void rend_services_add_filenames_to_lists(smartlist_t *open_lst,
+ smartlist_t *stat_lst);
void rend_services_introduce(void);
void rend_consider_services_upload(time_t now);
void rend_hsdir_routers_changed(void);
@@ -83,7 +85,6 @@ int rend_service_intro_established(origin_circuit_t *circuit,
void rend_service_rendezvous_has_opened(origin_circuit_t *circuit);
int rend_service_introduce(origin_circuit_t *circuit, const uint8_t *request,
size_t request_len);
-void rend_service_compact_intro(rend_intro_cell_t *request);
int rend_service_decrypt_intro(rend_intro_cell_t *request,
crypto_pk_t *key,
char **err_msg_out);
diff --git a/src/or/rephist.c b/src/or/rephist.c
index 2948bf8f0..5446c25e3 100644
--- a/src/or/rephist.c
+++ b/src/or/rephist.c
@@ -879,126 +879,6 @@ rep_hist_record_mtbf_data(time_t now, int missing_means_down)
return -1;
}
-/** Format the current tracked status of the router in <b>hist</b> at time
- * <b>now</b> for analysis; return it in a newly allocated string. */
-static char *
-rep_hist_format_router_status(or_history_t *hist, time_t now)
-{
- char sor_buf[ISO_TIME_LEN+1];
- char sod_buf[ISO_TIME_LEN+1];
- double wfu;
- double mtbf;
- int up = 0, down = 0;
- char *cp = NULL;
-
- if (hist->start_of_run) {
- format_iso_time(sor_buf, hist->start_of_run);
- up = 1;
- }
- if (hist->start_of_downtime) {
- format_iso_time(sod_buf, hist->start_of_downtime);
- down = 1;
- }
-
- wfu = get_weighted_fractional_uptime(hist, now);
- mtbf = get_stability(hist, now);
- tor_asprintf(&cp,
- "%s%s%s"
- "%s%s%s"
- "wfu %0.3f\n"
- " weighted-time %lu\n"
- " weighted-uptime %lu\n"
- "mtbf %0.1f\n"
- " weighted-run-length %lu\n"
- " total-run-weights %f\n",
- up?"uptime-started ":"", up?sor_buf:"", up?" UTC\n":"",
- down?"downtime-started ":"", down?sod_buf:"", down?" UTC\n":"",
- wfu,
- hist->total_weighted_time,
- hist->weighted_uptime,
- mtbf,
- hist->weighted_run_length,
- hist->total_run_weights
- );
- return cp;
-}
-
-/** The last stability analysis document that we created, or NULL if we never
- * have created one. */
-static char *last_stability_doc = NULL;
-/** The last time we created a stability analysis document, or 0 if we never
- * have created one. */
-static time_t built_last_stability_doc_at = 0;
-/** Shortest allowable time between building two stability documents. */
-#define MAX_STABILITY_DOC_BUILD_RATE (3*60)
-
-/** Return a pointer to a NUL-terminated document describing our view of the
- * stability of the routers we've been tracking. Return NULL on failure. */
-const char *
-rep_hist_get_router_stability_doc(time_t now)
-{
- char *result;
- smartlist_t *chunks;
- if (built_last_stability_doc_at + MAX_STABILITY_DOC_BUILD_RATE > now)
- return last_stability_doc;
-
- if (!history_map)
- return NULL;
-
- tor_free(last_stability_doc);
- chunks = smartlist_new();
-
- if (rep_hist_have_measured_enough_stability()) {
- smartlist_add(chunks, tor_strdup("we-have-enough-measurements\n"));
- } else {
- smartlist_add(chunks, tor_strdup("we-do-not-have-enough-measurements\n"));
- }
-
- DIGESTMAP_FOREACH(history_map, id, or_history_t *, hist) {
- const node_t *node;
- char dbuf[BASE64_DIGEST_LEN+1];
- char *info;
- digest_to_base64(dbuf, id);
- node = node_get_by_id(id);
- if (node) {
- char ip[INET_NTOA_BUF_LEN+1];
- char tbuf[ISO_TIME_LEN+1];
- time_t published = node_get_published_on(node);
- node_get_address_string(node,ip,sizeof(ip));
- if (published > 0)
- format_iso_time(tbuf, published);
- else
- strlcpy(tbuf, "???", sizeof(tbuf));
- smartlist_add_asprintf(chunks,
- "router %s %s %s\n"
- "published %s\n"
- "relevant-flags %s%s%s\n"
- "declared-uptime %ld\n",
- dbuf, node_get_nickname(node), ip,
- tbuf,
- node->is_running ? "Running " : "",
- node->is_valid ? "Valid " : "",
- node->ri && node->ri->is_hibernating ? "Hibernating " : "",
- node_get_declared_uptime(node));
- } else {
- smartlist_add_asprintf(chunks,
- "router %s {no descriptor}\n", dbuf);
- }
- info = rep_hist_format_router_status(hist, now);
- if (info)
- smartlist_add(chunks, info);
-
- } DIGESTMAP_FOREACH_END;
-
- result = smartlist_join_strings(chunks, "", 0, NULL);
- SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp));
- smartlist_free(chunks);
-
- last_stability_doc = result;
- built_last_stability_doc_at = time(NULL);
- return result;
-}
-
/** Helper: return the first j >= i such that !strcmpstart(sl[j], prefix) and
* such that no line sl[k] with i <= k < j starts with "R ". Return -1 if no
* such line exists. */
@@ -1051,7 +931,7 @@ correct_time(time_t t, time_t now, time_t stored_at, time_t started_measuring)
return 0;
else {
long run_length = stored_at - t;
- t = now - run_length;
+ t = (time_t)(now - run_length);
if (t < started_measuring)
t = started_measuring;
return t;
@@ -1212,7 +1092,7 @@ rep_hist_load_mtbf_data(time_t now)
hist->start_of_run = correct_time(start_of_run, now, stored_at,
tracked_since);
if (hist->start_of_run < latest_possible_start + wrl)
- latest_possible_start = hist->start_of_run - wrl;
+ latest_possible_start = (time_t)(hist->start_of_run - wrl);
hist->weighted_run_length = wrl;
hist->total_run_weights = trw;
@@ -1862,22 +1742,20 @@ rep_hist_note_used_port(time_t now, uint16_t port)
add_predicted_port(now, port);
}
-/** For this long after we've seen a request for a given port, assume that
- * we'll want to make connections to the same port in the future. */
-#define PREDICTED_CIRCS_RELEVANCE_TIME (60*60)
-
/** Return a newly allocated pointer to a list of uint16_t * for ports that
* are likely to be asked for in the near future.
*/
smartlist_t *
rep_hist_get_predicted_ports(time_t now)
{
+ int predicted_circs_relevance_time;
smartlist_t *out = smartlist_new();
tor_assert(predicted_ports_list);
+ predicted_circs_relevance_time = get_options()->PredictedPortsRelevanceTime;
/* clean out obsolete entries */
SMARTLIST_FOREACH_BEGIN(predicted_ports_list, predicted_port_t *, pp) {
- if (pp->time + PREDICTED_CIRCS_RELEVANCE_TIME < now) {
+ if (pp->time + predicted_circs_relevance_time < now) {
log_debug(LD_CIRC, "Expiring predicted port %d", pp->port);
rephist_total_alloc -= sizeof(predicted_port_t);
@@ -1944,14 +1822,17 @@ int
rep_hist_get_predicted_internal(time_t now, int *need_uptime,
int *need_capacity)
{
+ int predicted_circs_relevance_time;
+ predicted_circs_relevance_time = get_options()->PredictedPortsRelevanceTime;
+
if (!predicted_internal_time) { /* initialize it */
predicted_internal_time = now;
predicted_internal_uptime_time = now;
predicted_internal_capacity_time = now;
}
- if (predicted_internal_time + PREDICTED_CIRCS_RELEVANCE_TIME < now)
+ if (predicted_internal_time + predicted_circs_relevance_time < now)
return 0; /* too long ago */
- if (predicted_internal_uptime_time + PREDICTED_CIRCS_RELEVANCE_TIME >= now)
+ if (predicted_internal_uptime_time + predicted_circs_relevance_time >= now)
*need_uptime = 1;
// Always predict that we need capacity.
*need_capacity = 1;
@@ -1963,8 +1844,11 @@ rep_hist_get_predicted_internal(time_t now, int *need_uptime,
int
any_predicted_circuits(time_t now)
{
+ int predicted_circs_relevance_time;
+ predicted_circs_relevance_time = get_options()->PredictedPortsRelevanceTime;
+
return smartlist_len(predicted_ports_list) ||
- predicted_internal_time + PREDICTED_CIRCS_RELEVANCE_TIME >= now;
+ predicted_internal_time + predicted_circs_relevance_time >= now;
}
/** Return 1 if we have no need for circuits currently, else return 0. */
@@ -2313,7 +2197,7 @@ rep_hist_format_exit_stats(time_t now)
time_t
rep_hist_exit_stats_write(time_t now)
{
- char *statsdir = NULL, *filename = NULL, *str = NULL;
+ char *str = NULL;
if (!start_of_exit_stats_interval)
return 0; /* Not initialized. */
@@ -2329,19 +2213,12 @@ rep_hist_exit_stats_write(time_t now)
rep_hist_reset_exit_stats(now);
/* Try to write to disk. */
- statsdir = get_datadir_fname("stats");
- if (check_private_dir(statsdir, CPD_CREATE, get_options()->User) < 0) {
- log_warn(LD_HIST, "Unable to create stats/ directory!");
- goto done;
+ if (!check_or_create_data_subdir("stats")) {
+ write_to_data_subdir("stats", "exit-stats", str, "exit port statistics");
}
- filename = get_datadir_fname2("stats", "exit-stats");
- if (write_str_to_file(filename, str, 0) < 0)
- log_warn(LD_HIST, "Unable to write exit port statistics to disk!");
done:
tor_free(str);
- tor_free(statsdir);
- tor_free(filename);
return start_of_exit_stats_interval + WRITE_STATS_INTERVAL;
}
@@ -2434,7 +2311,7 @@ rep_hist_buffer_stats_add_circ(circuit_t *circ, time_t end_of_interval)
return;
start_of_interval = (circ->timestamp_created.tv_sec >
start_of_buffer_stats_interval) ?
- circ->timestamp_created.tv_sec :
+ (time_t)circ->timestamp_created.tv_sec :
start_of_buffer_stats_interval;
interval_length = (int) (end_of_interval - start_of_interval);
if (interval_length <= 0)
@@ -2598,7 +2475,7 @@ time_t
rep_hist_buffer_stats_write(time_t now)
{
circuit_t *circ;
- char *statsdir = NULL, *filename = NULL, *str = NULL;
+ char *str = NULL;
if (!start_of_buffer_stats_interval)
return 0; /* Not initialized. */
@@ -2606,7 +2483,7 @@ rep_hist_buffer_stats_write(time_t now)
goto done; /* Not ready to write */
/* Add open circuits to the history. */
- for (circ = circuit_get_global_list_(); circ; circ = circ->next) {
+ TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) {
rep_hist_buffer_stats_add_circ(circ, now);
}
@@ -2617,19 +2494,12 @@ rep_hist_buffer_stats_write(time_t now)
rep_hist_reset_buffer_stats(now);
/* Try to write to disk. */
- statsdir = get_datadir_fname("stats");
- if (check_private_dir(statsdir, CPD_CREATE, get_options()->User) < 0) {
- log_warn(LD_HIST, "Unable to create stats/ directory!");
- goto done;
+ if (!check_or_create_data_subdir("stats")) {
+ write_to_data_subdir("stats", "buffer-stats", str, "buffer statistics");
}
- filename = get_datadir_fname2("stats", "buffer-stats");
- if (write_str_to_file(filename, str, 0) < 0)
- log_warn(LD_HIST, "Unable to write buffer stats to disk!");
done:
tor_free(str);
- tor_free(filename);
- tor_free(statsdir);
return start_of_buffer_stats_interval + WRITE_STATS_INTERVAL;
}
@@ -2741,7 +2611,7 @@ rep_hist_format_desc_stats(time_t now)
time_t
rep_hist_desc_stats_write(time_t now)
{
- char *statsdir = NULL, *filename = NULL, *str = NULL;
+ char *filename = NULL, *str = NULL;
if (!start_of_served_descs_stats_interval)
return 0; /* We're not collecting stats. */
@@ -2751,10 +2621,8 @@ rep_hist_desc_stats_write(time_t now)
str = rep_hist_format_desc_stats(now);
tor_assert(str != NULL);
- statsdir = get_datadir_fname("stats");
- if (check_private_dir(statsdir, CPD_CREATE, get_options()->User) < 0) {
- log_warn(LD_HIST, "Unable to create stats/ directory!");
- goto done;
+ if (check_or_create_data_subdir("stats") < 0) {
+ goto done;
}
filename = get_datadir_fname2("stats", "served-desc-stats");
if (append_bytes_to_file(filename, str, strlen(str), 0) < 0)
@@ -2763,7 +2631,6 @@ rep_hist_desc_stats_write(time_t now)
rep_hist_reset_desc_stats(now);
done:
- tor_free(statsdir);
tor_free(filename);
tor_free(str);
return start_of_served_descs_stats_interval + WRITE_STATS_INTERVAL;
@@ -2981,7 +2848,7 @@ rep_hist_format_conn_stats(time_t now)
time_t
rep_hist_conn_stats_write(time_t now)
{
- char *statsdir = NULL, *filename = NULL, *str = NULL;
+ char *str = NULL;
if (!start_of_conn_stats_interval)
return 0; /* Not initialized. */
@@ -2995,28 +2862,21 @@ rep_hist_conn_stats_write(time_t now)
rep_hist_reset_conn_stats(now);
/* Try to write to disk. */
- statsdir = get_datadir_fname("stats");
- if (check_private_dir(statsdir, CPD_CREATE, get_options()->User) < 0) {
- log_warn(LD_HIST, "Unable to create stats/ directory!");
- goto done;
+ if (!check_or_create_data_subdir("stats")) {
+ write_to_data_subdir("stats", "conn-stats", str, "connection statistics");
}
- filename = get_datadir_fname2("stats", "conn-stats");
- if (write_str_to_file(filename, str, 0) < 0)
- log_warn(LD_HIST, "Unable to write conn stats to disk!");
done:
tor_free(str);
- tor_free(filename);
- tor_free(statsdir);
return start_of_conn_stats_interval + WRITE_STATS_INTERVAL;
}
/** Internal statistics to track how many requests of each type of
- * handshake we've received, and how many we've completed. Useful for
- * seeing trends in cpu load.
+ * handshake we've received, and how many we've assigned to cpuworkers.
+ * Useful for seeing trends in cpu load.
* @{ */
-static int onion_handshakes_requested[MAX_ONION_HANDSHAKE_TYPE+1] = {0};
-static int onion_handshakes_completed[MAX_ONION_HANDSHAKE_TYPE+1] = {0};
+STATIC int onion_handshakes_requested[MAX_ONION_HANDSHAKE_TYPE+1] = {0};
+STATIC int onion_handshakes_assigned[MAX_ONION_HANDSHAKE_TYPE+1] = {0};
/**@}*/
/** A new onionskin (using the <b>type</b> handshake) has arrived. */
@@ -3030,10 +2890,10 @@ rep_hist_note_circuit_handshake_requested(uint16_t type)
/** We've sent an onionskin (using the <b>type</b> handshake) to a
* cpuworker. */
void
-rep_hist_note_circuit_handshake_completed(uint16_t type)
+rep_hist_note_circuit_handshake_assigned(uint16_t type)
{
if (type <= MAX_ONION_HANDSHAKE_TYPE)
- onion_handshakes_completed[type]++;
+ onion_handshakes_assigned[type]++;
}
/** Log our onionskin statistics since the last time we were called. */
@@ -3041,13 +2901,13 @@ void
rep_hist_log_circuit_handshake_stats(time_t now)
{
(void)now;
- log_notice(LD_HIST, "Circuit handshake stats since last time: "
+ log_notice(LD_HEARTBEAT, "Circuit handshake stats since last time: "
"%d/%d TAP, %d/%d NTor.",
- onion_handshakes_completed[ONION_HANDSHAKE_TYPE_TAP],
+ onion_handshakes_assigned[ONION_HANDSHAKE_TYPE_TAP],
onion_handshakes_requested[ONION_HANDSHAKE_TYPE_TAP],
- onion_handshakes_completed[ONION_HANDSHAKE_TYPE_NTOR],
+ onion_handshakes_assigned[ONION_HANDSHAKE_TYPE_NTOR],
onion_handshakes_requested[ONION_HANDSHAKE_TYPE_NTOR]);
- memset(onion_handshakes_completed, 0, sizeof(onion_handshakes_completed));
+ memset(onion_handshakes_assigned, 0, sizeof(onion_handshakes_assigned));
memset(onion_handshakes_requested, 0, sizeof(onion_handshakes_requested));
}
@@ -3061,11 +2921,9 @@ rep_hist_free_all(void)
tor_free(write_array);
tor_free(dir_read_array);
tor_free(dir_write_array);
- tor_free(last_stability_doc);
tor_free(exit_bytes_read);
tor_free(exit_bytes_written);
tor_free(exit_streams);
- built_last_stability_doc_at = 0;
predicted_ports_free();
bidi_map_free();
diff --git a/src/or/rephist.h b/src/or/rephist.h
index de824749b..cd6231e6e 100644
--- a/src/or/rephist.h
+++ b/src/or/rephist.h
@@ -47,7 +47,6 @@ double rep_hist_get_stability(const char *id, time_t when);
double rep_hist_get_weighted_fractional_uptime(const char *id, time_t when);
long rep_hist_get_weighted_time_known(const char *id, time_t when);
int rep_hist_have_measured_enough_stability(void);
-const char *rep_hist_get_router_stability_doc(time_t now);
void rep_hist_note_used_port(time_t now, uint16_t port);
smartlist_t *rep_hist_get_predicted_ports(time_t now);
@@ -97,7 +96,7 @@ time_t rep_hist_conn_stats_write(time_t now);
void rep_hist_conn_stats_term(void);
void rep_hist_note_circuit_handshake_requested(uint16_t type);
-void rep_hist_note_circuit_handshake_completed(uint16_t type);
+void rep_hist_note_circuit_handshake_assigned(uint16_t type);
void rep_hist_log_circuit_handshake_stats(time_t now);
void rep_hist_free_all(void);
diff --git a/src/or/replaycache.c b/src/or/replaycache.c
index 59b98489b..90f87c12d 100644
--- a/src/or/replaycache.c
+++ b/src/or/replaycache.c
@@ -63,9 +63,9 @@ replaycache_new(time_t horizon, time_t interval)
/** See documentation for replaycache_add_and_test()
*/
-int
+STATIC int
replaycache_add_and_test_internal(
- time_t present, replaycache_t *r, const void *data, int len,
+ time_t present, replaycache_t *r, const void *data, size_t len,
time_t *elapsed)
{
int rv = 0;
@@ -73,7 +73,7 @@ replaycache_add_and_test_internal(
time_t *access_time;
/* sanity check */
- if (present <= 0 || !r || !data || len <= 0) {
+ if (present <= 0 || !r || !data || len == 0) {
log_info(LD_BUG, "replaycache_add_and_test_internal() called with stupid"
" parameters; please fix this.");
goto done;
@@ -127,14 +127,13 @@ replaycache_add_and_test_internal(
/** See documentation for replaycache_scrub_if_needed()
*/
-void
+STATIC void
replaycache_scrub_if_needed_internal(time_t present, replaycache_t *r)
{
digestmap_iter_t *itr = NULL;
const char *digest;
void *valp;
time_t *access_time;
- char scrub_this;
/* sanity check */
if (!r || !(r->digests_seen)) {
@@ -152,20 +151,10 @@ replaycache_scrub_if_needed_internal(time_t present, replaycache_t *r)
/* okay, scrub time */
itr = digestmap_iter_init(r->digests_seen);
while (!digestmap_iter_done(itr)) {
- scrub_this = 0;
digestmap_iter_get(itr, &digest, &valp);
access_time = (time_t *)valp;
- if (access_time) {
- /* aged out yet? */
- if (*access_time < present - r->horizon) scrub_this = 1;
- } else {
- /* Buh? Get rid of it, anyway */
- log_info(LD_BUG, "replaycache_scrub_if_needed_internal() saw a NULL"
- " entry in the digestmap.");
- scrub_this = 1;
- }
-
- if (scrub_this) {
+ /* aged out yet? */
+ if (*access_time < present - r->horizon) {
/* Advance the iterator and remove this one */
itr = digestmap_iter_next_rmv(r->digests_seen, itr);
/* Free the value removed */
@@ -187,7 +176,7 @@ replaycache_scrub_if_needed_internal(time_t present, replaycache_t *r)
*/
int
-replaycache_add_and_test(replaycache_t *r, const void *data, int len)
+replaycache_add_and_test(replaycache_t *r, const void *data, size_t len)
{
return replaycache_add_and_test_internal(time(NULL), r, data, len, NULL);
}
@@ -198,7 +187,7 @@ replaycache_add_and_test(replaycache_t *r, const void *data, int len)
int
replaycache_add_test_and_elapsed(
- replaycache_t *r, const void *data, int len, time_t *elapsed)
+ replaycache_t *r, const void *data, size_t len, time_t *elapsed)
{
return replaycache_add_and_test_internal(time(NULL), r, data, len, elapsed);
}
diff --git a/src/or/replaycache.h b/src/or/replaycache.h
index de20cab62..cd713fe89 100644
--- a/src/or/replaycache.h
+++ b/src/or/replaycache.h
@@ -45,10 +45,10 @@ replaycache_t * replaycache_new(time_t horizon, time_t interval);
* testing. For everything else, use the wrappers below instead.
*/
-int replaycache_add_and_test_internal(
- time_t present, replaycache_t *r, const void *data, int len,
+STATIC int replaycache_add_and_test_internal(
+ time_t present, replaycache_t *r, const void *data, size_t len,
time_t *elapsed);
-void replaycache_scrub_if_needed_internal(
+STATIC void replaycache_scrub_if_needed_internal(
time_t present, replaycache_t *r);
#endif /* REPLAYCACHE_PRIVATE */
@@ -57,9 +57,9 @@ void replaycache_scrub_if_needed_internal(
* replaycache_t methods
*/
-int replaycache_add_and_test(replaycache_t *r, const void *data, int len);
+int replaycache_add_and_test(replaycache_t *r, const void *data, size_t len);
int replaycache_add_test_and_elapsed(
- replaycache_t *r, const void *data, int len, time_t *elapsed);
+ replaycache_t *r, const void *data, size_t len, time_t *elapsed);
void replaycache_scrub_if_needed(replaycache_t *r);
#endif
diff --git a/src/or/router.c b/src/or/router.c
index eabd9c3f5..2cdbb0c8b 100644..100755
--- a/src/or/router.c
+++ b/src/or/router.c
@@ -232,7 +232,8 @@ get_server_identity_key(void)
return server_identitykey;
}
-/** Return true iff the server identity key has been set. */
+/** Return true iff we are a server and the server identity key
+ * has been set. */
int
server_identity_key_is_set(void)
{
@@ -683,6 +684,63 @@ router_initialize_tls_context(void)
(unsigned int)lifetime);
}
+/** Compute fingerprint (or hashed fingerprint if hashed is 1) and write
+ * it to 'fingerprint' (or 'hashed-fingerprint'). Return 0 on success, or
+ * -1 if Tor should die,
+ */
+STATIC int
+router_write_fingerprint(int hashed)
+{
+ char *keydir = NULL, *cp = NULL;
+ const char *fname = hashed ? "hashed-fingerprint" :
+ "fingerprint";
+ char fingerprint[FINGERPRINT_LEN+1];
+ const or_options_t *options = get_options();
+ char *fingerprint_line = NULL;
+ int result = -1;
+
+ keydir = get_datadir_fname(fname);
+ log_info(LD_GENERAL,"Dumping %sfingerprint to \"%s\"...",
+ hashed ? "hashed " : "", keydir);
+ if (!hashed) {
+ if (crypto_pk_get_fingerprint(get_server_identity_key(),
+ fingerprint, 0) < 0) {
+ log_err(LD_GENERAL,"Error computing fingerprint");
+ goto done;
+ }
+ } else {
+ if (crypto_pk_get_hashed_fingerprint(get_server_identity_key(),
+ fingerprint) < 0) {
+ log_err(LD_GENERAL,"Error computing hashed fingerprint");
+ goto done;
+ }
+ }
+
+ tor_asprintf(&fingerprint_line, "%s %s\n", options->Nickname, fingerprint);
+
+ /* Check whether we need to write the (hashed-)fingerprint file. */
+
+ cp = read_file_to_str(keydir, RFTS_IGNORE_MISSING, NULL);
+ if (!cp || strcmp(cp, fingerprint_line)) {
+ if (write_str_to_file(keydir, fingerprint_line, 0)) {
+ log_err(LD_FS, "Error writing %sfingerprint line to file",
+ hashed ? "hashed " : "");
+ goto done;
+ }
+ }
+
+ log_notice(LD_GENERAL, "Your Tor %s identity key fingerprint is '%s %s'",
+ hashed ? "bridge's hashed" : "server's", options->Nickname,
+ fingerprint);
+
+ result = 0;
+ done:
+ tor_free(cp);
+ tor_free(keydir);
+ tor_free(fingerprint_line);
+ return result;
+}
+
/** Initialize all OR private keys, and the TLS context, as necessary.
* On OPs, this only initializes the tls context. Return 0 on success,
* or -1 if Tor should die.
@@ -691,14 +749,10 @@ int
init_keys(void)
{
char *keydir;
- char fingerprint[FINGERPRINT_LEN+1];
- /*nickname<space>fp\n\0 */
- char fingerprint_line[MAX_NICKNAME_LEN+FINGERPRINT_LEN+3];
const char *mydesc;
crypto_pk_t *prkey;
char digest[DIGEST_LEN];
char v3_digest[DIGEST_LEN];
- char *cp;
const or_options_t *options = get_options();
dirinfo_type_t type;
time_t now = time(NULL);
@@ -888,40 +942,16 @@ init_keys(void)
}
}
- /* 5. Dump fingerprint to 'fingerprint' */
- keydir = get_datadir_fname("fingerprint");
- log_info(LD_GENERAL,"Dumping fingerprint to \"%s\"...",keydir);
- if (crypto_pk_get_fingerprint(get_server_identity_key(),
- fingerprint, 0) < 0) {
- log_err(LD_GENERAL,"Error computing fingerprint");
- tor_free(keydir);
+ /* 5. Dump fingerprint and possibly hashed fingerprint to files. */
+ if (router_write_fingerprint(0)) {
+ log_err(LD_FS, "Error writing fingerprint to file");
return -1;
}
- tor_assert(strlen(options->Nickname) <= MAX_NICKNAME_LEN);
- if (tor_snprintf(fingerprint_line, sizeof(fingerprint_line),
- "%s %s\n",options->Nickname, fingerprint) < 0) {
- log_err(LD_GENERAL,"Error writing fingerprint line");
- tor_free(keydir);
+ if (!public_server_mode(options) && router_write_fingerprint(1)) {
+ log_err(LD_FS, "Error writing hashed fingerprint to file");
return -1;
}
- /* Check whether we need to write the fingerprint file. */
- cp = NULL;
- if (file_status(keydir) == FN_FILE)
- cp = read_file_to_str(keydir, 0, NULL);
- if (!cp || strcmp(cp, fingerprint_line)) {
- if (write_str_to_file(keydir, fingerprint_line, 0)) {
- log_err(LD_FS, "Error writing fingerprint line to file");
- tor_free(keydir);
- tor_free(cp);
- return -1;
- }
- }
- tor_free(cp);
- tor_free(keydir);
- log_notice(LD_GENERAL,
- "Your Tor server's identity key fingerprint is '%s %s'",
- options->Nickname, fingerprint);
if (!authdir_mode(options))
return 0;
/* 6. [authdirserver only] load approved-routers file */
@@ -931,12 +961,9 @@ init_keys(void)
}
/* 6b. [authdirserver only] add own key to approved directories. */
crypto_pk_get_digest(get_server_identity_key(), digest);
- type = ((options->V1AuthoritativeDir ? V1_DIRINFO : NO_DIRINFO) |
- (options->V2AuthoritativeDir ? V2_DIRINFO : NO_DIRINFO) |
- (options->V3AuthoritativeDir ?
+ type = ((options->V3AuthoritativeDir ?
(V3_DIRINFO|MICRODESC_DIRINFO|EXTRAINFO_DIRINFO) : NO_DIRINFO) |
- (options->BridgeAuthoritativeDir ? BRIDGE_DIRINFO : NO_DIRINFO) |
- (options->HSAuthoritativeDir ? HIDSERV_DIRINFO : NO_DIRINFO));
+ (options->BridgeAuthoritativeDir ? BRIDGE_DIRINFO : NO_DIRINFO));
ds = router_get_trusteddirserver_by_digest(digest);
if (!ds) {
@@ -1149,7 +1176,7 @@ consider_testing_reachability(int test_or, int test_dir)
/* XXX IPv6 self testing */
log_info(LD_CIRC, "Testing %s of my ORPort: %s:%d.",
!orport_reachable ? "reachability" : "bandwidth",
- me->address, me->or_port);
+ fmt_addr32(me->addr), me->or_port);
circuit_launch_by_extend_info(CIRCUIT_PURPOSE_TESTING, ei,
CIRCLAUNCH_NEED_CAPACITY|CIRCLAUNCH_IS_INTERNAL);
extend_info_free(ei);
@@ -1161,7 +1188,7 @@ consider_testing_reachability(int test_or, int test_dir)
CONN_TYPE_DIR, &addr, me->dir_port,
DIR_PURPOSE_FETCH_SERVERDESC)) {
/* ask myself, via tor, for my server descriptor. */
- directory_initiate_command(me->address, &addr,
+ directory_initiate_command(&addr,
me->or_port, me->dir_port,
me->cache_info.identity_digest,
DIR_PURPOSE_FETCH_SERVERDESC,
@@ -1176,6 +1203,7 @@ router_orport_found_reachable(void)
{
const routerinfo_t *me = router_get_my_routerinfo();
if (!can_reach_or_port && me) {
+ char *address = tor_dup_ip(me->addr);
log_notice(LD_OR,"Self-testing indicates your ORPort is reachable from "
"the outside. Excellent.%s",
get_options()->PublishServerDescriptor_ != NO_DIRINFO ?
@@ -1184,7 +1212,8 @@ router_orport_found_reachable(void)
mark_my_descriptor_dirty("ORPort found reachable");
control_event_server_status(LOG_NOTICE,
"REACHABILITY_SUCCEEDED ORADDRESS=%s:%d",
- me->address, me->or_port);
+ address, me->or_port);
+ tor_free(address);
}
}
@@ -1194,6 +1223,7 @@ router_dirport_found_reachable(void)
{
const routerinfo_t *me = router_get_my_routerinfo();
if (!can_reach_dir_port && me) {
+ char *address = tor_dup_ip(me->addr);
log_notice(LD_DIRSERV,"Self-testing indicates your DirPort is reachable "
"from the outside. Excellent.");
can_reach_dir_port = 1;
@@ -1201,7 +1231,8 @@ router_dirport_found_reachable(void)
mark_my_descriptor_dirty("DirPort found reachable");
control_event_server_status(LOG_NOTICE,
"REACHABILITY_SUCCEEDED DIRADDRESS=%s:%d",
- me->address, me->dir_port);
+ address, me->dir_port);
+ tor_free(address);
}
}
@@ -1236,7 +1267,8 @@ router_perform_bandwidth_test(int num_circs, time_t now)
}
/** Return true iff our network is in some sense disabled: either we're
- * hibernating, entering hibernation, or */
+ * hibernating, entering hibernation, or the network is turned off with
+ * DisableNetwork. */
int
net_is_disabled(void)
{
@@ -1251,22 +1283,6 @@ authdir_mode(const or_options_t *options)
{
return options->AuthoritativeDir != 0;
}
-/** Return true iff we believe ourselves to be a v1 authoritative
- * directory server.
- */
-int
-authdir_mode_v1(const or_options_t *options)
-{
- return authdir_mode(options) && options->V1AuthoritativeDir != 0;
-}
-/** Return true iff we believe ourselves to be a v2 authoritative
- * directory server.
- */
-int
-authdir_mode_v2(const or_options_t *options)
-{
- return authdir_mode(options) && options->V2AuthoritativeDir != 0;
-}
/** Return true iff we believe ourselves to be a v3 authoritative
* directory server.
*/
@@ -1275,13 +1291,11 @@ authdir_mode_v3(const or_options_t *options)
{
return authdir_mode(options) && options->V3AuthoritativeDir != 0;
}
-/** Return true iff we are a v1, v2, or v3 directory authority. */
+/** Return true iff we are a v3 directory authority. */
int
authdir_mode_any_main(const or_options_t *options)
{
- return options->V1AuthoritativeDir ||
- options->V2AuthoritativeDir ||
- options->V3AuthoritativeDir;
+ return options->V3AuthoritativeDir;
}
/** Return true if we believe ourselves to be any kind of
* authoritative directory beyond just a hidserv authority. */
@@ -1335,8 +1349,8 @@ authdir_mode_bridge(const or_options_t *options)
/** Return true iff we are trying to be a server.
*/
-int
-server_mode(const or_options_t *options)
+MOCK_IMPL(int,
+server_mode,(const or_options_t *options))
{
if (options->ClientOnly) return 0;
/* XXXX024 I believe we can kill off ORListenAddress here.*/
@@ -1345,8 +1359,8 @@ server_mode(const or_options_t *options)
/** Return true iff we are trying to be a non-bridge server.
*/
-int
-public_server_mode(const or_options_t *options)
+MOCK_IMPL(int,
+public_server_mode,(const or_options_t *options))
{
if (!server_mode(options)) return 0;
return (!options->BridgeRelay);
@@ -1674,22 +1688,10 @@ router_is_me(const routerinfo_t *router)
return router_digest_is_me(router->cache_info.identity_digest);
}
-/** Return true iff <b>fp</b> is a hex fingerprint of my identity digest. */
-int
-router_fingerprint_is_me(const char *fp)
-{
- char digest[DIGEST_LEN];
- if (strlen(fp) == HEX_DIGEST_LEN &&
- base16_decode(digest, sizeof(digest), fp, HEX_DIGEST_LEN) == 0)
- return router_digest_is_me(digest);
-
- return 0;
-}
-
/** Return a routerinfo for this OR, rebuilding a fresh one if
* necessary. Return NULL on error, or if called on an OP. */
-const routerinfo_t *
-router_get_my_routerinfo(void)
+MOCK_IMPL(const routerinfo_t *,
+router_get_my_routerinfo,(void))
{
if (!server_mode(get_options()))
return NULL;
@@ -1793,7 +1795,6 @@ router_rebuild_descriptor(int force)
ri = tor_malloc_zero(sizeof(routerinfo_t));
ri->cache_info.routerlist_index = -1;
- ri->address = tor_dup_ip(addr);
ri->nickname = tor_strdup(options->Nickname);
ri->addr = addr;
ri->or_port = router_get_advertised_or_port(options);
@@ -1858,7 +1859,7 @@ router_rebuild_descriptor(int force)
policies_parse_exit_policy(options->ExitPolicy, &ri->exit_policy,
options->IPv6Exit,
options->ExitPolicyRejectPrivate,
- ri->address, !options->BridgeRelay);
+ ri->addr, !options->BridgeRelay);
}
ri->policy_is_reject_star =
policy_is_reject_star(ri->exit_policy, AF_INET) &&
@@ -1871,12 +1872,6 @@ router_rebuild_descriptor(int force)
tor_free(p_tmp);
}
-#if 0
- /* XXXX NM NM I belive this is safe to remove */
- if (authdir_mode(options))
- ri->is_valid = ri->is_named = 1; /* believe in yourself */
-#endif
-
if (options->MyFamily && ! options->BridgeRelay) {
smartlist_t *family;
if (!warned_nonexistent_family)
@@ -2249,7 +2244,7 @@ router_guess_address_from_dir_headers(uint32_t *guess)
* string describing the version of Tor and the operating system we're
* currently running on.
*/
-void
+STATIC void
get_platform_str(char *platform, size_t len)
{
tor_snprintf(platform, len, "Tor %s on %s",
@@ -2270,8 +2265,7 @@ char *
router_dump_router_to_string(routerinfo_t *router,
crypto_pk_t *ident_key)
{
- /* XXXX025 Make this look entirely at its arguments, and not at globals.
- */
+ char *address = NULL;
char *onion_pkey = NULL; /* Onion key, PEM-encoded. */
char *identity_pkey = NULL; /* Identity key, PEM-encoded. */
char digest[DIGEST_LEN];
@@ -2345,7 +2339,9 @@ router_dump_router_to_string(routerinfo_t *router,
}
}
+ address = tor_dup_ip(router->addr);
chunks = smartlist_new();
+
/* Generate the easy portion of the router descriptor. */
smartlist_add_asprintf(chunks,
"router %s %s %d 0 %d\n"
@@ -2361,7 +2357,7 @@ router_dump_router_to_string(routerinfo_t *router,
"signing-key\n%s"
"%s%s%s%s",
router->nickname,
- router->address,
+ address,
router->or_port,
decide_to_advertise_dirport(options, router->dir_port),
extra_or_address ? extra_or_address : "",
@@ -2403,20 +2399,13 @@ router_dump_router_to_string(routerinfo_t *router,
if (!router->exit_policy || !smartlist_len(router->exit_policy)) {
smartlist_add(chunks, tor_strdup("reject *:*\n"));
} else if (router->exit_policy) {
- int i;
- for (i = 0; i < smartlist_len(router->exit_policy); ++i) {
- char pbuf[POLICY_BUF_LEN];
- addr_policy_t *tmpe = smartlist_get(router->exit_policy, i);
- int result;
- if (tor_addr_family(&tmpe->addr) == AF_INET6)
- continue; /* Don't include IPv6 parts of address policy */
- result = policy_write_item(pbuf, POLICY_BUF_LEN, tmpe, 1);
- if (result < 0) {
- log_warn(LD_BUG,"descriptor policy_write_item ran out of room!");
- goto err;
- }
- smartlist_add_asprintf(chunks, "%s\n", pbuf);
- }
+ char *exit_policy = router_dump_exit_policy_to_string(router,1,0);
+
+ if (!exit_policy)
+ goto err;
+
+ smartlist_add_asprintf(chunks, "%s\n", exit_policy);
+ tor_free(exit_policy);
}
if (router->ipv6_exit_policy) {
@@ -2475,6 +2464,7 @@ router_dump_router_to_string(routerinfo_t *router,
SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp));
smartlist_free(chunks);
}
+ tor_free(address);
tor_free(family_line);
tor_free(onion_pkey);
tor_free(identity_pkey);
@@ -2483,6 +2473,56 @@ router_dump_router_to_string(routerinfo_t *router,
return output;
}
+/**
+ * OR only: Given <b>router</b>, produce a string with its exit policy.
+ * If <b>include_ipv4</b> is true, include IPv4 entries.
+ * If <b>include_ipv6</b> is true, include IPv6 entries.
+ */
+char *
+router_dump_exit_policy_to_string(const routerinfo_t *router,
+ int include_ipv4,
+ int include_ipv6)
+{
+ smartlist_t *exit_policy_strings;
+ char *policy_string = NULL;
+
+ if ((!router->exit_policy) || (router->policy_is_reject_star)) {
+ return tor_strdup("reject *:*");
+ }
+
+ exit_policy_strings = smartlist_new();
+
+ SMARTLIST_FOREACH_BEGIN(router->exit_policy, addr_policy_t *, tmpe) {
+ char *pbuf;
+ int bytes_written_to_pbuf;
+ if ((tor_addr_family(&tmpe->addr) == AF_INET6) && (!include_ipv6)) {
+ continue; /* Don't include IPv6 parts of address policy */
+ }
+ if ((tor_addr_family(&tmpe->addr) == AF_INET) && (!include_ipv4)) {
+ continue; /* Don't include IPv4 parts of address policy */
+ }
+
+ pbuf = tor_malloc(POLICY_BUF_LEN);
+ bytes_written_to_pbuf = policy_write_item(pbuf,POLICY_BUF_LEN, tmpe, 1);
+
+ if (bytes_written_to_pbuf < 0) {
+ log_warn(LD_BUG, "router_dump_exit_policy_to_string ran out of room!");
+ tor_free(pbuf);
+ goto done;
+ }
+
+ smartlist_add(exit_policy_strings,pbuf);
+ } SMARTLIST_FOREACH_END(tmpe);
+
+ policy_string = smartlist_join_strings(exit_policy_strings, "\n", 0, NULL);
+
+ done:
+ SMARTLIST_FOREACH(exit_policy_strings, char *, str, tor_free(str));
+ smartlist_free(exit_policy_strings);
+
+ return policy_string;
+}
+
/** Copy the primary (IPv4) OR port (IP address and TCP port) for
* <b>router</b> into *<b>ap_out</b>. */
void
diff --git a/src/or/router.h b/src/or/router.h
index 60095d087..d18ff065e 100644
--- a/src/or/router.h
+++ b/src/or/router.h
@@ -12,6 +12,8 @@
#ifndef TOR_ROUTER_H
#define TOR_ROUTER_H
+#include "testsupport.h"
+
crypto_pk_t *get_onion_key(void);
time_t get_onion_key_set_at(void);
void set_server_identity_key(crypto_pk_t *k);
@@ -48,8 +50,6 @@ void router_perform_bandwidth_test(int num_circs, time_t now);
int net_is_disabled(void);
int authdir_mode(const or_options_t *options);
-int authdir_mode_v1(const or_options_t *options);
-int authdir_mode_v2(const or_options_t *options);
int authdir_mode_v3(const or_options_t *options);
int authdir_mode_any_main(const or_options_t *options);
int authdir_mode_any_nonhidserv(const or_options_t *options);
@@ -66,8 +66,8 @@ uint16_t router_get_advertised_or_port_by_af(const or_options_t *options,
uint16_t router_get_advertised_dir_port(const or_options_t *options,
uint16_t dirport);
-int server_mode(const or_options_t *options);
-int public_server_mode(const or_options_t *options);
+MOCK_DECL(int, server_mode, (const or_options_t *options));
+MOCK_DECL(int, public_server_mode, (const or_options_t *options));
int advertised_server_mode(void);
int proxy_mode(const or_options_t *options);
void consider_publishable_server(int force);
@@ -82,7 +82,7 @@ void router_new_address_suggestion(const char *suggestion,
const dir_connection_t *d_conn);
int router_compare_to_my_exit_policy(const tor_addr_t *addr, uint16_t port);
int router_my_exit_policy_is_reject_star(void);
-const routerinfo_t *router_get_my_routerinfo(void);
+MOCK_DECL(const routerinfo_t *, router_get_my_routerinfo, (void));
extrainfo_t *router_get_my_extrainfo(void);
const char *router_get_my_descriptor(void);
const char *router_get_descriptor_gen_reason(void);
@@ -90,11 +90,13 @@ int router_digest_is_me(const char *digest);
const uint8_t *router_get_my_id_digest(void);
int router_extrainfo_digest_is_me(const char *digest);
int router_is_me(const routerinfo_t *router);
-int router_fingerprint_is_me(const char *fp);
int router_pick_published_address(const or_options_t *options, uint32_t *addr);
int router_rebuild_descriptor(int force);
char *router_dump_router_to_string(routerinfo_t *router,
crypto_pk_t *ident_key);
+char *router_dump_exit_policy_to_string(const routerinfo_t *router,
+ int include_ipv4,
+ int include_ipv6);
void router_get_prim_orport(const routerinfo_t *router,
tor_addr_port_t *addr_port_out);
void router_get_pref_orport(const routerinfo_t *router,
@@ -146,7 +148,8 @@ smartlist_t *router_get_all_orports(const routerinfo_t *ri);
#ifdef ROUTER_PRIVATE
/* Used only by router.c and test.c */
-void get_platform_str(char *platform, size_t len);
+STATIC void get_platform_str(char *platform, size_t len);
+STATIC int router_write_fingerprint(int hashed);
#endif
#endif
diff --git a/src/or/routerlist.c b/src/or/routerlist.c
index cb39729ff..8f3477a4a 100644
--- a/src/or/routerlist.c
+++ b/src/or/routerlist.c
@@ -37,7 +37,7 @@
#include "routerlist.h"
#include "routerparse.h"
#include "routerset.h"
-
+#include "../common/sandbox.h"
// #define DEBUG_ROUTERLIST
/****************************************************************************/
@@ -98,7 +98,8 @@ static smartlist_t *trusted_dir_servers = NULL;
* and all fallback directory servers. */
static smartlist_t *fallback_dir_servers = NULL;
-/** List of for a given authority, and download status for latest certificate.
+/** List of certificates for a single authority, and download status for
+ * latest certificate.
*/
struct cert_list_t {
/*
@@ -130,16 +131,6 @@ static smartlist_t *warned_nicknames = NULL;
* download is low. */
static time_t last_descriptor_download_attempted = 0;
-/** When we last computed the weights to use for bandwidths on directory
- * requests, what were the total weighted bandwidth, and our share of that
- * bandwidth? Used to determine what fraction of directory requests we should
- * expect to see.
- *
- * @{ */
-static uint64_t sl_last_total_weighted_bw = 0,
- sl_last_weighted_bw_of_me = 0;
-/**@}*/
-
/** Return the number of directory authorities whose type matches some bit set
* in <b>type</b> */
int
@@ -220,8 +211,6 @@ download_status_is_ready_by_sk_in_cl(cert_list_t *cl,
return rv;
}
-#define get_n_v2_authorities() get_n_authorities(V2_DIRINFO)
-
/** Helper: Return the cert_list_t for an authority whose authority ID is
* <b>id_digest</b>, allocating a new list if necessary. */
static cert_list_t *
@@ -449,7 +438,7 @@ trusted_dirs_flush_certs_to_disk(void)
} DIGESTMAP_FOREACH_END;
filename = get_datadir_fname("cached-certs");
- if (write_chunks_to_file(filename, chunks, 0)) {
+ if (write_chunks_to_file(filename, chunks, 0, 0)) {
log_warn(LD_FS, "Error writing certificates to disk.");
}
tor_free(filename);
@@ -633,6 +622,37 @@ authority_cert_dl_failed(const char *id_digest,
}
}
+static const char *BAD_SIGNING_KEYS[] = {
+ "09CD84F751FD6E955E0F8ADB497D5401470D697E", // Expires 2015-01-11 16:26:31
+ "0E7E9C07F0969D0468AD741E172A6109DC289F3C", // Expires 2014-08-12 10:18:26
+ "57B85409891D3FB32137F642FDEDF8B7F8CDFDCD", // Expires 2015-02-11 17:19:09
+ "87326329007AF781F587AF5B594E540B2B6C7630", // Expires 2014-07-17 11:10:09
+ "98CC82342DE8D298CF99D3F1A396475901E0D38E", // Expires 2014-11-10 13:18:56
+ "9904B52336713A5ADCB13E4FB14DC919E0D45571", // Expires 2014-04-20 20:01:01
+ "9DCD8E3F1DD1597E2AD476BBA28A1A89F3095227", // Expires 2015-01-16 03:52:30
+ "A61682F34B9BB9694AC98491FE1ABBFE61923941", // Expires 2014-06-11 09:25:09
+ "B59F6E99C575113650C99F1C425BA7B20A8C071D", // Expires 2014-07-31 13:22:10
+ "D27178388FA75B96D37FA36E0B015227DDDBDA51", // Expires 2014-08-04 04:01:57
+ NULL,
+};
+
+/** DOCDOC */
+int
+authority_cert_is_blacklisted(const authority_cert_t *cert)
+{
+ char hex_digest[HEX_DIGEST_LEN+1];
+ int i;
+ base16_encode(hex_digest, sizeof(hex_digest),
+ cert->signing_key_digest, sizeof(cert->signing_key_digest));
+
+ for (i = 0; BAD_SIGNING_KEYS[i]; ++i) {
+ if (!strcasecmp(hex_digest, BAD_SIGNING_KEYS[i])) {
+ return 1;
+ }
+ }
+ return 0;
+}
+
/** Return true iff when we've been getting enough failures when trying to
* download the certificate with ID digest <b>id_digest</b> that we're willing
* to start bugging the user about it. */
@@ -650,9 +670,6 @@ authority_cert_dl_looks_uncertain(const char *id_digest)
return n_failures >= N_AUTH_CERT_DL_FAILURES_TO_BUG_USER;
}
-/** How many times will we try to fetch a certificate before giving up? */
-#define MAX_CERT_DL_FAILURES 8
-
/** Try to download any v3 authority certificates that we may be missing. If
* <b>status</b> is provided, try to get all the ones that were used to sign
* <b>status</b>. Additionally, try to have a non-expired certificate for
@@ -684,7 +701,7 @@ authority_certs_fetch_missing(networkstatus_t *status, time_t now)
char id_digest_str[2*DIGEST_LEN+1];
char sk_digest_str[2*DIGEST_LEN+1];
- if (should_delay_dir_fetches(get_options()))
+ if (should_delay_dir_fetches(get_options(), NULL))
return;
pending_cert = fp_pair_map_new();
@@ -724,7 +741,7 @@ authority_certs_fetch_missing(networkstatus_t *status, time_t now)
} SMARTLIST_FOREACH_END(cert);
if (!found &&
download_status_is_ready(&(cl->dl_status_by_id), now,
- MAX_CERT_DL_FAILURES) &&
+ get_options()->TestingCertMaxDownloadTries) &&
!digestmap_get(pending_id, ds->v3_identity_digest)) {
log_info(LD_DIR,
"No current certificate known for authority %s "
@@ -786,7 +803,7 @@ authority_certs_fetch_missing(networkstatus_t *status, time_t now)
}
if (download_status_is_ready_by_sk_in_cl(
cl, sig->signing_key_digest,
- now, MAX_CERT_DL_FAILURES) &&
+ now, get_options()->TestingCertMaxDownloadTries) &&
!fp_pair_map_get_by_digests(pending_cert,
voter->identity_digest,
sig->signing_key_digest)) {
@@ -1072,15 +1089,18 @@ router_rebuild_store(int flags, desc_store_t *store)
smartlist_add(chunk_list, c);
} SMARTLIST_FOREACH_END(sd);
- if (write_chunks_to_file(fname_tmp, chunk_list, 1)<0) {
+ if (write_chunks_to_file(fname_tmp, chunk_list, 1, 1)<0) {
log_warn(LD_FS, "Error writing router store to disk.");
goto done;
}
/* Our mmap is now invalid. */
if (store->mmap) {
- tor_munmap_file(store->mmap);
+ int res = tor_munmap_file(store->mmap);
store->mmap = NULL;
+ if (res != 0) {
+ log_warn(LD_FS, "Unable to munmap route store in %s", fname);
+ }
}
if (replace_file(fname_tmp, fname)<0) {
@@ -1147,32 +1167,25 @@ router_rebuild_store(int flags, desc_store_t *store)
static int
router_reload_router_list_impl(desc_store_t *store)
{
- char *fname = NULL, *altname = NULL, *contents = NULL;
+ char *fname = NULL, *contents = NULL;
struct stat st;
- int read_from_old_location = 0;
int extrainfo = (store->type == EXTRAINFO_STORE);
- time_t now = time(NULL);
store->journal_len = store->store_len = 0;
fname = get_datadir_fname(store->fname_base);
- if (store->fname_alt_base)
- altname = get_datadir_fname(store->fname_alt_base);
- if (store->mmap) /* get rid of it first */
- tor_munmap_file(store->mmap);
- store->mmap = NULL;
+ if (store->mmap) {
+ /* get rid of it first */
+ int res = tor_munmap_file(store->mmap);
+ store->mmap = NULL;
+ if (res != 0) {
+ log_warn(LD_FS, "Failed to munmap %s", fname);
+ tor_free(fname);
+ return -1;
+ }
+ }
store->mmap = tor_mmap_file(fname);
- if (!store->mmap && altname && file_status(altname) == FN_FILE) {
- read_from_old_location = 1;
- log_notice(LD_DIR, "Couldn't read %s; trying to load routers from old "
- "location %s.", fname, altname);
- if ((store->mmap = tor_mmap_file(altname)))
- read_from_old_location = 1;
- }
- if (altname && !read_from_old_location) {
- remove_file_if_very_old(altname, now);
- }
if (store->mmap) {
store->store_len = store->mmap->size;
if (extrainfo)
@@ -1189,14 +1202,6 @@ router_reload_router_list_impl(desc_store_t *store)
fname = get_datadir_fname_suffix(store->fname_base, ".new");
if (file_status(fname) == FN_FILE)
contents = read_file_to_str(fname, RFTS_BIN|RFTS_IGNORE_MISSING, &st);
- if (read_from_old_location) {
- tor_free(altname);
- altname = get_datadir_fname_suffix(store->fname_alt_base, ".new");
- if (!contents)
- contents = read_file_to_str(altname, RFTS_BIN|RFTS_IGNORE_MISSING, &st);
- else
- remove_file_if_very_old(altname, now);
- }
if (contents) {
if (extrainfo)
router_load_extrainfo_from_string(contents, NULL,SAVED_IN_JOURNAL,
@@ -1209,9 +1214,8 @@ router_reload_router_list_impl(desc_store_t *store)
}
tor_free(fname);
- tor_free(altname);
- if (store->journal_len || read_from_old_location) {
+ if (store->journal_len) {
/* Always clear the journal on startup.*/
router_rebuild_store(RRS_FORCE, store);
} else if (!extrainfo) {
@@ -1278,8 +1282,6 @@ const routerstatus_t *
router_pick_directory_server(dirinfo_type_t type, int flags)
{
const routerstatus_t *choice;
- if (get_options()->PreferTunneledDirConns)
- flags |= PDS_PREFER_TUNNELED_DIR_CONNS_;
if (!routerlist)
return NULL;
@@ -1298,47 +1300,6 @@ router_pick_directory_server(dirinfo_type_t type, int flags)
return choice;
}
-/** Try to determine which fraction of v2 and v3 directory requests aimed at
- * caches will be sent to us. Set *<b>v2_share_out</b> and
- * *<b>v3_share_out</b> to the fractions of v2 and v3 protocol shares we
- * expect to see, respectively. Return 0 on success, negative on failure. */
-int
-router_get_my_share_of_directory_requests(double *v2_share_out,
- double *v3_share_out)
-{
- const routerinfo_t *me = router_get_my_routerinfo();
- const routerstatus_t *rs;
- const int pds_flags = PDS_ALLOW_SELF|PDS_IGNORE_FASCISTFIREWALL;
- *v2_share_out = *v3_share_out = 0.0;
- if (!me)
- return -1;
- rs = router_get_consensus_status_by_id(me->cache_info.identity_digest);
- if (!rs)
- return -1;
-
- /* Calling for side effect */
- /* XXXX This is a bit of a kludge */
- if (rs->is_v2_dir) {
- sl_last_total_weighted_bw = 0;
- router_pick_directory_server(V2_DIRINFO, pds_flags);
- if (sl_last_total_weighted_bw != 0) {
- *v2_share_out = U64_TO_DBL(sl_last_weighted_bw_of_me) /
- U64_TO_DBL(sl_last_total_weighted_bw);
- }
- }
-
- {
- sl_last_total_weighted_bw = 0;
- router_pick_directory_server(V3_DIRINFO, pds_flags);
- if (sl_last_total_weighted_bw != 0) {
- *v3_share_out = U64_TO_DBL(sl_last_weighted_bw_of_me) /
- U64_TO_DBL(sl_last_total_weighted_bw);
- }
- }
-
- return 0;
-}
-
/** Return the dir_server_t for the directory authority whose identity
* key hashes to <b>digest</b>, or NULL if no such authority is known.
*/
@@ -1422,8 +1383,6 @@ router_pick_dirserver_generic(smartlist_t *sourcelist,
{
const routerstatus_t *choice;
int busy = 0;
- if (get_options()->PreferTunneledDirConns)
- flags |= PDS_PREFER_TUNNELED_DIR_CONNS_;
choice = router_pick_trusteddirserver_impl(sourcelist, type, flags, &busy);
if (choice || !(flags & PDS_RETRY_IF_NO_SERVERS))
@@ -1448,10 +1407,7 @@ router_pick_dirserver_generic(smartlist_t *sourcelist,
/** Pick a random running valid directory server/mirror from our
* routerlist. Arguments are as for router_pick_directory_server(), except
- * that RETRY_IF_NO_SERVERS is ignored, and:
- *
- * If the PDS_PREFER_TUNNELED_DIR_CONNS_ flag is set, prefer directory servers
- * that we can use with BEGINDIR.
+ * that RETRY_IF_NO_SERVERS is ignored.
*/
static const routerstatus_t *
router_pick_directory_server_impl(dirinfo_type_t type, int flags)
@@ -1465,7 +1421,6 @@ router_pick_directory_server_impl(dirinfo_type_t type, int flags)
const networkstatus_t *consensus = networkstatus_get_latest_consensus();
int requireother = ! (flags & PDS_ALLOW_SELF);
int fascistfirewall = ! (flags & PDS_IGNORE_FASCISTFIREWALL);
- int prefer_tunnel = (flags & PDS_PREFER_TUNNELED_DIR_CONNS_);
int for_guard = (flags & PDS_FOR_GUARD);
int try_excluding = 1, n_excluded = 0;
@@ -1498,8 +1453,6 @@ router_pick_directory_server_impl(dirinfo_type_t type, int flags)
if (requireother && router_digest_is_me(node->identity))
continue;
is_trusted = router_digest_is_trusted_dir(node->identity);
- if ((type & V2_DIRINFO) && !(node->rs->is_v2_dir || is_trusted))
- continue;
if ((type & EXTRAINFO_DIRINFO) &&
!router_supports_extrainfo(node->identity, 0))
continue;
@@ -1520,8 +1473,7 @@ router_pick_directory_server_impl(dirinfo_type_t type, int flags)
is_overloaded = status->last_dir_503_at + DIR_503_TIMEOUT > now;
- if (prefer_tunnel &&
- (!fascistfirewall ||
+ if ((!fascistfirewall ||
fascist_firewall_allows_address_or(&addr, status->or_port)))
smartlist_add(is_trusted ? trusted_tunnel :
is_overloaded ? overloaded_tunnel : tunnel, (void*)node);
@@ -1608,7 +1560,6 @@ router_pick_trusteddirserver_impl(const smartlist_t *sourcelist,
time_t now = time(NULL);
const int requireother = ! (flags & PDS_ALLOW_SELF);
const int fascistfirewall = ! (flags & PDS_IGNORE_FASCISTFIREWALL);
- const int prefer_tunnel = (flags & PDS_PREFER_TUNNELED_DIR_CONNS_);
const int no_serverdesc_fetching =(flags & PDS_NO_EXISTING_SERVERDESC_FETCH);
const int no_microdesc_fetching =(flags & PDS_NO_EXISTING_MICRODESC_FETCH);
const double auth_weight = (sourcelist == fallback_dir_servers) ?
@@ -1669,8 +1620,7 @@ router_pick_trusteddirserver_impl(const smartlist_t *sourcelist,
}
}
- if (prefer_tunnel &&
- d->or_port &&
+ if (d->or_port &&
(!fascistfirewall ||
fascist_firewall_allows_address_or(&addr, d->or_port)))
smartlist_add(is_overloaded ? overloaded_tunnel : tunnel, (void*)d);
@@ -1726,7 +1676,6 @@ mark_all_dirservers_up(smartlist_t *server_list)
routerstatus_t *rs;
node_t *node;
dir->is_running = 1;
- download_status_reset(&dir->v2_ns_dl_status);
node = node_get_mutable_by_id(dir->digest);
if (node)
node->is_running = 1;
@@ -1848,7 +1797,7 @@ router_get_advertised_bandwidth_capped(const routerinfo_t *router)
* doubles, convert them to uint64_t, and try to scale them linearly so as to
* much of the range of uint64_t. If <b>total_out</b> is provided, set it to
* the sum of all elements in the array _before_ scaling. */
-/* private */ void
+STATIC void
scale_array_elements_to_u64(u64_dbl_t *entries, int n_entries,
uint64_t *total_out)
{
@@ -1891,7 +1840,7 @@ gt_i64_timei(uint64_t a, uint64_t b)
* value, and return the index of that element. If all elements are 0, choose
* an index at random. Return -1 on error.
*/
-/* private */ int
+STATIC int
choose_array_element_by_weight(const u64_dbl_t *entries, int n_entries)
{
int i, i_chosen=-1, n_chosen=0;
@@ -1984,8 +1933,7 @@ smartlist_choose_node_by_bandwidth_weights(const smartlist_t *sl,
if (compute_weighted_bandwidths(sl, rule, &bandwidths) < 0)
return NULL;
- scale_array_elements_to_u64(bandwidths, smartlist_len(sl),
- &sl_last_total_weighted_bw);
+ scale_array_elements_to_u64(bandwidths, smartlist_len(sl), NULL);
{
int idx = choose_array_element_by_weight(bandwidths,
@@ -2094,7 +2042,7 @@ compute_weighted_bandwidths(const smartlist_t *sl,
// Cycle through smartlist and total the bandwidth.
SMARTLIST_FOREACH_BEGIN(sl, const node_t *, node) {
- int is_exit = 0, is_guard = 0, is_dir = 0, this_bw = 0, is_me = 0;
+ int is_exit = 0, is_guard = 0, is_dir = 0, this_bw = 0;
double weight = 1;
is_exit = node->is_exit && ! node->is_bad_exit;
is_guard = node->is_possible_guard;
@@ -2117,7 +2065,6 @@ compute_weighted_bandwidths(const smartlist_t *sl,
/* We can't use this one. */
continue;
}
- is_me = router_digest_is_me(node->identity);
if (is_guard && is_exit) {
weight = (is_dir ? Wdb*Wd : Wd);
@@ -2136,8 +2083,6 @@ compute_weighted_bandwidths(const smartlist_t *sl,
weight = 0.0;
bandwidths[node_sl_idx].dbl = weight*this_bw + 0.5;
- if (is_me)
- sl_last_weighted_bw_of_me = (uint64_t) bandwidths[node_sl_idx].dbl;
} SMARTLIST_FOREACH_END(node);
log_debug(LD_CIRC, "Generated weighted bandwidths for rule %s based "
@@ -2219,7 +2164,6 @@ smartlist_choose_node_by_bandwidth(const smartlist_t *sl,
bitarray_t *fast_bits;
bitarray_t *exit_bits;
bitarray_t *guard_bits;
- int me_idx = -1;
// This function does not support WEIGHT_FOR_DIR
// or WEIGHT_FOR_MID
@@ -2253,9 +2197,6 @@ smartlist_choose_node_by_bandwidth(const smartlist_t *sl,
uint32_t this_bw = 0;
i = node_sl_idx;
- if (router_digest_is_me(node->identity))
- me_idx = node_sl_idx;
-
is_exit = node->is_exit;
is_guard = node->is_possible_guard;
if (node->rs) {
@@ -2359,7 +2300,6 @@ smartlist_choose_node_by_bandwidth(const smartlist_t *sl,
if (guard_weight <= 0.0)
guard_weight = 0.0;
- sl_last_weighted_bw_of_me = 0;
for (i=0; i < (unsigned)smartlist_len(sl); i++) {
tor_assert(bandwidths[i].dbl >= 0.0);
@@ -2371,9 +2311,6 @@ smartlist_choose_node_by_bandwidth(const smartlist_t *sl,
bandwidths[i].dbl *= guard_weight;
else if (is_exit)
bandwidths[i].dbl *= exit_weight;
-
- if (i == (unsigned) me_idx)
- sl_last_weighted_bw_of_me = (uint64_t) bandwidths[i].dbl;
}
}
@@ -2392,8 +2329,7 @@ smartlist_choose_node_by_bandwidth(const smartlist_t *sl,
guard_weight, (int)(rule == WEIGHT_FOR_GUARD));
#endif
- scale_array_elements_to_u64(bandwidths, smartlist_len(sl),
- &sl_last_total_weighted_bw);
+ scale_array_elements_to_u64(bandwidths, smartlist_len(sl), NULL);
{
int idx = choose_array_element_by_weight(bandwidths,
@@ -2785,7 +2721,6 @@ router_get_routerlist(void)
routerlist->extra_info_map = eimap_new();
routerlist->desc_store.fname_base = "cached-descriptors";
- routerlist->desc_store.fname_alt_base = "cached-routers";
routerlist->extrainfo_store.fname_base = "cached-extrainfo";
routerlist->desc_store.type = ROUTER_STORE;
@@ -2805,7 +2740,6 @@ routerinfo_free(routerinfo_t *router)
return;
tor_free(router->cache_info.signed_descriptor_body);
- tor_free(router->address);
tor_free(router->nickname);
tor_free(router->platform);
tor_free(router->contact_info);
@@ -2891,10 +2825,18 @@ routerlist_free(routerlist_t *rl)
signed_descriptor_free(sd));
smartlist_free(rl->routers);
smartlist_free(rl->old_routers);
- if (routerlist->desc_store.mmap)
- tor_munmap_file(routerlist->desc_store.mmap);
- if (routerlist->extrainfo_store.mmap)
- tor_munmap_file(routerlist->extrainfo_store.mmap);
+ if (rl->desc_store.mmap) {
+ int res = tor_munmap_file(routerlist->desc_store.mmap);
+ if (res != 0) {
+ log_warn(LD_FS, "Failed to munmap routerlist->desc_store.mmap");
+ }
+ }
+ if (rl->extrainfo_store.mmap) {
+ int res = tor_munmap_file(routerlist->extrainfo_store.mmap);
+ if (res != 0) {
+ log_warn(LD_FS, "Failed to munmap routerlist->extrainfo_store.mmap");
+ }
+ }
tor_free(rl);
router_dir_info_changed();
@@ -3381,7 +3323,6 @@ router_add_to_routerlist(routerinfo_t *router, const char **msg,
routerinfo_t *old_router;
networkstatus_t *consensus =
networkstatus_get_latest_consensus_by_flavor(FLAV_NS);
- const smartlist_t *networkstatus_v2_list = networkstatus_get_v2_list();
int in_consensus = 0;
tor_assert(msg);
@@ -3452,15 +3393,6 @@ router_add_to_routerlist(routerinfo_t *router, const char **msg,
}
/* We no longer need a router with this descriptor digest. */
- SMARTLIST_FOREACH(networkstatus_v2_list, networkstatus_v2_t *, ns,
- {
- routerstatus_t *rs =
- networkstatus_v2_find_mutable_entry(ns, id_digest);
- if (rs && tor_memeq(rs->descriptor_digest,
- router->cache_info.signed_descriptor_digest,
- DIGEST_LEN))
- rs->need_to_mirror = 0;
- });
if (consensus) {
routerstatus_t *rs = networkstatus_vote_find_mutable_entry(
consensus, id_digest);
@@ -3468,7 +3400,6 @@ router_add_to_routerlist(routerinfo_t *router, const char **msg,
router->cache_info.signed_descriptor_digest,
DIGEST_LEN)) {
in_consensus = 1;
- rs->need_to_mirror = 0;
}
}
@@ -3522,7 +3453,6 @@ router_add_to_routerlist(routerinfo_t *router, const char **msg,
signed_desc_append_to_journal(&router->cache_info,
&routerlist->desc_store);
}
- directory_set_dirty();
*msg = authdir_believes_valid ? "Valid server updated" :
("Invalid server updated. (This dirserver is marking your "
"server as unapproved.)");
@@ -3544,7 +3474,6 @@ router_add_to_routerlist(routerinfo_t *router, const char **msg,
signed_desc_append_to_journal(&router->cache_info,
&routerlist->desc_store);
}
- directory_set_dirty();
return ROUTER_ADDED_SUCCESSFULLY;
}
@@ -3707,11 +3636,7 @@ routerlist_remove_old_routers(void)
routerinfo_t *router;
signed_descriptor_t *sd;
digestset_t *retain;
- int caches = directory_caches_dir_info(get_options());
const networkstatus_t *consensus = networkstatus_get_latest_consensus();
- const smartlist_t *networkstatus_v2_list = networkstatus_get_v2_list();
- int have_enough_v2;
- const or_options_t *options = get_options();
trusted_dirs_remove_old_certs();
@@ -3727,38 +3652,10 @@ routerlist_remove_old_routers(void)
{
/* We'll probably retain everything in the consensus. */
int n_max_retain = smartlist_len(consensus->routerstatus_list);
- if (caches && networkstatus_v2_list) {
- /* If we care about v2 statuses, we'll retain at most as many as are
- listed any of the v2 statues. This will be at least the length of
- the largest v2 networkstatus, and in the worst case, this set will be
- equal to the sum of the lengths of all v2 consensuses. Take the
- worst case.
- */
- SMARTLIST_FOREACH(networkstatus_v2_list, networkstatus_v2_t *, ns,
- n_max_retain += smartlist_len(ns->entries));
- }
retain = digestset_new(n_max_retain);
}
cutoff = now - OLD_ROUTER_DESC_MAX_AGE;
- /* Build a list of all the descriptors that _anybody_ lists. */
- if (caches && networkstatus_v2_list) {
- SMARTLIST_FOREACH_BEGIN(networkstatus_v2_list, networkstatus_v2_t *, ns) {
- /* XXXX The inner loop here gets pretty expensive, and actually shows up
- * on some profiles. It may be the reason digestmap_set shows up in
- * profiles too. If instead we kept a per-descriptor digest count of
- * how many networkstatuses recommended each descriptor, and changed
- * that only when the networkstatuses changed, that would be a speed
- * improvement, possibly 1-4% if it also removes digestmap_set from the
- * profile. Not worth it for 0.1.2.x, though. The new directory
- * system will obsolete this whole thing in 0.2.0.x. */
- SMARTLIST_FOREACH_BEGIN(ns->entries, routerstatus_t *, rs) {
- if (rs->published_on >= cutoff)
- digestset_add(retain, rs->descriptor_digest);
- } SMARTLIST_FOREACH_END(rs);
- } SMARTLIST_FOREACH_END(ns);
- }
-
/* Retain anything listed in the consensus. */
if (consensus) {
SMARTLIST_FOREACH(consensus->routerstatus_list, routerstatus_t *, rs,
@@ -3766,18 +3663,11 @@ routerlist_remove_old_routers(void)
digestset_add(retain, rs->descriptor_digest));
}
- /* If we have a consensus, and nearly as many v2 networkstatuses as we want,
- * we should consider pruning current routers that are too old and that
- * nobody recommends. (If we don't have a consensus or enough v2
- * networkstatuses, then we should get more before we decide to kill
- * routers.) */
- /* we set this to true iff we don't care about v2 info, or we have enough. */
- have_enough_v2 = !caches ||
- !(authdir_mode_any_main(options) || options->FetchV2Networkstatus) ||
- (networkstatus_v2_list &&
- smartlist_len(networkstatus_v2_list) > get_n_v2_authorities() / 2);
-
- if (have_enough_v2 && consensus) {
+ /* If we have a consensus, we should consider pruning current routers that
+ * are too old and that nobody recommends. (If we don't have a consensus,
+ * then we should get one before we decide to kill routers.) */
+
+ if (consensus) {
cutoff = now - ROUTER_MAX_AGE;
/* Remove too-old unrecommended members of routerlist->routers. */
for (i = 0; i < smartlist_len(routerlist->routers); ++i) {
@@ -4076,8 +3966,6 @@ signed_desc_digest_is_recognized(signed_descriptor_t *desc)
{
const routerstatus_t *rs;
networkstatus_t *consensus = networkstatus_get_latest_consensus();
- int caches = directory_caches_dir_info(get_options());
- const smartlist_t *networkstatus_v2_list = networkstatus_get_v2_list();
if (consensus) {
rs = networkstatus_vote_find_entry(consensus, desc->identity_digest);
@@ -4085,16 +3973,6 @@ signed_desc_digest_is_recognized(signed_descriptor_t *desc)
desc->signed_descriptor_digest, DIGEST_LEN))
return 1;
}
- if (caches && networkstatus_v2_list) {
- SMARTLIST_FOREACH(networkstatus_v2_list, networkstatus_v2_t *, ns,
- {
- if (!(rs = networkstatus_v2_find_entry(ns, desc->identity_digest)))
- continue;
- if (tor_memeq(rs->descriptor_digest,
- desc->signed_descriptor_digest, DIGEST_LEN))
- return 1;
- });
- }
return 0;
}
@@ -4110,7 +3988,7 @@ update_all_descriptor_downloads(time_t now)
launch_dummy_descriptor_download_as_needed(now, get_options());
}
-/** Clear all our timeouts for fetching v2 and v3 directory stuff, and then
+/** Clear all our timeouts for fetching v3 directory stuff, and then
* give it all a try again. */
void
routerlist_retry_directory_downloads(time_t now)
@@ -4489,12 +4367,8 @@ initiate_descriptor_downloads(const routerstatus_t *source,
* try to split our requests into at least this many requests. */
#define MIN_REQUESTS 3
/** If we want fewer than this many descriptors, wait until we
- * want more, or until MAX_CLIENT_INTERVAL_WITHOUT_REQUEST has
- * passed. */
+ * want more, or until TestingClientMaxIntervalWithoutRequest has passed. */
#define MAX_DL_TO_DELAY 16
-/** When directory clients have only a few servers to request, they batch
- * them until they have more, or until this amount of time has passed. */
-#define MAX_CLIENT_INTERVAL_WITHOUT_REQUEST (10*60)
/** Given a <b>purpose</b> (FETCH_MICRODESC or FETCH_SERVERDESC) and a list of
* router descriptor digests or microdescriptor digest256s in
@@ -4526,7 +4400,7 @@ launch_descriptor_downloads(int purpose,
should_delay = 0;
} else {
should_delay = (last_descriptor_download_attempted +
- MAX_CLIENT_INTERVAL_WITHOUT_REQUEST) > now;
+ options->TestingClientMaxIntervalWithoutRequest) > now;
if (!should_delay && n_downloadable) {
if (last_descriptor_download_attempted) {
log_info(LD_DIR,
@@ -4595,152 +4469,6 @@ launch_descriptor_downloads(int purpose,
}
}
-/** Launch downloads for router status as needed, using the strategy used by
- * authorities and caches: based on the v2 networkstatuses we have, download
- * every descriptor we don't have but would serve, from a random authority
- * that lists it. */
-static void
-update_router_descriptor_cache_downloads_v2(time_t now)
-{
- smartlist_t **downloadable; /* For each authority, what can we dl from it? */
- smartlist_t **download_from; /* ... and, what will we dl from it? */
- digestmap_t *map; /* Which descs are in progress, or assigned? */
- int i, j, n;
- int n_download;
- const or_options_t *options = get_options();
- const smartlist_t *networkstatus_v2_list = networkstatus_get_v2_list();
-
- if (! directory_fetches_dir_info_early(options)) {
- log_warn(LD_BUG, "Called update_router_descriptor_cache_downloads_v2() "
- "on a non-dir-mirror?");
- }
-
- if (!networkstatus_v2_list || !smartlist_len(networkstatus_v2_list))
- return;
-
- map = digestmap_new();
- n = smartlist_len(networkstatus_v2_list);
-
- downloadable = tor_malloc_zero(sizeof(smartlist_t*) * n);
- download_from = tor_malloc_zero(sizeof(smartlist_t*) * n);
-
- /* Set map[d]=1 for the digest of every descriptor that we are currently
- * downloading. */
- list_pending_descriptor_downloads(map, 0);
-
- /* For the digest of every descriptor that we don't have, and that we aren't
- * downloading, add d to downloadable[i] if the i'th networkstatus knows
- * about that descriptor, and we haven't already failed to get that
- * descriptor from the corresponding authority.
- */
- n_download = 0;
- SMARTLIST_FOREACH_BEGIN(networkstatus_v2_list, networkstatus_v2_t *, ns) {
- dir_server_t *ds;
- smartlist_t *dl;
- dl = downloadable[ns_sl_idx] = smartlist_new();
- download_from[ns_sl_idx] = smartlist_new();
- if (ns->published_on + MAX_NETWORKSTATUS_AGE+10*60 < now) {
- /* Don't download if the networkstatus is almost ancient. */
- /* Actually, I suspect what's happening here is that we ask
- * for the descriptor when we have a given networkstatus,
- * and then we get a newer networkstatus, and then we receive
- * the descriptor. Having a networkstatus actually expire is
- * probably a rare event, and we'll probably be happiest if
- * we take this clause out. -RD */
- continue;
- }
-
- /* Don't try dirservers that we think are down -- we might have
- * just tried them and just marked them as down. */
- ds = router_get_trusteddirserver_by_digest(ns->identity_digest);
- if (ds && !ds->is_running)
- continue;
-
- SMARTLIST_FOREACH_BEGIN(ns->entries, routerstatus_t * , rs) {
- if (!rs->need_to_mirror)
- continue;
- if (router_get_by_descriptor_digest(rs->descriptor_digest)) {
- log_warn(LD_BUG,
- "We have a router descriptor, but need_to_mirror=1.");
- rs->need_to_mirror = 0;
- continue;
- }
- if (authdir_mode(options) && dirserv_would_reject_router(rs)) {
- rs->need_to_mirror = 0;
- continue;
- }
- if (digestmap_get(map, rs->descriptor_digest)) {
- /* We're downloading it already. */
- continue;
- } else {
- /* We could download it from this guy. */
- smartlist_add(dl, rs->descriptor_digest);
- ++n_download;
- }
- } SMARTLIST_FOREACH_END(rs);
- } SMARTLIST_FOREACH_END(ns);
-
- /* At random, assign descriptors to authorities such that:
- * - if d is a member of some downloadable[x], d is a member of some
- * download_from[y]. (Everything we want to download, we try to download
- * from somebody.)
- * - If d is a member of download_from[y], d is a member of downloadable[y].
- * (We only try to download descriptors from authorities who claim to have
- * them.)
- * - No d is a member of download_from[x] and download_from[y] s.t. x != y.
- * (We don't try to download anything from two authorities concurrently.)
- */
- while (n_download) {
- int which_ns = crypto_rand_int(n);
- smartlist_t *dl = downloadable[which_ns];
- int idx;
- char *d;
- if (!smartlist_len(dl))
- continue;
- idx = crypto_rand_int(smartlist_len(dl));
- d = smartlist_get(dl, idx);
- if (! digestmap_get(map, d)) {
- smartlist_add(download_from[which_ns], d);
- digestmap_set(map, d, (void*) 1);
- }
- smartlist_del(dl, idx);
- --n_download;
- }
-
- /* Now, we can actually launch our requests. */
- for (i=0; i<n; ++i) {
- networkstatus_v2_t *ns = smartlist_get(networkstatus_v2_list, i);
- dir_server_t *ds =
- router_get_trusteddirserver_by_digest(ns->identity_digest);
- smartlist_t *dl = download_from[i];
- int pds_flags = PDS_RETRY_IF_NO_SERVERS;
- if (! authdir_mode_any_nonhidserv(options))
- pds_flags |= PDS_NO_EXISTING_SERVERDESC_FETCH; /* XXXX ignored*/
-
- if (!ds) {
- log_info(LD_DIR, "Networkstatus with no corresponding authority!");
- continue;
- }
- if (! smartlist_len(dl))
- continue;
- log_info(LD_DIR, "Requesting %d descriptors from authority \"%s\"",
- smartlist_len(dl), ds->nickname);
- for (j=0; j < smartlist_len(dl); j += MAX_DL_PER_REQUEST) {
- initiate_descriptor_downloads(&(ds->fake_status),
- DIR_PURPOSE_FETCH_SERVERDESC, dl, j,
- j+MAX_DL_PER_REQUEST, pds_flags);
- }
- }
-
- for (i=0; i<n; ++i) {
- smartlist_free(download_from[i]);
- smartlist_free(downloadable[i]);
- }
- tor_free(download_from);
- tor_free(downloadable);
- digestmap_free(map,NULL);
-}
-
/** For any descriptor that we want that's currently listed in
* <b>consensus</b>, download it as appropriate. */
void
@@ -4799,7 +4527,7 @@ update_consensus_router_descriptor_downloads(time_t now, int is_vote,
continue; /* We have an in-progress download. */
}
if (!download_status_is_ready(&rs->dl_status, now,
- MAX_ROUTERDESC_DOWNLOAD_FAILURES)) {
+ options->TestingDescriptorMaxDownloadTries)) {
++n_delayed; /* Not ready for retry. */
continue;
}
@@ -4901,13 +4629,10 @@ void
update_router_descriptor_downloads(time_t now)
{
const or_options_t *options = get_options();
- if (should_delay_dir_fetches(options))
+ if (should_delay_dir_fetches(options, NULL))
return;
if (!we_fetch_router_descriptors(options))
return;
- if (directory_fetches_dir_info_early(options)) {
- update_router_descriptor_cache_downloads_v2(now);
- }
update_consensus_router_descriptor_downloads(now, 0,
networkstatus_get_reasonably_live_consensus(now, FLAV_NS));
@@ -4925,7 +4650,7 @@ update_extrainfo_downloads(time_t now)
int n_no_ei = 0, n_pending = 0, n_have = 0, n_delay = 0;
if (! options->DownloadExtraInfo)
return;
- if (should_delay_dir_fetches(options))
+ if (should_delay_dir_fetches(options, NULL))
return;
if (!router_have_minimum_dir_info())
return;
@@ -4959,7 +4684,7 @@ update_extrainfo_downloads(time_t now)
continue;
}
if (!download_status_is_ready(&sd->ei_dl_status, now,
- MAX_ROUTERDESC_DOWNLOAD_FAILURES)) {
+ options->TestingDescriptorMaxDownloadTries)) {
++n_delay;
continue;
}
@@ -5031,7 +4756,7 @@ router_differences_are_cosmetic(const routerinfo_t *r1, const routerinfo_t *r2)
}
/* If any key fields differ, they're different. */
- if (strcasecmp(r1->address, r2->address) ||
+ if (r1->addr != r2->addr ||
strcasecmp(r1->nickname, r2->nickname) ||
r1->or_port != r2->or_port ||
!tor_addr_eq(&r1->ipv6_addr, &r2->ipv6_addr) ||
diff --git a/src/or/routerlist.h b/src/or/routerlist.h
index ce0f0f2e3..6e2f2eaea 100644
--- a/src/or/routerlist.h
+++ b/src/or/routerlist.h
@@ -11,6 +11,8 @@
#ifndef TOR_ROUTERLIST_H
#define TOR_ROUTERLIST_H
+#include "testsupport.h"
+
int get_n_authorities(dirinfo_type_t type);
int trusted_dirs_reload_certs(void);
@@ -41,6 +43,7 @@ int router_reload_router_list(void);
int authority_cert_dl_looks_uncertain(const char *id_digest);
const smartlist_t *router_get_trusted_dir_servers(void);
const smartlist_t *router_get_fallback_dir_servers(void);
+int authority_cert_is_blacklisted(const authority_cert_t *cert);
const routerstatus_t *router_pick_directory_server(dirinfo_type_t type,
int flags);
@@ -52,8 +55,7 @@ const routerstatus_t *router_pick_trusteddirserver(dirinfo_type_t type,
int flags);
const routerstatus_t *router_pick_fallback_dirserver(dirinfo_type_t type,
int flags);
-int router_get_my_share_of_directory_requests(double *v2_share_out,
- double *v3_share_out);
+int router_get_my_share_of_directory_requests(double *v3_share_out);
void router_reset_status_download_failures(void);
int routers_have_same_or_addrs(const routerinfo_t *r1, const routerinfo_t *r2);
const routerinfo_t *routerlist_find_my_routerinfo(void);
@@ -206,9 +208,10 @@ typedef union u64_dbl_t {
double dbl;
} u64_dbl_t;
-int choose_array_element_by_weight(const u64_dbl_t *entries, int n_entries);
-void scale_array_elements_to_u64(u64_dbl_t *entries, int n_entries,
- uint64_t *total_out);
+STATIC int choose_array_element_by_weight(const u64_dbl_t *entries,
+ int n_entries);
+STATIC void scale_array_elements_to_u64(u64_dbl_t *entries, int n_entries,
+ uint64_t *total_out);
#endif
#endif
diff --git a/src/or/routerparse.c b/src/or/routerparse.c
index 3aa4bdf8a..5add728d6 100644
--- a/src/or/routerparse.c
+++ b/src/or/routerparse.c
@@ -339,7 +339,7 @@ static token_rule_t extrainfo_token_table[] = {
END_OF_TABLE
};
-/** List of tokens recognized in the body part of v2 and v3 networkstatus
+/** List of tokens recognized in the body part of v3 networkstatus
* documents. */
static token_rule_t rtrstatus_token_table[] = {
T01("p", K_P, CONCAT_ARGS, NO_OBJ ),
@@ -353,31 +353,6 @@ static token_rule_t rtrstatus_token_table[] = {
END_OF_TABLE
};
-/** List of tokens recognized in the header part of v2 networkstatus documents.
- */
-static token_rule_t netstatus_token_table[] = {
- T1( "published", K_PUBLISHED, CONCAT_ARGS, NO_OBJ ),
- T0N("opt", K_OPT, CONCAT_ARGS, OBJ_OK ),
- T1( "contact", K_CONTACT, CONCAT_ARGS, NO_OBJ ),
- T1( "dir-signing-key", K_DIR_SIGNING_KEY, NO_ARGS, NEED_KEY_1024 ),
- T1( "fingerprint", K_FINGERPRINT, CONCAT_ARGS, NO_OBJ ),
- T1_START("network-status-version", K_NETWORK_STATUS_VERSION,
- GE(1), NO_OBJ ),
- T1( "dir-source", K_DIR_SOURCE, GE(3), NO_OBJ ),
- T01("dir-options", K_DIR_OPTIONS, ARGS, NO_OBJ ),
- T01("client-versions", K_CLIENT_VERSIONS, CONCAT_ARGS, NO_OBJ ),
- T01("server-versions", K_SERVER_VERSIONS, CONCAT_ARGS, NO_OBJ ),
-
- END_OF_TABLE
-};
-
-/** List of tokens recognized in the footer of v1/v2 directory/networkstatus
- * footers. */
-static token_rule_t dir_footer_token_table[] = {
- T1("directory-signature", K_DIRECTORY_SIGNATURE, EQ(1), NEED_OBJ ),
- END_OF_TABLE
-};
-
/** List of tokens common to V3 authority certificates and V3 consensuses. */
#define CERTIFICATE_MEMBERS \
T1("dir-key-certificate-version", K_DIR_KEY_CERTIFICATE_VERSION, \
@@ -386,7 +361,7 @@ static token_rule_t dir_footer_token_table[] = {
T1("dir-key-published",K_DIR_KEY_PUBLISHED, CONCAT_ARGS, NO_OBJ), \
T1("dir-key-expires", K_DIR_KEY_EXPIRES, CONCAT_ARGS, NO_OBJ), \
T1("dir-signing-key", K_DIR_SIGNING_KEY, NO_ARGS, NEED_KEY ),\
- T01("dir-key-crosscert", K_DIR_KEY_CROSSCERT, NO_ARGS, NEED_OBJ ),\
+ T1("dir-key-crosscert", K_DIR_KEY_CROSSCERT, NO_ARGS, NEED_OBJ ),\
T1("dir-key-certification", K_DIR_KEY_CERTIFICATION, \
NO_ARGS, NEED_OBJ), \
T01("dir-address", K_DIR_ADDRESS, GE(1), NO_OBJ),
@@ -486,8 +461,7 @@ static token_rule_t networkstatus_consensus_token_table[] = {
END_OF_TABLE
};
-/** List of tokens recognized in the footer of v1/v2 directory/networkstatus
- * footers. */
+/** List of tokens recognized in the footer of v1 directory footers. */
static token_rule_t networkstatus_vote_footer_token_table[] = {
T01("directory-footer", K_DIRECTORY_FOOTER, NO_ARGS, NO_OBJ ),
T01("bandwidth-weights", K_BW_WEIGHTS, ARGS, NO_OBJ ),
@@ -598,7 +572,7 @@ dump_desc(const char *desc, const char *type)
char *content = tor_malloc_zero(filelen);
tor_snprintf(content, filelen, "Unable to parse descriptor of type "
"%s:\n%s", type, desc);
- write_str_to_file(debugfile, content, 0);
+ write_str_to_file(debugfile, content, 1);
log_info(LD_DIR, "Unable to parse descriptor of type %s. See file "
"unparseable-desc in data directory for details.", type);
tor_free(content);
@@ -629,28 +603,6 @@ router_get_router_hash(const char *s, size_t s_len, char *digest)
DIGEST_SHA1);
}
-/** Set <b>digest</b> to the SHA-1 digest of the hash of the running-routers
- * string in <b>s</b>. Return 0 on success, -1 on failure.
- */
-int
-router_get_runningrouters_hash(const char *s, char *digest)
-{
- return router_get_hash_impl(s, strlen(s), digest,
- "network-status","\ndirectory-signature", '\n',
- DIGEST_SHA1);
-}
-
-/** Set <b>digest</b> to the SHA-1 digest of the hash of the network-status
- * string in <b>s</b>. Return 0 on success, -1 on failure. */
-int
-router_get_networkstatus_v2_hash(const char *s, char *digest)
-{
- return router_get_hash_impl(s, strlen(s), digest,
- "network-status-version","\ndirectory-signature",
- '\n',
- DIGEST_SHA1);
-}
-
/** Set <b>digests</b> to all the digests of the consensus document in
* <b>s</b> */
int
@@ -728,7 +680,7 @@ router_get_dirobj_signature(const char *digest,
/** Helper: used to generate signatures for routers, directories and
* network-status objects. Given a digest in <b>digest</b> and a secret
- * <b>private_key</b>, generate an PKCS1-padded signature, BASE64-encode it,
+ * <b>private_key</b>, generate a PKCS1-padded signature, BASE64-encode it,
* surround it with -----BEGIN/END----- pairs, and write it to the
* <b>buf_len</b>-byte buffer at <b>buf</b>. Return 0 on success, -1 on
* failure.
@@ -751,6 +703,7 @@ router_append_dirobj_signature(char *buf, size_t buf_len, const char *digest,
return -1;
}
memcpy(buf+s_len, sig, sig_len+1);
+ tor_free(sig);
return 0;
}
@@ -1232,8 +1185,7 @@ router_parse_entry_from_string(const char *s, const char *end,
log_warn(LD_DIR,"Router nickname is invalid");
goto err;
}
- router->address = tor_strdup(tok->args[1]);
- if (!tor_inet_aton(router->address, &in)) {
+ if (!tor_inet_aton(tok->args[1], &in)) {
log_warn(LD_DIR,"Router address is not an IP address.");
goto err;
}
@@ -1728,7 +1680,6 @@ authority_cert_parse_from_string(const char *s, const char **end_of_string)
log_debug(LD_DIR, "We already checked the signature on this "
"certificate; no need to do so again.");
found = 1;
- cert->is_cross_certified = old_cert->is_cross_certified;
}
}
if (!found) {
@@ -1737,18 +1688,14 @@ authority_cert_parse_from_string(const char *s, const char **end_of_string)
goto err;
}
- if ((tok = find_opt_by_keyword(tokens, K_DIR_KEY_CROSSCERT))) {
- /* XXXX Once all authorities generate cross-certified certificates,
- * make this field mandatory. */
- if (check_signature_token(cert->cache_info.identity_digest,
- DIGEST_LEN,
- tok,
- cert->signing_key,
- CST_NO_CHECK_OBJTYPE,
- "key cross-certification")) {
- goto err;
- }
- cert->is_cross_certified = 1;
+ tok = find_by_keyword(tokens, K_DIR_KEY_CROSSCERT);
+ if (check_signature_token(cert->cache_info.identity_digest,
+ DIGEST_LEN,
+ tok,
+ cert->signing_key,
+ CST_NO_CHECK_OBJTYPE,
+ "key cross-certification")) {
+ goto err;
}
}
@@ -1948,8 +1895,6 @@ routerstatus_parse_entry_from_string(memarea_t *area,
rs->is_named = 1;
else if (!strcmp(tok->args[i], "Valid"))
rs->is_valid = 1;
- else if (!strcmp(tok->args[i], "V2Dir"))
- rs->is_v2_dir = 1;
else if (!strcmp(tok->args[i], "Guard"))
rs->is_possible_guard = 1;
else if (!strcmp(tok->args[i], "BadExit"))
@@ -2084,14 +2029,6 @@ routerstatus_parse_entry_from_string(memarea_t *area,
return rs;
}
-/** Helper to sort a smartlist of pointers to routerstatus_t */
-int
-compare_routerstatus_entries(const void **_a, const void **_b)
-{
- const routerstatus_t *a = *_a, *b = *_b;
- return fast_memcmp(a->identity_digest, b->identity_digest, DIGEST_LEN);
-}
-
int
compare_vote_routerstatus_entries(const void **_a, const void **_b)
{
@@ -2100,188 +2037,6 @@ compare_vote_routerstatus_entries(const void **_a, const void **_b)
DIGEST_LEN);
}
-/** Helper: used in call to _smartlist_uniq to clear out duplicate entries. */
-static void
-free_duplicate_routerstatus_entry_(void *e)
-{
- log_warn(LD_DIR,
- "Network-status has two entries for the same router. "
- "Dropping one.");
- routerstatus_free(e);
-}
-
-/** Given a v2 network-status object in <b>s</b>, try to
- * parse it and return the result. Return NULL on failure. Check the
- * signature of the network status, but do not (yet) check the signing key for
- * authority.
- */
-networkstatus_v2_t *
-networkstatus_v2_parse_from_string(const char *s)
-{
- const char *eos, *s_dup = s;
- smartlist_t *tokens = smartlist_new();
- smartlist_t *footer_tokens = smartlist_new();
- networkstatus_v2_t *ns = NULL;
- char ns_digest[DIGEST_LEN];
- char tmp_digest[DIGEST_LEN];
- struct in_addr in;
- directory_token_t *tok;
- int i;
- memarea_t *area = NULL;
-
- if (router_get_networkstatus_v2_hash(s, ns_digest)) {
- log_warn(LD_DIR, "Unable to compute digest of network-status");
- goto err;
- }
-
- area = memarea_new();
- eos = find_start_of_next_routerstatus(s);
- if (tokenize_string(area, s, eos, tokens, netstatus_token_table,0)) {
- log_warn(LD_DIR, "Error tokenizing network-status header.");
- goto err;
- }
- ns = tor_malloc_zero(sizeof(networkstatus_v2_t));
- memcpy(ns->networkstatus_digest, ns_digest, DIGEST_LEN);
-
- tok = find_by_keyword(tokens, K_NETWORK_STATUS_VERSION);
- tor_assert(tok->n_args >= 1);
- if (strcmp(tok->args[0], "2")) {
- log_warn(LD_BUG, "Got a non-v2 networkstatus. Version was "
- "%s", escaped(tok->args[0]));
- goto err;
- }
-
- tok = find_by_keyword(tokens, K_DIR_SOURCE);
- tor_assert(tok->n_args >= 3);
- ns->source_address = tor_strdup(tok->args[0]);
- if (tor_inet_aton(tok->args[1], &in) == 0) {
- log_warn(LD_DIR, "Error parsing network-status source address %s",
- escaped(tok->args[1]));
- goto err;
- }
- ns->source_addr = ntohl(in.s_addr);
- ns->source_dirport =
- (uint16_t) tor_parse_long(tok->args[2],10,0,65535,NULL,NULL);
- if (ns->source_dirport == 0) {
- log_warn(LD_DIR, "Directory source without dirport; skipping.");
- goto err;
- }
-
- tok = find_by_keyword(tokens, K_FINGERPRINT);
- tor_assert(tok->n_args);
- if (base16_decode(ns->identity_digest, DIGEST_LEN, tok->args[0],
- strlen(tok->args[0]))) {
- log_warn(LD_DIR, "Couldn't decode networkstatus fingerprint %s",
- escaped(tok->args[0]));
- goto err;
- }
-
- if ((tok = find_opt_by_keyword(tokens, K_CONTACT))) {
- tor_assert(tok->n_args);
- ns->contact = tor_strdup(tok->args[0]);
- }
-
- tok = find_by_keyword(tokens, K_DIR_SIGNING_KEY);
- tor_assert(tok->key);
- ns->signing_key = tok->key;
- tok->key = NULL;
-
- if (crypto_pk_get_digest(ns->signing_key, tmp_digest)<0) {
- log_warn(LD_DIR, "Couldn't compute signing key digest");
- goto err;
- }
- if (tor_memneq(tmp_digest, ns->identity_digest, DIGEST_LEN)) {
- log_warn(LD_DIR,
- "network-status fingerprint did not match dir-signing-key");
- goto err;
- }
-
- if ((tok = find_opt_by_keyword(tokens, K_DIR_OPTIONS))) {
- for (i=0; i < tok->n_args; ++i) {
- if (!strcmp(tok->args[i], "Names"))
- ns->binds_names = 1;
- if (!strcmp(tok->args[i], "Versions"))
- ns->recommends_versions = 1;
- if (!strcmp(tok->args[i], "BadExits"))
- ns->lists_bad_exits = 1;
- if (!strcmp(tok->args[i], "BadDirectories"))
- ns->lists_bad_directories = 1;
- }
- }
-
- if (ns->recommends_versions) {
- if (!(tok = find_opt_by_keyword(tokens, K_CLIENT_VERSIONS))) {
- log_warn(LD_DIR, "Missing client-versions on versioning directory");
- goto err;
- }
- ns->client_versions = tor_strdup(tok->args[0]);
-
- if (!(tok = find_opt_by_keyword(tokens, K_SERVER_VERSIONS)) ||
- tok->n_args<1) {
- log_warn(LD_DIR, "Missing server-versions on versioning directory");
- goto err;
- }
- ns->server_versions = tor_strdup(tok->args[0]);
- }
-
- tok = find_by_keyword(tokens, K_PUBLISHED);
- tor_assert(tok->n_args == 1);
- if (parse_iso_time(tok->args[0], &ns->published_on) < 0) {
- goto err;
- }
-
- ns->entries = smartlist_new();
- s = eos;
- SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t));
- smartlist_clear(tokens);
- memarea_clear(area);
- while (!strcmpstart(s, "r ")) {
- routerstatus_t *rs;
- if ((rs = routerstatus_parse_entry_from_string(area, &s, tokens,
- NULL, NULL, 0, 0)))
- smartlist_add(ns->entries, rs);
- }
- smartlist_sort(ns->entries, compare_routerstatus_entries);
- smartlist_uniq(ns->entries, compare_routerstatus_entries,
- free_duplicate_routerstatus_entry_);
-
- if (tokenize_string(area,s, NULL, footer_tokens, dir_footer_token_table,0)) {
- log_warn(LD_DIR, "Error tokenizing network-status footer.");
- goto err;
- }
- if (smartlist_len(footer_tokens) < 1) {
- log_warn(LD_DIR, "Too few items in network-status footer.");
- goto err;
- }
- tok = smartlist_get(footer_tokens, smartlist_len(footer_tokens)-1);
- if (tok->tp != K_DIRECTORY_SIGNATURE) {
- log_warn(LD_DIR,
- "Expected network-status footer to end with a signature.");
- goto err;
- }
-
- note_crypto_pk_op(VERIFY_DIR);
- if (check_signature_token(ns_digest, DIGEST_LEN, tok, ns->signing_key, 0,
- "network-status") < 0)
- goto err;
-
- goto done;
- err:
- dump_desc(s_dup, "v2 networkstatus");
- networkstatus_v2_free(ns);
- ns = NULL;
- done:
- SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t));
- smartlist_free(tokens);
- SMARTLIST_FOREACH(footer_tokens, directory_token_t *, t, token_clear(t));
- smartlist_free(footer_tokens);
- if (area) {
- DUMP_AREA(area, "v2 networkstatus");
- memarea_drop_all(area);
- }
- return ns;
-}
-
/** Verify the bandwidth weights of a network status document */
int
networkstatus_verify_bw_weights(networkstatus_t *ns, int consensus_method)
@@ -2932,6 +2687,14 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out,
log_warn(LD_DIR,"Mismatch between identities in certificate and vote");
goto err;
}
+ if (ns->type != NS_TYPE_CONSENSUS) {
+ if (authority_cert_is_blacklisted(ns->cert)) {
+ log_warn(LD_DIR, "Rejecting vote signature made with blacklisted "
+ "signing key %s",
+ hex_str(ns->cert->signing_key_digest, DIGEST_LEN));
+ goto err;
+ }
+ }
voter->address = tor_strdup(tok->args[2]);
if (!tor_inet_aton(tok->args[3], &in)) {
log_warn(LD_DIR, "Error decoding IP address %s in network-status.",
@@ -4366,11 +4129,13 @@ microdescs_parse_from_string(const char *s, const char *eos,
microdesc_free(md);
md = NULL;
+ SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t));
memarea_clear(area);
smartlist_clear(tokens);
s = start_of_next_microdesc;
}
+ SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t));
memarea_drop_all(area);
smartlist_free(tokens);
diff --git a/src/or/routerparse.h b/src/or/routerparse.h
index eb2e885cb..5d5d9e59e 100644
--- a/src/or/routerparse.h
+++ b/src/or/routerparse.h
@@ -14,8 +14,6 @@
int router_get_router_hash(const char *s, size_t s_len, char *digest);
int router_get_dir_hash(const char *s, char *digest);
-int router_get_runningrouters_hash(const char *s, char *digest);
-int router_get_networkstatus_v2_hash(const char *s, char *digest);
int router_get_networkstatus_v3_hashes(const char *s, digests_t *digests);
int router_get_extrainfo_hash(const char *s, size_t s_len, char *digest);
#define DIROBJ_MAX_SIG_LEN 256
@@ -52,9 +50,7 @@ void sort_version_list(smartlist_t *lst, int remove_duplicates);
void assert_addr_policy_ok(smartlist_t *t);
void dump_distinct_digest_count(int severity);
-int compare_routerstatus_entries(const void **_a, const void **_b);
int compare_vote_routerstatus_entries(const void **_a, const void **_b);
-networkstatus_v2_t *networkstatus_v2_parse_from_string(const char *s);
int networkstatus_verify_bw_weights(networkstatus_t *ns, int);
networkstatus_t *networkstatus_parse_vote_from_string(const char *s,
const char **eos_out,
diff --git a/src/or/routerset.c b/src/or/routerset.c
index 2e41f7f6c..7aee90d6d 100644
--- a/src/or/routerset.c
+++ b/src/or/routerset.c
@@ -358,39 +358,6 @@ routerset_get_all_nodes(smartlist_t *out, const routerset_t *routerset,
}
}
-#if 0
-/** Add to <b>target</b> every node_t from <b>source</b> except:
- *
- * 1) Don't add it if <b>include</b> is non-empty and the relay isn't in
- * <b>include</b>; and
- * 2) Don't add it if <b>exclude</b> is non-empty and the relay is
- * excluded in a more specific fashion by <b>exclude</b>.
- * 3) If <b>running_only</b>, don't add non-running routers.
- */
-void
-routersets_get_node_disjunction(smartlist_t *target,
- const smartlist_t *source,
- const routerset_t *include,
- const routerset_t *exclude, int running_only)
-{
- SMARTLIST_FOREACH(source, const node_t *, node, {
- int include_result;
- if (running_only && !node->is_running)
- continue;
- if (!routerset_is_empty(include))
- include_result = routerset_contains_node(include, node);
- else
- include_result = 1;
-
- if (include_result) {
- int exclude_result = routerset_contains_node(exclude, node);
- if (include_result >= exclude_result)
- smartlist_add(target, (void*)node);
- }
- });
-}
-#endif
-
/** Remove every node_t from <b>lst</b> that is in <b>routerset</b>. */
void
routerset_subtract_nodes(smartlist_t *lst, const routerset_t *routerset)
diff --git a/src/or/routerset.h b/src/or/routerset.h
index bfa0c59ac..8261c7fb0 100644
--- a/src/or/routerset.h
+++ b/src/or/routerset.h
@@ -32,12 +32,6 @@ void routerset_get_all_nodes(smartlist_t *out, const routerset_t *routerset,
const routerset_t *excludeset,
int running_only);
int routerset_add_unknown_ccs(routerset_t **setp, int only_if_some_cc_set);
-#if 0
-void routersets_get_node_disjunction(smartlist_t *target,
- const smartlist_t *source,
- const routerset_t *include,
- const routerset_t *exclude, int running_only);
-#endif
void routerset_subtract_nodes(smartlist_t *out,
const routerset_t *routerset);
diff --git a/src/or/statefile.c b/src/or/statefile.c
index bcb7b0741..7b9998fc1 100644
--- a/src/or/statefile.c
+++ b/src/or/statefile.c
@@ -4,6 +4,7 @@
* Copyright (c) 2007-2013, The Tor Project, Inc. */
/* See LICENSE for licensing information */
+#define STATEFILE_PRIVATE
#include "or.h"
#include "circuitstats.h"
#include "config.h"
@@ -12,6 +13,7 @@
#include "hibernate.h"
#include "rephist.h"
#include "router.h"
+#include "sandbox.h"
#include "statefile.h"
/** A list of state-file "abbreviations," for compatibility. */
@@ -90,8 +92,11 @@ static config_var_t state_vars_[] = {
#undef VAR
#undef V
-static int or_state_validate(or_state_t *old_options, or_state_t *options,
- int from_setconf, char **msg);
+static int or_state_validate(or_state_t *state, char **msg);
+
+static int or_state_validate_cb(void *old_options, void *options,
+ void *default_options,
+ int from_setconf, char **msg);
/** Magic value for or_state_t. */
#define OR_STATE_MAGIC 0x57A73f57
@@ -109,7 +114,7 @@ static const config_format_t state_format = {
STRUCT_OFFSET(or_state_t, magic_),
state_abbrevs_,
state_vars_,
- (validate_fn_t)or_state_validate,
+ or_state_validate_cb,
&state_extra_var,
};
@@ -117,8 +122,8 @@ static const config_format_t state_format = {
static or_state_t *global_state = NULL;
/** Return the persistent state struct for this Tor. */
-or_state_t *
-get_or_state(void)
+MOCK_IMPL(or_state_t *,
+get_or_state, (void))
{
tor_assert(global_state);
return global_state;
@@ -194,21 +199,27 @@ validate_transports_in_state(or_state_t *state)
return 0;
}
-/** Return 0 if every setting in <b>state</b> is reasonable, and a
- * permissible transition from <b>old_state</b>. Else warn and return -1.
- * Should have no side effects, except for normalizing the contents of
- * <b>state</b>.
- */
-/* XXX from_setconf is here because of bug 238 */
static int
-or_state_validate(or_state_t *old_state, or_state_t *state,
- int from_setconf, char **msg)
+or_state_validate_cb(void *old_state, void *state, void *default_state,
+ int from_setconf, char **msg)
{
/* We don't use these; only options do. Still, we need to match that
* signature. */
(void) from_setconf;
+ (void) default_state;
(void) old_state;
+ return or_state_validate(state, msg);
+}
+
+/** Return 0 if every setting in <b>state</b> is reasonable, and a
+ * permissible transition from <b>old_state</b>. Else warn and return -1.
+ * Should have no side effects, except for normalizing the contents of
+ * <b>state</b>.
+ */
+static int
+or_state_validate(or_state_t *state, char **msg)
+{
if (entry_guards_parse_state(state, 0, msg)<0)
return -1;
@@ -237,7 +248,8 @@ or_state_set(or_state_t *new_state)
tor_free(err);
ret = -1;
}
- if (circuit_build_times_parse_state(&circ_times, global_state) < 0) {
+ if (circuit_build_times_parse_state(
+ get_circuit_build_times_mutable(),global_state) < 0) {
ret = -1;
}
return ret;
@@ -249,7 +261,7 @@ or_state_set(or_state_t *new_state)
static void
or_state_save_broken(char *fname)
{
- int i;
+ int i, res;
file_status_t status;
char *fname2 = NULL;
for (i = 0; i < 100; ++i) {
@@ -263,12 +275,18 @@ or_state_save_broken(char *fname)
log_warn(LD_BUG, "Unable to parse state in \"%s\"; too many saved bad "
"state files to move aside. Discarding the old state file.",
fname);
- unlink(fname);
+ res = unlink(fname);
+ if (res != 0) {
+ log_warn(LD_FS,
+ "Also couldn't discard old state file \"%s\" because "
+ "unlink() failed: %s",
+ fname, strerror(errno));
+ }
} else {
log_warn(LD_BUG, "Unable to parse state in \"%s\". Moving it aside "
"to \"%s\". This could be a bug in Tor; please tell "
"the developers.", fname, fname2);
- if (rename(fname, fname2) < 0) {
+ if (tor_rename(fname, fname2) < 0) {//XXXX sandbox prohibits
log_warn(LD_BUG, "Weirdly, I couldn't even move the state aside. The "
"OS gave an error of %s", strerror(errno));
}
@@ -276,6 +294,16 @@ or_state_save_broken(char *fname)
tor_free(fname2);
}
+STATIC or_state_t *
+or_state_new(void)
+{
+ or_state_t *new_state = tor_malloc_zero(sizeof(or_state_t));
+ new_state->magic_ = OR_STATE_MAGIC;
+ config_init(&state_format, new_state);
+
+ return new_state;
+}
+
/** Reload the persistent state from disk, generating a new state as needed.
* Return 0 on success, less than 0 on failure.
*/
@@ -303,9 +331,7 @@ or_state_load(void)
log_warn(LD_GENERAL,"State file \"%s\" is not a file? Failing.", fname);
goto done;
}
- new_state = tor_malloc_zero(sizeof(or_state_t));
- new_state->magic_ = OR_STATE_MAGIC;
- config_init(&state_format, new_state);
+ new_state = or_state_new();
if (contents) {
config_line_t *lines=NULL;
int assign_retval;
@@ -322,7 +348,7 @@ or_state_load(void)
}
}
- if (!badstate && or_state_validate(NULL, new_state, 1, &errmsg) < 0)
+ if (!badstate && or_state_validate(new_state, &errmsg) < 0)
badstate = 1;
if (errmsg) {
@@ -340,9 +366,7 @@ or_state_load(void)
tor_free(contents);
config_free(&state_format, new_state);
- new_state = tor_malloc_zero(sizeof(or_state_t));
- new_state->magic_ = OR_STATE_MAGIC;
- config_init(&state_format, new_state);
+ new_state = or_state_new();
} else if (contents) {
log_info(LD_GENERAL, "Loaded state from \"%s\"", fname);
} else {
@@ -404,7 +428,7 @@ or_state_save(time_t now)
* to avoid redundant writes. */
entry_guards_update_state(global_state);
rep_hist_update_state(global_state);
- circuit_build_times_update_state(&circ_times, global_state);
+ circuit_build_times_update_state(get_circuit_build_times(), global_state);
if (accounting_is_enabled(get_options()))
accounting_run_housekeeping(now);
@@ -449,7 +473,7 @@ or_state_save(time_t now)
/** Return the config line for transport <b>transport</b> in the current state.
* Return NULL if there is no config line for <b>transport</b>. */
-static config_line_t *
+STATIC config_line_t *
get_transport_in_state_by_name(const char *transport)
{
or_state_t *or_state = get_or_state();
@@ -607,10 +631,19 @@ save_transport_to_state(const char *transport,
tor_free(transport_addrport);
}
+STATIC void
+or_state_free(or_state_t *state)
+{
+ if (!state)
+ return;
+
+ config_free(&state_format, state);
+}
+
void
or_state_free_all(void)
{
- config_free(&state_format, global_state);
+ or_state_free(global_state);
global_state = NULL;
}
diff --git a/src/or/statefile.h b/src/or/statefile.h
index dcdee6c60..15bb0b4aa 100644
--- a/src/or/statefile.h
+++ b/src/or/statefile.h
@@ -7,7 +7,7 @@
#ifndef TOR_STATEFILE_H
#define TOR_STATEFILE_H
-or_state_t *get_or_state(void);
+MOCK_DECL(or_state_t *,get_or_state,(void));
int did_last_state_file_write_fail(void);
int or_state_save(time_t now);
@@ -18,5 +18,11 @@ int or_state_load(void);
int or_state_loaded(void);
void or_state_free_all(void);
+#ifdef STATEFILE_PRIVATE
+STATIC config_line_t *get_transport_in_state_by_name(const char *transport);
+STATIC void or_state_free(or_state_t *state);
+STATIC or_state_t *or_state_new(void);
+#endif
+
#endif
diff --git a/src/or/status.c b/src/or/status.c
index 69f92ed09..afaa9de84 100644
--- a/src/or/status.c
+++ b/src/or/status.c
@@ -6,7 +6,10 @@
* \brief Keep status information and log the heartbeat messages.
**/
+#define STATUS_PRIVATE
+
#include "or.h"
+#include "circuituse.h"
#include "config.h"
#include "status.h"
#include "nodelist.h"
@@ -14,17 +17,21 @@
#include "router.h"
#include "circuitlist.h"
#include "main.h"
+#include "rephist.h"
#include "hibernate.h"
#include "rephist.h"
+#include "statefile.h"
+
+static void log_accounting(const time_t now, const or_options_t *options);
/** Return the total number of circuits. */
-static int
+STATIC int
count_circuits(void)
{
circuit_t *circ;
int nr=0;
- for (circ = circuit_get_global_list_(); circ; circ = circ->next)
+ TOR_LIST_FOREACH(circ, circuit_get_global_list(), head)
nr++;
return nr;
@@ -32,7 +39,7 @@ count_circuits(void)
/** Take seconds <b>secs</b> and return a newly allocated human-readable
* uptime string */
-static char *
+STATIC char *
secs_to_uptime(long secs)
{
long int days = secs / 86400;
@@ -59,7 +66,7 @@ secs_to_uptime(long secs)
/** Take <b>bytes</b> and returns a newly allocated human-readable usage
* string. */
-static char *
+STATIC char *
bytes_to_usage(uint64_t bytes)
{
char *bw_string = NULL;
@@ -112,6 +119,10 @@ log_heartbeat(time_t now)
uptime, count_circuits(),bw_sent,bw_rcvd,
hibernating?" We are currently hibernating.":"");
+ if (server_mode(options) && accounting_is_enabled(options) && !hibernating) {
+ log_accounting(now, options);
+ }
+
if (stats_n_data_cells_packaged && !hibernating)
log_notice(LD_HEARTBEAT, "Average packaged cell fullness: %2.3f%%",
100*(U64_TO_DBL(stats_n_data_bytes_packaged) /
@@ -125,6 +136,8 @@ log_heartbeat(time_t now)
if (public_server_mode(options))
rep_hist_log_circuit_handshake_stats(now);
+ circuit_log_ancient_one_hop_circuits(1800);
+
tor_free(uptime);
tor_free(bw_sent);
tor_free(bw_rcvd);
@@ -132,3 +145,27 @@ log_heartbeat(time_t now)
return 0;
}
+static void
+log_accounting(const time_t now, const or_options_t *options)
+{
+ or_state_t *state = get_or_state();
+ char *acc_rcvd = bytes_to_usage(state->AccountingBytesReadInInterval);
+ char *acc_sent = bytes_to_usage(state->AccountingBytesWrittenInInterval);
+ char *acc_max = bytes_to_usage(options->AccountingMax);
+ time_t interval_end = accounting_get_end_time();
+ char end_buf[ISO_TIME_LEN + 1];
+ char *remaining = NULL;
+ format_local_iso_time(end_buf, interval_end);
+ remaining = secs_to_uptime(interval_end - now);
+
+ log_notice(LD_HEARTBEAT, "Heartbeat: Accounting enabled. "
+ "Sent: %s / %s, Received: %s / %s. The "
+ "current accounting interval ends on %s, in %s.",
+ acc_sent, acc_max, acc_rcvd, acc_max, end_buf, remaining);
+
+ tor_free(acc_rcvd);
+ tor_free(acc_sent);
+ tor_free(acc_max);
+ tor_free(remaining);
+}
+
diff --git a/src/or/status.h b/src/or/status.h
index 7c3b969c8..13458ea47 100644
--- a/src/or/status.h
+++ b/src/or/status.h
@@ -4,7 +4,15 @@
#ifndef TOR_STATUS_H
#define TOR_STATUS_H
+#include "testsupport.h"
+
int log_heartbeat(time_t now);
+#ifdef STATUS_PRIVATE
+STATIC int count_circuits(void);
+STATIC char *secs_to_uptime(long secs);
+STATIC char *bytes_to_usage(uint64_t bytes);
+#endif
+
#endif
diff --git a/src/or/transports.c b/src/or/transports.c
index 3749d6bb2..dc3075416 100644
--- a/src/or/transports.c
+++ b/src/or/transports.c
@@ -51,35 +51,37 @@
* logic, because of race conditions that can cause dangling
* pointers. ]
*
- * <b>In even more detail, this is what happens when a SIGHUP
- * occurs:</b>
+ * <b>In even more detail, this is what happens when a config read
+ * (like a SIGHUP or a SETCONF) occurs:</b>
*
* We immediately destroy all unconfigured proxies (We shouldn't have
- * unconfigured proxies in the first place, except when SIGHUP rings
- * immediately after tor is launched.).
+ * unconfigured proxies in the first place, except when the config
+ * read happens immediately after tor is launched.).
*
* We mark all managed proxies and transports to signify that they
* must be removed if they don't contribute by the new torrc
* (we mark using the <b>marked_for_removal</b> element).
* We also mark all managed proxies to signify that they might need to
* be restarted so that they end up supporting all the transports the
- * new torrc wants them to support (using the <b>got_hup</b> element).
+ * new torrc wants them to support
+ * (we mark using the <b>was_around_before_config_read</b> element).
* We also clear their <b>transports_to_launch</b> list so that we can
* put there the transports we need to launch according to the new
* torrc.
*
* We then start parsing torrc again.
*
- * Everytime we encounter a transport line using a known pre-SIGHUP
- * managed proxy, we cleanse that proxy from the removal mark.
- * We also mark it as unconfigured so that on the next scheduled
- * events tick, we investigate whether we need to restart the proxy
- * so that it also spawns the new transports.
- * If the post-SIGHUP <b>transports_to_launch</b> list is identical to
- * the pre-SIGHUP one, it means that no changes were introduced to
- * this proxy during the SIGHUP and no restart has to take place.
+ * Everytime we encounter a transport line using a managed proxy that
+ * was around before the config read, we cleanse that proxy from the
+ * removal mark. We also toggle the <b>check_if_restarts_needed</b>
+ * flag, so that on the next <b>pt_configure_remaining_proxies</b>
+ * tick, we investigate whether we need to restart the proxy so that
+ * it also spawns the new transports. If the post-config-read
+ * <b>transports_to_launch</b> list is identical to the pre-config-read
+ * one, it means that no changes were introduced to this proxy during
+ * the config read and no restart has to take place.
*
- * During the post-SIGHUP torrc parsing, we unmark all transports
+ * During the post-config-read torrc parsing, we unmark all transports
* spawned by managed proxies that we find in our torrc.
* We do that so that if we don't need to restart a managed proxy, we
* can continue using its old transports normally.
@@ -95,18 +97,17 @@
#include "util.h"
#include "router.h"
#include "statefile.h"
+#include "entrynodes.h"
+#include "connection_or.h"
+#include "ext_orport.h"
+#include "control.h"
static process_environment_t *
create_managed_proxy_environment(const managed_proxy_t *mp);
static INLINE int proxy_configuration_finished(const managed_proxy_t *mp);
-static void managed_proxy_destroy(managed_proxy_t *mp,
- int also_terminate_process);
-
static void handle_finished_proxy(managed_proxy_t *mp);
-static int configure_proxy(managed_proxy_t *mp);
-
static void parse_method_error(const char *line, int is_server_method);
#define parse_server_method_error(l) parse_method_error(l, 1)
#define parse_client_method_error(l) parse_method_error(l, 0)
@@ -136,7 +137,8 @@ static smartlist_t *transport_list = NULL;
SOCKS version <b>socks_ver</b>. */
static transport_t *
transport_new(const tor_addr_t *addr, uint16_t port,
- const char *name, int socks_ver)
+ const char *name, int socks_ver,
+ const char *extra_info_args)
{
transport_t *t = tor_malloc_zero(sizeof(transport_t));
@@ -144,6 +146,8 @@ transport_new(const tor_addr_t *addr, uint16_t port,
t->port = port;
t->name = tor_strdup(name);
t->socks_version = socks_ver;
+ if (extra_info_args)
+ t->extra_info_args = tor_strdup(extra_info_args);
return t;
}
@@ -156,6 +160,7 @@ transport_free(transport_t *transport)
return;
tor_free(transport->name);
+ tor_free(transport->extra_info_args);
tor_free(transport);
}
@@ -323,7 +328,7 @@ int
transport_add_from_config(const tor_addr_t *addr, uint16_t port,
const char *name, int socks_ver)
{
- transport_t *t = transport_new(addr, port, name, socks_ver);
+ transport_t *t = transport_new(addr, port, name, socks_ver, NULL);
int r = transport_add(t);
@@ -531,8 +536,7 @@ launch_managed_proxy(managed_proxy_t *mp)
}
/** Check if any of the managed proxies we are currently trying to
- * configure have anything new to say. This is called from
- * run_scheduled_events(). */
+ * configure has anything new to say. */
void
pt_configure_remaining_proxies(void)
{
@@ -549,14 +553,15 @@ pt_configure_remaining_proxies(void)
assert_unconfigured_count_ok();
SMARTLIST_FOREACH_BEGIN(tmp, managed_proxy_t *, mp) {
- tor_assert(mp->conf_state != PT_PROTO_BROKEN ||
+ tor_assert(mp->conf_state != PT_PROTO_BROKEN &&
mp->conf_state != PT_PROTO_FAILED_LAUNCH);
- if (mp->got_hup) {
- mp->got_hup = 0;
+ if (mp->was_around_before_config_read) {
+ /* This proxy is marked by a config read. Check whether we need
+ to restart it. */
+
+ mp->was_around_before_config_read = 0;
- /* This proxy is marked by a SIGHUP. Check whether we need to
- restart it. */
if (proxy_needs_restart(mp)) {
log_info(LD_GENERAL, "Preparing managed proxy '%s' for restart.",
mp->argv[0]);
@@ -589,7 +594,7 @@ pt_configure_remaining_proxies(void)
* Return 1 if the transport configuration finished, and return 0
* otherwise (if we still have more configuring to do for this
* proxy). */
-static int
+STATIC int
configure_proxy(managed_proxy_t *mp)
{
int configuration_finished = 0;
@@ -657,6 +662,7 @@ register_server_proxy(const managed_proxy_t *mp)
save_transport_to_state(t->name, &t->addr, t->port);
log_notice(LD_GENERAL, "Registered server transport '%s' at '%s'",
t->name, fmt_addrport(&t->addr, t->port));
+ control_event_transport_launched("server", t->name, &t->addr, t->port);
} SMARTLIST_FOREACH_END(t);
}
@@ -679,9 +685,11 @@ register_client_proxy(const managed_proxy_t *mp)
break;
case 0:
log_info(LD_GENERAL, "Successfully registered transport %s", t->name);
+ control_event_transport_launched("client", t->name, &t->addr, t->port);
break;
case 1:
log_info(LD_GENERAL, "Successfully registered transport %s", t->name);
+ control_event_transport_launched("client", t->name, &t->addr, t->port);
transport_free(transport_tmp);
break;
}
@@ -699,7 +707,7 @@ register_proxy(const managed_proxy_t *mp)
}
/** Free memory allocated by managed proxy <b>mp</b>. */
-static void
+STATIC void
managed_proxy_destroy(managed_proxy_t *mp,
int also_terminate_process)
{
@@ -713,7 +721,8 @@ managed_proxy_destroy(managed_proxy_t *mp,
smartlist_free(mp->transports_to_launch);
/* remove it from the list of managed proxies */
- smartlist_remove(managed_proxy_list, mp);
+ if (managed_proxy_list)
+ smartlist_remove(managed_proxy_list, mp);
/* free the argv */
free_execve_args(mp->argv);
@@ -750,7 +759,6 @@ handle_finished_proxy(managed_proxy_t *mp)
}
unconfigured_proxies_n--;
- tor_assert(unconfigured_proxies_n >= 0);
}
/** Return true if the configuration of the managed proxy <b>mp</b> is
@@ -781,7 +789,7 @@ handle_methods_done(const managed_proxy_t *mp)
/** Handle a configuration protocol <b>line</b> received from a
* managed proxy <b>mp</b>. */
-void
+STATIC void
handle_proxy_line(const char *line, managed_proxy_t *mp)
{
log_info(LD_GENERAL, "Got a line from managed proxy '%s': (%s)",
@@ -882,7 +890,7 @@ handle_proxy_line(const char *line, managed_proxy_t *mp)
}
/** Parses an ENV-ERROR <b>line</b> and warns the user accordingly. */
-void
+STATIC void
parse_env_error(const char *line)
{
/* (Length of the protocol string) plus (a space) and (the first char of
@@ -898,7 +906,7 @@ parse_env_error(const char *line)
/** Handles a VERSION <b>line</b>. Updates the configuration protocol
* version in <b>mp</b>. */
-int
+STATIC int
parse_version(const char *line, managed_proxy_t *mp)
{
if (strlen(line) < (strlen(PROTO_NEG_SUCCESS) + 2)) {
@@ -939,14 +947,14 @@ parse_method_error(const char *line, int is_server)
/** Parses an SMETHOD <b>line</b> and if well-formed it registers the
* new transport in <b>mp</b>. */
-int
+STATIC int
parse_smethod_line(const char *line, managed_proxy_t *mp)
{
int r;
smartlist_t *items = NULL;
char *method_name=NULL;
-
+ char *args_string=NULL;
char *addrport=NULL;
tor_addr_t tor_addr;
char *address=NULL;
@@ -963,6 +971,9 @@ parse_smethod_line(const char *line, managed_proxy_t *mp)
goto err;
}
+ /* Example of legit SMETHOD line:
+ SMETHOD obfs2 0.0.0.0:25612 ARGS:secret=supersekrit,key=superkey */
+
tor_assert(!strcmp(smartlist_get(items,0),PROTO_SMETHOD));
method_name = smartlist_get(items,1);
@@ -990,7 +1001,19 @@ parse_smethod_line(const char *line, managed_proxy_t *mp)
goto err;
}
- transport = transport_new(&tor_addr, port, method_name, PROXY_NONE);
+ if (smartlist_len(items) > 3) {
+ /* Seems like there are also some [options] in the SMETHOD line.
+ Let's see if we can parse them. */
+ char *options_string = smartlist_get(items, 3);
+ log_debug(LD_CONFIG, "Got options_string: %s", options_string);
+ if (!strcmpstart(options_string, "ARGS:")) {
+ args_string = options_string+strlen("ARGS:");
+ log_debug(LD_CONFIG, "Got ARGS: %s", args_string);
+ }
+ }
+
+ transport = transport_new(&tor_addr, port, method_name,
+ PROXY_NONE, args_string);
if (!transport)
goto err;
@@ -1016,7 +1039,7 @@ parse_smethod_line(const char *line, managed_proxy_t *mp)
/** Parses a CMETHOD <b>line</b>, and if well-formed it registers
* the new transport in <b>mp</b>. */
-int
+STATIC int
parse_cmethod_line(const char *line, managed_proxy_t *mp)
{
int r;
@@ -1082,7 +1105,7 @@ parse_cmethod_line(const char *line, managed_proxy_t *mp)
goto err;
}
- transport = transport_new(&tor_addr, port, method_name, socks_ver);
+ transport = transport_new(&tor_addr, port, method_name, socks_ver, NULL);
if (!transport)
goto err;
@@ -1105,6 +1128,50 @@ parse_cmethod_line(const char *line, managed_proxy_t *mp)
return r;
}
+/** Return a newly allocated string that tor should place in
+ * TOR_PT_SERVER_TRANSPORT_OPTIONS while configuring the server
+ * manged proxy in <b>mp</b>. Return NULL if no such options are found. */
+STATIC char *
+get_transport_options_for_server_proxy(const managed_proxy_t *mp)
+{
+ char *options_string = NULL;
+ smartlist_t *string_sl = smartlist_new();
+
+ tor_assert(mp->is_server);
+
+ /** Loop over the transports of the proxy. If we have options for
+ any of them, format them appropriately and place them in our
+ smartlist. Finally, join our smartlist to get the final
+ string. */
+ SMARTLIST_FOREACH_BEGIN(mp->transports_to_launch, const char *, transport) {
+ smartlist_t *options_tmp_sl = NULL;
+ options_tmp_sl = get_options_for_server_transport(transport);
+ if (!options_tmp_sl)
+ continue;
+
+ /** Loop over the options of this transport, escape them, and
+ place them in the smartlist. */
+ SMARTLIST_FOREACH_BEGIN(options_tmp_sl, const char *, options) {
+ char *escaped_opts = tor_escape_str_for_pt_args(options, ":;\\");
+ smartlist_add_asprintf(string_sl, "%s:%s",
+ transport, escaped_opts);
+ tor_free(escaped_opts);
+ } SMARTLIST_FOREACH_END(options);
+
+ SMARTLIST_FOREACH(options_tmp_sl, char *, c, tor_free(c));
+ smartlist_free(options_tmp_sl);
+ } SMARTLIST_FOREACH_END(transport);
+
+ if (smartlist_len(string_sl)) {
+ options_string = smartlist_join_strings(string_sl, ";", 0, NULL);
+ }
+
+ SMARTLIST_FOREACH(string_sl, char *, t, tor_free(t));
+ smartlist_free(string_sl);
+
+ return options_string;
+}
+
/** Return the string that tor should place in TOR_PT_SERVER_BINDADDR
* while configuring the server managed proxy in <b>mp</b>. The
* string is stored in the heap, and it's the the responsibility of
@@ -1139,6 +1206,8 @@ get_bindaddr_for_server_proxy(const managed_proxy_t *mp)
static process_environment_t *
create_managed_proxy_environment(const managed_proxy_t *mp)
{
+ const or_options_t *options = get_options();
+
/* Environment variables to be added to or set in mp's environment. */
smartlist_t *envs = smartlist_new();
/* XXXX The next time someone touches this code, shorten the name of
@@ -1176,8 +1245,10 @@ create_managed_proxy_environment(const managed_proxy_t *mp)
{
char *orport_tmp =
get_first_listener_addrport_string(CONN_TYPE_OR_LISTENER);
- smartlist_add_asprintf(envs, "TOR_PT_ORPORT=%s", orport_tmp);
- tor_free(orport_tmp);
+ if (orport_tmp) {
+ smartlist_add_asprintf(envs, "TOR_PT_ORPORT=%s", orport_tmp);
+ tor_free(orport_tmp);
+ }
}
{
@@ -1186,13 +1257,41 @@ create_managed_proxy_environment(const managed_proxy_t *mp)
tor_free(bindaddr_tmp);
}
+ {
+ char *server_transport_options =
+ get_transport_options_for_server_proxy(mp);
+ if (server_transport_options) {
+ smartlist_add_asprintf(envs, "TOR_PT_SERVER_TRANSPORT_OPTIONS=%s",
+ server_transport_options);
+ tor_free(server_transport_options);
+ }
+ }
+
/* XXX024 Remove the '=' here once versions of obfsproxy which
* assert that this env var exists are sufficiently dead.
*
* (If we remove this line entirely, some joker will stick this
* variable in Tor's environment and crash PTs that try to parse
* it even when not run in server mode.) */
- smartlist_add(envs, tor_strdup("TOR_PT_EXTENDED_SERVER_PORT="));
+
+ if (options->ExtORPort_lines) {
+ char *ext_or_addrport_tmp =
+ get_first_listener_addrport_string(CONN_TYPE_EXT_OR_LISTENER);
+ char *cookie_file_loc = get_ext_or_auth_cookie_file_name();
+
+ if (ext_or_addrport_tmp) {
+ smartlist_add_asprintf(envs, "TOR_PT_EXTENDED_SERVER_PORT=%s",
+ ext_or_addrport_tmp);
+ }
+ smartlist_add_asprintf(envs, "TOR_PT_AUTH_COOKIE_FILE=%s",
+ cookie_file_loc);
+
+ tor_free(ext_or_addrport_tmp);
+ tor_free(cookie_file_loc);
+
+ } else {
+ smartlist_add_asprintf(envs, "TOR_PT_EXTENDED_SERVER_PORT=");
+ }
}
SMARTLIST_FOREACH_BEGIN(envs, const char *, env_var) {
@@ -1216,7 +1315,7 @@ create_managed_proxy_environment(const managed_proxy_t *mp)
* <b>proxy_argv</b>.
*
* Requires that proxy_argv have at least one element. */
-static managed_proxy_t *
+STATIC managed_proxy_t *
managed_proxy_create(const smartlist_t *transport_list,
char **proxy_argv, int is_server)
{
@@ -1267,19 +1366,20 @@ pt_kickstart_proxy(const smartlist_t *transport_list,
managed_proxy_create(transport_list, proxy_argv, is_server);
} else { /* known proxy. add its transport to its transport list */
- if (mp->got_hup) {
- /* If the managed proxy we found is marked by a SIGHUP, it means
- that it's not useless and should be kept. If it's marked for
- removal, unmark it and increase the unconfigured proxies so
- that we try to restart it if we need to. Afterwards, check if
- a transport_t for 'transport' used to exist before the SIGHUP
- and make sure it doesn't get deleted because we might reuse
- it. */
+ if (mp->was_around_before_config_read) {
+ /* If this managed proxy was around even before we read the
+ config this time, it means that it was already enabled before
+ and is not useless and should be kept. If it's marked for
+ removal, unmark it and make sure that we check whether it
+ needs to be restarted. */
if (mp->marked_for_removal) {
mp->marked_for_removal = 0;
check_if_restarts_needed = 1;
}
+ /* For each new transport, check if the managed proxy used to
+ support it before the SIGHUP. If that was the case, make sure
+ it doesn't get removed because we might reuse it. */
SMARTLIST_FOREACH_BEGIN(transport_list, const char *, transport) {
old_transport = transport_get_by_name(transport);
if (old_transport)
@@ -1328,8 +1428,10 @@ pt_prepare_proxy_list_for_config_read(void)
tor_assert(mp->conf_state == PT_PROTO_COMPLETED);
+ /* Mark all proxies for removal, and also note that they have been
+ here before the config read. */
mp->marked_for_removal = 1;
- mp->got_hup = 1;
+ mp->was_around_before_config_read = 1;
SMARTLIST_FOREACH(mp->transports_to_launch, char *, t, tor_free(t));
smartlist_clear(mp->transports_to_launch);
} SMARTLIST_FOREACH_END(mp);
@@ -1390,6 +1492,8 @@ pt_get_extra_info_descriptor_string(void)
tor_assert(mp->transports);
SMARTLIST_FOREACH_BEGIN(mp->transports, const transport_t *, t) {
+ char *transport_args = NULL;
+
/* If the transport proxy returned "0.0.0.0" as its address, and
* we know our external IP address, use it. Otherwise, use the
* returned address. */
@@ -1405,9 +1509,16 @@ pt_get_extra_info_descriptor_string(void)
addrport = fmt_addrport(&t->addr, t->port);
}
+ /* If this transport has any arguments with it, prepend a space
+ to them so that we can add them to the transport line. */
+ if (t->extra_info_args)
+ tor_asprintf(&transport_args, " %s", t->extra_info_args);
+
smartlist_add_asprintf(string_chunks,
- "transport %s %s",
- t->name, addrport);
+ "transport %s %s%s",
+ t->name, addrport,
+ transport_args ? transport_args : "");
+ tor_free(transport_args);
} SMARTLIST_FOREACH_END(t);
} SMARTLIST_FOREACH_END(mp);
@@ -1426,6 +1537,57 @@ pt_get_extra_info_descriptor_string(void)
return the_string;
}
+/** Stringify the SOCKS arguments in <b>socks_args</b> according to
+ * 180_pluggable_transport.txt. The string is allocated on the heap
+ * and it's the responsibility of the caller to free it after use. */
+char *
+pt_stringify_socks_args(const smartlist_t *socks_args)
+{
+ /* tmp place to store escaped socks arguments, so that we can
+ concatenate them up afterwards */
+ smartlist_t *sl_tmp = NULL;
+ char *escaped_string = NULL;
+ char *new_string = NULL;
+
+ tor_assert(socks_args);
+ tor_assert(smartlist_len(socks_args) > 0);
+
+ sl_tmp = smartlist_new();
+
+ SMARTLIST_FOREACH_BEGIN(socks_args, const char *, s) {
+ /* Escape ';' and '\'. */
+ escaped_string = tor_escape_str_for_pt_args(s, ";\\");
+ if (!escaped_string)
+ goto done;
+
+ smartlist_add(sl_tmp, escaped_string);
+ } SMARTLIST_FOREACH_END(s);
+
+ new_string = smartlist_join_strings(sl_tmp, ";", 0, NULL);
+
+ done:
+ SMARTLIST_FOREACH(sl_tmp, char *, s, tor_free(s));
+ smartlist_free(sl_tmp);
+
+ return new_string;
+}
+
+/** Return a string of the SOCKS arguments that we should pass to the
+ * pluggable transports proxy in <b>addr</b>:<b>port</b> according to
+ * 180_pluggable_transport.txt. The string is allocated on the heap
+ * and it's the responsibility of the caller to free it after use. */
+char *
+pt_get_socks_args_for_proxy_addrport(const tor_addr_t *addr, uint16_t port)
+{
+ const smartlist_t *socks_args = NULL;
+
+ socks_args = get_socks_args_by_bridge_addrport(addr, port);
+ if (!socks_args)
+ return NULL;
+
+ return pt_stringify_socks_args(socks_args);
+}
+
/** The tor config was read.
* Destroy all managed proxies that were marked by a previous call to
* prepare_proxy_list_for_config_read() and are not used by the new
diff --git a/src/or/transports.h b/src/or/transports.h
index 6ee82f455..1365ead00 100644
--- a/src/or/transports.h
+++ b/src/or/transports.h
@@ -25,6 +25,9 @@ typedef struct transport_t {
/** Boolean: We are re-parsing our transport list, and we are going to remove
* this one if we don't find it in the list of configured transports. */
unsigned marked_for_removal : 1;
+ /** Arguments for this transport that must be written to the
+ extra-info descriptor. */
+ char *extra_info_args;
} transport_t;
void mark_transport_list(void);
@@ -55,6 +58,10 @@ void pt_prepare_proxy_list_for_config_read(void);
void sweep_proxy_list(void);
smartlist_t *get_transport_proxy_ports(void);
+char *pt_stringify_socks_args(const smartlist_t *socks_args);
+
+char *pt_get_socks_args_for_proxy_addrport(const tor_addr_t *addr,
+ uint16_t port);
#ifdef PT_PRIVATE
/** State of the managed proxy configuration protocol. */
@@ -90,7 +97,7 @@ typedef struct {
* this flag to signify that this proxy might need to be restarted
* so that it can listen for other transports according to the new
* torrc. */
- unsigned int got_hup : 1;
+ unsigned int was_around_before_config_read : 1;
/* transports to-be-launched by this proxy */
smartlist_t *transports_to_launch;
@@ -100,12 +107,21 @@ typedef struct {
smartlist_t *transports;
} managed_proxy_t;
-int parse_cmethod_line(const char *line, managed_proxy_t *mp);
-int parse_smethod_line(const char *line, managed_proxy_t *mp);
+STATIC int parse_cmethod_line(const char *line, managed_proxy_t *mp);
+STATIC int parse_smethod_line(const char *line, managed_proxy_t *mp);
+
+STATIC int parse_version(const char *line, managed_proxy_t *mp);
+STATIC void parse_env_error(const char *line);
+STATIC void handle_proxy_line(const char *line, managed_proxy_t *mp);
+STATIC char *get_transport_options_for_server_proxy(const managed_proxy_t *mp);
+
+STATIC void managed_proxy_destroy(managed_proxy_t *mp,
+ int also_terminate_process);
+
+STATIC managed_proxy_t *managed_proxy_create(const smartlist_t *transport_list,
+ char **proxy_argv, int is_server);
-int parse_version(const char *line, managed_proxy_t *mp);
-void parse_env_error(const char *line);
-void handle_proxy_line(const char *line, managed_proxy_t *mp);
+STATIC int configure_proxy(managed_proxy_t *mp);
#endif
diff --git a/src/test/Makefile.nmake b/src/test/Makefile.nmake
index 562c8df8b..822431f3b 100644
--- a/src/test/Makefile.nmake
+++ b/src/test/Makefile.nmake
@@ -12,9 +12,10 @@ LIBS = ..\..\..\build-alpha\lib\libevent.lib \
crypt32.lib gdi32.lib user32.lib
TEST_OBJECTS = test.obj test_addr.obj test_containers.obj \
- test_crypto.obj test_data.obj test_dir.obj test_microdesc.obj \
- test_pt.obj test_util.obj test_config.obj test_cell_formats.obj \
- test_replay.obj test_introduce.obj tinytest.obj
+ test_controller_events.ogj test_crypto.obj test_data.obj test_dir.obj \
+ test_microdesc.obj test_pt.obj test_util.obj test_config.obj \
+ test_cell_formats.obj test_replay.obj test_introduce.obj tinytest.obj \
+ test_hs.obj
tinytest.obj: ..\ext\tinytest.c
$(CC) $(CFLAGS) /D snprintf=_snprintf /c ..\ext\tinytest.c
diff --git a/src/test/bench.c b/src/test/bench.c
index 706b8bc7f..f6c33626f 100644
--- a/src/test/bench.c
+++ b/src/test/bench.c
@@ -14,9 +14,6 @@ const char tor_git_revision[] = "";
#include "orconfig.h"
-#define RELAY_PRIVATE
-#define CONFIG_PRIVATE
-
#include "or.h"
#include "onion_tap.h"
#include "relay.h"
@@ -204,6 +201,7 @@ bench_onion_ntor(void)
for (i = 0; i < iters; ++i) {
onion_skin_ntor_create(nodeid, &keypair1.pubkey, &state, os);
ntor_handshake_state_free(state);
+ state = NULL;
}
end = perftime();
printf("Client-side, part 1: %f usec.\n", NANOCOUNT(start, end, iters)/1e3);
@@ -340,6 +338,28 @@ bench_dmap(void)
}
static void
+bench_siphash(void)
+{
+ char buf[128];
+ int lens[] = { 7, 8, 15, 16, 20, 32, 111, 128, -1 };
+ int i, j;
+ uint64_t start, end;
+ const int N = 300000;
+ crypto_rand(buf, sizeof(buf));
+
+ for (i = 0; lens[i] > 0; ++i) {
+ reset_perftime();
+ start = perftime();
+ for (j = 0; j < N; ++j) {
+ siphash24g(buf, lens[i]);
+ }
+ end = perftime();
+ printf("siphash24g(%d): %.2f ns per call\n",
+ lens[i], NANOCOUNT(start,end,N));
+ }
+}
+
+static void
bench_cell_ops(void)
{
const int iters = 1<<16;
@@ -489,6 +509,7 @@ typedef struct benchmark_t {
static struct benchmark_t benchmarks[] = {
ENT(dmap),
+ ENT(siphash),
ENT(aes),
ENT(onion_TAP),
#ifdef CURVE25519_ENABLED
@@ -546,6 +567,7 @@ main(int argc, const char **argv)
reset_perftime();
crypto_seed_rng(1);
+ crypto_init_siphash_key();
options = options_new();
init_logging();
options->command = CMD_RUN_UNITTESTS;
diff --git a/src/test/bt_test.py b/src/test/bt_test.py
new file mode 100755
index 000000000..8290509fa
--- /dev/null
+++ b/src/test/bt_test.py
@@ -0,0 +1,42 @@
+# Copyright 2013, The Tor Project, Inc
+# See LICENSE for licensing information
+
+"""
+bt_test.py
+
+This file tests the output from test-bt-cl to make sure it's as expected.
+
+Example usage:
+
+$ ./src/test/test-bt-cl crash | ./src/test/bt_test.py
+OK
+$ ./src/test/test-bt-cl assert | ./src/test/bt_test.py
+OK
+
+"""
+
+import sys
+
+
+def matches(lines, funcs):
+ if len(lines) < len(funcs):
+ return False
+ try:
+ for l, f in zip(lines, funcs):
+ l.index(f)
+ except ValueError:
+ return False
+ else:
+ return True
+
+FUNCNAMES = "crash oh_what a_tangled_web we_weave main".split()
+
+LINES = sys.stdin.readlines()
+
+for I in range(len(LINES)):
+ if matches(LINES[I:], FUNCNAMES):
+ print("OK")
+ break
+else:
+ print("BAD")
+
diff --git a/src/test/include.am b/src/test/include.am
index 112d1a79d..fba439a61 100644
--- a/src/test/include.am
+++ b/src/test/include.am
@@ -1,11 +1,15 @@
-TESTS+= src/test/test
+TESTS += src/test/test
-noinst_PROGRAMS+= src/test/test src/test/test-child src/test/bench
+noinst_PROGRAMS+= src/test/bench
+if UNITTESTS_ENABLED
+noinst_PROGRAMS+= src/test/test src/test/test-child
+endif
src_test_AM_CPPFLAGS = -DSHARE_DATADIR="\"$(datadir)\"" \
-DLOCALSTATEDIR="\"$(localstatedir)\"" \
-DBINDIR="\"$(bindir)\"" \
- -I"$(top_srcdir)/src/or" -I"$(top_srcdir)/src/ext"
+ -I"$(top_srcdir)/src/or" -I"$(top_srcdir)/src/ext" \
+ -DTOR_UNIT_TESTS
# -L flags need to go in LDFLAGS. -l flags need to go in LDADD.
# This seems to matter nowhere but on Windows, but I assure you that it
@@ -14,31 +18,47 @@ src_test_AM_CPPFLAGS = -DSHARE_DATADIR="\"$(datadir)\"" \
src_test_test_SOURCES = \
src/test/test.c \
src/test/test_addr.c \
+ src/test/test_buffers.c \
src/test/test_cell_formats.c \
+ src/test/test_circuitlist.c \
+ src/test/test_circuitmux.c \
src/test/test_containers.c \
+ src/test/test_controller_events.c \
src/test/test_crypto.c \
+ src/test/test_cell_queue.c \
src/test/test_data.c \
src/test/test_dir.c \
+ src/test/test_extorport.c \
src/test/test_introduce.c \
+ src/test/test_logging.c \
src/test/test_microdesc.c \
+ src/test/test_oom.c \
+ src/test/test_options.c \
src/test/test_pt.c \
+ src/test/test_relaycell.c \
src/test/test_replay.c \
+ src/test/test_routerkeys.c \
+ src/test/test_socks.c \
src/test/test_util.c \
src/test/test_config.c \
+ src/test/test_hs.c \
+ src/test/test_nodelist.c \
+ src/test/test_policy.c \
+ src/test/test_status.c \
src/ext/tinytest.c
+src_test_test_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS)
+
src_test_test_CPPFLAGS= $(src_test_AM_CPPFLAGS)
src_test_bench_SOURCES = \
src/test/bench.c
-src_test_bench_CPPFLAGS= $(src_test_AM_CPPFLAGS)
-
src_test_test_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ \
@TOR_LDFLAGS_libevent@
-src_test_test_LDADD = src/or/libtor.a src/common/libor.a \
- src/common/libor-crypto.a $(LIBDONNA) \
- src/common/libor-event.a \
+src_test_test_LDADD = src/or/libtor-testing.a src/common/libor-testing.a \
+ src/common/libor-crypto-testing.a $(LIBDONNA) \
+ src/common/libor-event-testing.a \
@TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ \
@TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@
@@ -63,6 +83,39 @@ src_test_test_ntor_cl_LDADD = src/or/libtor.a src/common/libor.a \
@TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@
src_test_test_ntor_cl_AM_CPPFLAGS = \
-I"$(top_srcdir)/src/or"
+NTOR_TEST_DEPS=src/test/test-ntor-cl
+else
+NTOR_TEST_DEPS=
+endif
+if COVERAGE_ENABLED
+CMDLINE_TEST_TOR = ./src/or/tor-cov
+else
+CMDLINE_TEST_TOR = ./src/or/tor
+endif
+
+noinst_PROGRAMS += src/test/test-bt-cl
+src_test_test_bt_cl_SOURCES = src/test/test_bt_cl.c
+src_test_test_bt_cl_LDADD = src/common/libor-testing.a \
+ @TOR_LIB_MATH@ \
+ @TOR_LIB_WS32@ @TOR_LIB_GDI@
+src_test_test_bt_cl_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS)
+src_test_test_bt_cl_CPPFLAGS= $(src_test_AM_CPPFLAGS)
+
+
+check-local: $(NTOR_TEST_DEPS) $(CMDLINE_TEST_TOR)
+if USEPYTHON
+ $(PYTHON) $(top_srcdir)/src/test/test_cmdline_args.py $(CMDLINE_TEST_TOR) "${top_srcdir}"
+if CURVE25519_ENABLED
+ $(PYTHON) $(top_srcdir)/src/test/ntor_ref.py test-tor
+ $(PYTHON) $(top_srcdir)/src/test/ntor_ref.py self-test
+endif
+ ./src/test/test-bt-cl assert | $(PYTHON) $(top_srcdir)/src/test/bt_test.py
+ ./src/test/test-bt-cl crash | $(PYTHON) $(top_srcdir)/src/test/bt_test.py
endif
+EXTRA_DIST += \
+ src/test/bt_test.py \
+ src/test/ntor_ref.py \
+ src/test/slownacl_curve25519.py \
+ src/test/test_cmdline_args.py
diff --git a/src/test/ntor_ref.py b/src/test/ntor_ref.py
index ade468da7..7d6e43e71 100644..100755
--- a/src/test/ntor_ref.py
+++ b/src/test/ntor_ref.py
@@ -1,3 +1,4 @@
+#!/usr/bin/python
# Copyright 2012-2013, The Tor Project, Inc
# See LICENSE for licensing information
@@ -27,17 +28,25 @@ commands:
"""
import binascii
-import curve25519
+try:
+ import curve25519
+ curve25519mod = curve25519.keys
+except ImportError:
+ curve25519 = None
+ import slownacl_curve25519
+ curve25519mod = slownacl_curve25519
+
import hashlib
import hmac
import subprocess
+import sys
# **********************************************************************
# Helpers and constants
def HMAC(key,msg):
"Return the HMAC-SHA256 of 'msg' using the key 'key'."
- H = hmac.new(key, "", hashlib.sha256)
+ H = hmac.new(key, b"", hashlib.sha256)
H.update(msg)
return H.digest()
@@ -59,31 +68,38 @@ G_LENGTH = 32
H_LENGTH = 32
PROTOID = b"ntor-curve25519-sha256-1"
-M_EXPAND = PROTOID + ":key_expand"
-T_MAC = PROTOID + ":mac"
-T_KEY = PROTOID + ":key_extract"
-T_VERIFY = PROTOID + ":verify"
+M_EXPAND = PROTOID + b":key_expand"
+T_MAC = PROTOID + b":mac"
+T_KEY = PROTOID + b":key_extract"
+T_VERIFY = PROTOID + b":verify"
def H_mac(msg): return H(msg, tweak=T_MAC)
def H_verify(msg): return H(msg, tweak=T_VERIFY)
-class PrivateKey(curve25519.keys.Private):
- """As curve25519.keys.Private, but doesn't regenerate its public key
+class PrivateKey(curve25519mod.Private):
+ """As curve25519mod.Private, but doesn't regenerate its public key
every time you ask for it.
"""
def __init__(self):
- curve25519.keys.Private.__init__(self)
+ curve25519mod.Private.__init__(self)
self._memo_public = None
def get_public(self):
if self._memo_public is None:
- self._memo_public = curve25519.keys.Private.get_public(self)
+ self._memo_public = curve25519mod.Private.get_public(self)
return self._memo_public
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-def kdf_rfc5869(key, salt, info, n):
+if sys.version < '3':
+ def int2byte(i):
+ return chr(i)
+else:
+ def int2byte(i):
+ return bytes([i])
+
+def kdf_rfc5869(key, salt, info, n):
prk = HMAC(key=salt, msg=key)
@@ -91,7 +107,7 @@ def kdf_rfc5869(key, salt, info, n):
last = b""
i = 1
while len(out) < n:
- m = last + info + chr(i)
+ m = last + info + int2byte(i)
last = h = HMAC(key=prk, msg=m)
out += h
i = i + 1
@@ -177,7 +193,7 @@ def server(seckey_b, my_node_id, message, keyBytes=72):
badness = (keyid(seckey_b.get_public()) !=
message[NODE_ID_LENGTH:NODE_ID_LENGTH+H_LENGTH])
- pubkey_X = curve25519.keys.Public(message[NODE_ID_LENGTH+H_LENGTH:])
+ pubkey_X = curve25519mod.Public(message[NODE_ID_LENGTH+H_LENGTH:])
seckey_y = PrivateKey()
pubkey_Y = seckey_y.get_public()
pubkey_B = seckey_b.get_public()
@@ -200,7 +216,7 @@ def server(seckey_b, my_node_id, message, keyBytes=72):
pubkey_Y.serialize() +
pubkey_X.serialize() +
PROTOID +
- "Server")
+ b"Server")
msg = pubkey_Y.serialize() + H_mac(auth_input)
@@ -240,7 +256,7 @@ def client_part2(seckey_x, msg, node_id, pubkey_B, keyBytes=72):
"""
assert len(msg) == G_LENGTH + H_LENGTH
- pubkey_Y = curve25519.keys.Public(msg[:G_LENGTH])
+ pubkey_Y = curve25519mod.Public(msg[:G_LENGTH])
their_auth = msg[G_LENGTH:]
pubkey_X = seckey_x.get_public()
@@ -262,7 +278,7 @@ def client_part2(seckey_x, msg, node_id, pubkey_B, keyBytes=72):
pubkey_B.serialize() +
pubkey_Y.serialize() +
pubkey_X.serialize() + PROTOID +
- "Server")
+ b"Server")
my_auth = H_mac(auth_input)
@@ -276,7 +292,7 @@ def client_part2(seckey_x, msg, node_id, pubkey_B, keyBytes=72):
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-def demo(node_id="iToldYouAboutStairs.", server_key=PrivateKey()):
+def demo(node_id=b"iToldYouAboutStairs.", server_key=PrivateKey()):
"""
Try to handshake with ourself.
"""
@@ -286,6 +302,7 @@ def demo(node_id="iToldYouAboutStairs.", server_key=PrivateKey()):
assert len(skeys) == 72
assert len(ckeys) == 72
assert skeys == ckeys
+ print("OK")
# ======================================================================
def timing():
@@ -295,7 +312,7 @@ def timing():
import timeit
t = timeit.Timer(stmt="ntor_ref.demo(N,SK)",
setup="import ntor_ref,curve25519;N='ABCD'*5;SK=ntor_ref.PrivateKey()")
- print t.timeit(number=1000)
+ print(t.timeit(number=1000))
# ======================================================================
@@ -306,7 +323,7 @@ def kdf_vectors():
import binascii
def kdf_vec(inp):
k = kdf(inp, T_KEY, M_EXPAND, 100)
- print repr(inp), "\n\""+ binascii.b2a_hex(k)+ "\""
+ print(repr(inp), "\n\""+ binascii.b2a_hex(k)+ "\"")
kdf_vec("")
kdf_vec("Tor")
kdf_vec("AN ALARMING ITEM TO FIND ON YOUR CREDIT-RATING STATEMENT")
@@ -319,13 +336,13 @@ def test_tor():
Call the test-ntor-cl command-line program to make sure we can
interoperate with Tor's ntor program
"""
- enhex=binascii.b2a_hex
+ enhex=lambda s: binascii.b2a_hex(s)
dehex=lambda s: binascii.a2b_hex(s.strip())
- PROG = "./src/test/test-ntor-cl"
+ PROG = b"./src/test/test-ntor-cl"
def tor_client1(node_id, pubkey_B):
" returns (msg, state) "
- p = subprocess.Popen([PROG, "client1", enhex(node_id),
+ p = subprocess.Popen([PROG, b"client1", enhex(node_id),
enhex(pubkey_B.serialize())],
stdout=subprocess.PIPE)
return map(dehex, p.stdout.readlines())
@@ -343,7 +360,7 @@ def test_tor():
return map(dehex, p.stdout.readlines())
- node_id = "thisisatornodeid$#%^"
+ node_id = b"thisisatornodeid$#%^"
seckey_b = PrivateKey()
pubkey_B = seckey_b.get_public()
@@ -368,13 +385,14 @@ def test_tor():
assert c_keys == s_keys
assert len(c_keys) == 90
- print "We just interoperated."
+ print("OK")
# ======================================================================
if __name__ == '__main__':
- import sys
- if sys.argv[1] == 'gen_kdf_vectors':
+ if len(sys.argv) < 2:
+ print(__doc__)
+ elif sys.argv[1] == 'gen_kdf_vectors':
kdf_vectors()
elif sys.argv[1] == 'timing':
timing()
@@ -384,4 +402,4 @@ if __name__ == '__main__':
test_tor()
else:
- print __doc__
+ print(__doc__)
diff --git a/src/test/slownacl_curve25519.py b/src/test/slownacl_curve25519.py
new file mode 100644
index 000000000..4dabab61b
--- /dev/null
+++ b/src/test/slownacl_curve25519.py
@@ -0,0 +1,117 @@
+# This is the curve25519 implementation from Matthew Dempsky's "Slownacl"
+# library. It is in the public domain.
+#
+# It isn't constant-time. Don't use it except for testing.
+#
+# Nick got the slownacl source from:
+# https://github.com/mdempsky/dnscurve/tree/master/slownacl
+
+__all__ = ['smult_curve25519_base', 'smult_curve25519']
+
+import sys
+
+P = 2 ** 255 - 19
+A = 486662
+
+def expmod(b, e, m):
+ if e == 0: return 1
+ t = expmod(b, e // 2, m) ** 2 % m
+ if e & 1: t = (t * b) % m
+ return t
+
+def inv(x):
+ return expmod(x, P - 2, P)
+
+# Addition and doubling formulas taken from Appendix D of "Curve25519:
+# new Diffie-Hellman speed records".
+
+def add(n,m,d):
+ (xn,zn), (xm,zm), (xd,zd) = n, m, d
+ x = 4 * (xm * xn - zm * zn) ** 2 * zd
+ z = 4 * (xm * zn - zm * xn) ** 2 * xd
+ return (x % P, z % P)
+
+def double(n):
+ (xn,zn) = n
+ x = (xn ** 2 - zn ** 2) ** 2
+ z = 4 * xn * zn * (xn ** 2 + A * xn * zn + zn ** 2)
+ return (x % P, z % P)
+
+def curve25519(n, base):
+ one = (base,1)
+ two = double(one)
+ # f(m) evaluates to a tuple containing the mth multiple and the
+ # (m+1)th multiple of base.
+ def f(m):
+ if m == 1: return (one, two)
+ (pm, pm1) = f(m // 2)
+ if (m & 1):
+ return (add(pm, pm1, one), double(pm1))
+ return (double(pm), add(pm, pm1, one))
+ ((x,z), _) = f(n)
+ return (x * inv(z)) % P
+
+if sys.version < '3':
+ def b2i(c):
+ return ord(c)
+ def i2b(i):
+ return chr(i)
+ def ba2bs(ba):
+ return "".join(ba)
+else:
+ def b2i(c):
+ return c
+ def i2b(i):
+ return i
+ def ba2bs(ba):
+ return bytes(ba)
+
+def unpack(s):
+ if len(s) != 32: raise ValueError('Invalid Curve25519 argument')
+ return sum(b2i(s[i]) << (8 * i) for i in range(32))
+
+def pack(n):
+ return ba2bs([i2b((n >> (8 * i)) & 255) for i in range(32)])
+
+def clamp(n):
+ n &= ~7
+ n &= ~(128 << 8 * 31)
+ n |= 64 << 8 * 31
+ return n
+
+def smult_curve25519(n, p):
+ n = clamp(unpack(n))
+ p = unpack(p)
+ return pack(curve25519(n, p))
+
+def smult_curve25519_base(n):
+ n = clamp(unpack(n))
+ return pack(curve25519(n, 9))
+
+
+#
+# This part I'm adding in for compatibility with the curve25519 python
+# module. -Nick
+#
+import os
+
+class Private:
+ def __init__(self, secret=None, seed=None):
+ self.private = pack(clamp(unpack(os.urandom(32))))
+
+ def get_public(self):
+ return Public(smult_curve25519_base(self.private))
+
+ def get_shared_key(self, public, hashfn):
+ return hashfn(smult_curve25519(self.private, public.public))
+
+ def serialize(self):
+ return self.private
+
+class Public:
+ def __init__(self, public):
+ self.public = public
+
+ def serialize(self):
+ return self.public
+
diff --git a/src/test/test-network.sh b/src/test/test-network.sh
new file mode 100755
index 000000000..7b5986416
--- /dev/null
+++ b/src/test/test-network.sh
@@ -0,0 +1,47 @@
+#! /bin/sh
+
+until [ -z $1 ]
+do
+ case $1 in
+ --chutney-path)
+ export CHUTNEY_PATH="$2"
+ shift
+ ;;
+ --tor-path)
+ export TOR_DIR="$2"
+ shift
+ ;;
+ --flavo?r|--network-flavo?r)
+ export NETWORK_FLAVOUR="$2"
+ shift
+ ;;
+ *)
+ echo "Sorry, I don't know what to do with '$1'."
+ exit 2
+ ;;
+ esac
+ shift
+done
+
+TOR_DIR="${TOR_DIR:-$PWD}"
+NETWORK_FLAVOUR=${NETWORK_FLAVOUR:-basic}
+CHUTNEY_NETWORK=networks/$NETWORK_FLAVOUR
+myname=$(basename $0)
+
+[ -d "$CHUTNEY_PATH" ] && [ -x "$CHUTNEY_PATH/chutney" ] || {
+ echo "$myname: missing 'chutney' in CHUTNEY_PATH ($CHUTNEY_PATH)"
+ exit 1
+}
+cd "$CHUTNEY_PATH"
+# For picking up the right tor binaries.
+PATH="$TOR_DIR/src/or:$TOR_DIR/src/tools:$PATH"
+./tools/bootstrap-network.sh $NETWORK_FLAVOUR || exit 2
+
+# Sleep some, waiting for the network to bootstrap.
+# TODO: Add chutney command 'bootstrap-status' and use that instead.
+BOOTSTRAP_TIME=18
+echo -n "$myname: sleeping for $BOOTSTRAP_TIME seconds"
+n=$BOOTSTRAP_TIME; while [ $n -gt 0 ]; do
+ sleep 1; n=$(expr $n - 1); echo -n .
+done; echo ""
+./chutney verify $CHUTNEY_NETWORK
diff --git a/src/test/test.c b/src/test/test.c
index c2911d842..8bce9c91f 100644
--- a/src/test/test.c
+++ b/src/test/test.c
@@ -28,11 +28,11 @@ const char tor_git_revision[] = "";
/* These macros pull in declarations for some functions and structures that
* are typically file-private. */
-#define BUFFERS_PRIVATE
-#define CONFIG_PRIVATE
#define GEOIP_PRIVATE
#define ROUTER_PRIVATE
#define CIRCUITSTATS_PRIVATE
+#define CIRCUITLIST_PRIVATE
+#define STATEFILE_PRIVATE
/*
* Linux doesn't provide lround in math.h by default, but mac os does...
@@ -52,16 +52,20 @@ double fabs(double x);
#include "rendcommon.h"
#include "test.h"
#include "torgzip.h"
+#ifdef ENABLE_MEMPOOLS
#include "mempool.h"
+#endif
#include "memarea.h"
#include "onion.h"
-#include "onion_tap.h"
#include "onion_ntor.h"
+#include "onion_tap.h"
#include "policies.h"
#include "rephist.h"
#include "routerparse.h"
+#include "statefile.h"
#ifdef CURVE25519_ENABLED
#include "crypto_curve25519.h"
+#include "onion_ntor.h"
#endif
#ifdef USE_DMALLOC
@@ -218,667 +222,138 @@ free_pregenerated_keys(void)
}
}
-typedef struct socks_test_data_t {
- socks_request_t *req;
- buf_t *buf;
-} socks_test_data_t;
-
-static void *
-socks_test_setup(const struct testcase_t *testcase)
-{
- socks_test_data_t *data = tor_malloc(sizeof(socks_test_data_t));
- (void)testcase;
- data->buf = buf_new_with_capacity(256);
- data->req = socks_request_new();
- config_register_addressmaps(get_options());
- return data;
-}
-static int
-socks_test_cleanup(const struct testcase_t *testcase, void *ptr)
-{
- socks_test_data_t *data = ptr;
- (void)testcase;
- buf_free(data->buf);
- socks_request_free(data->req);
- tor_free(data);
- return 1;
-}
-
-const struct testcase_setup_t socks_setup = {
- socks_test_setup, socks_test_cleanup
-};
-
-#define SOCKS_TEST_INIT() \
- socks_test_data_t *testdata = ptr; \
- buf_t *buf = testdata->buf; \
- socks_request_t *socks = testdata->req;
-#define ADD_DATA(buf, s) \
- write_to_buf(s, sizeof(s)-1, buf)
-
-static void
-socks_request_clear(socks_request_t *socks)
-{
- tor_free(socks->username);
- tor_free(socks->password);
- memset(socks, 0, sizeof(socks_request_t));
-}
-
-/** Perform unsupported SOCKS 4 commands */
-static void
-test_socks_4_unsupported_commands(void *ptr)
-{
- SOCKS_TEST_INIT();
-
- /* SOCKS 4 Send BIND [02] to IP address 2.2.2.2:4369 */
- ADD_DATA(buf, "\x04\x02\x11\x11\x02\x02\x02\x02\x00");
- test_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks) == -1);
- test_eq(4, socks->socks_version);
- test_eq(0, socks->replylen); /* XXX: shouldn't tor reply? */
-
- done:
- ;
-}
-
-/** Perform supported SOCKS 4 commands */
-static void
-test_socks_4_supported_commands(void *ptr)
-{
- SOCKS_TEST_INIT();
-
- test_eq(0, buf_datalen(buf));
-
- /* SOCKS 4 Send CONNECT [01] to IP address 2.2.2.2:4370 */
- ADD_DATA(buf, "\x04\x01\x11\x12\x02\x02\x02\x03\x00");
- test_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks) == 1);
- test_eq(4, socks->socks_version);
- test_eq(0, socks->replylen); /* XXX: shouldn't tor reply? */
- test_eq(SOCKS_COMMAND_CONNECT, socks->command);
- test_streq("2.2.2.3", socks->address);
- test_eq(4370, socks->port);
- test_assert(socks->got_auth == 0);
- test_assert(! socks->username);
-
- test_eq(0, buf_datalen(buf));
- socks_request_clear(socks);
-
- /* SOCKS 4 Send CONNECT [01] to IP address 2.2.2.2:4369 with userid*/
- ADD_DATA(buf, "\x04\x01\x11\x12\x02\x02\x02\x04me\x00");
- test_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks) == 1);
- test_eq(4, socks->socks_version);
- test_eq(0, socks->replylen); /* XXX: shouldn't tor reply? */
- test_eq(SOCKS_COMMAND_CONNECT, socks->command);
- test_streq("2.2.2.4", socks->address);
- test_eq(4370, socks->port);
- test_assert(socks->got_auth == 1);
- test_assert(socks->username);
- test_eq(2, socks->usernamelen);
- test_memeq("me", socks->username, 2);
-
- test_eq(0, buf_datalen(buf));
- socks_request_clear(socks);
-
- /* SOCKS 4a Send RESOLVE [F0] request for torproject.org */
- ADD_DATA(buf, "\x04\xF0\x01\x01\x00\x00\x00\x02me\x00torproject.org\x00");
- test_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks) == 1);
- test_eq(4, socks->socks_version);
- test_eq(0, socks->replylen); /* XXX: shouldn't tor reply? */
- test_streq("torproject.org", socks->address);
-
- test_eq(0, buf_datalen(buf));
-
- done:
- ;
-}
-
-/** Perform unsupported SOCKS 5 commands */
-static void
-test_socks_5_unsupported_commands(void *ptr)
-{
- SOCKS_TEST_INIT();
-
- /* SOCKS 5 Send unsupported BIND [02] command */
- ADD_DATA(buf, "\x05\x02\x00\x01");
-
- test_eq(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks), 0);
- test_eq(0, buf_datalen(buf));
- test_eq(5, socks->socks_version);
- test_eq(2, socks->replylen);
- test_eq(5, socks->reply[0]);
- test_eq(0, socks->reply[1]);
- ADD_DATA(buf, "\x05\x02\x00\x01\x02\x02\x02\x01\x01\x01");
- test_eq(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks), -1);
- /* XXX: shouldn't tor reply 'command not supported' [07]? */
-
- buf_clear(buf);
- socks_request_clear(socks);
-
- /* SOCKS 5 Send unsupported UDP_ASSOCIATE [03] command */
- ADD_DATA(buf, "\x05\x03\x00\x01\x02");
- test_eq(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks), 0);
- test_eq(5, socks->socks_version);
- test_eq(2, socks->replylen);
- test_eq(5, socks->reply[0]);
- test_eq(2, socks->reply[1]);
- ADD_DATA(buf, "\x05\x03\x00\x01\x02\x02\x02\x01\x01\x01");
- test_eq(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks), -1);
- /* XXX: shouldn't tor reply 'command not supported' [07]? */
-
- done:
- ;
-}
-
-/** Perform supported SOCKS 5 commands */
-static void
-test_socks_5_supported_commands(void *ptr)
-{
- SOCKS_TEST_INIT();
-
- /* SOCKS 5 Send CONNECT [01] to IP address 2.2.2.2:4369 */
- ADD_DATA(buf, "\x05\x01\x00");
- test_eq(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks), 0);
- test_eq(5, socks->socks_version);
- test_eq(2, socks->replylen);
- test_eq(5, socks->reply[0]);
- test_eq(0, socks->reply[1]);
-
- ADD_DATA(buf, "\x05\x01\x00\x01\x02\x02\x02\x02\x11\x11");
- test_eq(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks), 1);
- test_streq("2.2.2.2", socks->address);
- test_eq(4369, socks->port);
-
- test_eq(0, buf_datalen(buf));
- socks_request_clear(socks);
-
- /* SOCKS 5 Send CONNECT [01] to FQDN torproject.org:4369 */
- ADD_DATA(buf, "\x05\x01\x00");
- ADD_DATA(buf, "\x05\x01\x00\x03\x0Etorproject.org\x11\x11");
- test_eq(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks), 1);
-
- test_eq(5, socks->socks_version);
- test_eq(2, socks->replylen);
- test_eq(5, socks->reply[0]);
- test_eq(0, socks->reply[1]);
- test_streq("torproject.org", socks->address);
- test_eq(4369, socks->port);
-
- test_eq(0, buf_datalen(buf));
- socks_request_clear(socks);
-
- /* SOCKS 5 Send RESOLVE [F0] request for torproject.org:4369 */
- ADD_DATA(buf, "\x05\x01\x00");
- ADD_DATA(buf, "\x05\xF0\x00\x03\x0Etorproject.org\x01\x02");
- test_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks) == 1);
- test_eq(5, socks->socks_version);
- test_eq(2, socks->replylen);
- test_eq(5, socks->reply[0]);
- test_eq(0, socks->reply[1]);
- test_streq("torproject.org", socks->address);
-
- test_eq(0, buf_datalen(buf));
- socks_request_clear(socks);
-
- /* SOCKS 5 Send RESOLVE_PTR [F1] for IP address 2.2.2.5 */
- ADD_DATA(buf, "\x05\x01\x00");
- ADD_DATA(buf, "\x05\xF1\x00\x01\x02\x02\x02\x05\x01\x03");
- test_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks) == 1);
- test_eq(5, socks->socks_version);
- test_eq(2, socks->replylen);
- test_eq(5, socks->reply[0]);
- test_eq(0, socks->reply[1]);
- test_streq("2.2.2.5", socks->address);
-
- test_eq(0, buf_datalen(buf));
-
- done:
- ;
-}
-
-/** Perform SOCKS 5 authentication */
-static void
-test_socks_5_no_authenticate(void *ptr)
-{
- SOCKS_TEST_INIT();
-
- /*SOCKS 5 No Authentication */
- ADD_DATA(buf,"\x05\x01\x00");
- test_assert(!fetch_from_buf_socks(buf, socks,
- get_options()->TestSocks,
- get_options()->SafeSocks));
- test_eq(2, socks->replylen);
- test_eq(5, socks->reply[0]);
- test_eq(SOCKS_NO_AUTH, socks->reply[1]);
-
- test_eq(0, buf_datalen(buf));
-
- /*SOCKS 5 Send username/password anyway - pretend to be broken */
- ADD_DATA(buf,"\x01\x02\x01\x01\x02\x01\x01");
- test_assert(!fetch_from_buf_socks(buf, socks,
- get_options()->TestSocks,
- get_options()->SafeSocks));
- test_eq(5, socks->socks_version);
- test_eq(2, socks->replylen);
- test_eq(1, socks->reply[0]);
- test_eq(0, socks->reply[1]);
-
- test_eq(2, socks->usernamelen);
- test_eq(2, socks->passwordlen);
-
- test_memeq("\x01\x01", socks->username, 2);
- test_memeq("\x01\x01", socks->password, 2);
-
- done:
- ;
-}
-
-/** Perform SOCKS 5 authentication */
-static void
-test_socks_5_authenticate(void *ptr)
-{
- SOCKS_TEST_INIT();
-
- /* SOCKS 5 Negotiate username/password authentication */
- ADD_DATA(buf, "\x05\x01\x02");
-
- test_assert(!fetch_from_buf_socks(buf, socks,
- get_options()->TestSocks,
- get_options()->SafeSocks));
- test_eq(2, socks->replylen);
- test_eq(5, socks->reply[0]);
- test_eq(SOCKS_USER_PASS, socks->reply[1]);
- test_eq(5, socks->socks_version);
-
- test_eq(0, buf_datalen(buf));
-
- /* SOCKS 5 Send username/password */
- ADD_DATA(buf, "\x01\x02me\x08mypasswd");
- test_assert(!fetch_from_buf_socks(buf, socks,
- get_options()->TestSocks,
- get_options()->SafeSocks));
- test_eq(5, socks->socks_version);
- test_eq(2, socks->replylen);
- test_eq(1, socks->reply[0]);
- test_eq(0, socks->reply[1]);
-
- test_eq(2, socks->usernamelen);
- test_eq(8, socks->passwordlen);
-
- test_memeq("me", socks->username, 2);
- test_memeq("mypasswd", socks->password, 8);
-
- done:
- ;
-}
-
-/** Perform SOCKS 5 authentication and send data all in one go */
-static void
-test_socks_5_authenticate_with_data(void *ptr)
-{
- SOCKS_TEST_INIT();
-
- /* SOCKS 5 Negotiate username/password authentication */
- ADD_DATA(buf, "\x05\x01\x02");
-
- test_assert(!fetch_from_buf_socks(buf, socks,
- get_options()->TestSocks,
- get_options()->SafeSocks));
- test_eq(2, socks->replylen);
- test_eq(5, socks->reply[0]);
- test_eq(SOCKS_USER_PASS, socks->reply[1]);
- test_eq(5, socks->socks_version);
-
- test_eq(0, buf_datalen(buf));
-
- /* SOCKS 5 Send username/password */
- /* SOCKS 5 Send CONNECT [01] to IP address 2.2.2.2:4369 */
- ADD_DATA(buf, "\x01\x02me\x03you\x05\x01\x00\x01\x02\x02\x02\x02\x11\x11");
- test_assert(fetch_from_buf_socks(buf, socks,
- get_options()->TestSocks,
- get_options()->SafeSocks) == 1);
- test_eq(5, socks->socks_version);
- test_eq(2, socks->replylen);
- test_eq(1, socks->reply[0]);
- test_eq(0, socks->reply[1]);
-
- test_streq("2.2.2.2", socks->address);
- test_eq(4369, socks->port);
-
- test_eq(2, socks->usernamelen);
- test_eq(3, socks->passwordlen);
- test_memeq("me", socks->username, 2);
- test_memeq("you", socks->password, 3);
-
- done:
- ;
-}
-
-/** Perform SOCKS 5 authentication before method negotiated */
-static void
-test_socks_5_auth_before_negotiation(void *ptr)
-{
- SOCKS_TEST_INIT();
-
- /* SOCKS 5 Send username/password */
- ADD_DATA(buf, "\x01\x02me\x02me");
- test_assert(fetch_from_buf_socks(buf, socks,
- get_options()->TestSocks,
- get_options()->SafeSocks) == -1);
- test_eq(0, socks->socks_version);
- test_eq(0, socks->replylen);
- test_eq(0, socks->reply[0]);
- test_eq(0, socks->reply[1]);
-
- done:
- ;
-}
-
+/** Run unit tests for the onion handshake code. */
static void
-test_buffer_copy(void *arg)
+test_onion_handshake(void)
{
- generic_buffer_t *buf=NULL, *buf2=NULL;
- const char *s;
- size_t len;
- char b[256];
+ /* client-side */
+ crypto_dh_t *c_dh = NULL;
+ char c_buf[TAP_ONIONSKIN_CHALLENGE_LEN];
+ char c_keys[40];
+ /* server-side */
+ char s_buf[TAP_ONIONSKIN_REPLY_LEN];
+ char s_keys[40];
int i;
- (void)arg;
-
- buf = generic_buffer_new();
- tt_assert(buf);
-
- /* Copy an empty buffer. */
- tt_int_op(0, ==, generic_buffer_set_to_copy(&buf2, buf));
- tt_assert(buf2);
- tt_int_op(0, ==, generic_buffer_len(buf2));
-
- /* Now try with a short buffer. */
- s = "And now comes an act of enormous enormance!";
- len = strlen(s);
- generic_buffer_add(buf, s, len);
- tt_int_op(len, ==, generic_buffer_len(buf));
- /* Add junk to buf2 so we can test replacing.*/
- generic_buffer_add(buf2, "BLARG", 5);
- tt_int_op(0, ==, generic_buffer_set_to_copy(&buf2, buf));
- tt_int_op(len, ==, generic_buffer_len(buf2));
- generic_buffer_get(buf2, b, len);
- test_mem_op(b, ==, s, len);
- /* Now free buf2 and retry so we can test allocating */
- generic_buffer_free(buf2);
- buf2 = NULL;
- tt_int_op(0, ==, generic_buffer_set_to_copy(&buf2, buf));
- tt_int_op(len, ==, generic_buffer_len(buf2));
- generic_buffer_get(buf2, b, len);
- test_mem_op(b, ==, s, len);
- /* Clear buf for next test */
- generic_buffer_get(buf, b, len);
- tt_int_op(generic_buffer_len(buf),==,0);
-
- /* Okay, now let's try a bigger buffer. */
- s = "Quis autem vel eum iure reprehenderit qui in ea voluptate velit "
- "esse quam nihil molestiae consequatur, vel illum qui dolorem eum "
- "fugiat quo voluptas nulla pariatur?";
- len = strlen(s);
- for (i = 0; i < 256; ++i) {
- b[0]=i;
- generic_buffer_add(buf, b, 1);
- generic_buffer_add(buf, s, len);
- }
- tt_int_op(0, ==, generic_buffer_set_to_copy(&buf2, buf));
- tt_int_op(generic_buffer_len(buf2), ==, generic_buffer_len(buf));
- for (i = 0; i < 256; ++i) {
- generic_buffer_get(buf2, b, len+1);
- tt_int_op((unsigned char)b[0],==,i);
- test_mem_op(b+1, ==, s, len);
- }
-
- done:
- if (buf)
- generic_buffer_free(buf);
- if (buf2)
- generic_buffer_free(buf2);
-}
-
-/** Run unit tests for buffers.c */
-static void
-test_buffers(void)
-{
- char str[256];
- char str2[256];
-
- buf_t *buf = NULL, *buf2 = NULL;
- const char *cp;
+ /* shared */
+ crypto_pk_t *pk = NULL, *pk2 = NULL;
- int j;
- size_t r;
+ pk = pk_generate(0);
+ pk2 = pk_generate(1);
- /****
- * buf_new
- ****/
- if (!(buf = buf_new()))
- test_fail();
+ /* client handshake 1. */
+ memset(c_buf, 0, TAP_ONIONSKIN_CHALLENGE_LEN);
+ test_assert(! onion_skin_TAP_create(pk, &c_dh, c_buf));
- //test_eq(buf_capacity(buf), 4096);
- test_eq(buf_datalen(buf), 0);
+ for (i = 1; i <= 3; ++i) {
+ crypto_pk_t *k1, *k2;
+ if (i==1) {
+ /* server handshake: only one key known. */
+ k1 = pk; k2 = NULL;
+ } else if (i==2) {
+ /* server handshake: try the right key first. */
+ k1 = pk; k2 = pk2;
+ } else {
+ /* server handshake: try the right key second. */
+ k1 = pk2; k2 = pk;
+ }
- /****
- * General pointer frobbing
- */
- for (j=0;j<256;++j) {
- str[j] = (char)j;
- }
- write_to_buf(str, 256, buf);
- write_to_buf(str, 256, buf);
- test_eq(buf_datalen(buf), 512);
- fetch_from_buf(str2, 200, buf);
- test_memeq(str, str2, 200);
- test_eq(buf_datalen(buf), 312);
- memset(str2, 0, sizeof(str2));
-
- fetch_from_buf(str2, 256, buf);
- test_memeq(str+200, str2, 56);
- test_memeq(str, str2+56, 200);
- test_eq(buf_datalen(buf), 56);
- memset(str2, 0, sizeof(str2));
- /* Okay, now we should be 512 bytes into the 4096-byte buffer. If we add
- * another 3584 bytes, we hit the end. */
- for (j=0;j<15;++j) {
- write_to_buf(str, 256, buf);
- }
- assert_buf_ok(buf);
- test_eq(buf_datalen(buf), 3896);
- fetch_from_buf(str2, 56, buf);
- test_eq(buf_datalen(buf), 3840);
- test_memeq(str+200, str2, 56);
- for (j=0;j<15;++j) {
- memset(str2, 0, sizeof(str2));
- fetch_from_buf(str2, 256, buf);
- test_memeq(str, str2, 256);
- }
- test_eq(buf_datalen(buf), 0);
- buf_free(buf);
- buf = NULL;
-
- /* Okay, now make sure growing can work. */
- buf = buf_new_with_capacity(16);
- //test_eq(buf_capacity(buf), 16);
- write_to_buf(str+1, 255, buf);
- //test_eq(buf_capacity(buf), 256);
- fetch_from_buf(str2, 254, buf);
- test_memeq(str+1, str2, 254);
- //test_eq(buf_capacity(buf), 256);
- assert_buf_ok(buf);
- write_to_buf(str, 32, buf);
- //test_eq(buf_capacity(buf), 256);
- assert_buf_ok(buf);
- write_to_buf(str, 256, buf);
- assert_buf_ok(buf);
- //test_eq(buf_capacity(buf), 512);
- test_eq(buf_datalen(buf), 33+256);
- fetch_from_buf(str2, 33, buf);
- test_eq(*str2, str[255]);
-
- test_memeq(str2+1, str, 32);
- //test_eq(buf_capacity(buf), 512);
- test_eq(buf_datalen(buf), 256);
- fetch_from_buf(str2, 256, buf);
- test_memeq(str, str2, 256);
-
- /* now try shrinking: case 1. */
- buf_free(buf);
- buf = buf_new_with_capacity(33668);
- for (j=0;j<67;++j) {
- write_to_buf(str,255, buf);
- }
- //test_eq(buf_capacity(buf), 33668);
- test_eq(buf_datalen(buf), 17085);
- for (j=0; j < 40; ++j) {
- fetch_from_buf(str2, 255,buf);
- test_memeq(str2, str, 255);
- }
+ memset(s_buf, 0, TAP_ONIONSKIN_REPLY_LEN);
+ memset(s_keys, 0, 40);
+ test_assert(! onion_skin_TAP_server_handshake(c_buf, k1, k2,
+ s_buf, s_keys, 40));
- /* now try shrinking: case 2. */
- buf_free(buf);
- buf = buf_new_with_capacity(33668);
- for (j=0;j<67;++j) {
- write_to_buf(str,255, buf);
- }
- for (j=0; j < 20; ++j) {
- fetch_from_buf(str2, 255,buf);
- test_memeq(str2, str, 255);
- }
- for (j=0;j<80;++j) {
- write_to_buf(str,255, buf);
- }
- //test_eq(buf_capacity(buf),33668);
- for (j=0; j < 120; ++j) {
- fetch_from_buf(str2, 255,buf);
- test_memeq(str2, str, 255);
- }
+ /* client handshake 2 */
+ memset(c_keys, 0, 40);
+ test_assert(! onion_skin_TAP_client_handshake(c_dh, s_buf, c_keys, 40));
- /* Move from buf to buf. */
- buf_free(buf);
- buf = buf_new_with_capacity(4096);
- buf2 = buf_new_with_capacity(4096);
- for (j=0;j<100;++j)
- write_to_buf(str, 255, buf);
- test_eq(buf_datalen(buf), 25500);
- for (j=0;j<100;++j) {
- r = 10;
- move_buf_to_buf(buf2, buf, &r);
- test_eq(r, 0);
- }
- test_eq(buf_datalen(buf), 24500);
- test_eq(buf_datalen(buf2), 1000);
- for (j=0;j<3;++j) {
- fetch_from_buf(str2, 255, buf2);
- test_memeq(str2, str, 255);
- }
- r = 8192; /*big move*/
- move_buf_to_buf(buf2, buf, &r);
- test_eq(r, 0);
- r = 30000; /* incomplete move */
- move_buf_to_buf(buf2, buf, &r);
- test_eq(r, 13692);
- for (j=0;j<97;++j) {
- fetch_from_buf(str2, 255, buf2);
- test_memeq(str2, str, 255);
+ test_memeq(c_keys, s_keys, 40);
+ memset(s_buf, 0, 40);
+ test_memneq(c_keys, s_buf, 40);
}
- buf_free(buf);
- buf_free(buf2);
- buf = buf2 = NULL;
-
- buf = buf_new_with_capacity(5);
- cp = "Testing. This is a moderately long Testing string.";
- for (j = 0; cp[j]; j++)
- write_to_buf(cp+j, 1, buf);
- test_eq(0, buf_find_string_offset(buf, "Testing", 7));
- test_eq(1, buf_find_string_offset(buf, "esting", 6));
- test_eq(1, buf_find_string_offset(buf, "est", 3));
- test_eq(39, buf_find_string_offset(buf, "ing str", 7));
- test_eq(35, buf_find_string_offset(buf, "Testing str", 11));
- test_eq(32, buf_find_string_offset(buf, "ng ", 3));
- test_eq(43, buf_find_string_offset(buf, "string.", 7));
- test_eq(-1, buf_find_string_offset(buf, "shrdlu", 6));
- test_eq(-1, buf_find_string_offset(buf, "Testing thing", 13));
- test_eq(-1, buf_find_string_offset(buf, "ngx", 3));
- buf_free(buf);
- buf = NULL;
-
- /* Try adding a string too long for any freelist. */
- {
- char *cp = tor_malloc_zero(65536);
- buf = buf_new();
- write_to_buf(cp, 65536, buf);
- tor_free(cp);
-
- tt_int_op(buf_datalen(buf), ==, 65536);
- buf_free(buf);
- buf = NULL;
- }
-
done:
- if (buf)
- buf_free(buf);
- if (buf2)
- buf_free(buf2);
+ crypto_dh_free(c_dh);
+ crypto_pk_free(pk);
+ crypto_pk_free(pk2);
}
-/** Run unit tests for the onion handshake code. */
static void
-test_onion_handshake(void)
+test_bad_onion_handshake(void *arg)
{
+ char junk_buf[TAP_ONIONSKIN_CHALLENGE_LEN];
+ char junk_buf2[TAP_ONIONSKIN_CHALLENGE_LEN];
/* client-side */
crypto_dh_t *c_dh = NULL;
char c_buf[TAP_ONIONSKIN_CHALLENGE_LEN];
char c_keys[40];
-
/* server-side */
char s_buf[TAP_ONIONSKIN_REPLY_LEN];
char s_keys[40];
-
/* shared */
- crypto_pk_t *pk = NULL;
+ crypto_pk_t *pk = NULL, *pk2 = NULL;
+
+ (void)arg;
pk = pk_generate(0);
+ pk2 = pk_generate(1);
- /* client handshake 1. */
+ /* Server: Case 1: the encrypted data is degenerate. */
+ memset(junk_buf, 0, sizeof(junk_buf));
+ crypto_pk_public_hybrid_encrypt(pk, junk_buf2, TAP_ONIONSKIN_CHALLENGE_LEN,
+ junk_buf, DH_KEY_LEN, PK_PKCS1_OAEP_PADDING, 1);
+ tt_int_op(-1, ==,
+ onion_skin_TAP_server_handshake(junk_buf2, pk, NULL,
+ s_buf, s_keys, 40));
+
+ /* Server: Case 2: the encrypted data is not long enough. */
+ memset(junk_buf, 0, sizeof(junk_buf));
+ memset(junk_buf2, 0, sizeof(junk_buf2));
+ crypto_pk_public_encrypt(pk, junk_buf2, sizeof(junk_buf2),
+ junk_buf, 48, PK_PKCS1_OAEP_PADDING);
+ tt_int_op(-1, ==,
+ onion_skin_TAP_server_handshake(junk_buf2, pk, NULL,
+ s_buf, s_keys, 40));
+
+ /* client handshake 1: do it straight. */
memset(c_buf, 0, TAP_ONIONSKIN_CHALLENGE_LEN);
test_assert(! onion_skin_TAP_create(pk, &c_dh, c_buf));
- /* server handshake */
- memset(s_buf, 0, TAP_ONIONSKIN_REPLY_LEN);
- memset(s_keys, 0, 40);
- test_assert(! onion_skin_TAP_server_handshake(c_buf, pk, NULL,
+ /* Server: Case 3: we just don't have the right key. */
+ tt_int_op(-1, ==,
+ onion_skin_TAP_server_handshake(c_buf, pk2, NULL,
s_buf, s_keys, 40));
- /* client handshake 2 */
- memset(c_keys, 0, 40);
- test_assert(! onion_skin_TAP_client_handshake(c_dh, s_buf, c_keys, 40));
+ /* Server: Case 4: The RSA-encrypted portion is corrupt. */
+ c_buf[64] ^= 33;
+ tt_int_op(-1, ==,
+ onion_skin_TAP_server_handshake(c_buf, pk, NULL,
+ s_buf, s_keys, 40));
+ c_buf[64] ^= 33;
- if (memcmp(c_keys, s_keys, 40)) {
- puts("Aiiiie");
- exit(1);
- }
- test_memeq(c_keys, s_keys, 40);
- memset(s_buf, 0, 40);
- test_memneq(c_keys, s_buf, 40);
+ /* (Let the server procede) */
+ tt_int_op(0, ==,
+ onion_skin_TAP_server_handshake(c_buf, pk, NULL,
+ s_buf, s_keys, 40));
+
+ /* Client: Case 1: The server sent back junk. */
+ s_buf[64] ^= 33;
+ tt_int_op(-1, ==,
+ onion_skin_TAP_client_handshake(c_dh, s_buf, c_keys, 40));
+ s_buf[64] ^= 33;
+
+ /* Let the client finish; make sure it can. */
+ tt_int_op(0, ==,
+ onion_skin_TAP_client_handshake(c_dh, s_buf, c_keys, 40));
+ test_memeq(s_keys, c_keys, 40);
+
+ /* Client: Case 2: The server sent back a degenerate DH. */
+ memset(s_buf, 0, sizeof(s_buf));
+ tt_int_op(-1, ==,
+ onion_skin_TAP_client_handshake(c_dh, s_buf, c_keys, 40));
done:
- if (c_dh)
- crypto_dh_free(c_dh);
- if (pk)
- crypto_pk_free(pk);
+ crypto_dh_free(c_dh);
+ crypto_pk_free(pk);
+ crypto_pk_free(pk2);
}
#ifdef CURVE25519_ENABLED
@@ -945,9 +420,10 @@ test_onion_queues(void)
or_circuit_t *circ1 = or_circuit_new(0, NULL);
or_circuit_t *circ2 = or_circuit_new(0, NULL);
- create_cell_t *onionskin = NULL;
+ create_cell_t *onionskin = NULL, *create2_ptr;
create_cell_t *create1 = tor_malloc_zero(sizeof(create_cell_t));
create_cell_t *create2 = tor_malloc_zero(sizeof(create_cell_t));
+ create2_ptr = create2; /* remember, but do not free */
create_cell_init(create1, CELL_CREATE, ONION_HANDSHAKE_TYPE_TAP,
TAP_ONIONSKIN_CHALLENGE_LEN, buf1);
@@ -956,26 +432,29 @@ test_onion_queues(void)
test_eq(0, onion_num_pending(ONION_HANDSHAKE_TYPE_TAP));
test_eq(0, onion_pending_add(circ1, create1));
+ create1 = NULL;
test_eq(1, onion_num_pending(ONION_HANDSHAKE_TYPE_TAP));
test_eq(0, onion_num_pending(ONION_HANDSHAKE_TYPE_NTOR));
test_eq(0, onion_pending_add(circ2, create2));
+ create2 = NULL;
test_eq(1, onion_num_pending(ONION_HANDSHAKE_TYPE_NTOR));
test_eq_ptr(circ2, onion_next_task(&onionskin));
test_eq(1, onion_num_pending(ONION_HANDSHAKE_TYPE_TAP));
test_eq(0, onion_num_pending(ONION_HANDSHAKE_TYPE_NTOR));
+ tt_ptr_op(onionskin, ==, create2_ptr);
clear_pending_onions();
test_eq(0, onion_num_pending(ONION_HANDSHAKE_TYPE_TAP));
test_eq(0, onion_num_pending(ONION_HANDSHAKE_TYPE_NTOR));
done:
- ;
-// circuit_free(circ1);
-// circuit_free(circ2);
- /* and free create1 and create2 */
- /* XXX leaks everything here */
+ circuit_free(TO_CIRCUIT(circ1));
+ circuit_free(TO_CIRCUIT(circ2));
+ tor_free(create1);
+ tor_free(create2);
+ tor_free(onionskin);
}
static void
@@ -994,14 +473,14 @@ test_circuit_timeout(void)
circuit_build_times_t estimate;
circuit_build_times_t final;
double timeout1, timeout2;
- or_state_t state;
+ or_state_t *state=NULL;
int i, runs;
double close_ms;
circuit_build_times_init(&initial);
circuit_build_times_init(&estimate);
circuit_build_times_init(&final);
- memset(&state, 0, sizeof(or_state_t));
+ state = or_state_new();
circuitbuild_running_unit_tests();
#define timeout0 (build_time_t)(30*1000.0)
@@ -1033,8 +512,9 @@ test_circuit_timeout(void)
test_assert(estimate.total_build_times <= CBT_NCIRCUITS_TO_OBSERVE);
- circuit_build_times_update_state(&estimate, &state);
- test_assert(circuit_build_times_parse_state(&final, &state) == 0);
+ circuit_build_times_update_state(&estimate, state);
+ circuit_build_times_free_timeouts(&final);
+ test_assert(circuit_build_times_parse_state(&final, state) == 0);
circuit_build_times_update_alpha(&final);
timeout2 = circuit_build_times_calculate_timeout(&final,
@@ -1123,336 +603,10 @@ test_circuit_timeout(void)
}
done:
- return;
-}
-
-/* Helper: assert that short_policy parses and writes back out as itself,
- or as <b>expected</b> if that's provided. */
-static void
-test_short_policy_parse(const char *input,
- const char *expected)
-{
- short_policy_t *short_policy = NULL;
- char *out = NULL;
-
- if (expected == NULL)
- expected = input;
-
- short_policy = parse_short_policy(input);
- tt_assert(short_policy);
- out = write_short_policy(short_policy);
- tt_str_op(out, ==, expected);
-
- done:
- tor_free(out);
- short_policy_free(short_policy);
-}
-
-/** Helper: Parse the exit policy string in <b>policy_str</b>, and make sure
- * that policies_summarize() produces the string <b>expected_summary</b> from
- * it. */
-static void
-test_policy_summary_helper(const char *policy_str,
- const char *expected_summary)
-{
- config_line_t line;
- smartlist_t *policy = smartlist_new();
- char *summary = NULL;
- char *summary_after = NULL;
- int r;
- short_policy_t *short_policy = NULL;
-
- line.key = (char*)"foo";
- line.value = (char *)policy_str;
- line.next = NULL;
-
- r = policies_parse_exit_policy(&line, &policy, 1, 0, NULL, 1);
- test_eq(r, 0);
- summary = policy_summarize(policy, AF_INET);
-
- test_assert(summary != NULL);
- test_streq(summary, expected_summary);
-
- short_policy = parse_short_policy(summary);
- tt_assert(short_policy);
- summary_after = write_short_policy(short_policy);
- test_streq(summary, summary_after);
-
- done:
- tor_free(summary_after);
- tor_free(summary);
- if (policy)
- addr_policy_list_free(policy);
- short_policy_free(short_policy);
-}
-
-/** Run unit tests for generating summary lines of exit policies */
-static void
-test_policies(void)
-{
- int i;
- smartlist_t *policy = NULL, *policy2 = NULL, *policy3 = NULL,
- *policy4 = NULL, *policy5 = NULL, *policy6 = NULL,
- *policy7 = NULL;
- addr_policy_t *p;
- tor_addr_t tar;
- config_line_t line;
- smartlist_t *sm = NULL;
- char *policy_str = NULL;
-
- policy = smartlist_new();
-
- p = router_parse_addr_policy_item_from_string("reject 192.168.0.0/16:*",-1);
- test_assert(p != NULL);
- test_eq(ADDR_POLICY_REJECT, p->policy_type);
- tor_addr_from_ipv4h(&tar, 0xc0a80000u);
- test_eq(0, tor_addr_compare(&p->addr, &tar, CMP_EXACT));
- test_eq(16, p->maskbits);
- test_eq(1, p->prt_min);
- test_eq(65535, p->prt_max);
-
- smartlist_add(policy, p);
-
- tor_addr_from_ipv4h(&tar, 0x01020304u);
- test_assert(ADDR_POLICY_ACCEPTED ==
- compare_tor_addr_to_addr_policy(&tar, 2, policy));
- tor_addr_make_unspec(&tar);
- test_assert(ADDR_POLICY_PROBABLY_ACCEPTED ==
- compare_tor_addr_to_addr_policy(&tar, 2, policy));
- tor_addr_from_ipv4h(&tar, 0xc0a80102);
- test_assert(ADDR_POLICY_REJECTED ==
- compare_tor_addr_to_addr_policy(&tar, 2, policy));
-
- test_assert(0 == policies_parse_exit_policy(NULL, &policy2, 1, 1, NULL, 1));
- test_assert(policy2);
-
- policy3 = smartlist_new();
- p = router_parse_addr_policy_item_from_string("reject *:*",-1);
- test_assert(p != NULL);
- smartlist_add(policy3, p);
- p = router_parse_addr_policy_item_from_string("accept *:*",-1);
- test_assert(p != NULL);
- smartlist_add(policy3, p);
-
- policy4 = smartlist_new();
- p = router_parse_addr_policy_item_from_string("accept *:443",-1);
- test_assert(p != NULL);
- smartlist_add(policy4, p);
- p = router_parse_addr_policy_item_from_string("accept *:443",-1);
- test_assert(p != NULL);
- smartlist_add(policy4, p);
-
- policy5 = smartlist_new();
- p = router_parse_addr_policy_item_from_string("reject 0.0.0.0/8:*",-1);
- test_assert(p != NULL);
- smartlist_add(policy5, p);
- p = router_parse_addr_policy_item_from_string("reject 169.254.0.0/16:*",-1);
- test_assert(p != NULL);
- smartlist_add(policy5, p);
- p = router_parse_addr_policy_item_from_string("reject 127.0.0.0/8:*",-1);
- test_assert(p != NULL);
- smartlist_add(policy5, p);
- p = router_parse_addr_policy_item_from_string("reject 192.168.0.0/16:*",-1);
- test_assert(p != NULL);
- smartlist_add(policy5, p);
- p = router_parse_addr_policy_item_from_string("reject 10.0.0.0/8:*",-1);
- test_assert(p != NULL);
- smartlist_add(policy5, p);
- p = router_parse_addr_policy_item_from_string("reject 172.16.0.0/12:*",-1);
- test_assert(p != NULL);
- smartlist_add(policy5, p);
- p = router_parse_addr_policy_item_from_string("reject 80.190.250.90:*",-1);
- test_assert(p != NULL);
- smartlist_add(policy5, p);
- p = router_parse_addr_policy_item_from_string("reject *:1-65534",-1);
- test_assert(p != NULL);
- smartlist_add(policy5, p);
- p = router_parse_addr_policy_item_from_string("reject *:65535",-1);
- test_assert(p != NULL);
- smartlist_add(policy5, p);
- p = router_parse_addr_policy_item_from_string("accept *:1-65535",-1);
- test_assert(p != NULL);
- smartlist_add(policy5, p);
-
- policy6 = smartlist_new();
- p = router_parse_addr_policy_item_from_string("accept 43.3.0.0/9:*",-1);
- test_assert(p != NULL);
- smartlist_add(policy6, p);
-
- policy7 = smartlist_new();
- p = router_parse_addr_policy_item_from_string("accept 0.0.0.0/8:*",-1);
- test_assert(p != NULL);
- smartlist_add(policy7, p);
-
- test_assert(!exit_policy_is_general_exit(policy));
- test_assert(exit_policy_is_general_exit(policy2));
- test_assert(!exit_policy_is_general_exit(NULL));
- test_assert(!exit_policy_is_general_exit(policy3));
- test_assert(!exit_policy_is_general_exit(policy4));
- test_assert(!exit_policy_is_general_exit(policy5));
- test_assert(!exit_policy_is_general_exit(policy6));
- test_assert(!exit_policy_is_general_exit(policy7));
-
- test_assert(cmp_addr_policies(policy, policy2));
- test_assert(cmp_addr_policies(policy, NULL));
- test_assert(!cmp_addr_policies(policy2, policy2));
- test_assert(!cmp_addr_policies(NULL, NULL));
-
- test_assert(!policy_is_reject_star(policy2, AF_INET));
- test_assert(policy_is_reject_star(policy, AF_INET));
- test_assert(policy_is_reject_star(NULL, AF_INET));
-
- addr_policy_list_free(policy);
- policy = NULL;
-
- /* make sure compacting logic works. */
- policy = NULL;
- line.key = (char*)"foo";
- line.value = (char*)"accept *:80,reject private:*,reject *:*";
- line.next = NULL;
- test_assert(0 == policies_parse_exit_policy(&line, &policy, 1, 0, NULL, 1));
- test_assert(policy);
- //test_streq(policy->string, "accept *:80");
- //test_streq(policy->next->string, "reject *:*");
- test_eq(smartlist_len(policy), 4);
-
- /* test policy summaries */
- /* check if we properly ignore private IP addresses */
- test_policy_summary_helper("reject 192.168.0.0/16:*,"
- "reject 0.0.0.0/8:*,"
- "reject 10.0.0.0/8:*,"
- "accept *:10-30,"
- "accept *:90,"
- "reject *:*",
- "accept 10-30,90");
- /* check all accept policies, and proper counting of rejects */
- test_policy_summary_helper("reject 11.0.0.0/9:80,"
- "reject 12.0.0.0/9:80,"
- "reject 13.0.0.0/9:80,"
- "reject 14.0.0.0/9:80,"
- "accept *:*", "accept 1-65535");
- test_policy_summary_helper("reject 11.0.0.0/9:80,"
- "reject 12.0.0.0/9:80,"
- "reject 13.0.0.0/9:80,"
- "reject 14.0.0.0/9:80,"
- "reject 15.0.0.0:81,"
- "accept *:*", "accept 1-65535");
- test_policy_summary_helper("reject 11.0.0.0/9:80,"
- "reject 12.0.0.0/9:80,"
- "reject 13.0.0.0/9:80,"
- "reject 14.0.0.0/9:80,"
- "reject 15.0.0.0:80,"
- "accept *:*",
- "reject 80");
- /* no exits */
- test_policy_summary_helper("accept 11.0.0.0/9:80,"
- "reject *:*",
- "reject 1-65535");
- /* port merging */
- test_policy_summary_helper("accept *:80,"
- "accept *:81,"
- "accept *:100-110,"
- "accept *:111,"
- "reject *:*",
- "accept 80-81,100-111");
- /* border ports */
- test_policy_summary_helper("accept *:1,"
- "accept *:3,"
- "accept *:65535,"
- "reject *:*",
- "accept 1,3,65535");
- /* holes */
- test_policy_summary_helper("accept *:1,"
- "accept *:3,"
- "accept *:5,"
- "accept *:7,"
- "reject *:*",
- "accept 1,3,5,7");
- test_policy_summary_helper("reject *:1,"
- "reject *:3,"
- "reject *:5,"
- "reject *:7,"
- "accept *:*",
- "reject 1,3,5,7");
-
- /* Short policies with unrecognized formats should get accepted. */
- test_short_policy_parse("accept fred,2,3-5", "accept 2,3-5");
- test_short_policy_parse("accept 2,fred,3", "accept 2,3");
- test_short_policy_parse("accept 2,fred,3,bob", "accept 2,3");
- test_short_policy_parse("accept 2,-3,500-600", "accept 2,500-600");
- /* Short policies with nil entries are accepted too. */
- test_short_policy_parse("accept 1,,3", "accept 1,3");
- test_short_policy_parse("accept 100-200,,", "accept 100-200");
- test_short_policy_parse("reject ,1-10,,,,30-40", "reject 1-10,30-40");
-
- /* Try parsing various broken short policies */
- tt_ptr_op(NULL, ==, parse_short_policy("accept 200-199"));
- tt_ptr_op(NULL, ==, parse_short_policy(""));
- tt_ptr_op(NULL, ==, parse_short_policy("rejekt 1,2,3"));
- tt_ptr_op(NULL, ==, parse_short_policy("reject "));
- tt_ptr_op(NULL, ==, parse_short_policy("reject"));
- tt_ptr_op(NULL, ==, parse_short_policy("rej"));
- tt_ptr_op(NULL, ==, parse_short_policy("accept 2,3,100000"));
- tt_ptr_op(NULL, ==, parse_short_policy("accept 2,3x,4"));
- tt_ptr_op(NULL, ==, parse_short_policy("accept 2,3x,4"));
- tt_ptr_op(NULL, ==, parse_short_policy("accept 2-"));
- tt_ptr_op(NULL, ==, parse_short_policy("accept 2-x"));
- tt_ptr_op(NULL, ==, parse_short_policy("accept 1-,3"));
- tt_ptr_op(NULL, ==, parse_short_policy("accept 1-,3"));
- /* Test a too-long policy. */
- {
- int i;
- char *policy = NULL;
- smartlist_t *chunks = smartlist_new();
- smartlist_add(chunks, tor_strdup("accept "));
- for (i=1; i<10000; ++i)
- smartlist_add_asprintf(chunks, "%d,", i);
- smartlist_add(chunks, tor_strdup("20000"));
- policy = smartlist_join_strings(chunks, "", 0, NULL);
- SMARTLIST_FOREACH(chunks, char *, ch, tor_free(ch));
- smartlist_free(chunks);
- tt_ptr_op(NULL, ==, parse_short_policy(policy));/* shouldn't be accepted */
- tor_free(policy); /* could leak. */
- }
-
- /* truncation ports */
- sm = smartlist_new();
- for (i=1; i<2000; i+=2) {
- char buf[POLICY_BUF_LEN];
- tor_snprintf(buf, sizeof(buf), "reject *:%d", i);
- smartlist_add(sm, tor_strdup(buf));
- }
- smartlist_add(sm, tor_strdup("accept *:*"));
- policy_str = smartlist_join_strings(sm, ",", 0, NULL);
- test_policy_summary_helper( policy_str,
- "accept 2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,"
- "46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,"
- "92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,"
- "130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,"
- "166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200,"
- "202,204,206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,236,"
- "238,240,242,244,246,248,250,252,254,256,258,260,262,264,266,268,270,272,"
- "274,276,278,280,282,284,286,288,290,292,294,296,298,300,302,304,306,308,"
- "310,312,314,316,318,320,322,324,326,328,330,332,334,336,338,340,342,344,"
- "346,348,350,352,354,356,358,360,362,364,366,368,370,372,374,376,378,380,"
- "382,384,386,388,390,392,394,396,398,400,402,404,406,408,410,412,414,416,"
- "418,420,422,424,426,428,430,432,434,436,438,440,442,444,446,448,450,452,"
- "454,456,458,460,462,464,466,468,470,472,474,476,478,480,482,484,486,488,"
- "490,492,494,496,498,500,502,504,506,508,510,512,514,516,518,520,522");
-
- done:
- addr_policy_list_free(policy);
- addr_policy_list_free(policy2);
- addr_policy_list_free(policy3);
- addr_policy_list_free(policy4);
- addr_policy_list_free(policy5);
- addr_policy_list_free(policy6);
- addr_policy_list_free(policy7);
- tor_free(policy_str);
- if (sm) {
- SMARTLIST_FOREACH(sm, char *, s, tor_free(s));
- smartlist_free(sm);
- }
+ circuit_build_times_free_timeouts(&initial);
+ circuit_build_times_free_timeouts(&estimate);
+ circuit_build_times_free_timeouts(&final);
+ or_state_free(state);
}
/** Test encoding and parsing of rendezvous service descriptors. */
@@ -1579,6 +733,34 @@ test_rend_fns(void)
tor_free(intro_points_encrypted);
}
+ /* Record odd numbered fake-IPs using ipv6, even numbered fake-IPs
+ * using ipv4. Since our fake geoip database is the same between
+ * ipv4 and ipv6, we should get the same result no matter which
+ * address family we pick for each IP. */
+#define SET_TEST_ADDRESS(i) do { \
+ if ((i) & 1) { \
+ SET_TEST_IPV6(i); \
+ tor_addr_from_in6(&addr, &in6); \
+ } else { \
+ tor_addr_from_ipv4h(&addr, (uint32_t) i); \
+ } \
+ } while (0)
+
+ /* Make sure that country ID actually works. */
+#define SET_TEST_IPV6(i) \
+ do { \
+ set_uint32(in6.s6_addr + 12, htonl((uint32_t) (i))); \
+ } while (0)
+#define CHECK_COUNTRY(country, val) do { \
+ /* test ipv4 country lookup */ \
+ test_streq(country, \
+ geoip_get_country_name(geoip_get_country_by_ipv4(val))); \
+ /* test ipv6 country lookup */ \
+ SET_TEST_IPV6(val); \
+ test_streq(country, \
+ geoip_get_country_name(geoip_get_country_by_ipv6(&in6))); \
+ } while (0)
+
/** Run unit tests for GeoIP code. */
static void
test_geoip(void)
@@ -1589,7 +771,8 @@ test_geoip(void)
const char *bridge_stats_1 =
"bridge-stats-end 2010-08-12 13:27:30 (86400 s)\n"
"bridge-ips zz=24,xy=8\n"
- "bridge-ip-versions v4=16,v6=16\n",
+ "bridge-ip-versions v4=16,v6=16\n"
+ "bridge-ip-transports <OR>=24\n",
*dirreq_stats_1 =
"dirreq-stats-end 2010-08-12 13:27:30 (86400 s)\n"
"dirreq-v3-ips ab=8\n"
@@ -1653,21 +836,6 @@ test_geoip(void)
test_eq(4, geoip_get_n_countries());
memset(&in6, 0, sizeof(in6));
- /* Make sure that country ID actually works. */
-#define SET_TEST_IPV6(i) \
- do { \
- set_uint32(in6.s6_addr + 12, htonl((uint32_t) (i))); \
- } while (0)
-#define CHECK_COUNTRY(country, val) do { \
- /* test ipv4 country lookup */ \
- test_streq(country, \
- geoip_get_country_name(geoip_get_country_by_ipv4(val))); \
- /* test ipv6 country lookup */ \
- SET_TEST_IPV6(val); \
- test_streq(country, \
- geoip_get_country_name(geoip_get_country_by_ipv6(&in6))); \
- } while (0)
-
CHECK_COUNTRY("??", 3);
CHECK_COUNTRY("ab", 32);
CHECK_COUNTRY("??", 5);
@@ -1680,40 +848,25 @@ test_geoip(void)
SET_TEST_IPV6(3);
test_eq(0, geoip_get_country_by_ipv6(&in6));
-#undef CHECK_COUNTRY
-
- /* Record odd numbered fake-IPs using ipv6, even numbered fake-IPs
- * using ipv4. Since our fake geoip database is the same between
- * ipv4 and ipv6, we should get the same result no matter which
- * address family we pick for each IP. */
-#define SET_TEST_ADDRESS(i) do { \
- if ((i) & 1) { \
- SET_TEST_IPV6(i); \
- tor_addr_from_in6(&addr, &in6); \
- } else { \
- tor_addr_from_ipv4h(&addr, (uint32_t) i); \
- } \
- } while (0)
-
get_options_mutable()->BridgeRelay = 1;
get_options_mutable()->BridgeRecordUsageByCountry = 1;
/* Put 9 observations in AB... */
for (i=32; i < 40; ++i) {
SET_TEST_ADDRESS(i);
- geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, now-7200);
+ geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now-7200);
}
SET_TEST_ADDRESS(225);
- geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, now-7200);
+ geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now-7200);
/* and 3 observations in XY, several times. */
for (j=0; j < 10; ++j)
for (i=52; i < 55; ++i) {
SET_TEST_ADDRESS(i);
- geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, now-3600);
+ geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now-3600);
}
/* and 17 observations in ZZ... */
for (i=110; i < 127; ++i) {
SET_TEST_ADDRESS(i);
- geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, now);
+ geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now);
}
geoip_get_client_history(GEOIP_CLIENT_CONNECT, &s, &v);
test_assert(s);
@@ -1762,7 +915,7 @@ test_geoip(void)
/* Start testing dirreq statistics by making sure that we don't collect
* dirreq stats without initializing them. */
SET_TEST_ADDRESS(100);
- geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, &addr, now);
+ geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, &addr, NULL, now);
s = geoip_format_dirreq_stats(now + 86400);
test_assert(!s);
@@ -1770,7 +923,7 @@ test_geoip(void)
* dirreq-stats history string. */
geoip_dirreq_stats_init(now);
SET_TEST_ADDRESS(100);
- geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, &addr, now);
+ geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, &addr, NULL, now);
s = geoip_format_dirreq_stats(now + 86400);
test_streq(dirreq_stats_1, s);
tor_free(s);
@@ -1779,7 +932,7 @@ test_geoip(void)
* don't generate a history string. */
geoip_dirreq_stats_term();
SET_TEST_ADDRESS(101);
- geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, &addr, now);
+ geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, &addr, NULL, now);
s = geoip_format_dirreq_stats(now + 86400);
test_assert(!s);
@@ -1787,7 +940,7 @@ test_geoip(void)
* that we get an all empty history string. */
geoip_dirreq_stats_init(now);
SET_TEST_ADDRESS(100);
- geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, &addr, now);
+ geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, &addr, NULL, now);
geoip_reset_dirreq_stats(now);
s = geoip_format_dirreq_stats(now + 86400);
test_streq(dirreq_stats_2, s);
@@ -1804,6 +957,7 @@ test_geoip(void)
geoip_start_dirreq((uint64_t) 1, 1024, DIRREQ_TUNNELED);
s = geoip_format_dirreq_stats(now + 86400);
test_streq(dirreq_stats_4, s);
+ tor_free(s);
/* Stop collecting directory request statistics and start gathering
* entry stats. */
@@ -1814,7 +968,7 @@ test_geoip(void)
/* Start testing entry statistics by making sure that we don't collect
* anything without initializing entry stats. */
SET_TEST_ADDRESS(100);
- geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, now);
+ geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now);
s = geoip_format_entry_stats(now + 86400);
test_assert(!s);
@@ -1822,7 +976,7 @@ test_geoip(void)
* entry-stats history string. */
geoip_entry_stats_init(now);
SET_TEST_ADDRESS(100);
- geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, now);
+ geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now);
s = geoip_format_entry_stats(now + 86400);
test_streq(entry_stats_1, s);
tor_free(s);
@@ -1831,7 +985,7 @@ test_geoip(void)
* don't generate a history string. */
geoip_entry_stats_term();
SET_TEST_ADDRESS(101);
- geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, now);
+ geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now);
s = geoip_format_entry_stats(now + 86400);
test_assert(!s);
@@ -1839,15 +993,12 @@ test_geoip(void)
* that we get an all empty history string. */
geoip_entry_stats_init(now);
SET_TEST_ADDRESS(100);
- geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, now);
+ geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now);
geoip_reset_entry_stats(now);
s = geoip_format_entry_stats(now + 86400);
test_streq(entry_stats_2, s);
tor_free(s);
-#undef SET_TEST_ADDRESS
-#undef SET_TEST_IPV6
-
/* Stop collecting entry statistics. */
geoip_entry_stats_term();
get_options_mutable()->EntryStatistics = 0;
@@ -1857,6 +1008,81 @@ test_geoip(void)
tor_free(v);
}
+static void
+test_geoip_with_pt(void)
+{
+ time_t now = 1281533250; /* 2010-08-11 13:27:30 UTC */
+ char *s = NULL;
+ int i;
+ tor_addr_t addr;
+ struct in6_addr in6;
+
+ get_options_mutable()->BridgeRelay = 1;
+ get_options_mutable()->BridgeRecordUsageByCountry = 1;
+
+ memset(&in6, 0, sizeof(in6));
+
+ /* No clients seen yet. */
+ s = geoip_get_transport_history();
+ tor_assert(!s);
+
+ /* 4 connections without a pluggable transport */
+ for (i=0; i < 4; ++i) {
+ SET_TEST_ADDRESS(i);
+ geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now-7200);
+ }
+
+ /* 9 connections with "alpha" */
+ for (i=4; i < 13; ++i) {
+ SET_TEST_ADDRESS(i);
+ geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, "alpha", now-7200);
+ }
+
+ /* one connection with "beta" */
+ SET_TEST_ADDRESS(13);
+ geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, "beta", now-7200);
+
+ /* 14 connections with "charlie" */
+ for (i=14; i < 28; ++i) {
+ SET_TEST_ADDRESS(i);
+ geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, "charlie", now-7200);
+ }
+
+ /* 131 connections with "ddr" */
+ for (i=28; i < 159; ++i) {
+ SET_TEST_ADDRESS(i);
+ geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, "ddr", now-7200);
+ }
+
+ /* 8 connections with "entropy" */
+ for (i=159; i < 167; ++i) {
+ SET_TEST_ADDRESS(i);
+ geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, "entropy", now-7200);
+ }
+
+ /* 2 connections from the same IP with two different transports. */
+ SET_TEST_ADDRESS(++i);
+ geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, "fire", now-7200);
+ geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, "google", now-7200);
+
+ /* Test the transport history string. */
+ s = geoip_get_transport_history();
+ tor_assert(s);
+ test_streq(s, "<OR>=8,alpha=16,beta=8,charlie=16,ddr=136,"
+ "entropy=8,fire=8,google=8");
+
+ /* Stop collecting entry statistics. */
+ geoip_entry_stats_term();
+ get_options_mutable()->EntryStatistics = 0;
+
+ done:
+ tor_free(s);
+}
+
+#undef SET_TEST_ADDRESS
+#undef SET_TEST_IPV6
+#undef CHECK_COUNTRY
+
/** Run unit tests for stats code. */
static void
test_stats(void)
@@ -2047,40 +1273,23 @@ const struct testcase_setup_t legacy_setup = {
{ #name, legacy_test_helper, TT_FORK, &legacy_setup, test_ ## name }
static struct testcase_t test_array[] = {
- ENT(buffers),
- { "buffer_copy", test_buffer_copy, 0, NULL, NULL },
ENT(onion_handshake),
+ { "bad_onion_handshake", test_bad_onion_handshake, 0, NULL, NULL },
ENT(onion_queues),
#ifdef CURVE25519_ENABLED
{ "ntor_handshake", test_ntor_handshake, 0, NULL, NULL },
#endif
ENT(circuit_timeout),
- ENT(policies),
ENT(rend_fns),
ENT(geoip),
+ FORK(geoip_with_pt),
FORK(stats),
END_OF_TESTCASES
};
-#define SOCKSENT(name) \
- { #name, test_socks_##name, TT_FORK, &socks_setup, NULL }
-
-static struct testcase_t socks_tests[] = {
- SOCKSENT(4_unsupported_commands),
- SOCKSENT(4_supported_commands),
-
- SOCKSENT(5_unsupported_commands),
- SOCKSENT(5_supported_commands),
- SOCKSENT(5_no_authenticate),
- SOCKSENT(5_auth_before_negotiation),
- SOCKSENT(5_authenticate),
- SOCKSENT(5_authenticate_with_data),
-
- END_OF_TESTCASES
-};
-
extern struct testcase_t addr_tests[];
+extern struct testcase_t buffer_tests[];
extern struct testcase_t crypto_tests[];
extern struct testcase_t container_tests[];
extern struct testcase_t util_tests[];
@@ -2090,22 +1299,52 @@ extern struct testcase_t pt_tests[];
extern struct testcase_t config_tests[];
extern struct testcase_t introduce_tests[];
extern struct testcase_t replaycache_tests[];
+extern struct testcase_t relaycell_tests[];
extern struct testcase_t cell_format_tests[];
+extern struct testcase_t circuitlist_tests[];
+extern struct testcase_t circuitmux_tests[];
+extern struct testcase_t cell_queue_tests[];
+extern struct testcase_t options_tests[];
+extern struct testcase_t socks_tests[];
+extern struct testcase_t extorport_tests[];
+extern struct testcase_t controller_event_tests[];
+extern struct testcase_t logging_tests[];
+extern struct testcase_t hs_tests[];
+extern struct testcase_t nodelist_tests[];
+extern struct testcase_t routerkeys_tests[];
+extern struct testcase_t oom_tests[];
+extern struct testcase_t policy_tests[];
+extern struct testcase_t status_tests[];
static struct testgroup_t testgroups[] = {
{ "", test_array },
+ { "buffer/", buffer_tests },
{ "socks/", socks_tests },
{ "addr/", addr_tests },
{ "crypto/", crypto_tests },
{ "container/", container_tests },
{ "util/", util_tests },
+ { "util/logging/", logging_tests },
{ "cellfmt/", cell_format_tests },
+ { "cellqueue/", cell_queue_tests },
{ "dir/", dir_tests },
{ "dir/md/", microdesc_tests },
{ "pt/", pt_tests },
{ "config/", config_tests },
{ "replaycache/", replaycache_tests },
+ { "relaycell/", relaycell_tests },
{ "introduce/", introduce_tests },
+ { "circuitlist/", circuitlist_tests },
+ { "circuitmux/", circuitmux_tests },
+ { "options/", options_tests },
+ { "extorport/", extorport_tests },
+ { "control/", controller_event_tests },
+ { "hs/", hs_tests },
+ { "nodelist/", nodelist_tests },
+ { "routerkeys/", routerkeys_tests },
+ { "oom/", oom_tests },
+ { "policy/" , policy_tests },
+ { "status/" , status_tests },
END_OF_GROUPS
};
@@ -2118,6 +1357,7 @@ main(int c, const char **v)
char *errmsg = NULL;
int i, i_out;
int loglevel = LOG_ERR;
+ int accel_crypto = 0;
#ifdef USE_DMALLOC
{
@@ -2140,6 +1380,8 @@ main(int c, const char **v)
loglevel = LOG_INFO;
} else if (!strcmp(v[i], "--debug")) {
loglevel = LOG_DEBUG;
+ } else if (!strcmp(v[i], "--accel")) {
+ accel_crypto = 1;
} else {
v[i_out++] = v[i];
}
@@ -2154,7 +1396,7 @@ main(int c, const char **v)
}
options->command = CMD_RUN_UNITTESTS;
- if (crypto_global_init(0, NULL, NULL)) {
+ if (crypto_global_init(accel_crypto, NULL, NULL)) {
printf("Can't initialize crypto subsystem; exiting.\n");
return 1;
}
diff --git a/src/test/test.h b/src/test/test.h
index a89b558e5..861ce5ac3 100644
--- a/src/test/test.h
+++ b/src/test/test.h
@@ -36,17 +36,7 @@
#define test_strneq(expr1, expr2) tt_str_op((expr1), !=, (expr2))
#define test_mem_op(expr1, op, expr2, len) \
- tt_assert_test_fmt_type(expr1,expr2,#expr1" "#op" "#expr2, \
- const char *, \
- (memcmp(val1_, val2_, len) op 0), \
- char *, "%s", \
- { size_t printlen = (len)*2+1; \
- print_ = tor_malloc(printlen); \
- base16_encode(print_, printlen, value_, \
- (len)); }, \
- { tor_free(print_); }, \
- TT_EXIT_TEST_FUNCTION \
- );
+ tt_mem_op((expr1), op, (expr2), (len))
#define test_memeq(expr1, expr2, len) test_mem_op((expr1), ==, (expr2), len)
#define test_memneq(expr1, expr2, len) test_mem_op((expr1), !=, (expr2), len)
@@ -69,11 +59,126 @@
tt_assert_test_type(a,b,#a" "#op" "#b,double,(val1_ op val2_),"%f", \
TT_EXIT_TEST_FUNCTION)
+#ifdef _MSC_VER
+#define U64_PRINTF_TYPE uint64_t
+#define U64_PRINTF_TYPE int64_t
+#else
+#define U64_PRINTF_TYPE unsigned long long
+#define I64_PRINTF_TYPE long long
+#endif
+
+#define tt_size_op(a,op,b) \
+ tt_assert_test_fmt_type(a,b,#a" "#op" "#b,size_t,(val1_ op val2_), \
+ U64_PRINTF_TYPE, U64_FORMAT, \
+ {print_ = (U64_PRINTF_TYPE) value_;}, {}, TT_EXIT_TEST_FUNCTION)
+
+#define tt_u64_op(a,op,b) \
+ tt_assert_test_fmt_type(a,b,#a" "#op" "#b,uint64_t,(val1_ op val2_), \
+ U64_PRINTF_TYPE, U64_FORMAT, \
+ {print_ = (U64_PRINTF_TYPE) value_;}, {}, TT_EXIT_TEST_FUNCTION)
+
+#define tt_i64_op(a,op,b) \
+ tt_assert_test_fmt_type(a,b,#a" "#op" "#b,int64_t,(val1_ op val2_), \
+ I64_PRINTF_TYPE, I64_FORMAT, \
+ {print_ = (I64_PRINTF_TYPE) value_;}, {}, TT_EXIT_TEST_FUNCTION)
+
const char *get_fname(const char *name);
crypto_pk_t *pk_generate(int idx);
void legacy_test_helper(void *data);
extern const struct testcase_setup_t legacy_setup;
+#define US2_CONCAT_2__(a, b) a ## __ ## b
+#define US_CONCAT_2__(a, b) a ## _ ## b
+#define US_CONCAT_3__(a, b, c) a ## _ ## b ## _ ## c
+#define US_CONCAT_2_(a, b) US_CONCAT_2__(a, b)
+#define US_CONCAT_3_(a, b, c) US_CONCAT_3__(a, b, c)
+
+/*
+ * These macros are helpful for streamlining the authorship of several test
+ * cases that use mocks.
+ *
+ * The pattern is as follows.
+ * * Declare a top level namespace:
+ * #define NS_MODULE foo
+ *
+ * * For each test case you want to write, create a new submodule in the
+ * namespace. All mocks and other information should belong to a single
+ * submodule to avoid interference with other test cases.
+ * You can simply name the submodule after the function in the module you
+ * are testing:
+ * #define NS_SUBMODULE some_function
+ * or, if you're wanting to write several tests against the same function,
+ * ie., you are testing an aspect of that function, you can use:
+ * #define NS_SUBMODULE ASPECT(some_function, behavior)
+ *
+ * * Declare all the mocks you will use. The NS_DECL macro serves to declare
+ * the mock in the current namespace (defined by NS_MODULE and NS_SUBMODULE).
+ * It behaves like MOCK_DECL:
+ * NS_DECL(int, dependent_function, (void *));
+ * Here, dependent_function must be declared and implemented with the
+ * MOCK_DECL and MOCK_IMPL macros. The NS_DECL macro also defines an integer
+ * global for use for tracking how many times a mock was called, and can be
+ * accessed by CALLED(mock_name). For example, you might put
+ * CALLED(dependent_function)++;
+ * in your mock body.
+ *
+ * * Define a function called NS(main) that will contain the body of the
+ * test case. The NS macro can be used to reference a name in the current
+ * namespace.
+ *
+ * * In NS(main), indicate that a mock function in the current namespace,
+ * declared with NS_DECL is to override that in the global namespace,
+ * with the NS_MOCK macro:
+ * NS_MOCK(dependent_function)
+ * Unmock with:
+ * NS_UNMOCK(dependent_function)
+ *
+ * * Define the mocks with the NS macro, eg.,
+ * int
+ * NS(dependent_function)(void *)
+ * {
+ * CALLED(dependent_function)++;
+ * }
+ *
+ * * In the struct testcase_t array, you can use the TEST_CASE and
+ * TEST_CASE_ASPECT macros to define the cases without having to do so
+ * explicitly nor without having to reset NS_SUBMODULE, eg.,
+ * struct testcase_t foo_tests[] = {
+ * TEST_CASE_ASPECT(some_function, behavior),
+ * ...
+ * END_OF_TESTCASES
+ * which will define a test case named "some_function__behavior".
+ */
+
+#define NAME_TEST_(name) #name
+#define NAME_TEST(name) NAME_TEST_(name)
+#define ASPECT(test_module, test_name) US2_CONCAT_2__(test_module, test_name)
+#define TEST_CASE(function) \
+ { \
+ NAME_TEST(function), \
+ NS_FULL(NS_MODULE, function, test_main), \
+ TT_FORK, \
+ NULL, \
+ NULL, \
+ }
+#define TEST_CASE_ASPECT(function, aspect) \
+ { \
+ NAME_TEST(ASPECT(function, aspect)), \
+ NS_FULL(NS_MODULE, ASPECT(function, aspect), test_main), \
+ TT_FORK, \
+ NULL, \
+ NULL, \
+ }
+
+#define NS(name) US_CONCAT_3_(NS_MODULE, NS_SUBMODULE, name)
+#define NS_FULL(module, submodule, name) US_CONCAT_3_(module, submodule, name)
+
+#define CALLED(mock_name) US_CONCAT_2_(NS(mock_name), called)
+#define NS_DECL(retval, mock_fn, args) \
+ static retval NS(mock_fn) args; int CALLED(mock_fn) = 0
+#define NS_MOCK(name) MOCK(name, NS(name))
+#define NS_UNMOCK(name) UNMOCK(name)
+
#endif
diff --git a/src/test/test_addr.c b/src/test/test_addr.c
index fec85a469..50011e606 100644
--- a/src/test/test_addr.c
+++ b/src/test/test_addr.c
@@ -44,6 +44,10 @@ test_addr_basic(void)
test_eq(u32, 0x7f000001u);
test_eq(u16, 0);
tor_free(cp);
+
+ test_assert(addr_port_lookup(LOG_WARN, "localhost:3", &cp, &u32, NULL));
+ tor_free(cp);
+
test_eq(0, addr_mask_get_bits(0x0u));
test_eq(32, addr_mask_get_bits(0xFFFFFFFFu));
test_eq(16, addr_mask_get_bits(0xFFFF0000u));
@@ -69,7 +73,7 @@ test_addr_basic(void)
}
done:
- ;
+ tor_free(cp);
}
#define test_op_ip6_(a,op,b,e1,e2) \
@@ -217,11 +221,12 @@ test_addr_ip6_helpers(void)
/* ==== Converting to and from sockaddr_t. */
sin = (struct sockaddr_in *)&sa_storage;
sin->sin_family = AF_INET;
- sin->sin_port = 9090;
+ sin->sin_port = htons(9090);
sin->sin_addr.s_addr = htonl(0x7f7f0102); /*127.127.1.2*/
- tor_addr_from_sockaddr(&t1, (struct sockaddr *)sin, NULL);
+ tor_addr_from_sockaddr(&t1, (struct sockaddr *)sin, &port1);
test_eq(tor_addr_family(&t1), AF_INET);
test_eq(tor_addr_to_ipv4h(&t1), 0x7f7f0102);
+ tt_int_op(port1, ==, 9090);
memset(&sa_storage, 0, sizeof(sa_storage));
test_eq(sizeof(struct sockaddr_in),
@@ -235,8 +240,9 @@ test_addr_ip6_helpers(void)
sin6->sin6_family = AF_INET6;
sin6->sin6_port = htons(7070);
sin6->sin6_addr.s6_addr[0] = 128;
- tor_addr_from_sockaddr(&t1, (struct sockaddr *)sin6, NULL);
+ tor_addr_from_sockaddr(&t1, (struct sockaddr *)sin6, &port1);
test_eq(tor_addr_family(&t1), AF_INET6);
+ tt_int_op(port1, ==, 7070);
p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 0);
test_streq(p1, "8000::");
@@ -340,6 +346,9 @@ test_addr_ip6_helpers(void)
test_pton6_bad("a:::b:c");
test_pton6_bad(":::a:b:c");
test_pton6_bad("a:b:c:::");
+ test_pton6_bad("1.2.3.4");
+ test_pton6_bad(":1.2.3.4");
+ test_pton6_bad(".2.3.4");
/* test internal checking */
test_external_ip("fbff:ffff::2:7", 0);
@@ -396,7 +405,6 @@ test_addr_ip6_helpers(void)
test_internal_ip("::ffff:169.254.0.0", 0);
test_internal_ip("::ffff:169.254.255.255", 0);
test_external_ip("::ffff:169.255.0.0", 0);
- test_assert(is_internal_IP(0x7f000001, 0));
/* tor_addr_compare(tor_addr_t x2) */
test_addr_compare("ffff::", ==, "ffff::0");
@@ -464,6 +472,9 @@ test_addr_ip6_helpers(void)
test_eq(0, i);
i = tor_addr_parse_PTR_name(&t1, "Foobar.baz", AF_UNSPEC, 1);
test_eq(0, i);
+ i = tor_addr_parse_PTR_name(&t1, "9999999999999999999999999999.in-addr.arpa",
+ AF_UNSPEC, 1);
+ test_eq(-1, i);
i = tor_addr_parse_PTR_name(&t1, "1.0.168.192.in-addr.arpa",
AF_UNSPEC, 1);
test_eq(1, i);
@@ -735,42 +746,89 @@ test_addr_parse(void)
/* Correct call. */
r= tor_addr_port_parse(LOG_DEBUG,
"192.0.2.1:1234",
- &addr, &port);
+ &addr, &port, -1);
test_assert(r == 0);
tor_addr_to_str(buf, &addr, sizeof(buf), 0);
test_streq(buf, "192.0.2.1");
test_eq(port, 1234);
+ r= tor_addr_port_parse(LOG_DEBUG,
+ "[::1]:1234",
+ &addr, &port, -1);
+ test_assert(r == 0);
+ tor_addr_to_str(buf, &addr, sizeof(buf), 0);
+ test_streq(buf, "::1");
+ test_eq(port, 1234);
+
/* Domain name. */
r= tor_addr_port_parse(LOG_DEBUG,
"torproject.org:1234",
- &addr, &port);
+ &addr, &port, -1);
test_assert(r == -1);
/* Only IP. */
r= tor_addr_port_parse(LOG_DEBUG,
"192.0.2.2",
- &addr, &port);
+ &addr, &port, -1);
+ test_assert(r == -1);
+
+ r= tor_addr_port_parse(LOG_DEBUG,
+ "192.0.2.2",
+ &addr, &port, 200);
+ test_assert(r == 0);
+ tt_int_op(port,==,200);
+
+ r= tor_addr_port_parse(LOG_DEBUG,
+ "[::1]",
+ &addr, &port, -1);
test_assert(r == -1);
+ r= tor_addr_port_parse(LOG_DEBUG,
+ "[::1]",
+ &addr, &port, 400);
+ test_assert(r == 0);
+ tt_int_op(port,==,400);
+
/* Bad port. */
r= tor_addr_port_parse(LOG_DEBUG,
"192.0.2.2:66666",
- &addr, &port);
+ &addr, &port, -1);
+ test_assert(r == -1);
+ r= tor_addr_port_parse(LOG_DEBUG,
+ "192.0.2.2:66666",
+ &addr, &port, 200);
test_assert(r == -1);
/* Only domain name */
r= tor_addr_port_parse(LOG_DEBUG,
"torproject.org",
- &addr, &port);
+ &addr, &port, -1);
+ test_assert(r == -1);
+ r= tor_addr_port_parse(LOG_DEBUG,
+ "torproject.org",
+ &addr, &port, 200);
test_assert(r == -1);
/* Bad IP address */
r= tor_addr_port_parse(LOG_DEBUG,
"192.0.2:1234",
- &addr, &port);
+ &addr, &port, -1);
test_assert(r == -1);
+ /* Make sure that the default port has lower priority than the real
+ one */
+ r= tor_addr_port_parse(LOG_DEBUG,
+ "192.0.2.2:1337",
+ &addr, &port, 200);
+ test_assert(r == 0);
+ tt_int_op(port,==,1337);
+
+ r= tor_addr_port_parse(LOG_DEBUG,
+ "[::1]:1369",
+ &addr, &port, 200);
+ test_assert(r == 0);
+ tt_int_op(port,==,1369);
+
done:
;
}
@@ -844,6 +902,90 @@ test_virtaddrmap(void *data)
}
static void
+test_addr_localname(void *arg)
+{
+ (void)arg;
+ tt_assert(tor_addr_hostname_is_local("localhost"));
+ tt_assert(tor_addr_hostname_is_local("LOCALHOST"));
+ tt_assert(tor_addr_hostname_is_local("LocalHost"));
+ tt_assert(tor_addr_hostname_is_local("local"));
+ tt_assert(tor_addr_hostname_is_local("LOCAL"));
+ tt_assert(tor_addr_hostname_is_local("here.now.local"));
+ tt_assert(tor_addr_hostname_is_local("here.now.LOCAL"));
+
+ tt_assert(!tor_addr_hostname_is_local(" localhost"));
+ tt_assert(!tor_addr_hostname_is_local("www.torproject.org"));
+ done:
+ ;
+}
+
+static void
+test_addr_dup_ip(void *arg)
+{
+ char *v = NULL;
+ (void)arg;
+#define CHECK(ip, s) do { \
+ v = tor_dup_ip(ip); \
+ tt_str_op(v,==,(s)); \
+ tor_free(v); \
+ } while (0)
+
+ CHECK(0xffffffff, "255.255.255.255");
+ CHECK(0x00000000, "0.0.0.0");
+ CHECK(0x7f000001, "127.0.0.1");
+ CHECK(0x01020304, "1.2.3.4");
+
+#undef CHECK
+ done:
+ tor_free(v);
+}
+
+static void
+test_addr_sockaddr_to_str(void *arg)
+{
+ char *v = NULL;
+ struct sockaddr_in sin;
+ struct sockaddr_in6 sin6;
+ struct sockaddr_storage ss;
+#ifdef HAVE_SYS_UN_H
+ struct sockaddr_un s_un;
+#endif
+#define CHECK(sa, s) do { \
+ v = tor_sockaddr_to_str((const struct sockaddr*) &(sa)); \
+ tt_str_op(v,==,(s)); \
+ tor_free(v); \
+ } while (0)
+ (void)arg;
+
+ memset(&ss,0,sizeof(ss));
+ ss.ss_family = AF_UNSPEC;
+ CHECK(ss, "unspec");
+
+ memset(&sin,0,sizeof(sin));
+ sin.sin_family = AF_INET;
+ sin.sin_addr.s_addr = htonl(0x7f808001);
+ sin.sin_port = htons(1234);
+ CHECK(sin, "127.128.128.1:1234");
+
+#ifdef HAVE_SYS_UN_H
+ memset(&s_un,0,sizeof(s_un));
+ s_un.sun_family = AF_UNIX;
+ strlcpy(s_un.sun_path, "/here/is/a/path", sizeof(s_un.sun_path));
+ CHECK(s_un, "unix:/here/is/a/path");
+#endif
+
+ memset(&sin6,0,sizeof(sin6));
+ sin6.sin6_family = AF_INET6;
+ memcpy(sin6.sin6_addr.s6_addr, "\x20\x00\x00\x00\x00\x00\x00\x00"
+ "\x00\x1a\x2b\x3c\x4d\x5e\x00\x01", 16);
+ sin6.sin6_port = htons(1234);
+ CHECK(sin6, "[2000::1a:2b3c:4d5e:1]:1234");
+
+ done:
+ tor_free(v);
+}
+
+static void
test_addr_is_loopback(void *data)
{
static const struct loopback_item {
@@ -878,6 +1020,32 @@ test_addr_is_loopback(void *data)
;
}
+static void
+test_addr_make_null(void *data)
+{
+ tor_addr_t *addr = tor_malloc(sizeof(*addr));
+ tor_addr_t *zeros = tor_malloc_zero(sizeof(*addr));
+ char buf[TOR_ADDR_BUF_LEN];
+ (void) data;
+ /* Ensure that before tor_addr_make_null, addr != 0's */
+ memset(addr, 1, sizeof(*addr));
+ tt_int_op(memcmp(addr, zeros, sizeof(*addr)), !=, 0);
+ /* Test with AF == AF_INET */
+ zeros->family = AF_INET;
+ tor_addr_make_null(addr, AF_INET);
+ tt_int_op(memcmp(addr, zeros, sizeof(*addr)), ==, 0);
+ tt_str_op(tor_addr_to_str(buf, addr, sizeof(buf), 0), ==, "0.0.0.0");
+ /* Test with AF == AF_INET6 */
+ memset(addr, 1, sizeof(*addr));
+ zeros->family = AF_INET6;
+ tor_addr_make_null(addr, AF_INET6);
+ tt_int_op(memcmp(addr, zeros, sizeof(*addr)), ==, 0);
+ tt_str_op(tor_addr_to_str(buf, addr, sizeof(buf), 0), ==, "::");
+ done:
+ tor_free(addr);
+ tor_free(zeros);
+}
+
#define ADDR_LEGACY(name) \
{ #name, legacy_test_helper, 0, &legacy_setup, test_addr_ ## name }
@@ -886,7 +1054,11 @@ struct testcase_t addr_tests[] = {
ADDR_LEGACY(ip6_helpers),
ADDR_LEGACY(parse),
{ "virtaddr", test_virtaddrmap, 0, NULL, NULL },
+ { "localname", test_addr_localname, 0, NULL, NULL },
+ { "dup_ip", test_addr_dup_ip, 0, NULL, NULL },
+ { "sockaddr_to_str", test_addr_sockaddr_to_str, 0, NULL, NULL },
{ "is_loopback", test_addr_is_loopback, 0, NULL, NULL },
+ { "make_null", test_addr_make_null, 0, NULL, NULL },
END_OF_TESTCASES
};
diff --git a/src/test/test_bt_cl.c b/src/test/test_bt_cl.c
new file mode 100644
index 000000000..45ae82fb8
--- /dev/null
+++ b/src/test/test_bt_cl.c
@@ -0,0 +1,109 @@
+/* Copyright (c) 2012-2013, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#include "orconfig.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "or.h"
+#include "util.h"
+#include "backtrace.h"
+#include "torlog.h"
+
+/* -1: no crash.
+ * 0: crash with a segmentation fault.
+ * 1x: crash with an assertion failure. */
+static int crashtype = 0;
+
+#ifdef __GNUC__
+#define NOINLINE __attribute__((noinline))
+#define NORETURN __attribute__((noreturn))
+#endif
+
+int crash(int x) NOINLINE;
+int oh_what(int x) NOINLINE;
+int a_tangled_web(int x) NOINLINE;
+int we_weave(int x) NOINLINE;
+static void abort_handler(int s) NORETURN;
+
+int
+crash(int x)
+{
+ if (crashtype == 0) {
+ *(volatile int *)0 = 0;
+ } else if (crashtype == 1) {
+ tor_assert(1 == 0);
+ } else if (crashtype == -1) {
+ ;
+ }
+
+ crashtype *= x;
+ return crashtype;
+}
+
+int
+oh_what(int x)
+{
+ /* We call crash() twice here, so that the compiler won't try to do a
+ * tail-call optimization. Only the first call will actually happen, but
+ * telling the compiler to maybe do the second call will prevent it from
+ * replacing the first call with a jump. */
+ return crash(x) + crash(x*2);
+}
+
+int
+a_tangled_web(int x)
+{
+ return oh_what(x) * 99 + oh_what(x);
+}
+
+int
+we_weave(int x)
+{
+ return a_tangled_web(x) + a_tangled_web(x+1);
+}
+
+static void
+abort_handler(int s)
+{
+ (void)s;
+ exit(0);
+}
+
+int
+main(int argc, char **argv)
+{
+ log_severity_list_t severity;
+
+ if (argc < 2) {
+ puts("I take an argument. It should be \"assert\" or \"crash\" or "
+ "\"none\"");
+ return 1;
+ }
+ if (!strcmp(argv[1], "assert")) {
+ crashtype = 1;
+ } else if (!strcmp(argv[1], "crash")) {
+ crashtype = 0;
+ } else if (!strcmp(argv[1], "none")) {
+ crashtype = -1;
+ } else {
+ puts("Argument should be \"assert\" or \"crash\" or \"none\"");
+ return 1;
+ }
+
+ init_logging();
+ set_log_severity_config(LOG_WARN, LOG_ERR, &severity);
+ add_stream_log(&severity, "stdout", STDOUT_FILENO);
+ tor_log_update_sigsafe_err_fds();
+
+ configure_backtrace_handler(NULL);
+
+ signal(SIGABRT, abort_handler);
+
+ printf("%d\n", we_weave(2));
+
+ clean_up_backtrace_handler();
+
+ return 0;
+}
+
diff --git a/src/test/test_buffers.c b/src/test/test_buffers.c
new file mode 100644
index 000000000..61ac5bc36
--- /dev/null
+++ b/src/test/test_buffers.c
@@ -0,0 +1,732 @@
+/* Copyright (c) 2001-2004, Roger Dingledine.
+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
+ * Copyright (c) 2007-2013, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#define BUFFERS_PRIVATE
+#include "or.h"
+#include "buffers.h"
+#include "ext_orport.h"
+#include "test.h"
+
+/** Run unit tests for buffers.c */
+static void
+test_buffers_basic(void *arg)
+{
+ char str[256];
+ char str2[256];
+
+ buf_t *buf = NULL, *buf2 = NULL;
+ const char *cp;
+
+ int j;
+ size_t r;
+ (void) arg;
+
+ /****
+ * buf_new
+ ****/
+ if (!(buf = buf_new()))
+ test_fail();
+
+ //test_eq(buf_capacity(buf), 4096);
+ test_eq(buf_datalen(buf), 0);
+
+ /****
+ * General pointer frobbing
+ */
+ for (j=0;j<256;++j) {
+ str[j] = (char)j;
+ }
+ write_to_buf(str, 256, buf);
+ write_to_buf(str, 256, buf);
+ test_eq(buf_datalen(buf), 512);
+ fetch_from_buf(str2, 200, buf);
+ test_memeq(str, str2, 200);
+ test_eq(buf_datalen(buf), 312);
+ memset(str2, 0, sizeof(str2));
+
+ fetch_from_buf(str2, 256, buf);
+ test_memeq(str+200, str2, 56);
+ test_memeq(str, str2+56, 200);
+ test_eq(buf_datalen(buf), 56);
+ memset(str2, 0, sizeof(str2));
+ /* Okay, now we should be 512 bytes into the 4096-byte buffer. If we add
+ * another 3584 bytes, we hit the end. */
+ for (j=0;j<15;++j) {
+ write_to_buf(str, 256, buf);
+ }
+ assert_buf_ok(buf);
+ test_eq(buf_datalen(buf), 3896);
+ fetch_from_buf(str2, 56, buf);
+ test_eq(buf_datalen(buf), 3840);
+ test_memeq(str+200, str2, 56);
+ for (j=0;j<15;++j) {
+ memset(str2, 0, sizeof(str2));
+ fetch_from_buf(str2, 256, buf);
+ test_memeq(str, str2, 256);
+ }
+ test_eq(buf_datalen(buf), 0);
+ buf_free(buf);
+ buf = NULL;
+
+ /* Okay, now make sure growing can work. */
+ buf = buf_new_with_capacity(16);
+ //test_eq(buf_capacity(buf), 16);
+ write_to_buf(str+1, 255, buf);
+ //test_eq(buf_capacity(buf), 256);
+ fetch_from_buf(str2, 254, buf);
+ test_memeq(str+1, str2, 254);
+ //test_eq(buf_capacity(buf), 256);
+ assert_buf_ok(buf);
+ write_to_buf(str, 32, buf);
+ //test_eq(buf_capacity(buf), 256);
+ assert_buf_ok(buf);
+ write_to_buf(str, 256, buf);
+ assert_buf_ok(buf);
+ //test_eq(buf_capacity(buf), 512);
+ test_eq(buf_datalen(buf), 33+256);
+ fetch_from_buf(str2, 33, buf);
+ test_eq(*str2, str[255]);
+
+ test_memeq(str2+1, str, 32);
+ //test_eq(buf_capacity(buf), 512);
+ test_eq(buf_datalen(buf), 256);
+ fetch_from_buf(str2, 256, buf);
+ test_memeq(str, str2, 256);
+
+ /* now try shrinking: case 1. */
+ buf_free(buf);
+ buf = buf_new_with_capacity(33668);
+ for (j=0;j<67;++j) {
+ write_to_buf(str,255, buf);
+ }
+ //test_eq(buf_capacity(buf), 33668);
+ test_eq(buf_datalen(buf), 17085);
+ for (j=0; j < 40; ++j) {
+ fetch_from_buf(str2, 255,buf);
+ test_memeq(str2, str, 255);
+ }
+
+ /* now try shrinking: case 2. */
+ buf_free(buf);
+ buf = buf_new_with_capacity(33668);
+ for (j=0;j<67;++j) {
+ write_to_buf(str,255, buf);
+ }
+ for (j=0; j < 20; ++j) {
+ fetch_from_buf(str2, 255,buf);
+ test_memeq(str2, str, 255);
+ }
+ for (j=0;j<80;++j) {
+ write_to_buf(str,255, buf);
+ }
+ //test_eq(buf_capacity(buf),33668);
+ for (j=0; j < 120; ++j) {
+ fetch_from_buf(str2, 255,buf);
+ test_memeq(str2, str, 255);
+ }
+
+ /* Move from buf to buf. */
+ buf_free(buf);
+ buf = buf_new_with_capacity(4096);
+ buf2 = buf_new_with_capacity(4096);
+ for (j=0;j<100;++j)
+ write_to_buf(str, 255, buf);
+ test_eq(buf_datalen(buf), 25500);
+ for (j=0;j<100;++j) {
+ r = 10;
+ move_buf_to_buf(buf2, buf, &r);
+ test_eq(r, 0);
+ }
+ test_eq(buf_datalen(buf), 24500);
+ test_eq(buf_datalen(buf2), 1000);
+ for (j=0;j<3;++j) {
+ fetch_from_buf(str2, 255, buf2);
+ test_memeq(str2, str, 255);
+ }
+ r = 8192; /*big move*/
+ move_buf_to_buf(buf2, buf, &r);
+ test_eq(r, 0);
+ r = 30000; /* incomplete move */
+ move_buf_to_buf(buf2, buf, &r);
+ test_eq(r, 13692);
+ for (j=0;j<97;++j) {
+ fetch_from_buf(str2, 255, buf2);
+ test_memeq(str2, str, 255);
+ }
+ buf_free(buf);
+ buf_free(buf2);
+ buf = buf2 = NULL;
+
+ buf = buf_new_with_capacity(5);
+ cp = "Testing. This is a moderately long Testing string.";
+ for (j = 0; cp[j]; j++)
+ write_to_buf(cp+j, 1, buf);
+ test_eq(0, buf_find_string_offset(buf, "Testing", 7));
+ test_eq(1, buf_find_string_offset(buf, "esting", 6));
+ test_eq(1, buf_find_string_offset(buf, "est", 3));
+ test_eq(39, buf_find_string_offset(buf, "ing str", 7));
+ test_eq(35, buf_find_string_offset(buf, "Testing str", 11));
+ test_eq(32, buf_find_string_offset(buf, "ng ", 3));
+ test_eq(43, buf_find_string_offset(buf, "string.", 7));
+ test_eq(-1, buf_find_string_offset(buf, "shrdlu", 6));
+ test_eq(-1, buf_find_string_offset(buf, "Testing thing", 13));
+ test_eq(-1, buf_find_string_offset(buf, "ngx", 3));
+ buf_free(buf);
+ buf = NULL;
+
+ /* Try adding a string too long for any freelist. */
+ {
+ char *cp = tor_malloc_zero(65536);
+ buf = buf_new();
+ write_to_buf(cp, 65536, buf);
+ tor_free(cp);
+
+ tt_int_op(buf_datalen(buf), ==, 65536);
+ buf_free(buf);
+ buf = NULL;
+ }
+
+ done:
+ if (buf)
+ buf_free(buf);
+ if (buf2)
+ buf_free(buf2);
+ buf_shrink_freelists(1);
+}
+
+static void
+test_buffer_pullup(void *arg)
+{
+ buf_t *buf;
+ char *stuff, *tmp;
+ const char *cp;
+ size_t sz;
+ (void)arg;
+ stuff = tor_malloc(16384);
+ tmp = tor_malloc(16384);
+
+ /* Note: this test doesn't check the nulterminate argument to buf_pullup,
+ since nothing actually uses it. We should remove it some time. */
+
+ buf = buf_new_with_capacity(3000); /* rounds up to next power of 2. */
+
+ tt_assert(buf);
+ tt_int_op(buf_get_default_chunk_size(buf), ==, 4096);
+
+ tt_int_op(buf_get_total_allocation(), ==, 0);
+
+ /* There are a bunch of cases for pullup. One is the trivial case. Let's
+ mess around with an empty buffer. */
+ buf_pullup(buf, 16, 1);
+ buf_get_first_chunk_data(buf, &cp, &sz);
+ tt_ptr_op(cp, ==, NULL);
+ tt_uint_op(sz, ==, 0);
+
+ /* Let's make sure nothing got allocated */
+ tt_int_op(buf_get_total_allocation(), ==, 0);
+
+ /* Case 1: everything puts into the first chunk with some moving. */
+
+ /* Let's add some data. */
+ crypto_rand(stuff, 16384);
+ write_to_buf(stuff, 3000, buf);
+ write_to_buf(stuff+3000, 3000, buf);
+ buf_get_first_chunk_data(buf, &cp, &sz);
+ tt_ptr_op(cp, !=, NULL);
+ tt_int_op(sz, <=, 4096);
+
+ /* Make room for 3000 bytes in the first chunk, so that the pullup-move code
+ * can get tested. */
+ tt_int_op(fetch_from_buf(tmp, 3000, buf), ==, 3000);
+ test_memeq(tmp, stuff, 3000);
+ buf_pullup(buf, 2048, 0);
+ assert_buf_ok(buf);
+ buf_get_first_chunk_data(buf, &cp, &sz);
+ tt_ptr_op(cp, !=, NULL);
+ tt_int_op(sz, >=, 2048);
+ test_memeq(cp, stuff+3000, 2048);
+ tt_int_op(3000, ==, buf_datalen(buf));
+ tt_int_op(fetch_from_buf(tmp, 3000, buf), ==, 0);
+ test_memeq(tmp, stuff+3000, 2048);
+
+ buf_free(buf);
+
+ /* Now try the large-chunk case. */
+ buf = buf_new_with_capacity(3000); /* rounds up to next power of 2. */
+ write_to_buf(stuff, 4000, buf);
+ write_to_buf(stuff+4000, 4000, buf);
+ write_to_buf(stuff+8000, 4000, buf);
+ write_to_buf(stuff+12000, 4000, buf);
+ tt_int_op(buf_datalen(buf), ==, 16000);
+ buf_get_first_chunk_data(buf, &cp, &sz);
+ tt_ptr_op(cp, !=, NULL);
+ tt_int_op(sz, <=, 4096);
+
+ buf_pullup(buf, 12500, 0);
+ assert_buf_ok(buf);
+ buf_get_first_chunk_data(buf, &cp, &sz);
+ tt_ptr_op(cp, !=, NULL);
+ tt_int_op(sz, >=, 12500);
+ test_memeq(cp, stuff, 12500);
+ tt_int_op(buf_datalen(buf), ==, 16000);
+
+ fetch_from_buf(tmp, 12400, buf);
+ test_memeq(tmp, stuff, 12400);
+ tt_int_op(buf_datalen(buf), ==, 3600);
+ fetch_from_buf(tmp, 3500, buf);
+ test_memeq(tmp, stuff+12400, 3500);
+ fetch_from_buf(tmp, 100, buf);
+ test_memeq(tmp, stuff+15900, 10);
+
+ buf_free(buf);
+
+ /* Make sure that the pull-up-whole-buffer case works */
+ buf = buf_new_with_capacity(3000); /* rounds up to next power of 2. */
+ write_to_buf(stuff, 4000, buf);
+ write_to_buf(stuff+4000, 4000, buf);
+ fetch_from_buf(tmp, 100, buf); /* dump 100 bytes from first chunk */
+ buf_pullup(buf, 16000, 0); /* Way too much. */
+ assert_buf_ok(buf);
+ buf_get_first_chunk_data(buf, &cp, &sz);
+ tt_ptr_op(cp, !=, NULL);
+ tt_int_op(sz, ==, 7900);
+ test_memeq(cp, stuff+100, 7900);
+
+ buf_free(buf);
+ buf = NULL;
+
+ buf_shrink_freelists(1);
+
+ tt_int_op(buf_get_total_allocation(), ==, 0);
+ done:
+ buf_free(buf);
+ buf_shrink_freelists(1);
+ tor_free(stuff);
+ tor_free(tmp);
+}
+
+static void
+test_buffer_copy(void *arg)
+{
+ generic_buffer_t *buf=NULL, *buf2=NULL;
+ const char *s;
+ size_t len;
+ char b[256];
+ int i;
+ (void)arg;
+
+ buf = generic_buffer_new();
+ tt_assert(buf);
+
+ /* Copy an empty buffer. */
+ tt_int_op(0, ==, generic_buffer_set_to_copy(&buf2, buf));
+ tt_assert(buf2);
+ tt_int_op(0, ==, generic_buffer_len(buf2));
+
+ /* Now try with a short buffer. */
+ s = "And now comes an act of enormous enormance!";
+ len = strlen(s);
+ generic_buffer_add(buf, s, len);
+ tt_int_op(len, ==, generic_buffer_len(buf));
+ /* Add junk to buf2 so we can test replacing.*/
+ generic_buffer_add(buf2, "BLARG", 5);
+ tt_int_op(0, ==, generic_buffer_set_to_copy(&buf2, buf));
+ tt_int_op(len, ==, generic_buffer_len(buf2));
+ generic_buffer_get(buf2, b, len);
+ test_mem_op(b, ==, s, len);
+ /* Now free buf2 and retry so we can test allocating */
+ generic_buffer_free(buf2);
+ buf2 = NULL;
+ tt_int_op(0, ==, generic_buffer_set_to_copy(&buf2, buf));
+ tt_int_op(len, ==, generic_buffer_len(buf2));
+ generic_buffer_get(buf2, b, len);
+ test_mem_op(b, ==, s, len);
+ /* Clear buf for next test */
+ generic_buffer_get(buf, b, len);
+ tt_int_op(generic_buffer_len(buf),==,0);
+
+ /* Okay, now let's try a bigger buffer. */
+ s = "Quis autem vel eum iure reprehenderit qui in ea voluptate velit "
+ "esse quam nihil molestiae consequatur, vel illum qui dolorem eum "
+ "fugiat quo voluptas nulla pariatur?";
+ len = strlen(s);
+ for (i = 0; i < 256; ++i) {
+ b[0]=i;
+ generic_buffer_add(buf, b, 1);
+ generic_buffer_add(buf, s, len);
+ }
+ tt_int_op(0, ==, generic_buffer_set_to_copy(&buf2, buf));
+ tt_int_op(generic_buffer_len(buf2), ==, generic_buffer_len(buf));
+ for (i = 0; i < 256; ++i) {
+ generic_buffer_get(buf2, b, len+1);
+ tt_int_op((unsigned char)b[0],==,i);
+ test_mem_op(b+1, ==, s, len);
+ }
+
+ done:
+ if (buf)
+ generic_buffer_free(buf);
+ if (buf2)
+ generic_buffer_free(buf2);
+ buf_shrink_freelists(1);
+}
+
+static void
+test_buffer_ext_or_cmd(void *arg)
+{
+ ext_or_cmd_t *cmd = NULL;
+ generic_buffer_t *buf = generic_buffer_new();
+ char *tmp = NULL;
+ (void) arg;
+
+ /* Empty -- should give "not there. */
+ tt_int_op(0, ==, generic_buffer_fetch_ext_or_cmd(buf, &cmd));
+ tt_ptr_op(NULL, ==, cmd);
+
+ /* Three bytes: shouldn't work. */
+ generic_buffer_add(buf, "\x00\x20\x00", 3);
+ tt_int_op(0, ==, generic_buffer_fetch_ext_or_cmd(buf, &cmd));
+ tt_ptr_op(NULL, ==, cmd);
+ tt_int_op(3, ==, generic_buffer_len(buf));
+
+ /* 0020 0000: That's a nil command. It should work. */
+ generic_buffer_add(buf, "\x00", 1);
+ tt_int_op(1, ==, generic_buffer_fetch_ext_or_cmd(buf, &cmd));
+ tt_ptr_op(NULL, !=, cmd);
+ tt_int_op(0x20, ==, cmd->cmd);
+ tt_int_op(0, ==, cmd->len);
+ tt_int_op(0, ==, generic_buffer_len(buf));
+ ext_or_cmd_free(cmd);
+ cmd = NULL;
+
+ /* Now try a length-6 command with one byte missing. */
+ generic_buffer_add(buf, "\x10\x21\x00\x06""abcde", 9);
+ tt_int_op(0, ==, generic_buffer_fetch_ext_or_cmd(buf, &cmd));
+ tt_ptr_op(NULL, ==, cmd);
+ generic_buffer_add(buf, "f", 1);
+ tt_int_op(1, ==, generic_buffer_fetch_ext_or_cmd(buf, &cmd));
+ tt_ptr_op(NULL, !=, cmd);
+ tt_int_op(0x1021, ==, cmd->cmd);
+ tt_int_op(6, ==, cmd->len);
+ test_mem_op("abcdef", ==, cmd->body, 6);
+ tt_int_op(0, ==, generic_buffer_len(buf));
+ ext_or_cmd_free(cmd);
+ cmd = NULL;
+
+ /* Now try a length-10 command with 4 extra bytes. */
+ generic_buffer_add(buf, "\xff\xff\x00\x0a"
+ "loremipsum\x10\x00\xff\xff", 18);
+ tt_int_op(1, ==, generic_buffer_fetch_ext_or_cmd(buf, &cmd));
+ tt_ptr_op(NULL, !=, cmd);
+ tt_int_op(0xffff, ==, cmd->cmd);
+ tt_int_op(10, ==, cmd->len);
+ test_mem_op("loremipsum", ==, cmd->body, 10);
+ tt_int_op(4, ==, generic_buffer_len(buf));
+ ext_or_cmd_free(cmd);
+ cmd = NULL;
+
+ /* Finally, let's try a maximum-length command. We already have the header
+ * waiting. */
+ tt_int_op(0, ==, generic_buffer_fetch_ext_or_cmd(buf, &cmd));
+ tmp = tor_malloc_zero(65535);
+ generic_buffer_add(buf, tmp, 65535);
+ tt_int_op(1, ==, generic_buffer_fetch_ext_or_cmd(buf, &cmd));
+ tt_ptr_op(NULL, !=, cmd);
+ tt_int_op(0x1000, ==, cmd->cmd);
+ tt_int_op(0xffff, ==, cmd->len);
+ test_mem_op(tmp, ==, cmd->body, 65535);
+ tt_int_op(0, ==, generic_buffer_len(buf));
+ ext_or_cmd_free(cmd);
+ cmd = NULL;
+
+ done:
+ ext_or_cmd_free(cmd);
+ generic_buffer_free(buf);
+ tor_free(tmp);
+ buf_shrink_freelists(1);
+}
+
+static void
+test_buffer_allocation_tracking(void *arg)
+{
+ char *junk = tor_malloc(16384);
+ buf_t *buf1 = NULL, *buf2 = NULL;
+ int i;
+
+ (void)arg;
+
+ crypto_rand(junk, 16384);
+ tt_int_op(buf_get_total_allocation(), ==, 0);
+
+ buf1 = buf_new();
+ tt_assert(buf1);
+ buf2 = buf_new();
+ tt_assert(buf2);
+
+ tt_int_op(buf_allocation(buf1), ==, 0);
+ tt_int_op(buf_get_total_allocation(), ==, 0);
+
+ write_to_buf(junk, 4000, buf1);
+ write_to_buf(junk, 4000, buf1);
+ write_to_buf(junk, 4000, buf1);
+ write_to_buf(junk, 4000, buf1);
+ tt_int_op(buf_allocation(buf1), ==, 16384);
+ fetch_from_buf(junk, 100, buf1);
+ tt_int_op(buf_allocation(buf1), ==, 16384); /* still 4 4k chunks */
+
+ tt_int_op(buf_get_total_allocation(), ==, 16384);
+
+ fetch_from_buf(junk, 4096, buf1); /* drop a 1k chunk... */
+ tt_int_op(buf_allocation(buf1), ==, 3*4096); /* now 3 4k chunks */
+
+#ifdef ENABLE_BUF_FREELISTS
+ tt_int_op(buf_get_total_allocation(), ==, 16384); /* that chunk went onto
+ the freelist. */
+#else
+ tt_int_op(buf_get_total_allocation(), ==, 12288); /* that chunk was really
+ freed. */
+#endif
+
+ write_to_buf(junk, 4000, buf2);
+ tt_int_op(buf_allocation(buf2), ==, 4096); /* another 4k chunk. */
+ /*
+ * If we're using freelists, size stays at 16384 because we just pulled a
+ * chunk from the freelist. If we aren't, we bounce back up to 16384 by
+ * allocating a new chunk.
+ */
+ tt_int_op(buf_get_total_allocation(), ==, 16384);
+ write_to_buf(junk, 4000, buf2);
+ tt_int_op(buf_allocation(buf2), ==, 8192); /* another 4k chunk. */
+ tt_int_op(buf_get_total_allocation(), ==, 5*4096); /* that chunk was new. */
+
+ /* Make a really huge buffer */
+ for (i = 0; i < 1000; ++i) {
+ write_to_buf(junk, 4000, buf2);
+ }
+ tt_int_op(buf_allocation(buf2), >=, 4008000);
+ tt_int_op(buf_get_total_allocation(), >=, 4008000);
+ buf_free(buf2);
+ buf2 = NULL;
+
+ tt_int_op(buf_get_total_allocation(), <, 4008000);
+ buf_shrink_freelists(1);
+ tt_int_op(buf_get_total_allocation(), ==, buf_allocation(buf1));
+ buf_free(buf1);
+ buf1 = NULL;
+ buf_shrink_freelists(1);
+ tt_int_op(buf_get_total_allocation(), ==, 0);
+
+ done:
+ buf_free(buf1);
+ buf_free(buf2);
+ buf_shrink_freelists(1);
+ tor_free(junk);
+}
+
+static void
+test_buffer_time_tracking(void *arg)
+{
+ buf_t *buf=NULL, *buf2=NULL;
+ struct timeval tv0;
+ const time_t START = 1389288246;
+ const uint32_t START_MSEC = (uint32_t) ((uint64_t)START * 1000);
+ int i;
+ char tmp[4096];
+ (void)arg;
+
+ crypto_rand(tmp, sizeof(tmp));
+
+ tv0.tv_sec = START;
+ tv0.tv_usec = 0;
+
+ buf = buf_new_with_capacity(3000); /* rounds up to next power of 2. */
+ tt_assert(buf);
+
+ /* Empty buffer means the timestamp is 0. */
+ tt_int_op(0, ==, buf_get_oldest_chunk_timestamp(buf, START_MSEC));
+ tt_int_op(0, ==, buf_get_oldest_chunk_timestamp(buf, START_MSEC+1000));
+
+ tor_gettimeofday_cache_set(&tv0);
+ write_to_buf("ABCDEFG", 7, buf);
+ tt_int_op(1000, ==, buf_get_oldest_chunk_timestamp(buf, START_MSEC+1000));
+
+ buf2 = buf_copy(buf);
+ tt_assert(buf2);
+ tt_int_op(1234, ==, buf_get_oldest_chunk_timestamp(buf2, START_MSEC+1234));
+
+ /* Now add more bytes; enough to overflow the first chunk. */
+ tv0.tv_usec += 123 * 1000;
+ tor_gettimeofday_cache_set(&tv0);
+ for (i = 0; i < 600; ++i)
+ write_to_buf("ABCDEFG", 7, buf);
+ tt_int_op(4207, ==, buf_datalen(buf));
+
+ /* The oldest bytes are still in the front. */
+ tt_int_op(2000, ==, buf_get_oldest_chunk_timestamp(buf, START_MSEC+2000));
+
+ /* Once those bytes are dropped, the chunk is still on the first
+ * timestamp. */
+ fetch_from_buf(tmp, 100, buf);
+ tt_int_op(2000, ==, buf_get_oldest_chunk_timestamp(buf, START_MSEC+2000));
+
+ /* But once we discard the whole first chunk, we get the data in the second
+ * chunk. */
+ fetch_from_buf(tmp, 4000, buf);
+ tt_int_op(107, ==, buf_datalen(buf));
+ tt_int_op(2000, ==, buf_get_oldest_chunk_timestamp(buf, START_MSEC+2123));
+
+ /* This time we'll be grabbing a chunk from the freelist, and making sure
+ its time gets updated */
+ tv0.tv_sec += 5;
+ tv0.tv_usec = 617*1000;
+ tor_gettimeofday_cache_set(&tv0);
+ for (i = 0; i < 600; ++i)
+ write_to_buf("ABCDEFG", 7, buf);
+ tt_int_op(4307, ==, buf_datalen(buf));
+
+ tt_int_op(2000, ==, buf_get_oldest_chunk_timestamp(buf, START_MSEC+2123));
+ fetch_from_buf(tmp, 4000, buf);
+ fetch_from_buf(tmp, 306, buf);
+ tt_int_op(0, ==, buf_get_oldest_chunk_timestamp(buf, START_MSEC+5617));
+ tt_int_op(383, ==, buf_get_oldest_chunk_timestamp(buf, START_MSEC+6000));
+
+ done:
+ buf_free(buf);
+ buf_free(buf2);
+}
+
+static void
+test_buffers_zlib_impl(int finalize_with_nil)
+{
+ char *msg = NULL;
+ char *contents = NULL;
+ char *expanded = NULL;
+ buf_t *buf = NULL;
+ tor_zlib_state_t *zlib_state = NULL;
+ size_t out_len, in_len;
+ int done;
+
+ buf = buf_new_with_capacity(128); /* will round up */
+ zlib_state = tor_zlib_new(1, ZLIB_METHOD);
+
+ msg = tor_malloc(512);
+ crypto_rand(msg, 512);
+ tt_int_op(write_to_buf_zlib(buf, zlib_state, msg, 128, 0), ==, 0);
+ tt_int_op(write_to_buf_zlib(buf, zlib_state, msg+128, 128, 0), ==, 0);
+ tt_int_op(write_to_buf_zlib(buf, zlib_state, msg+256, 256, 0), ==, 0);
+ done = !finalize_with_nil;
+ tt_int_op(write_to_buf_zlib(buf, zlib_state, "all done", 9, done), ==, 0);
+ if (finalize_with_nil) {
+ tt_int_op(write_to_buf_zlib(buf, zlib_state, "", 0, 1), ==, 0);
+ }
+
+ in_len = buf_datalen(buf);
+ contents = tor_malloc(in_len);
+
+ tt_int_op(fetch_from_buf(contents, in_len, buf), ==, 0);
+
+ tt_int_op(0, ==, tor_gzip_uncompress(&expanded, &out_len,
+ contents, in_len,
+ ZLIB_METHOD, 1,
+ LOG_WARN));
+
+ tt_int_op(out_len, >=, 128);
+ tt_mem_op(msg, ==, expanded, 128);
+ tt_int_op(out_len, >=, 512);
+ tt_mem_op(msg, ==, expanded, 512);
+ tt_int_op(out_len, ==, 512+9);
+ tt_mem_op("all done", ==, expanded+512, 9);
+
+ done:
+ buf_free(buf);
+ tor_zlib_free(zlib_state);
+ tor_free(contents);
+ tor_free(expanded);
+ tor_free(msg);
+}
+
+static void
+test_buffers_zlib(void *arg)
+{
+ (void) arg;
+ test_buffers_zlib_impl(0);
+}
+static void
+test_buffers_zlib_fin_with_nil(void *arg)
+{
+ (void) arg;
+ test_buffers_zlib_impl(1);
+}
+
+static void
+test_buffers_zlib_fin_at_chunk_end(void *arg)
+{
+ char *msg = NULL;
+ char *contents = NULL;
+ char *expanded = NULL;
+ buf_t *buf = NULL;
+ tor_zlib_state_t *zlib_state = NULL;
+ size_t out_len, in_len;
+ size_t sz, headerjunk;
+ (void) arg;
+
+ buf = buf_new_with_capacity(128); /* will round up */
+ sz = buf_get_default_chunk_size(buf);
+ msg = tor_malloc_zero(sz);
+
+ write_to_buf(msg, 1, buf);
+ tt_assert(buf->head);
+
+ /* Fill up the chunk so the zlib stuff won't fit in one chunk. */
+ tt_uint_op(buf->head->memlen, <, sz);
+ headerjunk = buf->head->memlen - 7;
+ write_to_buf(msg, headerjunk-1, buf);
+ tt_uint_op(buf->head->datalen, ==, headerjunk);
+ printf("<%u>\n", (unsigned)buf_datalen(buf));
+ tt_uint_op(buf_datalen(buf), ==, headerjunk);
+ /* Write an empty string, with finalization on. */
+ zlib_state = tor_zlib_new(1, ZLIB_METHOD);
+ tt_int_op(write_to_buf_zlib(buf, zlib_state, "", 0, 1), ==, 0);
+
+ printf("<%u>\n", (unsigned)buf_datalen(buf));
+
+ in_len = buf_datalen(buf);
+ contents = tor_malloc(in_len);
+
+ tt_int_op(fetch_from_buf(contents, in_len, buf), ==, 0);
+
+ tt_uint_op(in_len, >, headerjunk);
+
+ tt_int_op(0, ==, tor_gzip_uncompress(&expanded, &out_len,
+ contents + headerjunk, in_len - headerjunk,
+ ZLIB_METHOD, 1,
+ LOG_WARN));
+
+ tt_int_op(out_len, ==, 0);
+ tt_assert(expanded);
+
+ done:
+ buf_free(buf);
+ tor_zlib_free(zlib_state);
+ tor_free(contents);
+ tor_free(expanded);
+ tor_free(msg);
+}
+
+struct testcase_t buffer_tests[] = {
+ { "basic", test_buffers_basic, TT_FORK, NULL, NULL },
+ { "copy", test_buffer_copy, TT_FORK, NULL, NULL },
+ { "pullup", test_buffer_pullup, TT_FORK, NULL, NULL },
+ { "ext_or_cmd", test_buffer_ext_or_cmd, TT_FORK, NULL, NULL },
+ { "allocation_tracking", test_buffer_allocation_tracking, TT_FORK,
+ NULL, NULL },
+ { "time_tracking", test_buffer_time_tracking, TT_FORK, NULL, NULL },
+ { "zlib", test_buffers_zlib, TT_FORK, NULL, NULL },
+ { "zlib_fin_with_nil", test_buffers_zlib_fin_with_nil, TT_FORK, NULL, NULL },
+ { "zlib_fin_at_chunk_end", test_buffers_zlib_fin_at_chunk_end, TT_FORK,
+ NULL, NULL},
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_cell_formats.c b/src/test/test_cell_formats.c
index 55d8d0f00..d7f60680c 100644
--- a/src/test/test_cell_formats.c
+++ b/src/test/test_cell_formats.c
@@ -8,7 +8,9 @@
#define CONNECTION_EDGE_PRIVATE
#define RELAY_PRIVATE
#include "or.h"
+#include "channel.h"
#include "connection_edge.h"
+#include "connection_or.h"
#include "onion.h"
#include "onion_tap.h"
#include "onion_fast.h"
@@ -872,6 +874,387 @@ test_cfmt_extended_cells(void *arg)
tor_free(mem_op_hex_tmp);
}
+static void
+test_cfmt_resolved_cells(void *arg)
+{
+ smartlist_t *addrs = smartlist_new();
+ relay_header_t rh;
+ cell_t cell;
+ int r, errcode;
+ address_ttl_t *a;
+
+ (void)arg;
+#define CLEAR_CELL() do { \
+ memset(&cell, 0, sizeof(cell)); \
+ memset(&rh, 0, sizeof(rh)); \
+ } while (0)
+#define CLEAR_ADDRS() do { \
+ SMARTLIST_FOREACH(addrs, address_ttl_t *, a, \
+ address_ttl_free(a); ); \
+ smartlist_clear(addrs); \
+ } while (0)
+#define SET_CELL(s) do { \
+ CLEAR_CELL(); \
+ memcpy(cell.payload + RELAY_HEADER_SIZE, (s), sizeof((s))-1); \
+ rh.length = sizeof((s))-1; \
+ rh.command = RELAY_COMMAND_RESOLVED; \
+ errcode = -1; \
+ } while (0)
+
+ /* The cell format is one or more answers; each of the form
+ * type [1 byte---0:hostname, 4:ipv4, 6:ipv6, f0:err-transient, f1:err]
+ * length [1 byte]
+ * body [length bytes]
+ * ttl [4 bytes]
+ */
+
+ /* Let's try an empty cell */
+ SET_CELL("");
+ r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
+ tt_int_op(errcode, ==, 0);
+ tt_int_op(r, ==, 0);
+ tt_int_op(smartlist_len(addrs), ==, 0);
+ CLEAR_ADDRS(); /* redundant but let's be consistent */
+
+ /* Cell with one ipv4 addr */
+ SET_CELL("\x04\x04" "\x7f\x00\x02\x0a" "\x00\00\x01\x00");
+ tt_int_op(rh.length, ==, 10);
+ r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
+ tt_int_op(errcode, ==, 0);
+ tt_int_op(r, ==, 0);
+ tt_int_op(smartlist_len(addrs), ==, 1);
+ a = smartlist_get(addrs, 0);
+ tt_str_op(fmt_addr(&a->addr), ==, "127.0.2.10");
+ tt_ptr_op(a->hostname, ==, NULL);
+ tt_int_op(a->ttl, ==, 256);
+ CLEAR_ADDRS();
+
+ /* Cell with one ipv6 addr */
+ SET_CELL("\x06\x10"
+ "\x20\x02\x90\x90\x00\x00\x00\x00"
+ "\x00\x00\x00\x00\xf0\xf0\xab\xcd"
+ "\x02\00\x00\x01");
+ tt_int_op(rh.length, ==, 22);
+ r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
+ tt_int_op(errcode, ==, 0);
+ tt_int_op(r, ==, 0);
+ tt_int_op(smartlist_len(addrs), ==, 1);
+ a = smartlist_get(addrs, 0);
+ tt_str_op(fmt_addr(&a->addr), ==, "2002:9090::f0f0:abcd");
+ tt_ptr_op(a->hostname, ==, NULL);
+ tt_int_op(a->ttl, ==, 0x2000001);
+ CLEAR_ADDRS();
+
+ /* Cell with one hostname */
+ SET_CELL("\x00\x11"
+ "motherbrain.zebes"
+ "\x00\00\x00\x00");
+ tt_int_op(rh.length, ==, 23);
+ r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
+ tt_int_op(errcode, ==, 0);
+ tt_int_op(r, ==, 0);
+ tt_int_op(smartlist_len(addrs), ==, 1);
+ a = smartlist_get(addrs, 0);
+ tt_assert(tor_addr_is_null(&a->addr));
+ tt_str_op(a->hostname, ==, "motherbrain.zebes");
+ tt_int_op(a->ttl, ==, 0);
+ CLEAR_ADDRS();
+
+#define LONG_NAME \
+ "this-hostname-has-255-characters.in-order-to-test-whether-very-long.ho" \
+ "stnames-are-accepted.i-am-putting-it-in-a-macro-because-although.this-" \
+ "function-is-already-very-full.of-copy-and-pasted-stuff.having-this-app" \
+ "ear-more-than-once-would-bother-me-somehow.is"
+
+ tt_int_op(strlen(LONG_NAME), ==, 255);
+ SET_CELL("\x00\xff"
+ LONG_NAME
+ "\x00\01\x00\x00");
+ tt_int_op(rh.length, ==, 261);
+ r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
+ tt_int_op(errcode, ==, 0);
+ tt_int_op(r, ==, 0);
+ tt_int_op(smartlist_len(addrs), ==, 1);
+ a = smartlist_get(addrs, 0);
+ tt_assert(tor_addr_is_null(&a->addr));
+ tt_str_op(a->hostname, ==, LONG_NAME);
+ tt_int_op(a->ttl, ==, 65536);
+ CLEAR_ADDRS();
+
+ /* Cells with an error */
+ SET_CELL("\xf0\x2b"
+ "I'm sorry, Dave. I'm afraid I can't do that"
+ "\x00\x11\x22\x33");
+ tt_int_op(rh.length, ==, 49);
+ r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
+ tt_int_op(errcode, ==, RESOLVED_TYPE_ERROR_TRANSIENT);
+ tt_int_op(r, ==, 0);
+ tt_int_op(smartlist_len(addrs), ==, 0);
+ CLEAR_ADDRS();
+
+ SET_CELL("\xf1\x40"
+ "This hostname is too important for me to allow you to resolve it"
+ "\x00\x00\x00\x00");
+ tt_int_op(rh.length, ==, 70);
+ r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
+ tt_int_op(errcode, ==, RESOLVED_TYPE_ERROR);
+ tt_int_op(r, ==, 0);
+ tt_int_op(smartlist_len(addrs), ==, 0);
+ CLEAR_ADDRS();
+
+ /* Cell with an unrecognized type */
+ SET_CELL("\xee\x16"
+ "fault in the AE35 unit"
+ "\x09\x09\x01\x01");
+ tt_int_op(rh.length, ==, 28);
+ r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
+ tt_int_op(errcode, ==, 0);
+ tt_int_op(r, ==, 0);
+ tt_int_op(smartlist_len(addrs), ==, 0);
+ CLEAR_ADDRS();
+
+ /* Cell with one of each */
+ SET_CELL(/* unrecognized: */
+ "\xee\x16"
+ "fault in the AE35 unit"
+ "\x09\x09\x01\x01"
+ /* error: */
+ "\xf0\x2b"
+ "I'm sorry, Dave. I'm afraid I can't do that"
+ "\x00\x11\x22\x33"
+ /* IPv6: */
+ "\x06\x10"
+ "\x20\x02\x90\x90\x00\x00\x00\x00"
+ "\x00\x00\x00\x00\xf0\xf0\xab\xcd"
+ "\x02\00\x00\x01"
+ /* IPv4: */
+ "\x04\x04" "\x7f\x00\x02\x0a" "\x00\00\x01\x00"
+ /* Hostname: */
+ "\x00\x11"
+ "motherbrain.zebes"
+ "\x00\00\x00\x00"
+ );
+ r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
+ tt_int_op(errcode, ==, 0); /* no error reported; we got answers */
+ tt_int_op(r, ==, 0);
+ tt_int_op(smartlist_len(addrs), ==, 3);
+ a = smartlist_get(addrs, 0);
+ tt_str_op(fmt_addr(&a->addr), ==, "2002:9090::f0f0:abcd");
+ tt_ptr_op(a->hostname, ==, NULL);
+ tt_int_op(a->ttl, ==, 0x2000001);
+ a = smartlist_get(addrs, 1);
+ tt_str_op(fmt_addr(&a->addr), ==, "127.0.2.10");
+ tt_ptr_op(a->hostname, ==, NULL);
+ tt_int_op(a->ttl, ==, 256);
+ a = smartlist_get(addrs, 2);
+ tt_assert(tor_addr_is_null(&a->addr));
+ tt_str_op(a->hostname, ==, "motherbrain.zebes");
+ tt_int_op(a->ttl, ==, 0);
+ CLEAR_ADDRS();
+
+ /* Cell with several of similar type */
+ SET_CELL(/* IPv4 */
+ "\x04\x04" "\x7f\x00\x02\x0a" "\x00\00\x01\x00"
+ "\x04\x04" "\x08\x08\x08\x08" "\x00\00\x01\x05"
+ "\x04\x04" "\x7f\xb0\x02\xb0" "\x00\01\xff\xff"
+ /* IPv6 */
+ "\x06\x10"
+ "\x20\x02\x90\x00\x00\x00\x00\x00"
+ "\x00\x00\x00\x00\xca\xfe\xf0\x0d"
+ "\x00\00\x00\x01"
+ "\x06\x10"
+ "\x20\x02\x90\x01\x00\x00\x00\x00"
+ "\x00\x00\x00\x00\x00\xfa\xca\xde"
+ "\x00\00\x00\x03");
+ r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
+ tt_int_op(errcode, ==, 0);
+ tt_int_op(r, ==, 0);
+ tt_int_op(smartlist_len(addrs), ==, 5);
+ a = smartlist_get(addrs, 0);
+ tt_str_op(fmt_addr(&a->addr), ==, "127.0.2.10");
+ tt_ptr_op(a->hostname, ==, NULL);
+ tt_int_op(a->ttl, ==, 256);
+ a = smartlist_get(addrs, 1);
+ tt_str_op(fmt_addr(&a->addr), ==, "8.8.8.8");
+ tt_ptr_op(a->hostname, ==, NULL);
+ tt_int_op(a->ttl, ==, 261);
+ a = smartlist_get(addrs, 2);
+ tt_str_op(fmt_addr(&a->addr), ==, "127.176.2.176");
+ tt_ptr_op(a->hostname, ==, NULL);
+ tt_int_op(a->ttl, ==, 131071);
+ a = smartlist_get(addrs, 3);
+ tt_str_op(fmt_addr(&a->addr), ==, "2002:9000::cafe:f00d");
+ tt_ptr_op(a->hostname, ==, NULL);
+ tt_int_op(a->ttl, ==, 1);
+ a = smartlist_get(addrs, 4);
+ tt_str_op(fmt_addr(&a->addr), ==, "2002:9001::fa:cade");
+ tt_ptr_op(a->hostname, ==, NULL);
+ tt_int_op(a->ttl, ==, 3);
+ CLEAR_ADDRS();
+
+ /* Full cell */
+#define LONG_NAME2 \
+ "this-name-has-231-characters.so-that-it-plus-LONG_NAME-can-completely-" \
+ "fill-up-the-payload-of-a-cell.its-important-to-check-for-the-full-thin" \
+ "g-case.to-avoid-off-by-one-errors.where-full-things-are-misreported-as" \
+ ".overflowing-by-one.z"
+
+ tt_int_op(strlen(LONG_NAME2), ==, 231);
+ SET_CELL("\x00\xff"
+ LONG_NAME
+ "\x00\01\x00\x00"
+ "\x00\xe7"
+ LONG_NAME2
+ "\x00\01\x00\x00");
+ tt_int_op(rh.length, ==, RELAY_PAYLOAD_SIZE);
+ r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
+ tt_int_op(errcode, ==, 0);
+ tt_int_op(r, ==, 0);
+ tt_int_op(smartlist_len(addrs), ==, 2);
+ a = smartlist_get(addrs, 0);
+ tt_str_op(a->hostname, ==, LONG_NAME);
+ a = smartlist_get(addrs, 1);
+ tt_str_op(a->hostname, ==, LONG_NAME2);
+ CLEAR_ADDRS();
+
+ /* BAD CELLS */
+
+ /* Invalid length on an IPv4 */
+ SET_CELL("\x04\x03zzz1234");
+ r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
+ tt_int_op(errcode, ==, 0);
+ tt_int_op(r, ==, -1);
+ tt_int_op(smartlist_len(addrs), ==, 0);
+ SET_CELL("\x04\x04" "\x7f\x00\x02\x0a" "\x00\00\x01\x00"
+ "\x04\x05zzzzz1234");
+ r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
+ tt_int_op(errcode, ==, 0);
+ tt_int_op(r, ==, -1);
+ tt_int_op(smartlist_len(addrs), ==, 0);
+
+ /* Invalid length on an IPv6 */
+ SET_CELL("\x06\x03zzz1234");
+ r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
+ tt_int_op(errcode, ==, 0);
+ tt_int_op(r, ==, -1);
+ tt_int_op(smartlist_len(addrs), ==, 0);
+ SET_CELL("\x04\x04" "\x7f\x00\x02\x0a" "\x00\00\x01\x00"
+ "\x06\x17wwwwwwwwwwwwwwwww1234");
+ r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
+ tt_int_op(errcode, ==, 0);
+ tt_int_op(r, ==, -1);
+ tt_int_op(smartlist_len(addrs), ==, 0);
+ SET_CELL("\x04\x04" "\x7f\x00\x02\x0a" "\x00\00\x01\x00"
+ "\x06\x10xxxx");
+ r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
+ tt_int_op(errcode, ==, 0);
+ tt_int_op(r, ==, -1);
+ tt_int_op(smartlist_len(addrs), ==, 0);
+
+ /* Empty hostname */
+ SET_CELL("\x00\x00xxxx");
+ r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
+ tt_int_op(errcode, ==, 0);
+ tt_int_op(r, ==, -1);
+ tt_int_op(smartlist_len(addrs), ==, 0);
+
+ /* rh.length out of range */
+ CLEAR_CELL();
+ rh.length = 499;
+ r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
+ tt_int_op(errcode, ==, 0);
+ tt_int_op(r, ==, -1);
+ tt_int_op(smartlist_len(addrs), ==, 0);
+
+ /* Item length extends beyond rh.length */
+ CLEAR_CELL();
+ SET_CELL("\x00\xff"
+ LONG_NAME
+ "\x00\01\x00\x00");
+ rh.length -= 1;
+ r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
+ tt_int_op(r, ==, -1);
+ tt_int_op(smartlist_len(addrs), ==, 0);
+ rh.length -= 5;
+ r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
+ tt_int_op(r, ==, -1);
+ tt_int_op(smartlist_len(addrs), ==, 0);
+
+ SET_CELL("\x04\x04" "\x7f\x00\x02\x0a" "\x00\00\x01\x00");
+ rh.length -= 1;
+ r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
+ tt_int_op(r, ==, -1);
+ tt_int_op(smartlist_len(addrs), ==, 0);
+
+ SET_CELL("\xee\x10"
+ "\x20\x02\x90\x01\x00\x00\x00\x00"
+ "\x00\x00\x00\x00\x00\xfa\xca\xde"
+ "\x00\00\x00\x03");
+ rh.length -= 1;
+ r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
+ tt_int_op(r, ==, -1);
+ tt_int_op(smartlist_len(addrs), ==, 0);
+
+ /* Truncated item after first character */
+ SET_CELL("\x04");
+ r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
+ tt_int_op(r, ==, -1);
+ tt_int_op(smartlist_len(addrs), ==, 0);
+
+ SET_CELL("\xee");
+ r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
+ tt_int_op(r, ==, -1);
+ tt_int_op(smartlist_len(addrs), ==, 0);
+
+ done:
+ CLEAR_ADDRS();
+ CLEAR_CELL();
+ smartlist_free(addrs);
+#undef CLEAR_ADDRS
+#undef CLEAR_CELL
+}
+
+static void
+test_cfmt_is_destroy(void *arg)
+{
+ cell_t cell;
+ packed_cell_t packed;
+ circid_t circid = 0;
+ channel_t *chan;
+ (void)arg;
+
+ chan = tor_malloc_zero(sizeof(channel_t));
+
+ memset(&cell, 0xff, sizeof(cell));
+ cell.circ_id = 3003;
+ cell.command = CELL_RELAY;
+
+ cell_pack(&packed, &cell, 0);
+ chan->wide_circ_ids = 0;
+ tt_assert(! packed_cell_is_destroy(chan, &packed, &circid));
+ tt_int_op(circid, ==, 0);
+
+ cell_pack(&packed, &cell, 1);
+ chan->wide_circ_ids = 1;
+ tt_assert(! packed_cell_is_destroy(chan, &packed, &circid));
+ tt_int_op(circid, ==, 0);
+
+ cell.command = CELL_DESTROY;
+
+ cell_pack(&packed, &cell, 0);
+ chan->wide_circ_ids = 0;
+ tt_assert(packed_cell_is_destroy(chan, &packed, &circid));
+ tt_int_op(circid, ==, 3003);
+
+ circid = 0;
+ cell_pack(&packed, &cell, 1);
+ chan->wide_circ_ids = 1;
+ tt_assert(packed_cell_is_destroy(chan, &packed, &circid));
+
+ done:
+ tor_free(chan);
+}
+
#define TEST(name, flags) \
{ #name, test_cfmt_ ## name, flags, 0, NULL }
@@ -883,6 +1266,8 @@ struct testcase_t cell_format_tests[] = {
TEST(created_cells, 0),
TEST(extend_cells, 0),
TEST(extended_cells, 0),
+ TEST(resolved_cells, 0),
+ TEST(is_destroy, 0),
END_OF_TESTCASES
};
diff --git a/src/test/test_cell_queue.c b/src/test/test_cell_queue.c
new file mode 100644
index 000000000..92629823e
--- /dev/null
+++ b/src/test/test_cell_queue.c
@@ -0,0 +1,158 @@
+/* Copyright (c) 2013, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#define CIRCUITLIST_PRIVATE
+#define RELAY_PRIVATE
+#include "or.h"
+#include "circuitlist.h"
+#include "relay.h"
+#include "test.h"
+
+static void
+test_cq_manip(void *arg)
+{
+ packed_cell_t *pc1=NULL, *pc2=NULL, *pc3=NULL, *pc4=NULL, *pc_tmp=NULL;
+ cell_queue_t cq;
+ cell_t cell;
+ (void) arg;
+
+#ifdef ENABLE_MEMPOOLS
+ init_cell_pool();
+#endif /* ENABLE_MEMPOOLS */
+
+ cell_queue_init(&cq);
+ tt_int_op(cq.n, ==, 0);
+
+ pc1 = packed_cell_new();
+ pc2 = packed_cell_new();
+ pc3 = packed_cell_new();
+ pc4 = packed_cell_new();
+ tt_assert(pc1 && pc2 && pc3 && pc4);
+
+ tt_ptr_op(NULL, ==, cell_queue_pop(&cq));
+
+ /* Add and remove a singleton. */
+ cell_queue_append(&cq, pc1);
+ tt_int_op(cq.n, ==, 1);
+ tt_ptr_op(pc1, ==, cell_queue_pop(&cq));
+ tt_int_op(cq.n, ==, 0);
+
+ /* Add and remove four items */
+ cell_queue_append(&cq, pc4);
+ cell_queue_append(&cq, pc3);
+ cell_queue_append(&cq, pc2);
+ cell_queue_append(&cq, pc1);
+ tt_int_op(cq.n, ==, 4);
+ tt_ptr_op(pc4, ==, cell_queue_pop(&cq));
+ tt_ptr_op(pc3, ==, cell_queue_pop(&cq));
+ tt_ptr_op(pc2, ==, cell_queue_pop(&cq));
+ tt_ptr_op(pc1, ==, cell_queue_pop(&cq));
+ tt_int_op(cq.n, ==, 0);
+ tt_ptr_op(NULL, ==, cell_queue_pop(&cq));
+
+ /* Try a packed copy (wide, then narrow, which is a bit of a cheat, since a
+ * real cell queue has only one type.) */
+ memset(&cell, 0, sizeof(cell));
+ cell.circ_id = 0x12345678;
+ cell.command = 10;
+ strlcpy((char*)cell.payload, "Lorax ipsum gruvvulus thneed amet, snergelly "
+ "once-ler lerkim, sed do barbaloot tempor gluppitus ut labore et "
+ "truffula magna aliqua.",
+ sizeof(cell.payload));
+ cell_queue_append_packed_copy(NULL /*circ*/, &cq, 0 /*exitward*/, &cell,
+ 1 /*wide*/, 0 /*stats*/);
+ cell.circ_id = 0x2013;
+ cell_queue_append_packed_copy(NULL /*circ*/, &cq, 0 /*exitward*/, &cell,
+ 0 /*wide*/, 0 /*stats*/);
+ tt_int_op(cq.n, ==, 2);
+
+ pc_tmp = cell_queue_pop(&cq);
+ tt_int_op(cq.n, ==, 1);
+ tt_ptr_op(pc_tmp, !=, NULL);
+ test_mem_op(pc_tmp->body, ==, "\x12\x34\x56\x78\x0a", 5);
+ test_mem_op(pc_tmp->body+5, ==, cell.payload, sizeof(cell.payload));
+ packed_cell_free(pc_tmp);
+
+ pc_tmp = cell_queue_pop(&cq);
+ tt_int_op(cq.n, ==, 0);
+ tt_ptr_op(pc_tmp, !=, NULL);
+ test_mem_op(pc_tmp->body, ==, "\x20\x13\x0a", 3);
+ test_mem_op(pc_tmp->body+3, ==, cell.payload, sizeof(cell.payload));
+ packed_cell_free(pc_tmp);
+ pc_tmp = NULL;
+
+ tt_ptr_op(NULL, ==, cell_queue_pop(&cq));
+
+ /* Now make sure cell_queue_clear works. */
+ cell_queue_append(&cq, pc2);
+ cell_queue_append(&cq, pc1);
+ tt_int_op(cq.n, ==, 2);
+ cell_queue_clear(&cq);
+ pc2 = pc1 = NULL; /* prevent double-free */
+ tt_int_op(cq.n, ==, 0);
+
+ done:
+ packed_cell_free(pc1);
+ packed_cell_free(pc2);
+ packed_cell_free(pc3);
+ packed_cell_free(pc4);
+ packed_cell_free(pc_tmp);
+
+ cell_queue_clear(&cq);
+
+#ifdef ENABLE_MEMPOOLS
+ free_cell_pool();
+#endif /* ENABLE_MEMPOOLS */
+}
+
+static void
+test_circuit_n_cells(void *arg)
+{
+ packed_cell_t *pc1=NULL, *pc2=NULL, *pc3=NULL, *pc4=NULL, *pc5=NULL;
+ origin_circuit_t *origin_c=NULL;
+ or_circuit_t *or_c=NULL;
+
+ (void)arg;
+
+#ifdef ENABLE_MEMPOOLS
+ init_cell_pool();
+#endif /* ENABLE_MEMPOOLS */
+
+ pc1 = packed_cell_new();
+ pc2 = packed_cell_new();
+ pc3 = packed_cell_new();
+ pc4 = packed_cell_new();
+ pc5 = packed_cell_new();
+ tt_assert(pc1 && pc2 && pc3 && pc4 && pc5);
+
+ or_c = or_circuit_new(0, NULL);
+ origin_c = origin_circuit_new();
+ origin_c->base_.purpose = CIRCUIT_PURPOSE_C_GENERAL;
+
+ tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(or_c)), ==, 0);
+ cell_queue_append(&or_c->p_chan_cells, pc1);
+ tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(or_c)), ==, 1);
+ cell_queue_append(&or_c->base_.n_chan_cells, pc2);
+ cell_queue_append(&or_c->base_.n_chan_cells, pc3);
+ tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(or_c)), ==, 3);
+
+ tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(origin_c)), ==, 0);
+ cell_queue_append(&origin_c->base_.n_chan_cells, pc4);
+ cell_queue_append(&origin_c->base_.n_chan_cells, pc5);
+ tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(origin_c)), ==, 2);
+
+ done:
+ circuit_free(TO_CIRCUIT(or_c));
+ circuit_free(TO_CIRCUIT(origin_c));
+
+#ifdef ENABLE_MEMPOOLS
+ free_cell_pool();
+#endif /* ENABLE_MEMPOOLS */
+}
+
+struct testcase_t cell_queue_tests[] = {
+ { "basic", test_cq_manip, TT_FORK, NULL, NULL, },
+ { "circ_n_cells", test_circuit_n_cells, TT_FORK, NULL, NULL },
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_circuitlist.c b/src/test/test_circuitlist.c
new file mode 100644
index 000000000..b19edd1fd
--- /dev/null
+++ b/src/test/test_circuitlist.c
@@ -0,0 +1,342 @@
+/* Copyright (c) 2013, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#define TOR_CHANNEL_INTERNAL_
+#define CIRCUITBUILD_PRIVATE
+#define CIRCUITLIST_PRIVATE
+#include "or.h"
+#include "channel.h"
+#include "circuitbuild.h"
+#include "circuitlist.h"
+#include "test.h"
+
+static channel_t *
+new_fake_channel(void)
+{
+ channel_t *chan = tor_malloc_zero(sizeof(channel_t));
+ channel_init(chan);
+ return chan;
+}
+
+static struct {
+ int ncalls;
+ void *cmux;
+ void *circ;
+ cell_direction_t dir;
+} cam;
+
+static void
+circuitmux_attach_mock(circuitmux_t *cmux, circuit_t *circ,
+ cell_direction_t dir)
+{
+ ++cam.ncalls;
+ cam.cmux = cmux;
+ cam.circ = circ;
+ cam.dir = dir;
+}
+
+static struct {
+ int ncalls;
+ void *cmux;
+ void *circ;
+} cdm;
+
+static void
+circuitmux_detach_mock(circuitmux_t *cmux, circuit_t *circ)
+{
+ ++cdm.ncalls;
+ cdm.cmux = cmux;
+ cdm.circ = circ;
+}
+
+#define GOT_CMUX_ATTACH(mux_, circ_, dir_) do { \
+ tt_int_op(cam.ncalls, ==, 1); \
+ tt_ptr_op(cam.cmux, ==, (mux_)); \
+ tt_ptr_op(cam.circ, ==, (circ_)); \
+ tt_int_op(cam.dir, ==, (dir_)); \
+ memset(&cam, 0, sizeof(cam)); \
+ } while (0)
+
+#define GOT_CMUX_DETACH(mux_, circ_) do { \
+ tt_int_op(cdm.ncalls, ==, 1); \
+ tt_ptr_op(cdm.cmux, ==, (mux_)); \
+ tt_ptr_op(cdm.circ, ==, (circ_)); \
+ memset(&cdm, 0, sizeof(cdm)); \
+ } while (0)
+
+static void
+test_clist_maps(void *arg)
+{
+ channel_t *ch1 = new_fake_channel();
+ channel_t *ch2 = new_fake_channel();
+ channel_t *ch3 = new_fake_channel();
+ or_circuit_t *or_c1=NULL, *or_c2=NULL;
+
+ (void) arg;
+
+ MOCK(circuitmux_attach_circuit, circuitmux_attach_mock);
+ MOCK(circuitmux_detach_circuit, circuitmux_detach_mock);
+ memset(&cam, 0, sizeof(cam));
+ memset(&cdm, 0, sizeof(cdm));
+
+ ch1->cmux = (void*)0x1001;
+ ch2->cmux = (void*)0x1002;
+ ch3->cmux = (void*)0x1003;
+
+ or_c1 = or_circuit_new(100, ch2);
+ tt_assert(or_c1);
+ GOT_CMUX_ATTACH(ch2->cmux, or_c1, CELL_DIRECTION_IN);
+ tt_int_op(or_c1->p_circ_id, ==, 100);
+ tt_ptr_op(or_c1->p_chan, ==, ch2);
+
+ or_c2 = or_circuit_new(100, ch1);
+ tt_assert(or_c2);
+ GOT_CMUX_ATTACH(ch1->cmux, or_c2, CELL_DIRECTION_IN);
+ tt_int_op(or_c2->p_circ_id, ==, 100);
+ tt_ptr_op(or_c2->p_chan, ==, ch1);
+
+ circuit_set_n_circid_chan(TO_CIRCUIT(or_c1), 200, ch1);
+ GOT_CMUX_ATTACH(ch1->cmux, or_c1, CELL_DIRECTION_OUT);
+
+ circuit_set_n_circid_chan(TO_CIRCUIT(or_c2), 200, ch2);
+ GOT_CMUX_ATTACH(ch2->cmux, or_c2, CELL_DIRECTION_OUT);
+
+ tt_ptr_op(circuit_get_by_circid_channel(200, ch1), ==, TO_CIRCUIT(or_c1));
+ tt_ptr_op(circuit_get_by_circid_channel(200, ch2), ==, TO_CIRCUIT(or_c2));
+ tt_ptr_op(circuit_get_by_circid_channel(100, ch2), ==, TO_CIRCUIT(or_c1));
+ /* Try the same thing again, to test the "fast" path. */
+ tt_ptr_op(circuit_get_by_circid_channel(100, ch2), ==, TO_CIRCUIT(or_c1));
+ tt_assert(circuit_id_in_use_on_channel(100, ch2));
+ tt_assert(! circuit_id_in_use_on_channel(101, ch2));
+
+ /* Try changing the circuitid and channel of that circuit. */
+ circuit_set_p_circid_chan(or_c1, 500, ch3);
+ GOT_CMUX_DETACH(ch2->cmux, TO_CIRCUIT(or_c1));
+ GOT_CMUX_ATTACH(ch3->cmux, TO_CIRCUIT(or_c1), CELL_DIRECTION_IN);
+ tt_ptr_op(circuit_get_by_circid_channel(100, ch2), ==, NULL);
+ tt_assert(! circuit_id_in_use_on_channel(100, ch2));
+ tt_ptr_op(circuit_get_by_circid_channel(500, ch3), ==, TO_CIRCUIT(or_c1));
+
+ /* Now let's see about destroy handling. */
+ tt_assert(! circuit_id_in_use_on_channel(205, ch2));
+ tt_assert(circuit_id_in_use_on_channel(200, ch2));
+ channel_note_destroy_pending(ch2, 200);
+ channel_note_destroy_pending(ch2, 205);
+ channel_note_destroy_pending(ch1, 100);
+ tt_assert(circuit_id_in_use_on_channel(205, ch2))
+ tt_assert(circuit_id_in_use_on_channel(200, ch2));
+ tt_assert(circuit_id_in_use_on_channel(100, ch1));
+
+ tt_assert(TO_CIRCUIT(or_c2)->n_delete_pending != 0);
+ tt_ptr_op(circuit_get_by_circid_channel(200, ch2), ==, TO_CIRCUIT(or_c2));
+ tt_ptr_op(circuit_get_by_circid_channel(100, ch1), ==, TO_CIRCUIT(or_c2));
+
+ /* Okay, now free ch2 and make sure that the circuit ID is STILL not
+ * usable, because we haven't declared the destroy to be nonpending */
+ tt_int_op(cdm.ncalls, ==, 0);
+ circuit_free(TO_CIRCUIT(or_c2));
+ or_c2 = NULL; /* prevent free */
+ tt_int_op(cdm.ncalls, ==, 2);
+ memset(&cdm, 0, sizeof(cdm));
+ tt_assert(circuit_id_in_use_on_channel(200, ch2));
+ tt_assert(circuit_id_in_use_on_channel(100, ch1));
+ tt_ptr_op(circuit_get_by_circid_channel(200, ch2), ==, NULL);
+ tt_ptr_op(circuit_get_by_circid_channel(100, ch1), ==, NULL);
+
+ /* Now say that the destroy is nonpending */
+ channel_note_destroy_not_pending(ch2, 200);
+ tt_ptr_op(circuit_get_by_circid_channel(200, ch2), ==, NULL);
+ channel_note_destroy_not_pending(ch1, 100);
+ tt_ptr_op(circuit_get_by_circid_channel(100, ch1), ==, NULL);
+ tt_assert(! circuit_id_in_use_on_channel(200, ch2));
+ tt_assert(! circuit_id_in_use_on_channel(100, ch1));
+
+ done:
+ if (or_c1)
+ circuit_free(TO_CIRCUIT(or_c1));
+ if (or_c2)
+ circuit_free(TO_CIRCUIT(or_c2));
+ tor_free(ch1);
+ tor_free(ch2);
+ tor_free(ch3);
+ UNMOCK(circuitmux_attach_circuit);
+ UNMOCK(circuitmux_detach_circuit);
+}
+
+static void
+test_rend_token_maps(void *arg)
+{
+ or_circuit_t *c1, *c2, *c3, *c4;
+ const uint8_t tok1[REND_TOKEN_LEN] = "The cat can't tell y";
+ const uint8_t tok2[REND_TOKEN_LEN] = "ou its name, and it ";
+ const uint8_t tok3[REND_TOKEN_LEN] = "doesn't really care.";
+ /* -- Adapted from a quote by Fredrik Lundh. */
+
+ (void)arg;
+ (void)tok1; //xxxx
+ c1 = or_circuit_new(0, NULL);
+ c2 = or_circuit_new(0, NULL);
+ c3 = or_circuit_new(0, NULL);
+ c4 = or_circuit_new(0, NULL);
+
+ /* Make sure we really filled up the tok* variables */
+ tt_int_op(tok1[REND_TOKEN_LEN-1], ==, 'y');
+ tt_int_op(tok2[REND_TOKEN_LEN-1], ==, ' ');
+ tt_int_op(tok3[REND_TOKEN_LEN-1], ==, '.');
+
+ /* No maps; nothing there. */
+ tt_ptr_op(NULL, ==, circuit_get_rendezvous(tok1));
+ tt_ptr_op(NULL, ==, circuit_get_intro_point(tok1));
+
+ circuit_set_rendezvous_cookie(c1, tok1);
+ circuit_set_intro_point_digest(c2, tok2);
+
+ tt_ptr_op(NULL, ==, circuit_get_rendezvous(tok3));
+ tt_ptr_op(NULL, ==, circuit_get_intro_point(tok3));
+ tt_ptr_op(NULL, ==, circuit_get_rendezvous(tok2));
+ tt_ptr_op(NULL, ==, circuit_get_intro_point(tok1));
+
+ /* Without purpose set, we don't get the circuits */
+ tt_ptr_op(NULL, ==, circuit_get_rendezvous(tok1));
+ tt_ptr_op(NULL, ==, circuit_get_intro_point(tok2));
+
+ c1->base_.purpose = CIRCUIT_PURPOSE_REND_POINT_WAITING;
+ c2->base_.purpose = CIRCUIT_PURPOSE_INTRO_POINT;
+
+ /* Okay, make sure they show up now. */
+ tt_ptr_op(c1, ==, circuit_get_rendezvous(tok1));
+ tt_ptr_op(c2, ==, circuit_get_intro_point(tok2));
+
+ /* Two items at the same place with the same token. */
+ c3->base_.purpose = CIRCUIT_PURPOSE_REND_POINT_WAITING;
+ circuit_set_rendezvous_cookie(c3, tok2);
+ tt_ptr_op(c2, ==, circuit_get_intro_point(tok2));
+ tt_ptr_op(c3, ==, circuit_get_rendezvous(tok2));
+
+ /* Marking a circuit makes it not get returned any more */
+ circuit_mark_for_close(TO_CIRCUIT(c1), END_CIRC_REASON_FINISHED);
+ tt_ptr_op(NULL, ==, circuit_get_rendezvous(tok1));
+ circuit_free(TO_CIRCUIT(c1));
+ c1 = NULL;
+
+ /* Freeing a circuit makes it not get returned any more. */
+ circuit_free(TO_CIRCUIT(c2));
+ c2 = NULL;
+ tt_ptr_op(NULL, ==, circuit_get_intro_point(tok2));
+
+ /* c3 -- are you still there? */
+ tt_ptr_op(c3, ==, circuit_get_rendezvous(tok2));
+ /* Change its cookie. This never happens in Tor per se, but hey. */
+ c3->base_.purpose = CIRCUIT_PURPOSE_INTRO_POINT;
+ circuit_set_intro_point_digest(c3, tok3);
+
+ tt_ptr_op(NULL, ==, circuit_get_rendezvous(tok2));
+ tt_ptr_op(c3, ==, circuit_get_intro_point(tok3));
+
+ /* Now replace c3 with c4. */
+ c4->base_.purpose = CIRCUIT_PURPOSE_INTRO_POINT;
+ circuit_set_intro_point_digest(c4, tok3);
+
+ tt_ptr_op(c4, ==, circuit_get_intro_point(tok3));
+
+ tt_ptr_op(c3->rendinfo, ==, NULL);
+ tt_ptr_op(c4->rendinfo, !=, NULL);
+ test_mem_op(c4->rendinfo, ==, tok3, REND_TOKEN_LEN);
+
+ /* Now clear c4's cookie. */
+ circuit_set_intro_point_digest(c4, NULL);
+ tt_ptr_op(c4->rendinfo, ==, NULL);
+ tt_ptr_op(NULL, ==, circuit_get_intro_point(tok3));
+
+ done:
+ if (c1)
+ circuit_free(TO_CIRCUIT(c1));
+ if (c2)
+ circuit_free(TO_CIRCUIT(c2));
+ if (c3)
+ circuit_free(TO_CIRCUIT(c3));
+ if (c4)
+ circuit_free(TO_CIRCUIT(c4));
+}
+
+static void
+test_pick_circid(void *arg)
+{
+ bitarray_t *ba = NULL;
+ channel_t *chan1, *chan2;
+ circid_t circid;
+ int i;
+ (void) arg;
+
+ chan1 = tor_malloc_zero(sizeof(channel_t));
+ chan2 = tor_malloc_zero(sizeof(channel_t));
+ chan2->wide_circ_ids = 1;
+
+ chan1->circ_id_type = CIRC_ID_TYPE_NEITHER;
+ tt_int_op(0, ==, get_unique_circ_id_by_chan(chan1));
+
+ /* Basic tests, with no collisions */
+ chan1->circ_id_type = CIRC_ID_TYPE_LOWER;
+ for (i = 0; i < 50; ++i) {
+ circid = get_unique_circ_id_by_chan(chan1);
+ tt_uint_op(0, <, circid);
+ tt_uint_op(circid, <, (1<<15));
+ }
+ chan1->circ_id_type = CIRC_ID_TYPE_HIGHER;
+ for (i = 0; i < 50; ++i) {
+ circid = get_unique_circ_id_by_chan(chan1);
+ tt_uint_op((1<<15), <, circid);
+ tt_uint_op(circid, <, (1<<16));
+ }
+
+ chan2->circ_id_type = CIRC_ID_TYPE_LOWER;
+ for (i = 0; i < 50; ++i) {
+ circid = get_unique_circ_id_by_chan(chan2);
+ tt_uint_op(0, <, circid);
+ tt_uint_op(circid, <, (1u<<31));
+ }
+ chan2->circ_id_type = CIRC_ID_TYPE_HIGHER;
+ for (i = 0; i < 50; ++i) {
+ circid = get_unique_circ_id_by_chan(chan2);
+ tt_uint_op((1u<<31), <, circid);
+ }
+
+ /* Now make sure that we can behave well when we are full up on circuits */
+ chan1->circ_id_type = CIRC_ID_TYPE_LOWER;
+ chan2->circ_id_type = CIRC_ID_TYPE_LOWER;
+ chan1->wide_circ_ids = chan2->wide_circ_ids = 0;
+ ba = bitarray_init_zero((1<<15));
+ for (i = 0; i < (1<<15); ++i) {
+ circid = get_unique_circ_id_by_chan(chan1);
+ if (circid == 0) {
+ tt_int_op(i, >, (1<<14));
+ break;
+ }
+ tt_uint_op(circid, <, (1<<15));
+ tt_assert(! bitarray_is_set(ba, circid));
+ bitarray_set(ba, circid);
+ channel_mark_circid_unusable(chan1, circid);
+ }
+ tt_int_op(i, <, (1<<15));
+ /* Make sure that being full on chan1 does not interfere with chan2 */
+ for (i = 0; i < 100; ++i) {
+ circid = get_unique_circ_id_by_chan(chan2);
+ tt_uint_op(circid, >, 0);
+ tt_uint_op(circid, <, (1<<15));
+ channel_mark_circid_unusable(chan2, circid);
+ }
+
+ done:
+ tor_free(chan1);
+ tor_free(chan2);
+ bitarray_free(ba);
+ circuit_free_all();
+}
+
+struct testcase_t circuitlist_tests[] = {
+ { "maps", test_clist_maps, TT_FORK, NULL, NULL },
+ { "rend_token_maps", test_rend_token_maps, TT_FORK, NULL, NULL },
+ { "pick_circid", test_pick_circid, TT_FORK, NULL, NULL },
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_circuitmux.c b/src/test/test_circuitmux.c
new file mode 100644
index 000000000..b9c0436eb
--- /dev/null
+++ b/src/test/test_circuitmux.c
@@ -0,0 +1,88 @@
+/* Copyright (c) 2013, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#define TOR_CHANNEL_INTERNAL_
+#define CIRCUITMUX_PRIVATE
+#define RELAY_PRIVATE
+#include "or.h"
+#include "channel.h"
+#include "circuitmux.h"
+#include "relay.h"
+#include "test.h"
+
+/* XXXX duplicated function from test_circuitlist.c */
+static channel_t *
+new_fake_channel(void)
+{
+ channel_t *chan = tor_malloc_zero(sizeof(channel_t));
+ channel_init(chan);
+ return chan;
+}
+
+static int
+has_queued_writes(channel_t *c)
+{
+ (void) c;
+ return 1;
+}
+
+/** Test destroy cell queue with no interference from other queues. */
+static void
+test_cmux_destroy_cell_queue(void *arg)
+{
+ circuitmux_t *cmux = NULL;
+ channel_t *ch = NULL;
+ circuit_t *circ = NULL;
+ cell_queue_t *cq = NULL;
+ packed_cell_t *pc = NULL;
+
+#ifdef ENABLE_MEMPOOLS
+ init_cell_pool();
+#endif /* ENABLE_MEMPOOLS */
+ (void) arg;
+
+ cmux = circuitmux_alloc();
+ tt_assert(cmux);
+ ch = new_fake_channel();
+ ch->has_queued_writes = has_queued_writes;
+ ch->wide_circ_ids = 1;
+
+ circ = circuitmux_get_first_active_circuit(cmux, &cq);
+ tt_assert(!circ);
+ tt_assert(!cq);
+
+ circuitmux_append_destroy_cell(ch, cmux, 100, 10);
+ circuitmux_append_destroy_cell(ch, cmux, 190, 6);
+ circuitmux_append_destroy_cell(ch, cmux, 30, 1);
+
+ tt_int_op(circuitmux_num_cells(cmux), ==, 3);
+
+ circ = circuitmux_get_first_active_circuit(cmux, &cq);
+ tt_assert(!circ);
+ tt_assert(cq);
+
+ tt_int_op(cq->n, ==, 3);
+
+ pc = cell_queue_pop(cq);
+ tt_assert(pc);
+ test_mem_op(pc->body, ==, "\x00\x00\x00\x64\x04\x0a\x00\x00\x00", 9);
+ packed_cell_free(pc);
+ pc = NULL;
+
+ tt_int_op(circuitmux_num_cells(cmux), ==, 2);
+
+ done:
+ circuitmux_free(cmux);
+ channel_free(ch);
+ packed_cell_free(pc);
+
+#ifdef ENABLE_MEMPOOLS
+ free_cell_pool();
+#endif /* ENABLE_MEMPOOLS */
+}
+
+struct testcase_t circuitmux_tests[] = {
+ { "destroy_cell_queue", test_cmux_destroy_cell_queue, TT_FORK, NULL, NULL },
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_cmdline_args.py b/src/test/test_cmdline_args.py
new file mode 100755
index 000000000..55d1cdb80
--- /dev/null
+++ b/src/test/test_cmdline_args.py
@@ -0,0 +1,292 @@
+#!/usr/bin/python
+
+import binascii
+import hashlib
+import os
+import re
+import shutil
+import subprocess
+import sys
+import tempfile
+import unittest
+
+TOR = "./src/or/tor"
+TOP_SRCDIR = "."
+
+if len(sys.argv) > 1:
+ TOR = sys.argv[1]
+ del sys.argv[1]
+
+if len(sys.argv) > 1:
+ TOP_SRCDIR = sys.argv[1]
+ del sys.argv[1]
+
+class UnexpectedSuccess(Exception):
+ pass
+
+class UnexpectedFailure(Exception):
+ pass
+
+if sys.version < '3':
+ def b2s(b):
+ return b
+ def s2b(s):
+ return s
+ def NamedTemporaryFile():
+ return tempfile.NamedTemporaryFile(delete=False)
+else:
+ def b2s(b):
+ return str(b, 'ascii')
+ def s2b(s):
+ return s.encode('ascii')
+ def NamedTemporaryFile():
+ return tempfile.NamedTemporaryFile(mode="w",delete=False,encoding="ascii")
+
+def contents(fn):
+ f = open(fn)
+ try:
+ return f.read()
+ finally:
+ f.close()
+
+def run_tor(args, failure=False):
+ p = subprocess.Popen([TOR] + args, stdout=subprocess.PIPE)
+ output, _ = p.communicate()
+ result = p.poll()
+ if result and not failure:
+ raise UnexpectedFailure()
+ elif not result and failure:
+ raise UnexpectedSuccess()
+ return b2s(output)
+
+def spaceify_fp(fp):
+ for i in range(0, len(fp), 4):
+ yield fp[i:i+4]
+
+def lines(s):
+ out = s.split("\n")
+ if out and out[-1] == '':
+ del out[-1]
+ return out
+
+def strip_log_junk(line):
+ m = re.match(r'([^\[]+\[[a-z]*\] *)(.*)', line)
+ if not m:
+ return ""+line
+ return m.group(2).strip()
+
+def randstring(entropy_bytes):
+ s = os.urandom(entropy_bytes)
+ return b2s(binascii.b2a_hex(s))
+
+def findLineContaining(lines, s):
+ for ln in lines:
+ if s in ln:
+ return True
+ return False
+
+class CmdlineTests(unittest.TestCase):
+
+ def test_version(self):
+ out = run_tor(["--version"])
+ self.assertTrue(out.startswith("Tor version "))
+ self.assertEqual(len(lines(out)), 1)
+
+ def test_quiet(self):
+ out = run_tor(["--quiet", "--quumblebluffin", "1"], failure=True)
+ self.assertEqual(out, "")
+
+ def test_help(self):
+ out = run_tor(["--help"], failure=False)
+ out2 = run_tor(["-h"], failure=False)
+ self.assertTrue(out.startswith("Copyright (c) 2001"))
+ self.assertTrue(out.endswith(
+ "tor -f <torrc> [args]\n"
+ "See man page for options, or https://www.torproject.org/ for documentation.\n"))
+ self.assertTrue(out == out2)
+
+ def test_hush(self):
+ torrc = NamedTemporaryFile()
+ torrc.close()
+ try:
+ out = run_tor(["--hush", "-f", torrc.name,
+ "--quumblebluffin", "1"], failure=True)
+ finally:
+ os.unlink(torrc.name)
+ self.assertEqual(len(lines(out)), 2)
+ ln = [ strip_log_junk(l) for l in lines(out) ]
+ self.assertEqual(ln[0], "Failed to parse/validate config: Unknown option 'quumblebluffin'. Failing.")
+ self.assertEqual(ln[1], "Reading config failed--see warnings above.")
+
+ def test_missing_argument(self):
+ out = run_tor(["--hush", "--hash-password"], failure=True)
+ self.assertEqual(len(lines(out)), 2)
+ ln = [ strip_log_junk(l) for l in lines(out) ]
+ self.assertEqual(ln[0], "Command-line option '--hash-password' with no value. Failing.")
+
+ def test_hash_password(self):
+ out = run_tor(["--hash-password", "woodwose"])
+ result = lines(out)[-1]
+ self.assertEqual(result[:3], "16:")
+ self.assertEqual(len(result), 61)
+ r = binascii.a2b_hex(result[3:])
+ self.assertEqual(len(r), 29)
+
+ salt, how, hashed = r[:8], r[8], r[9:]
+ self.assertEqual(len(hashed), 20)
+ if type(how) == type("A"):
+ how = ord(how)
+
+ count = (16 + (how & 15)) << ((how >> 4) + 6)
+ stuff = salt + s2b("woodwose")
+ repetitions = count // len(stuff) + 1
+ inp = stuff * repetitions
+ inp = inp[:count]
+
+ self.assertEqual(hashlib.sha1(inp).digest(), hashed)
+
+ def test_digests(self):
+ main_c = os.path.join(TOP_SRCDIR, "src", "or", "main.c")
+
+ if os.stat(TOR).st_mtime < os.stat(main_c).st_mtime:
+ self.skipTest(TOR+" not up to date")
+ out = run_tor(["--digests"])
+ main_line = [ l for l in lines(out) if l.endswith("/main.c") ]
+ digest, name = main_line[0].split()
+ f = open(main_c, 'rb')
+ actual = hashlib.sha1(f.read()).hexdigest()
+ f.close()
+ self.assertEqual(digest, actual)
+
+ def test_dump_options(self):
+ default_torrc = NamedTemporaryFile()
+ torrc = NamedTemporaryFile()
+ torrc.write("SocksPort 9999")
+ torrc.close()
+ default_torrc.write("SafeLogging 0")
+ default_torrc.close()
+ out_sh = out_nb = out_fl = None
+ opts = [ "-f", torrc.name,
+ "--defaults-torrc", default_torrc.name ]
+ try:
+ out_sh = run_tor(["--dump-config", "short"]+opts)
+ out_nb = run_tor(["--dump-config", "non-builtin"]+opts)
+ out_fl = run_tor(["--dump-config", "full"]+opts)
+ out_nr = run_tor(["--dump-config", "bliznert"]+opts,
+ failure=True)
+
+ out_verif = run_tor(["--verify-config"]+opts)
+ finally:
+ os.unlink(torrc.name)
+ os.unlink(default_torrc.name)
+
+ self.assertEqual(len(lines(out_sh)), 2)
+ self.assertTrue(lines(out_sh)[0].startswith("DataDirectory "))
+ self.assertEqual(lines(out_sh)[1:],
+ [ "SocksPort 9999" ])
+
+ self.assertEqual(len(lines(out_nb)), 2)
+ self.assertEqual(lines(out_nb),
+ [ "SafeLogging 0",
+ "SocksPort 9999" ])
+
+ out_fl = lines(out_fl)
+ self.assertTrue(len(out_fl) > 100)
+ self.assertTrue("SocksPort 9999" in out_fl)
+ self.assertTrue("SafeLogging 0" in out_fl)
+ self.assertTrue("ClientOnly 0" in out_fl)
+
+ self.assertTrue(out_verif.endswith("Configuration was valid\n"))
+
+ def test_list_fingerprint(self):
+ tmpdir = tempfile.mkdtemp(prefix='ttca_')
+ torrc = NamedTemporaryFile()
+ torrc.write("ORPort 9999\n")
+ torrc.write("DataDirectory %s\n"%tmpdir)
+ torrc.write("Nickname tippi")
+ torrc.close()
+ opts = ["-f", torrc.name]
+ try:
+ out = run_tor(["--list-fingerprint"]+opts)
+ fp = contents(os.path.join(tmpdir, "fingerprint"))
+ finally:
+ os.unlink(torrc.name)
+ shutil.rmtree(tmpdir)
+
+ out = lines(out)
+ lastlog = strip_log_junk(out[-2])
+ lastline = out[-1]
+ fp = fp.strip()
+ nn_fp = fp.split()[0]
+ space_fp = " ".join(spaceify_fp(fp.split()[1]))
+ self.assertEqual(lastlog,
+ "Your Tor server's identity key fingerprint is '%s'"%fp)
+ self.assertEqual(lastline, "tippi %s"%space_fp)
+ self.assertEqual(nn_fp, "tippi")
+
+ def test_list_options(self):
+ out = lines(run_tor(["--list-torrc-options"]))
+ self.assertTrue(len(out)>100)
+ self.assertTrue(out[0] <= 'AccountingMax')
+ self.assertTrue("UseBridges" in out)
+ self.assertTrue("SocksPort" in out)
+
+ def test_cmdline_args(self):
+ default_torrc = NamedTemporaryFile()
+ torrc = NamedTemporaryFile()
+ torrc.write("SocksPort 9999\n")
+ torrc.write("SocksPort 9998\n")
+ torrc.write("ORPort 9000\n")
+ torrc.write("ORPort 9001\n")
+ torrc.write("Nickname eleventeen\n")
+ torrc.write("ControlPort 9500\n")
+ torrc.close()
+ default_torrc.write("")
+ default_torrc.close()
+ out_sh = out_nb = out_fl = None
+ opts = [ "-f", torrc.name,
+ "--defaults-torrc", default_torrc.name,
+ "--dump-config", "short" ]
+ try:
+ out_1 = run_tor(opts)
+ out_2 = run_tor(opts+["+ORPort", "9003",
+ "SocksPort", "9090",
+ "/ControlPort",
+ "/TransPort",
+ "+ExtORPort", "9005"])
+ finally:
+ os.unlink(torrc.name)
+ os.unlink(default_torrc.name)
+
+ out_1 = [ l for l in lines(out_1) if not l.startswith("DataDir") ]
+ out_2 = [ l for l in lines(out_2) if not l.startswith("DataDir") ]
+
+ self.assertEqual(out_1,
+ ["ControlPort 9500",
+ "Nickname eleventeen",
+ "ORPort 9000",
+ "ORPort 9001",
+ "SocksPort 9999",
+ "SocksPort 9998"])
+ self.assertEqual(out_2,
+ ["ExtORPort 9005",
+ "Nickname eleventeen",
+ "ORPort 9000",
+ "ORPort 9001",
+ "ORPort 9003",
+ "SocksPort 9090"])
+
+ def test_missing_torrc(self):
+ fname = "nonexistent_file_"+randstring(8)
+ out = run_tor(["-f", fname, "--verify-config"], failure=True)
+ ln = [ strip_log_junk(l) for l in lines(out) ]
+ self.assertTrue("Unable to open configuration file" in ln[-2])
+ self.assertTrue("Reading config failed" in ln[-1])
+
+ out = run_tor(["-f", fname, "--verify-config", "--ignore-missing-torrc"])
+ ln = [ strip_log_junk(l) for l in lines(out) ]
+ self.assertTrue(findLineContaining(ln, ", using reasonable defaults"))
+ self.assertTrue("Configuration was valid" in ln[-1])
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/src/test/test_config.c b/src/test/test_config.c
index e20fe7329..94ac4dca1 100644
--- a/src/test/test_config.c
+++ b/src/test/test_config.c
@@ -4,12 +4,16 @@
/* See LICENSE for licensing information */
#include "orconfig.h"
+
+#define CONFIG_PRIVATE
#include "or.h"
#include "addressmap.h"
#include "config.h"
#include "confparse.h"
#include "connection_edge.h"
#include "test.h"
+#include "util.h"
+#include "address.h"
static void
test_config_addressmap(void *arg)
@@ -120,6 +124,7 @@ test_config_addressmap(void *arg)
test_assert(!addressmap_rewrite(address, sizeof(address), &expires, NULL));
/* Test top-level-domain matching a bit harder */
+ config_free_lines(get_options_mutable()->AddressMap);
addressmap_clear_configured();
strlcpy(buf, "MapAddress *.com *.torserver.exit\n"
"MapAddress *.torproject.org 1.1.1.1\n"
@@ -149,6 +154,7 @@ test_config_addressmap(void *arg)
test_streq(address, "2.2.2.2");
/* We don't support '*' as a mapping directive */
+ config_free_lines(get_options_mutable()->AddressMap);
addressmap_clear_configured();
strlcpy(buf, "MapAddress * *.torserver.exit\n", sizeof(buf));
config_get_lines(buf, &(get_options_mutable()->AddressMap), 0);
@@ -166,7 +172,421 @@ test_config_addressmap(void *arg)
#undef addressmap_rewrite
done:
- ;
+ config_free_lines(get_options_mutable()->AddressMap);
+ get_options_mutable()->AddressMap = NULL;
+}
+
+static int
+is_private_dir(const char* path)
+{
+ struct stat st;
+ int r = stat(path, &st);
+ if (r) {
+ return 0;
+ }
+#if !defined (_WIN32) || defined (WINCE)
+ if ((st.st_mode & (S_IFDIR | 0777)) != (S_IFDIR | 0700)) {
+ return 0;
+ }
+#endif
+ return 1;
+}
+
+static void
+test_config_check_or_create_data_subdir(void *arg)
+{
+ or_options_t *options = get_options_mutable();
+ char *datadir;
+ const char *subdir = "test_stats";
+ char *subpath;
+ struct stat st;
+ int r;
+#if !defined (_WIN32) || defined (WINCE)
+ unsigned group_permission;
+#endif
+ (void)arg;
+
+ tor_free(options->DataDirectory);
+ datadir = options->DataDirectory = tor_strdup(get_fname("datadir-0"));
+ subpath = get_datadir_fname(subdir);
+
+#if defined (_WIN32) && !defined (WINCE)
+ tt_int_op(mkdir(options->DataDirectory), ==, 0);
+#else
+ tt_int_op(mkdir(options->DataDirectory, 0700), ==, 0);
+#endif
+
+ r = stat(subpath, &st);
+
+ // The subdirectory shouldn't exist yet,
+ // but should be created by the call to check_or_create_data_subdir.
+ test_assert(r && (errno == ENOENT));
+ test_assert(!check_or_create_data_subdir(subdir));
+ test_assert(is_private_dir(subpath));
+
+ // The check should return 0, if the directory already exists
+ // and is private to the user.
+ test_assert(!check_or_create_data_subdir(subdir));
+
+ r = stat(subpath, &st);
+ if (r) {
+ tt_abort_perror("stat");
+ }
+
+#if !defined (_WIN32) || defined (WINCE)
+ group_permission = st.st_mode | 0070;
+ r = chmod(subpath, group_permission);
+
+ if (r) {
+ tt_abort_perror("chmod");
+ }
+
+ // If the directory exists, but its mode is too permissive
+ // a call to check_or_create_data_subdir should reset the mode.
+ test_assert(!is_private_dir(subpath));
+ test_assert(!check_or_create_data_subdir(subdir));
+ test_assert(is_private_dir(subpath));
+#endif
+
+ done:
+ rmdir(subpath);
+ tor_free(datadir);
+ tor_free(subpath);
+}
+
+static void
+test_config_write_to_data_subdir(void *arg)
+{
+ or_options_t* options = get_options_mutable();
+ char *datadir;
+ char *cp = NULL;
+ const char* subdir = "test_stats";
+ const char* fname = "test_file";
+ const char* str =
+ "Lorem ipsum dolor sit amet, consetetur sadipscing\n"
+ "elitr, sed diam nonumy eirmod\n"
+ "tempor invidunt ut labore et dolore magna aliquyam\n"
+ "erat, sed diam voluptua.\n"
+ "At vero eos et accusam et justo duo dolores et ea\n"
+ "rebum. Stet clita kasd gubergren,\n"
+ "no sea takimata sanctus est Lorem ipsum dolor sit amet.\n"
+ "Lorem ipsum dolor sit amet,\n"
+ "consetetur sadipscing elitr, sed diam nonumy eirmod\n"
+ "tempor invidunt ut labore et dolore\n"
+ "magna aliquyam erat, sed diam voluptua. At vero eos et\n"
+ "accusam et justo duo dolores et\n"
+ "ea rebum. Stet clita kasd gubergren, no sea takimata\n"
+ "sanctus est Lorem ipsum dolor sit amet.";
+ char* filepath = NULL;
+ (void)arg;
+
+ tor_free(options->DataDirectory);
+ datadir = options->DataDirectory = tor_strdup(get_fname("datadir-1"));
+ filepath = get_datadir_fname2(subdir, fname);
+
+#if defined (_WIN32) && !defined (WINCE)
+ tt_int_op(mkdir(options->DataDirectory), ==, 0);
+#else
+ tt_int_op(mkdir(options->DataDirectory, 0700), ==, 0);
+#endif
+
+ // Write attempt shoudl fail, if subdirectory doesn't exist.
+ test_assert(write_to_data_subdir(subdir, fname, str, NULL));
+ test_assert(! check_or_create_data_subdir(subdir));
+
+ // Content of file after write attempt should be
+ // equal to the original string.
+ test_assert(!write_to_data_subdir(subdir, fname, str, NULL));
+ cp = read_file_to_str(filepath, 0, NULL);
+ test_streq(cp, str);
+ tor_free(cp);
+
+ // A second write operation should overwrite the old content.
+ test_assert(!write_to_data_subdir(subdir, fname, str, NULL));
+ cp = read_file_to_str(filepath, 0, NULL);
+ test_streq(cp, str);
+ tor_free(cp);
+
+ done:
+ (void) unlink(filepath);
+ rmdir(options->DataDirectory);
+ tor_free(datadir);
+ tor_free(filepath);
+ tor_free(cp);
+}
+
+/* Test helper function: Make sure that a bridge line gets parsed
+ * properly. Also make sure that the resulting bridge_line_t structure
+ * has its fields set correctly. */
+static void
+good_bridge_line_test(const char *string, const char *test_addrport,
+ const char *test_digest, const char *test_transport,
+ const smartlist_t *test_socks_args)
+{
+ char *tmp = NULL;
+ bridge_line_t *bridge_line = parse_bridge_line(string);
+ test_assert(bridge_line);
+
+ /* test addrport */
+ tmp = tor_strdup(fmt_addrport(&bridge_line->addr, bridge_line->port));
+ test_streq(test_addrport, tmp);
+ tor_free(tmp);
+
+ /* If we were asked to validate a digest, but we did not get a
+ digest after parsing, we failed. */
+ if (test_digest && tor_digest_is_zero(bridge_line->digest))
+ test_assert(0);
+
+ /* If we were not asked to validate a digest, and we got a digest
+ after parsing, we failed again. */
+ if (!test_digest && !tor_digest_is_zero(bridge_line->digest))
+ test_assert(0);
+
+ /* If we were asked to validate a digest, and we got a digest after
+ parsing, make sure it's correct. */
+ if (test_digest) {
+ tmp = tor_strdup(hex_str(bridge_line->digest, DIGEST_LEN));
+ tor_strlower(tmp);
+ test_streq(test_digest, tmp);
+ tor_free(tmp);
+ }
+
+ /* If we were asked to validate a transport name, make sure tha it
+ matches with the transport name that was parsed. */
+ if (test_transport && !bridge_line->transport_name)
+ test_assert(0);
+ if (!test_transport && bridge_line->transport_name)
+ test_assert(0);
+ if (test_transport)
+ test_streq(test_transport, bridge_line->transport_name);
+
+ /* Validate the SOCKS argument smartlist. */
+ if (test_socks_args && !bridge_line->socks_args)
+ test_assert(0);
+ if (!test_socks_args && bridge_line->socks_args)
+ test_assert(0);
+ if (test_socks_args)
+ test_assert(smartlist_strings_eq(test_socks_args,
+ bridge_line->socks_args));
+
+ done:
+ tor_free(tmp);
+ bridge_line_free(bridge_line);
+}
+
+/* Test helper function: Make sure that a bridge line is
+ * unparseable. */
+static void
+bad_bridge_line_test(const char *string)
+{
+ bridge_line_t *bridge_line = parse_bridge_line(string);
+ if (bridge_line)
+ TT_FAIL(("%s was supposed to fail, but it didn't.", string));
+ test_assert(!bridge_line);
+
+ done:
+ bridge_line_free(bridge_line);
+}
+
+static void
+test_config_parse_bridge_line(void *arg)
+{
+ (void) arg;
+ good_bridge_line_test("192.0.2.1:4123",
+ "192.0.2.1:4123", NULL, NULL, NULL);
+
+ good_bridge_line_test("192.0.2.1",
+ "192.0.2.1:443", NULL, NULL, NULL);
+
+ good_bridge_line_test("transport [::1]",
+ "[::1]:443", NULL, "transport", NULL);
+
+ good_bridge_line_test("transport 192.0.2.1:12 "
+ "4352e58420e68f5e40bf7c74faddccd9d1349413",
+ "192.0.2.1:12",
+ "4352e58420e68f5e40bf7c74faddccd9d1349413",
+ "transport", NULL);
+
+ {
+ smartlist_t *sl_tmp = smartlist_new();
+ smartlist_add_asprintf(sl_tmp, "twoandtwo=five");
+
+ good_bridge_line_test("transport 192.0.2.1:12 "
+ "4352e58420e68f5e40bf7c74faddccd9d1349413 twoandtwo=five",
+ "192.0.2.1:12", "4352e58420e68f5e40bf7c74faddccd9d1349413",
+ "transport", sl_tmp);
+
+ SMARTLIST_FOREACH(sl_tmp, char *, s, tor_free(s));
+ smartlist_free(sl_tmp);
+ }
+
+ {
+ smartlist_t *sl_tmp = smartlist_new();
+ smartlist_add_asprintf(sl_tmp, "twoandtwo=five");
+ smartlist_add_asprintf(sl_tmp, "z=z");
+
+ good_bridge_line_test("transport 192.0.2.1:12 twoandtwo=five z=z",
+ "192.0.2.1:12", NULL, "transport", sl_tmp);
+
+ SMARTLIST_FOREACH(sl_tmp, char *, s, tor_free(s));
+ smartlist_free(sl_tmp);
+ }
+
+ {
+ smartlist_t *sl_tmp = smartlist_new();
+ smartlist_add_asprintf(sl_tmp, "dub=come");
+ smartlist_add_asprintf(sl_tmp, "save=me");
+
+ good_bridge_line_test("transport 192.0.2.1:12 "
+ "4352e58420e68f5e40bf7c74faddccd9d1349666 "
+ "dub=come save=me",
+
+ "192.0.2.1:12",
+ "4352e58420e68f5e40bf7c74faddccd9d1349666",
+ "transport", sl_tmp);
+
+ SMARTLIST_FOREACH(sl_tmp, char *, s, tor_free(s));
+ smartlist_free(sl_tmp);
+ }
+
+ good_bridge_line_test("192.0.2.1:1231 "
+ "4352e58420e68f5e40bf7c74faddccd9d1349413",
+ "192.0.2.1:1231",
+ "4352e58420e68f5e40bf7c74faddccd9d1349413",
+ NULL, NULL);
+
+ /* Empty line */
+ bad_bridge_line_test("");
+ /* bad transport name */
+ bad_bridge_line_test("tr$n_sp0r7 190.20.2.2");
+ /* weird ip address */
+ bad_bridge_line_test("a.b.c.d");
+ /* invalid fpr */
+ bad_bridge_line_test("2.2.2.2:1231 4352e58420e68f5e40bf7c74faddccd9d1349");
+ /* no k=v in the end */
+ bad_bridge_line_test("obfs2 2.2.2.2:1231 "
+ "4352e58420e68f5e40bf7c74faddccd9d1349413 what");
+ /* no addrport */
+ bad_bridge_line_test("asdw");
+ /* huge k=v value that can't fit in SOCKS fields */
+ bad_bridge_line_test(
+ "obfs2 2.2.2.2:1231 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aa=b");
+}
+
+static void
+test_config_parse_transport_options_line(void *arg)
+{
+ smartlist_t *options_sl = NULL, *sl_tmp = NULL;
+
+ (void) arg;
+
+ { /* too small line */
+ options_sl = get_options_from_transport_options_line("valley", NULL);
+ test_assert(!options_sl);
+ }
+
+ { /* no k=v values */
+ options_sl = get_options_from_transport_options_line("hit it!", NULL);
+ test_assert(!options_sl);
+ }
+
+ { /* correct line, but wrong transport specified */
+ options_sl =
+ get_options_from_transport_options_line("trebuchet k=v", "rook");
+ test_assert(!options_sl);
+ }
+
+ { /* correct -- no transport specified */
+ sl_tmp = smartlist_new();
+ smartlist_add_asprintf(sl_tmp, "ladi=dadi");
+ smartlist_add_asprintf(sl_tmp, "weliketo=party");
+
+ options_sl =
+ get_options_from_transport_options_line("rook ladi=dadi weliketo=party",
+ NULL);
+ test_assert(options_sl);
+ test_assert(smartlist_strings_eq(options_sl, sl_tmp));
+
+ SMARTLIST_FOREACH(sl_tmp, char *, s, tor_free(s));
+ smartlist_free(sl_tmp);
+ sl_tmp = NULL;
+ SMARTLIST_FOREACH(options_sl, char *, s, tor_free(s));
+ smartlist_free(options_sl);
+ options_sl = NULL;
+ }
+
+ { /* correct -- correct transport specified */
+ sl_tmp = smartlist_new();
+ smartlist_add_asprintf(sl_tmp, "ladi=dadi");
+ smartlist_add_asprintf(sl_tmp, "weliketo=party");
+
+ options_sl =
+ get_options_from_transport_options_line("rook ladi=dadi weliketo=party",
+ "rook");
+ test_assert(options_sl);
+ test_assert(smartlist_strings_eq(options_sl, sl_tmp));
+ SMARTLIST_FOREACH(sl_tmp, char *, s, tor_free(s));
+ smartlist_free(sl_tmp);
+ sl_tmp = NULL;
+ SMARTLIST_FOREACH(options_sl, char *, s, tor_free(s));
+ smartlist_free(options_sl);
+ options_sl = NULL;
+ }
+
+ done:
+ if (options_sl) {
+ SMARTLIST_FOREACH(options_sl, char *, s, tor_free(s));
+ smartlist_free(options_sl);
+ }
+ if (sl_tmp) {
+ SMARTLIST_FOREACH(sl_tmp, char *, s, tor_free(s));
+ smartlist_free(sl_tmp);
+ }
+}
+
+// Tests if an options with MyFamily fingerprints missing '$' normalises
+// them correctly and also ensure it also works with multiple fingerprints
+static void
+test_config_fix_my_family(void *arg)
+{
+ char *err = NULL;
+ const char *family = "$1111111111111111111111111111111111111111, "
+ "1111111111111111111111111111111111111112, "
+ "$1111111111111111111111111111111111111113";
+
+ or_options_t* options = options_new();
+ or_options_t* defaults = options_new();
+ (void) arg;
+
+ options_init(options);
+ options_init(defaults);
+ options->MyFamily = tor_strdup(family);
+
+ options_validate(NULL, options, defaults, 0, &err) ;
+
+ if (err != NULL) {
+ TT_FAIL(("options_validate failed: %s", err));
+ }
+
+ test_streq(options->MyFamily, "$1111111111111111111111111111111111111111, "
+ "$1111111111111111111111111111111111111112, "
+ "$1111111111111111111111111111111111111113");
+
+ done:
+ if (err != NULL) {
+ tor_free(err);
+ }
+
+ or_options_free(options);
+ or_options_free(defaults);
}
#define CONFIG_TEST(name, flags) \
@@ -174,6 +594,11 @@ test_config_addressmap(void *arg)
struct testcase_t config_tests[] = {
CONFIG_TEST(addressmap, 0),
+ CONFIG_TEST(parse_bridge_line, 0),
+ CONFIG_TEST(parse_transport_options_line, 0),
+ CONFIG_TEST(check_or_create_data_subdir, TT_FORK),
+ CONFIG_TEST(write_to_data_subdir, TT_FORK),
+ CONFIG_TEST(fix_my_family, 0),
END_OF_TESTCASES
};
diff --git a/src/test/test_containers.c b/src/test/test_containers.c
index 005e102e2..067c4c190 100644
--- a/src/test/test_containers.c
+++ b/src/test/test_containers.c
@@ -469,6 +469,51 @@ test_container_smartlist_join(void)
tor_free(joined);
}
+static void
+test_container_smartlist_ints_eq(void *arg)
+{
+ smartlist_t *sl1 = NULL, *sl2 = NULL;
+ int x;
+ (void)arg;
+
+ tt_assert(smartlist_ints_eq(NULL, NULL));
+
+ sl1 = smartlist_new();
+ tt_assert(!smartlist_ints_eq(sl1, NULL));
+ tt_assert(!smartlist_ints_eq(NULL, sl1));
+
+ sl2 = smartlist_new();
+ tt_assert(smartlist_ints_eq(sl1, sl2));
+
+ x = 5;
+ smartlist_add(sl1, tor_memdup(&x, sizeof(int)));
+ smartlist_add(sl2, tor_memdup(&x, sizeof(int)));
+ x = 90;
+ smartlist_add(sl1, tor_memdup(&x, sizeof(int)));
+ smartlist_add(sl2, tor_memdup(&x, sizeof(int)));
+ tt_assert(smartlist_ints_eq(sl1, sl2));
+
+ x = -50;
+ smartlist_add(sl1, tor_memdup(&x, sizeof(int)));
+ tt_assert(! smartlist_ints_eq(sl1, sl2));
+ tt_assert(! smartlist_ints_eq(sl2, sl1));
+ smartlist_add(sl2, tor_memdup(&x, sizeof(int)));
+ tt_assert(smartlist_ints_eq(sl1, sl2));
+
+ *(int*)smartlist_get(sl1, 1) = 101010;
+ tt_assert(! smartlist_ints_eq(sl2, sl1));
+ *(int*)smartlist_get(sl2, 1) = 101010;
+ tt_assert(smartlist_ints_eq(sl1, sl2));
+
+ done:
+ if (sl1)
+ SMARTLIST_FOREACH(sl1, int *, ip, tor_free(ip));
+ if (sl2)
+ SMARTLIST_FOREACH(sl2, int *, ip, tor_free(ip));
+ smartlist_free(sl1);
+ smartlist_free(sl2);
+}
+
/** Run unit tests for bitarray code */
static void
test_container_bitarray(void)
@@ -784,7 +829,7 @@ test_container_order_functions(void)
}
static void
-test_di_map(void *arg)
+test_container_di_map(void *arg)
{
di_digest256_map_t *map = NULL;
const uint8_t key1[] = "In view of the fact that it was ";
@@ -856,12 +901,12 @@ test_container_fp_pair_map(void)
memset(fp6.second, 0x62, DIGEST_LEN);
v = fp_pair_map_set(map, &fp1, (void*)99);
- test_eq(v, NULL);
+ tt_ptr_op(v, ==, NULL);
test_assert(!fp_pair_map_isempty(map));
v = fp_pair_map_set(map, &fp2, (void*)101);
- test_eq(v, NULL);
+ tt_ptr_op(v, ==, NULL);
v = fp_pair_map_set(map, &fp1, (void*)100);
- test_eq(v, (void*)99);
+ tt_ptr_op(v, ==, (void*)99);
test_eq_ptr(fp_pair_map_get(map, &fp1), (void*)100);
test_eq_ptr(fp_pair_map_get(map, &fp2), (void*)101);
test_eq_ptr(fp_pair_map_get(map, &fp3), NULL);
@@ -912,18 +957,22 @@ test_container_fp_pair_map(void)
#define CONTAINER_LEGACY(name) \
{ #name, legacy_test_helper, 0, &legacy_setup, test_container_ ## name }
+#define CONTAINER(name, flags) \
+ { #name, test_container_ ## name, (flags), NULL, NULL }
+
struct testcase_t container_tests[] = {
CONTAINER_LEGACY(smartlist_basic),
CONTAINER_LEGACY(smartlist_strings),
CONTAINER_LEGACY(smartlist_overlap),
CONTAINER_LEGACY(smartlist_digests),
CONTAINER_LEGACY(smartlist_join),
+ CONTAINER(smartlist_ints_eq, 0),
CONTAINER_LEGACY(bitarray),
CONTAINER_LEGACY(digestset),
CONTAINER_LEGACY(strmap),
CONTAINER_LEGACY(pqueue),
CONTAINER_LEGACY(order_functions),
- { "di_map", test_di_map, 0, NULL, NULL },
+ CONTAINER(di_map, 0),
CONTAINER_LEGACY(fp_pair_map),
END_OF_TESTCASES
};
diff --git a/src/test/test_controller_events.c b/src/test/test_controller_events.c
new file mode 100644
index 000000000..b45e97a41
--- /dev/null
+++ b/src/test/test_controller_events.c
@@ -0,0 +1,307 @@
+/* Copyright (c) 2013, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#define CONNECTION_PRIVATE
+#define TOR_CHANNEL_INTERNAL_
+#define CONTROL_PRIVATE
+#include "or.h"
+#include "channel.h"
+#include "channeltls.h"
+#include "connection.h"
+#include "control.h"
+#include "test.h"
+
+static void
+help_test_bucket_note_empty(uint32_t expected_msec_since_midnight,
+ int tokens_before, size_t tokens_removed,
+ uint32_t msec_since_epoch)
+{
+ uint32_t timestamp_var = 0;
+ struct timeval tvnow;
+ tvnow.tv_sec = msec_since_epoch / 1000;
+ tvnow.tv_usec = (msec_since_epoch % 1000) * 1000;
+ connection_buckets_note_empty_ts(&timestamp_var, tokens_before,
+ tokens_removed, &tvnow);
+ tt_int_op(expected_msec_since_midnight, ==, timestamp_var);
+
+ done:
+ ;
+}
+
+static void
+test_cntev_bucket_note_empty(void *arg)
+{
+ (void)arg;
+
+ /* Two cases with nothing to note, because bucket was empty before;
+ * 86442200 == 1970-01-02 00:00:42.200000 */
+ help_test_bucket_note_empty(0, 0, 0, 86442200);
+ help_test_bucket_note_empty(0, -100, 100, 86442200);
+
+ /* Nothing to note, because bucket has not been emptied. */
+ help_test_bucket_note_empty(0, 101, 100, 86442200);
+
+ /* Bucket was emptied, note 42200 msec since midnight. */
+ help_test_bucket_note_empty(42200, 101, 101, 86442200);
+ help_test_bucket_note_empty(42200, 101, 102, 86442200);
+}
+
+static void
+test_cntev_bucket_millis_empty(void *arg)
+{
+ struct timeval tvnow;
+ (void)arg;
+
+ /* 1970-01-02 00:00:42.200000 */
+ tvnow.tv_sec = 86400 + 42;
+ tvnow.tv_usec = 200000;
+
+ /* Bucket has not been refilled. */
+ tt_int_op(0, ==, bucket_millis_empty(0, 42120, 0, 100, &tvnow));
+ tt_int_op(0, ==, bucket_millis_empty(-10, 42120, -10, 100, &tvnow));
+
+ /* Bucket was not empty. */
+ tt_int_op(0, ==, bucket_millis_empty(10, 42120, 20, 100, &tvnow));
+
+ /* Bucket has been emptied 80 msec ago and has just been refilled. */
+ tt_int_op(80, ==, bucket_millis_empty(-20, 42120, -10, 100, &tvnow));
+ tt_int_op(80, ==, bucket_millis_empty(-10, 42120, 0, 100, &tvnow));
+ tt_int_op(80, ==, bucket_millis_empty(0, 42120, 10, 100, &tvnow));
+
+ /* Bucket has been emptied 180 msec ago, last refill was 100 msec ago
+ * which was insufficient to make it positive, so cap msec at 100. */
+ tt_int_op(100, ==, bucket_millis_empty(0, 42020, 1, 100, &tvnow));
+
+ /* 1970-01-02 00:00:00:050000 */
+ tvnow.tv_sec = 86400;
+ tvnow.tv_usec = 50000;
+
+ /* Last emptied 30 msec before midnight, tvnow is 50 msec after
+ * midnight, that's 80 msec in total. */
+ tt_int_op(80, ==, bucket_millis_empty(0, 86400000 - 30, 1, 100, &tvnow));
+
+ done:
+ ;
+}
+
+static void
+add_testing_cell_stats_entry(circuit_t *circ, uint8_t command,
+ unsigned int waiting_time,
+ unsigned int removed, unsigned int exitward)
+{
+ testing_cell_stats_entry_t *ent = tor_malloc_zero(
+ sizeof(testing_cell_stats_entry_t));
+ ent->command = command;
+ ent->waiting_time = waiting_time;
+ ent->removed = removed;
+ ent->exitward = exitward;
+ if (!circ->testing_cell_stats)
+ circ->testing_cell_stats = smartlist_new();
+ smartlist_add(circ->testing_cell_stats, ent);
+}
+
+static void
+test_cntev_sum_up_cell_stats(void *arg)
+{
+ or_circuit_t *or_circ;
+ circuit_t *circ;
+ cell_stats_t *cell_stats = NULL;
+ (void)arg;
+
+ /* This circuit is fake. */
+ or_circ = tor_malloc_zero(sizeof(or_circuit_t));
+ or_circ->base_.magic = OR_CIRCUIT_MAGIC;
+ or_circ->base_.purpose = CIRCUIT_PURPOSE_OR;
+ circ = TO_CIRCUIT(or_circ);
+
+ /* A single RELAY cell was added to the appward queue. */
+ cell_stats = tor_malloc_zero(sizeof(cell_stats_t));
+ add_testing_cell_stats_entry(circ, CELL_RELAY, 0, 0, 0);
+ sum_up_cell_stats_by_command(circ, cell_stats);
+ tt_u64_op(1, ==, cell_stats->added_cells_appward[CELL_RELAY]);
+
+ /* A single RELAY cell was added to the exitward queue. */
+ add_testing_cell_stats_entry(circ, CELL_RELAY, 0, 0, 1);
+ sum_up_cell_stats_by_command(circ, cell_stats);
+ tt_u64_op(1, ==, cell_stats->added_cells_exitward[CELL_RELAY]);
+
+ /* A single RELAY cell was removed from the appward queue where it spent
+ * 20 msec. */
+ add_testing_cell_stats_entry(circ, CELL_RELAY, 2, 1, 0);
+ sum_up_cell_stats_by_command(circ, cell_stats);
+ tt_u64_op(20, ==, cell_stats->total_time_appward[CELL_RELAY]);
+ tt_u64_op(1, ==, cell_stats->removed_cells_appward[CELL_RELAY]);
+
+ /* A single RELAY cell was removed from the exitward queue where it
+ * spent 30 msec. */
+ add_testing_cell_stats_entry(circ, CELL_RELAY, 3, 1, 1);
+ sum_up_cell_stats_by_command(circ, cell_stats);
+ tt_u64_op(30, ==, cell_stats->total_time_exitward[CELL_RELAY]);
+ tt_u64_op(1, ==, cell_stats->removed_cells_exitward[CELL_RELAY]);
+
+ done:
+ tor_free(cell_stats);
+ tor_free(or_circ);
+}
+
+static void
+test_cntev_append_cell_stats(void *arg)
+{
+ smartlist_t *event_parts;
+ char *cp = NULL;
+ const char *key = "Z";
+ uint64_t include_if_non_zero[CELL_COMMAND_MAX_ + 1],
+ number_to_include[CELL_COMMAND_MAX_ + 1];
+ (void)arg;
+
+ event_parts = smartlist_new();
+ memset(include_if_non_zero, 0,
+ (CELL_COMMAND_MAX_ + 1) * sizeof(uint64_t));
+ memset(number_to_include, 0,
+ (CELL_COMMAND_MAX_ + 1) * sizeof(uint64_t));
+
+ /* All array entries empty. */
+ append_cell_stats_by_command(event_parts, key,
+ include_if_non_zero,
+ number_to_include);
+ tt_int_op(0, ==, smartlist_len(event_parts));
+
+ /* There's a RELAY cell to include, but the corresponding field in
+ * include_if_non_zero is still zero. */
+ number_to_include[CELL_RELAY] = 1;
+ append_cell_stats_by_command(event_parts, key,
+ include_if_non_zero,
+ number_to_include);
+ tt_int_op(0, ==, smartlist_len(event_parts));
+
+ /* Now include single RELAY cell. */
+ include_if_non_zero[CELL_RELAY] = 2;
+ append_cell_stats_by_command(event_parts, key,
+ include_if_non_zero,
+ number_to_include);
+ cp = smartlist_pop_last(event_parts);
+ tt_str_op("Z=relay:1", ==, cp);
+ tor_free(cp);
+
+ /* Add four CREATE cells. */
+ include_if_non_zero[CELL_CREATE] = 3;
+ number_to_include[CELL_CREATE] = 4;
+ append_cell_stats_by_command(event_parts, key,
+ include_if_non_zero,
+ number_to_include);
+ cp = smartlist_pop_last(event_parts);
+ tt_str_op("Z=create:4,relay:1", ==, cp);
+
+ done:
+ tor_free(cp);
+ smartlist_free(event_parts);
+}
+
+static void
+test_cntev_format_cell_stats(void *arg)
+{
+ char *event_string = NULL;
+ origin_circuit_t *ocirc = NULL;
+ or_circuit_t *or_circ = NULL;
+ cell_stats_t *cell_stats = NULL;
+ channel_tls_t *n_chan=NULL, *p_chan=NULL;
+ (void)arg;
+
+ n_chan = tor_malloc_zero(sizeof(channel_tls_t));
+ n_chan->base_.global_identifier = 1;
+
+ ocirc = tor_malloc_zero(sizeof(origin_circuit_t));
+ ocirc->base_.magic = ORIGIN_CIRCUIT_MAGIC;
+ ocirc->base_.purpose = CIRCUIT_PURPOSE_C_GENERAL;
+ ocirc->global_identifier = 2;
+ ocirc->base_.n_circ_id = 3;
+ ocirc->base_.n_chan = &(n_chan->base_);
+
+ /* Origin circuit was completely idle. */
+ cell_stats = tor_malloc_zero(sizeof(cell_stats_t));
+ format_cell_stats(&event_string, TO_CIRCUIT(ocirc), cell_stats);
+ tt_str_op("ID=2 OutboundQueue=3 OutboundConn=1", ==, event_string);
+ tor_free(event_string);
+
+ /* Origin circuit had 4 RELAY cells added to its exitward queue. */
+ cell_stats->added_cells_exitward[CELL_RELAY] = 4;
+ format_cell_stats(&event_string, TO_CIRCUIT(ocirc), cell_stats);
+ tt_str_op("ID=2 OutboundQueue=3 OutboundConn=1 OutboundAdded=relay:4",
+ ==, event_string);
+ tor_free(event_string);
+
+ /* Origin circuit also had 5 CREATE2 cells added to its exitward
+ * queue. */
+ cell_stats->added_cells_exitward[CELL_CREATE2] = 5;
+ format_cell_stats(&event_string, TO_CIRCUIT(ocirc), cell_stats);
+ tt_str_op("ID=2 OutboundQueue=3 OutboundConn=1 OutboundAdded=relay:4,"
+ "create2:5", ==, event_string);
+ tor_free(event_string);
+
+ /* Origin circuit also had 7 RELAY cells removed from its exitward queue
+ * which together spent 6 msec in the queue. */
+ cell_stats->total_time_exitward[CELL_RELAY] = 6;
+ cell_stats->removed_cells_exitward[CELL_RELAY] = 7;
+ format_cell_stats(&event_string, TO_CIRCUIT(ocirc), cell_stats);
+ tt_str_op("ID=2 OutboundQueue=3 OutboundConn=1 OutboundAdded=relay:4,"
+ "create2:5 OutboundRemoved=relay:7 OutboundTime=relay:6",
+ ==, event_string);
+ tor_free(event_string);
+
+ p_chan = tor_malloc_zero(sizeof(channel_tls_t));
+ p_chan->base_.global_identifier = 2;
+
+ or_circ = tor_malloc_zero(sizeof(or_circuit_t));
+ or_circ->base_.magic = OR_CIRCUIT_MAGIC;
+ or_circ->base_.purpose = CIRCUIT_PURPOSE_OR;
+ or_circ->p_circ_id = 8;
+ or_circ->p_chan = &(p_chan->base_);
+ or_circ->base_.n_circ_id = 9;
+ or_circ->base_.n_chan = &(n_chan->base_);
+
+ tor_free(cell_stats);
+
+ /* OR circuit was idle. */
+ cell_stats = tor_malloc_zero(sizeof(cell_stats_t));
+ format_cell_stats(&event_string, TO_CIRCUIT(or_circ), cell_stats);
+ tt_str_op("InboundQueue=8 InboundConn=2 OutboundQueue=9 OutboundConn=1",
+ ==, event_string);
+ tor_free(event_string);
+
+ /* OR circuit had 3 RELAY cells added to its appward queue. */
+ cell_stats->added_cells_appward[CELL_RELAY] = 3;
+ format_cell_stats(&event_string, TO_CIRCUIT(or_circ), cell_stats);
+ tt_str_op("InboundQueue=8 InboundConn=2 InboundAdded=relay:3 "
+ "OutboundQueue=9 OutboundConn=1", ==, event_string);
+ tor_free(event_string);
+
+ /* OR circuit had 7 RELAY cells removed from its appward queue which
+ * together spent 6 msec in the queue. */
+ cell_stats->total_time_appward[CELL_RELAY] = 6;
+ cell_stats->removed_cells_appward[CELL_RELAY] = 7;
+ format_cell_stats(&event_string, TO_CIRCUIT(or_circ), cell_stats);
+ tt_str_op("InboundQueue=8 InboundConn=2 InboundAdded=relay:3 "
+ "InboundRemoved=relay:7 InboundTime=relay:6 "
+ "OutboundQueue=9 OutboundConn=1", ==, event_string);
+
+ done:
+ tor_free(cell_stats);
+ tor_free(event_string);
+ tor_free(or_circ);
+ tor_free(ocirc);
+ tor_free(p_chan);
+ tor_free(n_chan);
+}
+
+#define TEST(name, flags) \
+ { #name, test_cntev_ ## name, flags, 0, NULL }
+
+struct testcase_t controller_event_tests[] = {
+ TEST(bucket_note_empty, 0),
+ TEST(bucket_millis_empty, 0),
+ TEST(sum_up_cell_stats, 0),
+ TEST(append_cell_stats, 0),
+ TEST(format_cell_stats, 0),
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_crypto.c b/src/test/test_crypto.c
index f92bfd673..5d8edb655 100644
--- a/src/test/test_crypto.c
+++ b/src/test/test_crypto.c
@@ -4,16 +4,20 @@
/* See LICENSE for licensing information */
#include "orconfig.h"
-#define CRYPTO_PRIVATE
#define CRYPTO_CURVE25519_PRIVATE
#include "or.h"
#include "test.h"
#include "aes.h"
#include "util.h"
+#include "siphash.h"
#ifdef CURVE25519_ENABLED
#include "crypto_curve25519.h"
#endif
+extern const char AUTHORITY_SIGNKEY_3[];
+extern const char AUTHORITY_SIGNKEY_A_DIGEST[];
+extern const char AUTHORITY_SIGNKEY_A_DIGEST256[];
+
/** Run unit tests for Diffie-Hellman functionality. */
static void
test_crypto_dh(void)
@@ -269,34 +273,6 @@ test_crypto_sha(void)
"96177A9CB410FF61F20015AD");
tt_int_op(i, ==, 0);
- /* Test HMAC-SHA-1 with test cases from RFC2202. */
-
- /* Case 1. */
- memset(key, 0x0b, 20);
- crypto_hmac_sha1(digest, key, 20, "Hi There", 8);
- test_streq(hex_str(digest, 20),
- "B617318655057264E28BC0B6FB378C8EF146BE00");
- /* Case 2. */
- crypto_hmac_sha1(digest, "Jefe", 4, "what do ya want for nothing?", 28);
- test_streq(hex_str(digest, 20),
- "EFFCDF6AE5EB2FA2D27416D5F184DF9C259A7C79");
-
- /* Case 4. */
- base16_decode(key, 25,
- "0102030405060708090a0b0c0d0e0f10111213141516171819", 50);
- memset(data, 0xcd, 50);
- crypto_hmac_sha1(digest, key, 25, data, 50);
- test_streq(hex_str(digest, 20),
- "4C9007F4026250C6BC8414F9BF50C86C2D7235DA");
-
- /* Case 5. */
- memset(key, 0xaa, 80);
- crypto_hmac_sha1(digest, key, 80,
- "Test Using Larger Than Block-Size Key - Hash Key First",
- 54);
- test_streq(hex_str(digest, 20),
- "AA4AE5E15272D00E95705637CE8A3B55ED402112");
-
/* Test HMAC-SHA256 with test cases from wikipedia and RFC 4231 */
/* Case empty (wikipedia) */
@@ -422,7 +398,7 @@ test_crypto_pk(void)
char *encoded = NULL;
char data1[1024], data2[1024], data3[1024];
size_t size;
- int i, j, p, len;
+ int i, len;
/* Public-key ciphers */
pk1 = pk_generate(0);
@@ -506,19 +482,16 @@ test_crypto_pk(void)
/* Try with hybrid encryption wrappers. */
crypto_rand(data1, 1024);
- for (i = 0; i < 2; ++i) {
- for (j = 85; j < 140; ++j) {
- memset(data2,0,1024);
- memset(data3,0,1024);
- p = (i==0)?PK_PKCS1_PADDING:PK_PKCS1_OAEP_PADDING;
- len = crypto_pk_public_hybrid_encrypt(pk1,data2,sizeof(data2),
- data1,j,p,0);
- test_assert(len>=0);
- len = crypto_pk_private_hybrid_decrypt(pk1,data3,sizeof(data3),
- data2,len,p,1);
- test_eq(len,j);
- test_memeq(data1,data3,j);
- }
+ for (i = 85; i < 140; ++i) {
+ memset(data2,0,1024);
+ memset(data3,0,1024);
+ len = crypto_pk_public_hybrid_encrypt(pk1,data2,sizeof(data2),
+ data1,i,PK_PKCS1_OAEP_PADDING,0);
+ test_assert(len>=0);
+ len = crypto_pk_private_hybrid_decrypt(pk1,data3,sizeof(data3),
+ data2,len,PK_PKCS1_OAEP_PADDING,1);
+ test_eq(len,i);
+ test_memeq(data1,data3,i);
}
/* Try copy_full */
@@ -536,6 +509,85 @@ test_crypto_pk(void)
tor_free(encoded);
}
+static void
+test_crypto_pk_fingerprints(void *arg)
+{
+ crypto_pk_t *pk = NULL;
+ char encoded[512];
+ char d[DIGEST_LEN], d2[DIGEST_LEN];
+ char fingerprint[FINGERPRINT_LEN+1];
+ int n;
+ unsigned i;
+ char *mem_op_hex_tmp=NULL;
+
+ (void)arg;
+
+ pk = pk_generate(1);
+ tt_assert(pk);
+ n = crypto_pk_asn1_encode(pk, encoded, sizeof(encoded));
+ tt_int_op(n, >, 0);
+ tt_int_op(n, >, 128);
+ tt_int_op(n, <, 256);
+
+ /* Is digest as expected? */
+ crypto_digest(d, encoded, n);
+ tt_int_op(0, ==, crypto_pk_get_digest(pk, d2));
+ test_memeq(d, d2, DIGEST_LEN);
+
+ /* Is fingerprint right? */
+ tt_int_op(0, ==, crypto_pk_get_fingerprint(pk, fingerprint, 0));
+ tt_int_op(strlen(fingerprint), ==, DIGEST_LEN * 2);
+ test_memeq_hex(d, fingerprint);
+
+ /* Are spaces right? */
+ tt_int_op(0, ==, crypto_pk_get_fingerprint(pk, fingerprint, 1));
+ for (i = 4; i < strlen(fingerprint); i += 5) {
+ tt_int_op(fingerprint[i], ==, ' ');
+ }
+ tor_strstrip(fingerprint, " ");
+ tt_int_op(strlen(fingerprint), ==, DIGEST_LEN * 2);
+ test_memeq_hex(d, fingerprint);
+
+ /* Now hash again and check crypto_pk_get_hashed_fingerprint. */
+ crypto_digest(d2, d, sizeof(d));
+ tt_int_op(0, ==, crypto_pk_get_hashed_fingerprint(pk, fingerprint));
+ tt_int_op(strlen(fingerprint), ==, DIGEST_LEN * 2);
+ test_memeq_hex(d2, fingerprint);
+
+ done:
+ crypto_pk_free(pk);
+ tor_free(mem_op_hex_tmp);
+}
+
+/** Sanity check for crypto pk digests */
+static void
+test_crypto_digests(void)
+{
+ crypto_pk_t *k = NULL;
+ ssize_t r;
+ digests_t pkey_digests;
+ char digest[DIGEST_LEN];
+
+ k = crypto_pk_new();
+ test_assert(k);
+ r = crypto_pk_read_private_key_from_string(k, AUTHORITY_SIGNKEY_3, -1);
+ test_assert(!r);
+
+ r = crypto_pk_get_digest(k, digest);
+ test_assert(r == 0);
+ test_memeq(hex_str(digest, DIGEST_LEN),
+ AUTHORITY_SIGNKEY_A_DIGEST, HEX_DIGEST_LEN);
+
+ r = crypto_pk_get_all_digests(k, &pkey_digests);
+
+ test_memeq(hex_str(pkey_digests.d[DIGEST_SHA1], DIGEST_LEN),
+ AUTHORITY_SIGNKEY_A_DIGEST, HEX_DIGEST_LEN);
+ test_memeq(hex_str(pkey_digests.d[DIGEST_SHA256], DIGEST256_LEN),
+ AUTHORITY_SIGNKEY_A_DIGEST256, HEX_DIGEST256_LEN);
+ done:
+ crypto_pk_free(k);
+}
+
/** Run unit tests for misc crypto formatting functionality (base64, base32,
* fingerprints, etc) */
static void
@@ -630,7 +682,7 @@ test_crypto_formats(void)
data1 = tor_strdup("ABCD1234ABCD56780000ABCD1234ABCD56780000");
test_eq(strlen(data1), 40);
data2 = tor_malloc(FINGERPRINT_LEN+1);
- add_spaces_to_fp(data2, FINGERPRINT_LEN+1, data1);
+ crypto_add_spaces_to_fp(data2, FINGERPRINT_LEN+1, data1);
test_streq(data2, "ABCD 1234 ABCD 5678 0000 ABCD 1234 ABCD 5678 0000");
tor_free(data1);
tor_free(data2);
@@ -730,11 +782,13 @@ test_crypto_aes_iv(void *arg)
/* Decrypt with the wrong key. */
decrypted_size = crypto_cipher_decrypt_with_iv(key2, decrypted2, 4095,
encrypted1, encrypted_size);
+ test_eq(decrypted_size, 4095);
test_memneq(plain, decrypted2, decrypted_size);
/* Alter the initialization vector. */
encrypted1[0] += 42;
decrypted_size = crypto_cipher_decrypt_with_iv(key1, decrypted1, 4095,
encrypted1, encrypted_size);
+ test_eq(decrypted_size, 4095);
test_memneq(plain, decrypted2, 4095);
/* Special length case: 1. */
encrypted_size = crypto_cipher_encrypt_with_iv(key1, encrypted1, 16 + 1,
@@ -1078,7 +1132,8 @@ test_crypto_curve25519_persist(void *arg)
content = read_file_to_str(fname, RFTS_BIN, &st);
tt_assert(content);
taglen = strlen("== c25519v1: testing ==");
- tt_int_op(st.st_size, ==, 32+CURVE25519_PUBKEY_LEN+CURVE25519_SECKEY_LEN);
+ tt_u64_op((uint64_t)st.st_size, ==,
+ 32+CURVE25519_PUBKEY_LEN+CURVE25519_SECKEY_LEN);
tt_assert(fast_memeq(content, "== c25519v1: testing ==", taglen));
tt_assert(tor_mem_is_zero(content+taglen, 32-taglen));
cp = content + 32;
@@ -1108,6 +1163,102 @@ test_crypto_curve25519_persist(void *arg)
#endif
+static void
+test_crypto_siphash(void *arg)
+{
+ /* From the reference implementation, taking
+ k = 00 01 02 ... 0f
+ and in = 00; 00 01; 00 01 02; ...
+ */
+ const uint8_t VECTORS[64][8] =
+ {
+ { 0x31, 0x0e, 0x0e, 0xdd, 0x47, 0xdb, 0x6f, 0x72, },
+ { 0xfd, 0x67, 0xdc, 0x93, 0xc5, 0x39, 0xf8, 0x74, },
+ { 0x5a, 0x4f, 0xa9, 0xd9, 0x09, 0x80, 0x6c, 0x0d, },
+ { 0x2d, 0x7e, 0xfb, 0xd7, 0x96, 0x66, 0x67, 0x85, },
+ { 0xb7, 0x87, 0x71, 0x27, 0xe0, 0x94, 0x27, 0xcf, },
+ { 0x8d, 0xa6, 0x99, 0xcd, 0x64, 0x55, 0x76, 0x18, },
+ { 0xce, 0xe3, 0xfe, 0x58, 0x6e, 0x46, 0xc9, 0xcb, },
+ { 0x37, 0xd1, 0x01, 0x8b, 0xf5, 0x00, 0x02, 0xab, },
+ { 0x62, 0x24, 0x93, 0x9a, 0x79, 0xf5, 0xf5, 0x93, },
+ { 0xb0, 0xe4, 0xa9, 0x0b, 0xdf, 0x82, 0x00, 0x9e, },
+ { 0xf3, 0xb9, 0xdd, 0x94, 0xc5, 0xbb, 0x5d, 0x7a, },
+ { 0xa7, 0xad, 0x6b, 0x22, 0x46, 0x2f, 0xb3, 0xf4, },
+ { 0xfb, 0xe5, 0x0e, 0x86, 0xbc, 0x8f, 0x1e, 0x75, },
+ { 0x90, 0x3d, 0x84, 0xc0, 0x27, 0x56, 0xea, 0x14, },
+ { 0xee, 0xf2, 0x7a, 0x8e, 0x90, 0xca, 0x23, 0xf7, },
+ { 0xe5, 0x45, 0xbe, 0x49, 0x61, 0xca, 0x29, 0xa1, },
+ { 0xdb, 0x9b, 0xc2, 0x57, 0x7f, 0xcc, 0x2a, 0x3f, },
+ { 0x94, 0x47, 0xbe, 0x2c, 0xf5, 0xe9, 0x9a, 0x69, },
+ { 0x9c, 0xd3, 0x8d, 0x96, 0xf0, 0xb3, 0xc1, 0x4b, },
+ { 0xbd, 0x61, 0x79, 0xa7, 0x1d, 0xc9, 0x6d, 0xbb, },
+ { 0x98, 0xee, 0xa2, 0x1a, 0xf2, 0x5c, 0xd6, 0xbe, },
+ { 0xc7, 0x67, 0x3b, 0x2e, 0xb0, 0xcb, 0xf2, 0xd0, },
+ { 0x88, 0x3e, 0xa3, 0xe3, 0x95, 0x67, 0x53, 0x93, },
+ { 0xc8, 0xce, 0x5c, 0xcd, 0x8c, 0x03, 0x0c, 0xa8, },
+ { 0x94, 0xaf, 0x49, 0xf6, 0xc6, 0x50, 0xad, 0xb8, },
+ { 0xea, 0xb8, 0x85, 0x8a, 0xde, 0x92, 0xe1, 0xbc, },
+ { 0xf3, 0x15, 0xbb, 0x5b, 0xb8, 0x35, 0xd8, 0x17, },
+ { 0xad, 0xcf, 0x6b, 0x07, 0x63, 0x61, 0x2e, 0x2f, },
+ { 0xa5, 0xc9, 0x1d, 0xa7, 0xac, 0xaa, 0x4d, 0xde, },
+ { 0x71, 0x65, 0x95, 0x87, 0x66, 0x50, 0xa2, 0xa6, },
+ { 0x28, 0xef, 0x49, 0x5c, 0x53, 0xa3, 0x87, 0xad, },
+ { 0x42, 0xc3, 0x41, 0xd8, 0xfa, 0x92, 0xd8, 0x32, },
+ { 0xce, 0x7c, 0xf2, 0x72, 0x2f, 0x51, 0x27, 0x71, },
+ { 0xe3, 0x78, 0x59, 0xf9, 0x46, 0x23, 0xf3, 0xa7, },
+ { 0x38, 0x12, 0x05, 0xbb, 0x1a, 0xb0, 0xe0, 0x12, },
+ { 0xae, 0x97, 0xa1, 0x0f, 0xd4, 0x34, 0xe0, 0x15, },
+ { 0xb4, 0xa3, 0x15, 0x08, 0xbe, 0xff, 0x4d, 0x31, },
+ { 0x81, 0x39, 0x62, 0x29, 0xf0, 0x90, 0x79, 0x02, },
+ { 0x4d, 0x0c, 0xf4, 0x9e, 0xe5, 0xd4, 0xdc, 0xca, },
+ { 0x5c, 0x73, 0x33, 0x6a, 0x76, 0xd8, 0xbf, 0x9a, },
+ { 0xd0, 0xa7, 0x04, 0x53, 0x6b, 0xa9, 0x3e, 0x0e, },
+ { 0x92, 0x59, 0x58, 0xfc, 0xd6, 0x42, 0x0c, 0xad, },
+ { 0xa9, 0x15, 0xc2, 0x9b, 0xc8, 0x06, 0x73, 0x18, },
+ { 0x95, 0x2b, 0x79, 0xf3, 0xbc, 0x0a, 0xa6, 0xd4, },
+ { 0xf2, 0x1d, 0xf2, 0xe4, 0x1d, 0x45, 0x35, 0xf9, },
+ { 0x87, 0x57, 0x75, 0x19, 0x04, 0x8f, 0x53, 0xa9, },
+ { 0x10, 0xa5, 0x6c, 0xf5, 0xdf, 0xcd, 0x9a, 0xdb, },
+ { 0xeb, 0x75, 0x09, 0x5c, 0xcd, 0x98, 0x6c, 0xd0, },
+ { 0x51, 0xa9, 0xcb, 0x9e, 0xcb, 0xa3, 0x12, 0xe6, },
+ { 0x96, 0xaf, 0xad, 0xfc, 0x2c, 0xe6, 0x66, 0xc7, },
+ { 0x72, 0xfe, 0x52, 0x97, 0x5a, 0x43, 0x64, 0xee, },
+ { 0x5a, 0x16, 0x45, 0xb2, 0x76, 0xd5, 0x92, 0xa1, },
+ { 0xb2, 0x74, 0xcb, 0x8e, 0xbf, 0x87, 0x87, 0x0a, },
+ { 0x6f, 0x9b, 0xb4, 0x20, 0x3d, 0xe7, 0xb3, 0x81, },
+ { 0xea, 0xec, 0xb2, 0xa3, 0x0b, 0x22, 0xa8, 0x7f, },
+ { 0x99, 0x24, 0xa4, 0x3c, 0xc1, 0x31, 0x57, 0x24, },
+ { 0xbd, 0x83, 0x8d, 0x3a, 0xaf, 0xbf, 0x8d, 0xb7, },
+ { 0x0b, 0x1a, 0x2a, 0x32, 0x65, 0xd5, 0x1a, 0xea, },
+ { 0x13, 0x50, 0x79, 0xa3, 0x23, 0x1c, 0xe6, 0x60, },
+ { 0x93, 0x2b, 0x28, 0x46, 0xe4, 0xd7, 0x06, 0x66, },
+ { 0xe1, 0x91, 0x5f, 0x5c, 0xb1, 0xec, 0xa4, 0x6c, },
+ { 0xf3, 0x25, 0x96, 0x5c, 0xa1, 0x6d, 0x62, 0x9f, },
+ { 0x57, 0x5f, 0xf2, 0x8e, 0x60, 0x38, 0x1b, 0xe5, },
+ { 0x72, 0x45, 0x06, 0xeb, 0x4c, 0x32, 0x8a, 0x95, }
+ };
+
+ const struct sipkey K = { U64_LITERAL(0x0706050403020100),
+ U64_LITERAL(0x0f0e0d0c0b0a0908) };
+ uint8_t input[64];
+ int i, j;
+
+ (void)arg;
+
+ for (i = 0; i < 64; ++i)
+ input[i] = i;
+
+ for (i = 0; i < 64; ++i) {
+ uint64_t r = siphash24(input, i, &K);
+ for (j = 0; j < 8; ++j) {
+ tt_int_op( (r >> (j*8)) & 0xff, ==, VECTORS[i][j]);
+ }
+ }
+
+ done:
+ ;
+}
+
static void *
pass_data_setup_fn(const struct testcase_t *testcase)
{
@@ -1134,6 +1285,8 @@ struct testcase_t crypto_tests[] = {
{ "aes_EVP", test_crypto_aes, TT_FORK, &pass_data, (void*)"evp" },
CRYPTO_LEGACY(sha),
CRYPTO_LEGACY(pk),
+ { "pk_fingerprints", test_crypto_pk_fingerprints, TT_FORK, NULL, NULL },
+ CRYPTO_LEGACY(digests),
CRYPTO_LEGACY(dh),
CRYPTO_LEGACY(s2k),
{ "aes_iv_AES", test_crypto_aes_iv, TT_FORK, &pass_data, (void*)"aes" },
@@ -1148,6 +1301,7 @@ struct testcase_t crypto_tests[] = {
{ "curve25519_encode", test_crypto_curve25519_encode, 0, NULL, NULL },
{ "curve25519_persist", test_crypto_curve25519_persist, 0, NULL, NULL },
#endif
+ { "siphash", test_crypto_siphash, 0, NULL, NULL },
END_OF_TESTCASES
};
diff --git a/src/test/test_data.c b/src/test/test_data.c
index 5f0f7cba0..0c51c98f1 100644
--- a/src/test/test_data.c
+++ b/src/test/test_data.c
@@ -3,8 +3,18 @@
* Copyright (c) 2007-2013, The Tor Project, Inc. */
/* See LICENSE for licensing information */
+/* Our unit test expect that the AUTHORITY_CERT_* public keys will sort
+ * in this order. */
+#define AUTHORITY_CERT_A AUTHORITY_CERT_3
+#define AUTHORITY_CERT_B AUTHORITY_CERT_1
+#define AUTHORITY_CERT_C AUTHORITY_CERT_2
+
+#define AUTHORITY_SIGNKEY_A AUTHORITY_SIGNKEY_3
+#define AUTHORITY_SIGNKEY_B AUTHORITY_SIGNKEY_1
+#define AUTHORITY_SIGNKEY_C AUTHORITY_SIGNKEY_2
+
/** First of 3 example authority certificates for unit testing. */
-const char AUTHORITY_CERT_1[] =
+const char AUTHORITY_CERT_A[] =
"dir-key-certificate-version 3\n"
"fingerprint D867ACF56A9D229B35C25F0090BC9867E906BE69\n"
"dir-key-published 2008-12-12 18:07:24\n"
@@ -46,7 +56,7 @@ const char AUTHORITY_CERT_1[] =
"-----END SIGNATURE-----\n";
/** The private signing key for AUTHORITY_CERT_1 */
-const char AUTHORITY_SIGNKEY_1[] =
+const char AUTHORITY_SIGNKEY_A[] =
"-----BEGIN RSA PRIVATE KEY-----\n"
"MIICWwIBAAKBgQCz0lCJ8rhLujVdzY6M6ZWp4iBAc0FxI79cff/pqp8GQAaWFZrs\n"
"vQPJ8XqMmN7GRbJ2MDVvyGYwIBtt6RJnr7txfi+JsjI42mujkZdzIEWEOIJrhaqX\n"
@@ -63,111 +73,128 @@ const char AUTHORITY_SIGNKEY_1[] =
"Yx4lqK0ca5IkTp3HevwnlWaJgbaOTUspCVshzJBhDA==\n"
"-----END RSA PRIVATE KEY-----\n";
+const char AUTHORITY_SIGNKEY_A_DIGEST[] =
+ "CBF56A83368A5150F1A9AAADAFB4D77F8C4170E2";
+const char AUTHORITY_SIGNKEY_A_DIGEST256[] =
+ "AF7C5468DBE3BA54A052726038D7F15F3C4CA511B1952645B3D96D83A8DFB51C";
+
/** Second of 3 example authority certificates for unit testing. */
-const char AUTHORITY_CERT_2[] =
+const char AUTHORITY_CERT_B[] =
"dir-key-certificate-version 3\n"
-"fingerprint 4D44AE0470B9E88FD4558EFEC82698FB33715400\n"
-"dir-key-published 2007-06-13 16:52:32\n"
-"dir-key-expires 2008-06-13 16:52:32\n"
+"fingerprint AD011E25302925A9D39A80E0E32576442E956467\n"
+"dir-key-published 2013-11-14 14:12:05\n"
+"dir-key-expires 2014-11-14 14:12:05\n"
"dir-identity-key\n"
"-----BEGIN RSA PUBLIC KEY-----\n"
-"MIIBigKCAYEAqukDwQRm1Oy1pPY+7GNRnRNFJzEVPUBfJwC4tBH19tkvdRQPuIGI\n"
-"2jiTy/rmZ6CLcl1G0oulSgxfKEX75QdptOasZu+rKUrRRSxx0QrXhs9a7up0rpXh\n"
-"13fw3mh1Vl/As3rJYF30Hjk01BTOJMxi/HY2y0ALQytFWjiMGY74A9Y6+uDcHkB2\n"
-"KflBjxIl8zpCsXsTTnUhN5kXqaOOnK46XaUShSpXsyOxTMJXuJEtgLz9XCyA8XjW\n"
-"d75QLHucEnlTqxUAdI5YSN2KIlIJiySCVnAorDpJey2mE9VncpHQWMCv/FPFdnSU\n"
-"EMMPUc4bBShcoNFf0mMJeV2sv+dBkgKAL0GLM19PuJIThJhfN/B6+YQTxw4HEpPV\n"
-"plfUqYRN0fYC+5hCTS6rroO/uCfDR7NBtoeDNm9dQrvjfk3b/Mywah1rdWNjnVqs\n"
-"tPJaz3fc/CVBOUUexhmyktgLuwSNEYIQilQ+BydkWN/4RObhV+YSV5BgekEDVaoS\n"
-"RHw4IbYBDHVxAgMBAAE=\n"
+"MIIBigKCAYEAyXYEMlGNRAixXdg65xf2WPkskYj2Wo8ysKMTls1JCXdIOAPvC2k2\n"
+"+AC6i3x9JHzUgCjWr4Jd5PSi7ODGyFC543igYl4wzkxNTU2L+SQ+hMe9qbEuUNhH\n"
+"sRR0xofdoH//3UuKj+HXEiMhhHbRWQGtWFuJqtGBruJqjZqIGOrp5nFjdlP0R98n\n"
+"Rx5wWlPgdJzifkXjKouu4mV+KzLl7f0gAtngA9DkSjt1wzga5IlL/lxDciD0SyJU\n"
+"tKMmls056omrZNbTnBxnY2pOlq9nx/zFrt/KQm1fTAQMjMBCf9KnDIV7NhaaHx7F\n"
+"7Nk8L7Hha353SvR+bsOFpiu05/EMZFTTIhO3MhUxZiCVZ0hKXvW1xe0HoGC5wbB+\n"
+"NyXu8oa4fIKLJ+WJ8Z60BNc0DcxJiQOf1eolGM/qrBul1lFZznds5/7182d+nF2W\n"
+"+bEjSm0fgXIxPfSD/7hB0FvgtmB3TXybHGBfPZgX0sTzFB6LNtP0BHicRoMXKdLF\n"
+"hM3tgIjEAsoZAgMBAAE=\n"
"-----END RSA PUBLIC KEY-----\n"
"dir-signing-key\n"
"-----BEGIN RSA PUBLIC KEY-----\n"
-"MIGJAoGBAOu3dgrQth3iqvi/UzfywaANw0bBUuMOBhnMBeiLEcRLneJHUJkVvrpR\n"
-"/EDQkdMov1e7CX6aqBKygVnbDNYjJ+bcQej8MKpuuW+zIknnz5lfnAVZO5uAmo3Y\n"
-"DpG574oQ2FFMdkWHSBloIRxSj/E4Jn1M2qJjElBXP0E33Ka/Noo7AgMBAAE=\n"
+"MIGJAoGBAJ567PZIGG/mYWEY4szYi/C5XXvf0BkquzKTHKrqVjysZEys9giz56Gv\n"
+"B08kIRxsxYKEWkq60rv0xtTc1WyEMcDpV1WLU0KSTQSVXzLu7BT8jbTsWzGsxdTV\n"
+"TdeyOirwHh8Cyyon5lppuMH5twUHrL5O7pWWbxjjrQjAHCn3gd+NAgMBAAE=\n"
"-----END RSA PUBLIC KEY-----\n"
+"dir-key-crosscert\n"
+"-----BEGIN ID SIGNATURE-----\n"
+"OC+gaukd4K7xJOsgTPbRhacf5mDUGxsu3ho/J1oJdtni4CK9WscVs6/Goj1o5Lot\n"
+"H1nCAMaR96Jnqq5c63Aaj1sEXdeYHlu5cI7YHgtGI5MmtjiUNXUCWMjCwSQYwGKe\n"
+"2YDYGAKAGt97n7XMKhJWGjAmv1TgmK3DvL1jt/aazL8=\n"
+"-----END ID SIGNATURE-----\n"
"dir-key-certification\n"
"-----BEGIN SIGNATURE-----\n"
-"Fv0Li68QUdAiChY3OklZOakHzwXAUfCzDNxkqe+HLC0n6ZECE9ZCvLVo69XmgVhH\n"
-"L5qYr2rxT6QpF+9yuOHbN9gWn8EsDcli06MlhX9TUt/IYVxHa/9tJwNoTfEw2w2D\n"
-"tyHhWm94IfOK7/Sea6jHnjckl80X+kk0ZNtAGs3/6fP4iltKNGXnvBwfgLpEgW7X\n"
-"NpDl0OLeDuA79zem2GogwQZQdoDbePByU0TJVx9jYi2Bzx2Nb2H0hRTPP6+dY0HQ\n"
-"MHb7yyyTQRad5iAUnExKhhyt22p7X3a6lgkAhq4YrNn/zVPkpnT2dzjsOydTHOW8\n"
-"2BQs33QlGNe095i47pJBDYsUgmJaXfqB/RG6dFg7jwIsc3/7dZcvcqfxY7wKcD/T\n"
-"wtogCIKxDvWbZn7f0hqYkT6uQC8Zom8bcnedmyzufOZCyA2SqQ2wvio6lznR4RIB\n"
-"a8qDHR0tPS9/VkqTPcvUWCZeY3UiDeWPjoK1nea1pz6DHDWglKPx86a0amjjayZQ\n"
-"-----END SIGNATURE-----\n";
+"BddmCKsvS6VoFXIf9Aj9OZnfyVCx527517QtsQHN+NaVm20LzUkJ5MWGXYx4wgh3\n"
+"ExsHvVQguiVfnonkQpEHHKg+TbldlkuDhIdlb9f7dL7V3HLCsEdmS1c3A+TEyrPH\n"
+"i44p6QB5IMFAdgUMV/9ueKMh7pMoam6VNakMOd+Axx9BSJTrCRzcepjtM4Z0cPsj\n"
+"nmDgZi0df1+ca1t+HnuWyt3trxlqoUxRcPZKz28kEFDJsgnRNvoHrIvNTuy9qY4x\n"
+"rONnPuLr5kTO7VQVVZxgxt6WX3p6d8tj+WYHubydr2pG0dwu2vGDTy4qXvDIm/I4\n"
+"Gyo6OAoPbYV8fl0584EgiEbAWcX/Pze8mXr9lmXbf73xbSBHqveAs0UfB+4sBI98\n"
+"v4ax4NZkGs8cCIfugtAOLgZE0WCh/TQYnQ3PFcrUtj0RW+tM1z7S8P3UfEVBHVkJ\n"
+"8SqSB+pbsY6PwMuy6TC3WujW7gmjVanbwkbW19El9l9jRzteFerz7grG/WQkshqF\n"
+ "-----END SIGNATURE-----\n";
/** The private signing key for AUTHORITY_CERT_2 */
-const char AUTHORITY_SIGNKEY_2[] =
+const char AUTHORITY_SIGNKEY_B[] =
"-----BEGIN RSA PRIVATE KEY-----\n"
-"MIICXgIBAAKBgQDrt3YK0LYd4qr4v1M38sGgDcNGwVLjDgYZzAXoixHES53iR1CZ\n"
-"Fb66UfxA0JHTKL9Xuwl+mqgSsoFZ2wzWIyfm3EHo/DCqbrlvsyJJ58+ZX5wFWTub\n"
-"gJqN2A6Rue+KENhRTHZFh0gZaCEcUo/xOCZ9TNqiYxJQVz9BN9ymvzaKOwIDAQAB\n"
-"AoGAJ+I9/ex8tCfTSA2PdisEKiHKBeHWNYb870Z/RW6qje1BhLUOZSixwfL3XLwt\n"
-"wG3nml+SZrKid69uhZaz4FPIf0tqCgURf6dDrF5vuzzr7VLVqkZHYSBp0vE6bu0R\n"
-"Sgc5QNxI2talgc4bsp0O0C+Zd4n3Yto0pXl/I6NHVAxlFBECQQD2mahkY+QEHWPV\n"
-"yRY3w3HhRmWBcrkY2zVyvPpqfn/sdHRPYW/yj4Xr/d1CO9VyFmEs4k324lIvu6LT\n"
-"WDdpPlcJAkEA9LOZv5aNeAm8ckvvXH7iv8KiONiSz0n9wlisxMhNYTEkOCo1g7jG\n"
-"AX5ZknRC9s4sWCPOBpMhloUvemdQ5FCEIwJBAMqCFwoSCf7jD8hRcUBr7QodoF/0\n"
-"kVJ7OeI2lMJ9jZnlbFp/3snn2Qeam2e38SnWfQi582KKKwnt4eIDMMXpntkCQQDI\n"
-"v1Lh11wl3y7nQZ6T7lCNatp08k+2mQgCWYcbRQweMRd6sD4I2xwt+372ZETPfyLo\n"
-"CC+sOyYx+v+RVpMJS3irAkEA6l98nMteZKmhOgyKSjdolP+ahpZunb+WnCdAtP97\n"
-"rjZyXmEZS3oe7TRCDD28GAGMmxSDvNfOOpyn14ishEs5AQ==\n"
+"MIICWwIBAAKBgQCeeuz2SBhv5mFhGOLM2IvwuV1739AZKrsykxyq6lY8rGRMrPYI\n"
+"s+ehrwdPJCEcbMWChFpKutK79MbU3NVshDHA6VdVi1NCkk0ElV8y7uwU/I207Fsx\n"
+"rMXU1U3Xsjoq8B4fAssqJ+ZaabjB+bcFB6y+Tu6Vlm8Y460IwBwp94HfjQIDAQAB\n"
+"AoGAfHQ4ZmfTmPyoeGHcqdVcgBxxh3gJqdnezCavGqGQO3F+CqDBTbBKNLSI3uOW\n"
+"hQX+TTK23Xy9RRFCm6MYj3F4x7OOrSHSFyhMmzRnAZi3zGbtQZn30XoqTwCmVevY\n"
+"p5JbVvhP2BJcvdsyQhiIG23FRQ7MMHWtksAxmovTto1h/hkCQQDNCfMqSztgJZDn\n"
+"JSf5ASHBOw8QzfZBeYi3hqfiDtAN1RxT1uQnEiFQFJqwCz5lCbcwVrfQbrrk5M+h\n"
+"ooYrX7tTAkEAxd6Tl0N0WM3zCKz+3/Hoiyty6olnnpzNoPCg7LLBJcetABQi0KUv\n"
+"swYWlKP3eOFZkiBzTqa9nBK7eYLKV3d9nwJAKNM3WI98Nguky3FJgTnpd6kDuevY\n"
+"gXbqcuhb2xXp9Sceqc7axLDGc0R2/GBwvvttPzG1DcpOai7o7J0Iq/A2wwJAYuKI\n"
+"/99GFdtWyc8q0OAkRui/1VY14p6aZQPcaG4s+KSBYLivbXYgEGfKgR4wXsi/6rcs\n"
+"6PGLcKQr7N3gITYmIQJAaQn6djUWygCn1noKyWU+Sa7G5qqU2GWkLq9dMaRLm1/I\n"
+"nqi+2K1mN15rra0QtFVqSH4JXr8h3KAGyU45voGM7A==\n"
"-----END RSA PRIVATE KEY-----\n";
/** Third of 3 example authority certificates for unit testing. */
-const char AUTHORITY_CERT_3[] =
+const char AUTHORITY_CERT_C[] =
"dir-key-certificate-version 3\n"
-"fingerprint ED3719BF554DE9D7D59F5CA5A4F5AD121D020ED9\n"
-"dir-key-published 2007-06-13 16:52:40\n"
-"dir-key-expires 2008-06-13 16:52:40\n"
+"fingerprint 628C2086EC29C9D26E638C5A8B2065BFBD35829B\n"
+"dir-key-published 2013-11-14 14:12:18\n"
+"dir-key-expires 2014-11-14 14:12:18\n"
"dir-identity-key\n"
"-----BEGIN RSA PUBLIC KEY-----\n"
-"MIIBigKCAYEAtB+yw4BNxtZAG4cPaedkhWNmeij7IuNWmXjh58ZYEGurvGyHs1w4\n"
-"QlwNYI2UftSIeIGdWZ5fJ17h9P3xvO6eeJuOt4KPrNOxUbSGrELEx1Lje1fDAJ1X\n"
-"SvN+dvptusxtyFUr8afgTPrFIvYuazQ6q/Rw+NDagjmDx3h/A/enihpBnjwzeH8j\n"
-"Xzu7b+HKnzFnNfveTDdvSy0NSC6tCOnrfXo31XbXRXtlesnMIpbJClUcAv55eyai\n"
-"/PrVPCCUz8mk0sQnn2Xhv1YJmwOlQTGMfg0a0kWLmh+UWcHsGQ4VWxBZJcuzgFHG\n"
-"hu2/Fz6DXSpX5Q6B9HKoGmnH1oBh24l0kUW1jL8BxPY4YDU1Lt5t3qgcDn9dXYcI\n"
-"o8VvyI0ecSc26Q2PYFWX1hpN4VIBZ8uGaW3IpyTdNiRq0g3iMGRFEXcDlWuyMB9E\n"
-"EbSM7m/79V/z7SjDd75EP8Z0qDPESEVB8a8LbuSJtzFVE0KHd7RzkIEN5sorXspZ\n"
-"/THukftSmkIvAgMBAAE=\n"
+"MIIBigKCAYEAuzPA82lRVUAc1uZgfDehhK0rBU5xt+qhJXUSH0DxsuocYCLW//q+\n"
+"7+L7q9SochqZK3R5+SxJaZRlVK4rAeIHsxXFxsnGvuqasGM3he80EV1RpVRkvLaO\n"
+"2dDmHcfEjYBadft2DEq811yvqSRqbFXmK0hLucA6LI6NnEw9VNWlguaV6ACVLyKQ\n"
+"iYVFz2JOJIAi0Zz57WZg7eHypUAGoyXjtYTJPsh6pUe/0NLFJVd3JHcJX+bNqU2a\n"
+"QU37r+CQ9f3T+8fZGJQ/CXNnYUNHa0j+toOFuPEiZBBh8C4PE7FJWjidvhe9uI7T\n"
+"Py41RZhy8e05MAQmUBNRKBHWPKHoy2zWZZxTkcfWFdJJz/dzsNrIjrqf2fYId9To\n"
+"fDpHzYd/UjzZaaVYRVS/Oyf3pN8DKw8LMhEArS0X9pblPVkWWjmYMU6f0VR7pelc\n"
+"gGYuML3gOiKdNbeMWgAv3HNRsVsuW0HZLrhXUGYzTRPJ/GxVCwA/NmYgMTNVWRwF\n"
+"7M78YHpayyEPAgMBAAE=\n"
"-----END RSA PUBLIC KEY-----\n"
"dir-signing-key\n"
"-----BEGIN RSA PUBLIC KEY-----\n"
-"MIGJAoGBANrSZlUq38Boz3iuUOydYTJV57rTbq1bz805FP2QG2Z+2bwpgKIOZag/\n"
-"gN2A1ySJaIYLgZIg9irxrLkqlY/UAjC23y6V9fJXP1S3TXoqLmHleW8PsaDLuwTo\n"
-"hCWaR61Mx9WG7IXcodn2Z7RiCfZpSW4Rztbk5WtjQa5jPXSFOuBJAgMBAAE=\n"
+"MIGJAoGBANESf/hRRWCK3TLQyNb9Y42tYedCORUc8Rl+Q4wrvdz3R0TNr6rztE9N\n"
+"u8v3Wbvjtiqm1xL1I5PaOObFQQj61QZxKiCm1yU4eFH15dNmcvBEy5BjEXVYiDgy\n"
+"zKRyePzjHYQIZF3ZaQTABUplkXVpY0YvAurluhEy+dKEvZMwWFZTAgMBAAE=\n"
"-----END RSA PUBLIC KEY-----\n"
+"dir-key-crosscert\n"
+"-----BEGIN ID SIGNATURE-----\n"
+"NHNBya6Dt7Ww3qSGA0DBEl6pZFBzmYXM+QdqF+ESpdyYCQ54EYimaxl4VcXoGaxy\n"
+"xk8/VOXPC6h7hVnTWDTsC86G6eXug1yzpd/uhQbcDJMH5q8/Yg5WXGOnGhMWNCBh\n"
+"u2UmbtAjdjLrObQaB50FfOpuOV9kdG4SEzaPUBR2ayU=\n"
+"-----END ID SIGNATURE-----\n"
"dir-key-certification\n"
"-----BEGIN SIGNATURE-----\n"
-"UNXZy+4OQ8iat+gw+vg2ynvKj2BYbqZt+EAZAV3rmw6gux44U9TLRECRd6LsA08N\n"
-"4+Vz01TU81xqMgfrUy94ei2YvcfpO8art9/muWHTP9SmOX8S1uqDqLWA+n723C9A\n"
-"HyVXn4aINncO2081gJcIW5+Ul8WTCeZe/n3LVPTCKbTdqxvmrPUdCWlJTQUmb19M\n"
-"T+kcCjaEfgQGLC+Y2MHqYe/nxz+aBKqpjiWUDdjc35va6r/2e3c0jGi1B1xRZxN1\n"
-"xThPZ+CifjDoWBxJdDGlIfZRK1lMnOCJY9w9ibTXQ1UnvE4whFvmB55/t9/XLq4q\n"
-"3pnZz0H7funey3+ilmTxDohoAYT1GX+4a+3xYH07UmAFqlTzqKClj84XEHn+Cer7\n"
-"Nun9kJlJFuBgUpQjwCkzedFZKKLOHgB2h7trJfnqcBpAM8Rup1Bb5u/RcBx9gy1q\n"
-"pMc65FviIrc/Q5TUku6NNbCbnGll1599PvWuUzkG42lJ17V6psKHIsqGtVdHlCUc\n"
+"NocTkLl9iKglVo+yrpY0slsqgPviuScMyEfOJ3i65KeJb4Dr1huIs0Fip40zFD8D\n"
+"cz/SYu09FbANuRwBJIRdVWZLLwVFLBj5F8U65iJRAPBw/O/xgSVBvWoOhBUZqmJA\n"
+"Jp1IUutQHYFfnAOO9za4r8Ox6yPaOWF9Ks5gL0kU/fI8Bdi5E9p3e9fMtoM7hROg\n"
+"oX1AoV/za3LcM0oMsGsdXQ7B8vRqY0eUX523kpRpF1fUDyvBUvvMsXdZDN6anCV6\n"
+"NtSq2UaM/msTX1oQ8gzyD1gMXH0Ek26YMhd+6WZE6KUeb1x5HJgXtKtYzMLB6nQM\n"
+"4Q/OA4NND/Veflofy6xx8uzXe8H+MoUHK9WiORtwqvBl0E9qk6SVCuo4ipR4Ybgk\n"
+"PAFOXA58j80dlNYYEVgV8MXF1Y/g/thuXlf2dWiLAExdHTtE0AzC4quWshegaImC\n"
+"4aziHeA43TRDszAXcJorREAM0AhSxp3aWDde4Jt46ODOJR8t+gHreks29eDttEIn\n"
"-----END SIGNATURE-----\n";
/** The private signing key for AUTHORITY_CERT_3 */
-const char AUTHORITY_SIGNKEY_3[] =
+const char AUTHORITY_SIGNKEY_C[] =
"-----BEGIN RSA PRIVATE KEY-----\n"
-"MIICXgIBAAKBgQDa0mZVKt/AaM94rlDsnWEyVee6026tW8/NORT9kBtmftm8KYCi\n"
-"DmWoP4DdgNckiWiGC4GSIPYq8ay5KpWP1AIwtt8ulfXyVz9Ut016Ki5h5XlvD7Gg\n"
-"y7sE6IQlmketTMfVhuyF3KHZ9me0Ygn2aUluEc7W5OVrY0GuYz10hTrgSQIDAQAB\n"
-"AoGBAIyoeG1AnQmildKeQpiGZackf0uhg2BeRwpFKg//5Q0Sd0Wza+M/2+q1v1Ei\n"
-"86ihxxV7KfPTykk6hmuUSwVkI28Z+5J9NYTr35EzPiUlqpo0iclTkFqrlbqSPULx\n"
-"9fQhvcOGv1c0m5CnYrHsM8eu3tagLg+6OE4abLOYX4Az5pkxAkEA/NwHhVaVJrXH\n"
-"lGDrRAfGtaD5Tzeeg1H9DNZi5lmFiSNR0O11sgDLkiZNP5oM8knyqo8Gq08hwxEb\n"
-"yqMXM3XtJQJBAN2KJbFhOjDIkvJyYvbmcP6P7vV2c9j+oUTKkFMF7vvfWunxMi9j\n"
-"ghbdUKgl7tU0VFpw7ufDDD0pkN6sua3gp1UCQQCvNzTK861U7p/GtMYyFQVf9JTt\n"
-"jMf9jYHBNInBvwTme6AFG5bz6tMlif77dJ9GAXHzODrR2Hq3thJA/3RjR3M1AkBg\n"
-"+6M4ncmtpYC+5lhwob0Bk90WU/6vFflfdhXsYoKWfNb95vsDR9qhS82Nbt25NClh\n"
-"VmMfzoFDHTkwYgj/F4PpAkEA+RaaSRP7BmbvFNqvlm8J/m0RVdAH4+p/Q5Z5u6Yo\n"
-"N7xC/gFi0qFPGKsDvD2CncAYmt+KNsd8S0JGDN4eieKn+Q==\n"
+"MIICXAIBAAKBgQDREn/4UUVgit0y0MjW/WONrWHnQjkVHPEZfkOMK73c90dEza+q\n"
+"87RPTbvL91m747YqptcS9SOT2jjmxUEI+tUGcSogptclOHhR9eXTZnLwRMuQYxF1\n"
+"WIg4Msykcnj84x2ECGRd2WkEwAVKZZF1aWNGLwLq5boRMvnShL2TMFhWUwIDAQAB\n"
+"AoGAU68L+eDN3C65CzX2rdcOmg7kOSSQpJrJBmM7tkdr3546sJeD0PFrIrMCkEmZ\n"
+"aVNj/v545+WnL+8RB4280lNUIF4AMNaMZUL+4FAtwekqWua3QvvqgRMjCdG3/h/d\n"
+"bOAUiiKKEimflTaIVHNVSCvOIntftOu3PhebctuabnZzg0ECQQD9i+FX7M9UXT1A\n"
+"bVm+bRIJuQtG+u9jD3VxrvHsmh0QnOAL3oa/ofTCwoTJLZs8Qy0GeAoJNf28rY1q\n"
+"AgNMEeEXAkEA0xhxNX2fDQ2yvKwPkPMrRycJVWry+KHvSZG2+XYh+V5sVGQ5H7Gu\n"
+"krc6IzRZlIKQhEGktkw8ih0DEHQbAihiJQJBAKi/SnFcePjrPXL91Hb63MB/2dOZ\n"
+"+21wwnexOe6A+8ssvajop8IvJlnhYMMMiX7oLrVZe0R6HLBQyge94zfjxm0CQGye\n"
+"dRIrE34qAEBo4JGbLjesdHcJUwBwgqn+WoI+MPkZhvBdqa8PRF6l/TpEI5vxGt+S\n"
+"z2gmDjia+QqsU4FmuikCQDDOs85uwNSKJFax9XMzd1qd1QwX20F8lvnOsWErXiDw\n"
+"Fy2+rmIRHoSxn4D+rE5ivqkO99E9jAlz+uuQz/6WqwE=\n"
"-----END RSA PRIVATE KEY-----\n";
diff --git a/src/test/test_dir.c b/src/test/test_dir.c
index 56ac3b34c..c03b63be2 100644
--- a/src/test/test_dir.c
+++ b/src/test/test_dir.c
@@ -11,6 +11,7 @@
#define ROUTER_PRIVATE
#define ROUTERLIST_PRIVATE
#define HIBERNATE_PRIVATE
+#define NETWORKSTATUS_PRIVATE
#include "or.h"
#include "config.h"
#include "directory.h"
@@ -97,7 +98,6 @@ test_dir_formats(void)
get_platform_str(platform, sizeof(platform));
r1 = tor_malloc_zero(sizeof(routerinfo_t));
- r1->address = tor_strdup("18.244.0.1");
r1->addr = 0xc0a80001u; /* 192.168.0.1 */
r1->cache_info.published_on = 0;
r1->or_port = 9000;
@@ -124,7 +124,6 @@ test_dir_formats(void)
ex2->maskbits = 8;
ex2->prt_min = ex2->prt_max = 24;
r2 = tor_malloc_zero(sizeof(routerinfo_t));
- r2->address = tor_strdup("1.1.1.1");
r2->addr = 0x0a030201u; /* 10.3.2.1 */
r2->platform = tor_strdup(platform);
r2->cache_info.published_on = 5;
@@ -153,7 +152,7 @@ test_dir_formats(void)
tor_free(options->ContactInfo);
test_assert(buf);
- strlcpy(buf2, "router Magri 18.244.0.1 9000 0 9003\n"
+ strlcpy(buf2, "router Magri 192.168.0.1 9000 0 9003\n"
"or-address [1:2:3:4::]:9999\n"
"platform Tor "VERSION" on ", sizeof(buf2));
strlcat(buf2, get_uname(), sizeof(buf2));
@@ -187,7 +186,7 @@ test_dir_formats(void)
cp = buf;
rp1 = router_parse_entry_from_string((const char*)cp,NULL,1,0,NULL);
test_assert(rp1);
- test_streq(rp1->address, r1->address);
+ test_eq(rp1->addr, r1->addr);
test_eq(rp1->or_port, r1->or_port);
//test_eq(rp1->dir_port, r1->dir_port);
test_eq(rp1->bandwidthrate, r1->bandwidthrate);
@@ -196,9 +195,10 @@ test_dir_formats(void)
test_assert(crypto_pk_cmp_keys(rp1->onion_pkey, pk1) == 0);
test_assert(crypto_pk_cmp_keys(rp1->identity_pkey, pk2) == 0);
//test_assert(rp1->exit_policy == NULL);
+ tor_free(buf);
strlcpy(buf2,
- "router Fred 1.1.1.1 9005 0 0\n"
+ "router Fred 10.3.2.1 9005 0 0\n"
"platform Tor "VERSION" on ", sizeof(buf2));
strlcat(buf2, get_uname(), sizeof(buf2));
strlcat(buf2, "\n"
@@ -214,8 +214,10 @@ test_dir_formats(void)
strlcat(buf2, "signing-key\n", sizeof(buf2));
strlcat(buf2, pk1_str, sizeof(buf2));
strlcat(buf2, "hidden-service-dir\n", sizeof(buf2));
+#ifdef CURVE25519_ENABLED
strlcat(buf2, "ntor-onion-key "
"skyinAnvardNostarsNomoonNowindormistsorsnow=\n", sizeof(buf2));
+#endif
strlcat(buf2, "accept *:80\nreject 18.0.0.0/8:24\n", sizeof(buf2));
strlcat(buf2, "router-signature\n", sizeof(buf2));
@@ -229,15 +231,17 @@ test_dir_formats(void)
cp = buf;
rp2 = router_parse_entry_from_string((const char*)cp,NULL,1,0,NULL);
test_assert(rp2);
- test_streq(rp2->address, r2->address);
+ test_eq(rp2->addr, r2->addr);
test_eq(rp2->or_port, r2->or_port);
test_eq(rp2->dir_port, r2->dir_port);
test_eq(rp2->bandwidthrate, r2->bandwidthrate);
test_eq(rp2->bandwidthburst, r2->bandwidthburst);
test_eq(rp2->bandwidthcapacity, r2->bandwidthcapacity);
+#ifdef CURVE25519_ENABLED
test_memeq(rp2->onion_curve25519_pkey->public_key,
r2->onion_curve25519_pkey->public_key,
CURVE25519_PUBKEY_LEN);
+#endif
test_assert(crypto_pk_cmp_keys(rp2->onion_pkey, pk2) == 0);
test_assert(crypto_pk_cmp_keys(rp2->identity_pkey, pk1) == 0);
@@ -275,6 +279,8 @@ test_dir_formats(void)
routerinfo_free(r1);
if (r2)
routerinfo_free(r2);
+ if (rp2)
+ routerinfo_free(rp2);
tor_free(buf);
tor_free(pk1_str);
@@ -937,7 +943,7 @@ gen_routerstatus_for_v3ns(int idx, time_t now)
tor_addr_copy(&rs->ipv6_addr, &addr_ipv6);
rs->ipv6_orport = 4711;
rs->is_exit = rs->is_stable = rs->is_fast = rs->is_flagged_running =
- rs->is_valid = rs->is_v2_dir = rs->is_possible_guard = 1;
+ rs->is_valid = rs->is_possible_guard = 1;
break;
case 2:
/* Generate the third routerstatus. */
@@ -952,7 +958,7 @@ gen_routerstatus_for_v3ns(int idx, time_t now)
rs->or_port = 400;
rs->dir_port = 9999;
rs->is_authority = rs->is_exit = rs->is_stable = rs->is_fast =
- rs->is_flagged_running = rs->is_valid = rs->is_v2_dir =
+ rs->is_flagged_running = rs->is_valid =
rs->is_possible_guard = 1;
break;
case 3:
@@ -1009,16 +1015,14 @@ vote_tweaks_for_v3ns(networkstatus_t *v, int voter, time_t now)
/* Monkey around with the list a bit */
vrs = smartlist_get(v->routerstatus_list, 2);
smartlist_del_keeporder(v->routerstatus_list, 2);
- tor_free(vrs->version);
- tor_free(vrs);
+ vote_routerstatus_free(vrs);
vrs = smartlist_get(v->routerstatus_list, 0);
vrs->status.is_fast = 1;
if (voter == 3) {
vrs = smartlist_get(v->routerstatus_list, 0);
smartlist_del_keeporder(v->routerstatus_list, 0);
- tor_free(vrs->version);
- tor_free(vrs);
+ vote_routerstatus_free(vrs);
vrs = smartlist_get(v->routerstatus_list, 0);
memset(vrs->status.descriptor_digest, (int)'Z', DIGEST_LEN);
test_assert(router_add_to_routerlist(
@@ -1061,7 +1065,8 @@ test_vrs_for_v3ns(vote_routerstatus_t *vrs, int voter, time_t now)
test_eq(rs->addr, 0x99008801);
test_eq(rs->or_port, 443);
test_eq(rs->dir_port, 8000);
- test_eq(vrs->flags, U64_LITERAL(16)); // no flags except "running"
+ /* no flags except "running" (16) and "v2dir" (64) */
+ tt_u64_op(vrs->flags, ==, U64_LITERAL(80));
} else if (tor_memeq(rs->identity_digest,
"\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5"
"\x5\x5\x5\x5",
@@ -1086,10 +1091,11 @@ test_vrs_for_v3ns(vote_routerstatus_t *vrs, int voter, time_t now)
test_assert(tor_addr_eq(&rs->ipv6_addr, &addr_ipv6));
test_eq(rs->ipv6_orport, 4711);
if (voter == 1) {
- test_eq(vrs->flags, U64_LITERAL(254)); // all flags except "authority."
+ /* all except "authority" (1) and "v2dir" (64) */
+ tt_u64_op(vrs->flags, ==, U64_LITERAL(190));
} else {
- /* 1023 - authority(1) - madeofcheese(16) - madeoftin(32) */
- test_eq(vrs->flags, U64_LITERAL(974));
+ /* 1023 - authority(1) - madeofcheese(16) - madeoftin(32) - v2dir(256) */
+ tt_u64_op(vrs->flags, ==, U64_LITERAL(718));
}
} else if (tor_memeq(rs->identity_digest,
"\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33"
@@ -1157,7 +1163,6 @@ test_routerstatus_for_v3ns(routerstatus_t *rs, time_t now)
test_assert(!rs->is_stable);
/* (If it wasn't running it wouldn't be here) */
test_assert(rs->is_flagged_running);
- test_assert(!rs->is_v2_dir);
test_assert(!rs->is_valid);
test_assert(!rs->is_named);
/* XXXX check version */
@@ -1184,7 +1189,6 @@ test_routerstatus_for_v3ns(routerstatus_t *rs, time_t now)
test_assert(rs->is_possible_guard);
test_assert(rs->is_stable);
test_assert(rs->is_flagged_running);
- test_assert(rs->is_v2_dir);
test_assert(rs->is_valid);
test_assert(!rs->is_named);
/* XXXX check version */
@@ -1226,7 +1230,8 @@ test_a_networkstatus(
vote_routerstatus_t *vrs;
routerstatus_t *rs;
int idx, n_rs, n_vrs;
- char *v1_text=NULL, *v2_text=NULL, *v3_text=NULL, *consensus_text=NULL, *cp;
+ char *v1_text=NULL, *v2_text=NULL, *v3_text=NULL, *consensus_text=NULL,
+ *cp=NULL;
smartlist_t *votes = smartlist_new();
/* For generating the two other consensuses. */
@@ -1244,7 +1249,6 @@ test_a_networkstatus(
/* Parse certificates and keys. */
cert1 = authority_cert_parse_from_string(AUTHORITY_CERT_1, NULL);
test_assert(cert1);
- test_assert(cert1->is_cross_certified);
cert2 = authority_cert_parse_from_string(AUTHORITY_CERT_2, NULL);
test_assert(cert2);
cert3 = authority_cert_parse_from_string(AUTHORITY_CERT_3, NULL);
@@ -1358,7 +1362,8 @@ test_a_networkstatus(
vote->dist_seconds = 300;
authority_cert_free(vote->cert);
vote->cert = authority_cert_dup(cert2);
- vote->net_params = smartlist_new();
+ SMARTLIST_FOREACH(vote->net_params, char *, c, tor_free(c));
+ smartlist_clear(vote->net_params);
smartlist_split_string(vote->net_params, "bar=2000000000 circuitwindow=20",
NULL, 0, 0);
tor_free(vote->client_versions);
@@ -1402,7 +1407,8 @@ test_a_networkstatus(
vote->dist_seconds = 250;
authority_cert_free(vote->cert);
vote->cert = authority_cert_dup(cert3);
- vote->net_params = smartlist_new();
+ SMARTLIST_FOREACH(vote->net_params, char *, c, tor_free(c));
+ smartlist_clear(vote->net_params);
smartlist_split_string(vote->net_params, "circuitwindow=80 foo=660",
NULL, 0, 0);
smartlist_add(vote->supported_methods, tor_strdup("4"));
@@ -1645,6 +1651,7 @@ test_a_networkstatus(
}
done:
+ tor_free(cp);
smartlist_free(votes);
tor_free(v1_text);
tor_free(v2_text);
@@ -1768,7 +1775,7 @@ test_dir_random_weighted(void *testdata)
inp[i].u64 = vals[i];
total += vals[i];
}
- tt_int_op(total, ==, 45);
+ tt_u64_op(total, ==, 45);
for (i=0; i<n; ++i) {
choice = choose_array_element_by_weight(inp, 10);
tt_int_op(choice, >=, 0);
@@ -1886,7 +1893,7 @@ gen_routerstatus_for_umbw(int idx, time_t now)
tor_addr_copy(&rs->ipv6_addr, &addr_ipv6);
rs->ipv6_orport = 4711;
rs->is_exit = rs->is_stable = rs->is_fast = rs->is_flagged_running =
- rs->is_valid = rs->is_v2_dir = rs->is_possible_guard = 1;
+ rs->is_valid = rs->is_possible_guard = 1;
/*
* This one has measured bandwidth above the clip cutoff, and
* so shouldn't be clipped; we'll have to test that it isn't
@@ -1909,7 +1916,7 @@ gen_routerstatus_for_umbw(int idx, time_t now)
rs->or_port = 400;
rs->dir_port = 9999;
rs->is_authority = rs->is_exit = rs->is_stable = rs->is_fast =
- rs->is_flagged_running = rs->is_valid = rs->is_v2_dir =
+ rs->is_flagged_running = rs->is_valid =
rs->is_possible_guard = 1;
/*
* This one has unmeasured bandwidth above the clip cutoff, and
@@ -1978,6 +1985,7 @@ vote_tweaks_for_umbw(networkstatus_t *v, int voter, time_t now)
(void)now;
test_assert(v->supported_methods);
+ SMARTLIST_FOREACH(v->supported_methods, char *, c, tor_free(c));
smartlist_clear(v->supported_methods);
/* Method 17 is MIN_METHOD_TO_CLIP_UNMEASURED_BW_KB */
smartlist_split_string(v->supported_methods,
@@ -2145,7 +2153,6 @@ test_routerstatus_for_umbw(routerstatus_t *rs, time_t now)
test_assert(!rs->is_stable);
/* (If it wasn't running it wouldn't be here) */
test_assert(rs->is_flagged_running);
- test_assert(!rs->is_v2_dir);
test_assert(!rs->is_valid);
test_assert(!rs->is_named);
/* This one should have measured bandwidth below the clip cutoff */
@@ -2176,7 +2183,6 @@ test_routerstatus_for_umbw(routerstatus_t *rs, time_t now)
test_assert(rs->is_possible_guard);
test_assert(rs->is_stable);
test_assert(rs->is_flagged_running);
- test_assert(rs->is_v2_dir);
test_assert(rs->is_valid);
test_assert(!rs->is_named);
/* This one should have measured bandwidth above the clip cutoff */
@@ -2254,82 +2260,6 @@ test_dir_clip_unmeasured_bw_kb_alt(void)
test_routerstatus_for_umbw);
}
-extern time_t time_of_process_start; /* from main.c */
-
-static void
-test_dir_v2_dir(void *arg)
-{
- /* Runs in a forked process: acts like a v2 directory just enough to make and
- * sign a v2 networkstatus opinion */
-
- cached_dir_t *v2 = NULL;
- or_options_t *options = get_options_mutable();
- crypto_pk_t *id_key = pk_generate(4);
- (void) arg;
-
- options->ORPort_set = 1; /* So we believe we're a server. */
- options->DirPort_set = 1;
- options->Address = tor_strdup("99.99.99.99");
- options->Nickname = tor_strdup("TestV2Auth");
- options->ContactInfo = tor_strdup("TestV2Auth <testv2auth@example.com>");
- {
- /* Give it a DirPort */
- smartlist_t *ports = (smartlist_t *)get_configured_ports();
- port_cfg_t *port = tor_malloc_zero(sizeof(port_cfg_t));
- port->type = CONN_TYPE_DIR_LISTENER;
- port->port = 9999;
- smartlist_add(ports, port);
- }
- set_server_identity_key(id_key);
- set_client_identity_key(id_key);
-
- /* Add a router. */
- {
- was_router_added_t wra;
- const char *msg = NULL;
- routerinfo_t *r1 = tor_malloc_zero(sizeof(routerinfo_t));
- r1->address = tor_strdup("18.244.0.1");
- r1->addr = 0xc0a80001u; /* 192.168.0.1 */
- r1->cache_info.published_on = time(NULL)-60;
- r1->or_port = 9000;
- r1->dir_port = 9003;
- tor_addr_parse(&r1->ipv6_addr, "1:2:3:4::");
- r1->ipv6_orport = 9999;
- r1->onion_pkey = pk_generate(1);
- r1->identity_pkey = pk_generate(2);
- r1->bandwidthrate = 1000;
- r1->bandwidthburst = 5000;
- r1->bandwidthcapacity = 10000;
- r1->exit_policy = NULL;
- r1->nickname = tor_strdup("Magri");
- r1->platform = tor_strdup("Tor 0.2.7.7-gamma");
- r1->cache_info.routerlist_index = -1;
- r1->cache_info.signed_descriptor_body =
- router_dump_router_to_string(r1, r1->identity_pkey);
- r1->cache_info.signed_descriptor_len =
- strlen(r1->cache_info.signed_descriptor_body);
- wra = router_add_to_routerlist(r1, &msg, 0, 0);
- tt_int_op(wra, ==, ROUTER_ADDED_SUCCESSFULLY);
- }
-
- /* Prevent call of rep_hist_note_router_unreachable(). */
- time_of_process_start = time(NULL);
-
- /* Make a directory so there's somewhere to store the thing */
-#ifdef _WIN32
- mkdir(get_fname("cached-status"));
-#else
- mkdir(get_fname("cached-status"), 0700);
-#endif
-
- v2 = generate_v2_networkstatus_opinion();
- tt_assert(v2);
-
- done:
- crypto_pk_free(id_key);
- cached_dir_decref(v2);
-}
-
static void
test_dir_fmt_control_ns(void *arg)
{
@@ -2357,13 +2287,81 @@ test_dir_fmt_control_ns(void *arg)
"r TetsuoMilk U3RhdGVseSwgcGx1bXAgQnVjayA "
"TXVsbGlnYW4gY2FtZSB1cCBmcm8 2013-04-02 17:53:18 "
"32.48.64.80 9001 9002\n"
- "s Exit Fast Running\n"
+ "s Exit Fast Running V2Dir\n"
"w Bandwidth=1000\n");
done:
tor_free(s);
}
+static void
+test_dir_http_handling(void *args)
+{
+ char *url = NULL;
+ (void)args;
+
+ /* Parse http url tests: */
+ /* Good headers */
+ test_eq(parse_http_url("GET /tor/a/b/c.txt HTTP/1.1\r\n"
+ "Host: example.com\r\n"
+ "User-Agent: Mozilla/5.0 (Windows;"
+ " U; Windows NT 6.1; en-US; rv:1.9.1.5)\r\n",
+ &url), 0);
+ test_streq(url, "/tor/a/b/c.txt");
+ tor_free(url);
+
+ test_eq(parse_http_url("GET /tor/a/b/c.txt HTTP/1.0\r\n", &url), 0);
+ test_streq(url, "/tor/a/b/c.txt");
+ tor_free(url);
+
+ test_eq(parse_http_url("GET /tor/a/b/c.txt HTTP/1.600\r\n", &url), 0);
+ test_streq(url, "/tor/a/b/c.txt");
+ tor_free(url);
+
+ /* Should prepend '/tor/' to url if required */
+ test_eq(parse_http_url("GET /a/b/c.txt HTTP/1.1\r\n"
+ "Host: example.com\r\n"
+ "User-Agent: Mozilla/5.0 (Windows;"
+ " U; Windows NT 6.1; en-US; rv:1.9.1.5)\r\n",
+ &url), 0);
+ test_streq(url, "/tor/a/b/c.txt");
+ tor_free(url);
+
+ /* Bad headers -- no HTTP/1.x*/
+ test_eq(parse_http_url("GET /a/b/c.txt\r\n"
+ "Host: example.com\r\n"
+ "User-Agent: Mozilla/5.0 (Windows;"
+ " U; Windows NT 6.1; en-US; rv:1.9.1.5)\r\n",
+ &url), -1);
+ tt_assert(!url);
+
+ /* Bad headers */
+ test_eq(parse_http_url("GET /a/b/c.txt\r\n"
+ "Host: example.com\r\n"
+ "User-Agent: Mozilla/5.0 (Windows;"
+ " U; Windows NT 6.1; en-US; rv:1.9.1.5)\r\n",
+ &url), -1);
+ tt_assert(!url);
+
+ test_eq(parse_http_url("GET /tor/a/b/c.txt", &url), -1);
+ tt_assert(!url);
+
+ test_eq(parse_http_url("GET /tor/a/b/c.txt HTTP/1.1", &url), -1);
+ tt_assert(!url);
+
+ test_eq(parse_http_url("GET /tor/a/b/c.txt HTTP/1.1x\r\n", &url), -1);
+ tt_assert(!url);
+
+ test_eq(parse_http_url("GET /tor/a/b/c.txt HTTP/1.", &url), -1);
+ tt_assert(!url);
+
+ test_eq(parse_http_url("GET /tor/a/b/c.txt HTTP/1.\r", &url), -1);
+ tt_assert(!url);
+
+ done:
+ tor_free(url);
+}
+
#define DIR_LEGACY(name) \
{ #name, legacy_test_helper, TT_FORK, &legacy_setup, test_dir_ ## name }
@@ -2384,8 +2382,8 @@ struct testcase_t dir_tests[] = {
DIR(scale_bw, 0),
DIR_LEGACY(clip_unmeasured_bw_kb),
DIR_LEGACY(clip_unmeasured_bw_kb_alt),
- DIR(v2_dir, TT_FORK),
DIR(fmt_control_ns, 0),
+ DIR(http_handling, 0),
END_OF_TESTCASES
};
diff --git a/src/test/test_extorport.c b/src/test/test_extorport.c
new file mode 100644
index 000000000..93c8f77d5
--- /dev/null
+++ b/src/test/test_extorport.c
@@ -0,0 +1,607 @@
+/* Copyright (c) 2013, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#define CONNECTION_PRIVATE
+#define EXT_ORPORT_PRIVATE
+#define MAIN_PRIVATE
+#include "or.h"
+#include "buffers.h"
+#include "connection.h"
+#include "connection_or.h"
+#include "config.h"
+#include "control.h"
+#include "ext_orport.h"
+#include "main.h"
+#include "test.h"
+
+/* Test connection_or_remove_from_ext_or_id_map and
+ * connection_or_set_ext_or_identifier */
+static void
+test_ext_or_id_map(void *arg)
+{
+ or_connection_t *c1 = NULL, *c2 = NULL, *c3 = NULL;
+ char *idp = NULL, *idp2 = NULL;
+ (void)arg;
+
+ /* pre-initialization */
+ tt_ptr_op(NULL, ==, connection_or_get_by_ext_or_id("xxxxxxxxxxxxxxxxxxxx"));
+
+ c1 = or_connection_new(CONN_TYPE_EXT_OR, AF_INET);
+ c2 = or_connection_new(CONN_TYPE_EXT_OR, AF_INET);
+ c3 = or_connection_new(CONN_TYPE_OR, AF_INET);
+
+ tt_ptr_op(c1->ext_or_conn_id, !=, NULL);
+ tt_ptr_op(c2->ext_or_conn_id, !=, NULL);
+ tt_ptr_op(c3->ext_or_conn_id, ==, NULL);
+
+ tt_ptr_op(c1, ==, connection_or_get_by_ext_or_id(c1->ext_or_conn_id));
+ tt_ptr_op(c2, ==, connection_or_get_by_ext_or_id(c2->ext_or_conn_id));
+ tt_ptr_op(NULL, ==, connection_or_get_by_ext_or_id("xxxxxxxxxxxxxxxxxxxx"));
+
+ idp = tor_memdup(c2->ext_or_conn_id, EXT_OR_CONN_ID_LEN);
+
+ /* Give c2 a new ID. */
+ connection_or_set_ext_or_identifier(c2);
+ test_mem_op(idp, !=, c2->ext_or_conn_id, EXT_OR_CONN_ID_LEN);
+ idp2 = tor_memdup(c2->ext_or_conn_id, EXT_OR_CONN_ID_LEN);
+ tt_assert(!tor_digest_is_zero(idp2));
+
+ tt_ptr_op(NULL, ==, connection_or_get_by_ext_or_id(idp));
+ tt_ptr_op(c2, ==, connection_or_get_by_ext_or_id(idp2));
+
+ /* Now remove it. */
+ connection_or_remove_from_ext_or_id_map(c2);
+ tt_ptr_op(NULL, ==, connection_or_get_by_ext_or_id(idp));
+ tt_ptr_op(NULL, ==, connection_or_get_by_ext_or_id(idp2));
+
+ done:
+ if (c1)
+ connection_free_(TO_CONN(c1));
+ if (c2)
+ connection_free_(TO_CONN(c2));
+ if (c3)
+ connection_free_(TO_CONN(c3));
+ tor_free(idp);
+ tor_free(idp2);
+ connection_or_clear_ext_or_id_map();
+}
+
+/* Simple connection_write_to_buf_impl_ replacement that unconditionally
+ * writes to outbuf. */
+static void
+connection_write_to_buf_impl_replacement(const char *string, size_t len,
+ connection_t *conn, int zlib)
+{
+ (void) zlib;
+
+ tor_assert(string);
+ tor_assert(conn);
+ write_to_buf(string, len, conn->outbuf);
+}
+
+static char *
+buf_get_contents(buf_t *buf, size_t *sz_out)
+{
+ char *out;
+ *sz_out = buf_datalen(buf);
+ if (*sz_out >= ULONG_MAX)
+ return NULL; /* C'mon, really? */
+ out = tor_malloc(*sz_out + 1);
+ if (fetch_from_buf(out, (unsigned long)*sz_out, buf) != 0) {
+ tor_free(out);
+ return NULL;
+ }
+ out[*sz_out] = '\0'; /* Hopefully gratuitous. */
+ return out;
+}
+
+static void
+test_ext_or_write_command(void *arg)
+{
+ or_connection_t *c1;
+ char *cp = NULL;
+ char *buf = NULL;
+ size_t sz;
+
+ (void) arg;
+ MOCK(connection_write_to_buf_impl_,
+ connection_write_to_buf_impl_replacement);
+
+ c1 = or_connection_new(CONN_TYPE_EXT_OR, AF_INET);
+ tt_assert(c1);
+
+ /* Length too long */
+ tt_int_op(connection_write_ext_or_command(TO_CONN(c1), 100, "X", 100000),
+ <, 0);
+
+ /* Empty command */
+ tt_int_op(connection_write_ext_or_command(TO_CONN(c1), 0x99, NULL, 0),
+ ==, 0);
+ cp = buf_get_contents(TO_CONN(c1)->outbuf, &sz);
+ tt_int_op(sz, ==, 4);
+ test_mem_op(cp, ==, "\x00\x99\x00\x00", 4);
+ tor_free(cp);
+
+ /* Medium command. */
+ tt_int_op(connection_write_ext_or_command(TO_CONN(c1), 0x99,
+ "Wai\0Hello", 9), ==, 0);
+ cp = buf_get_contents(TO_CONN(c1)->outbuf, &sz);
+ tt_int_op(sz, ==, 13);
+ test_mem_op(cp, ==, "\x00\x99\x00\x09Wai\x00Hello", 13);
+ tor_free(cp);
+
+ /* Long command */
+ buf = tor_malloc(65535);
+ memset(buf, 'x', 65535);
+ tt_int_op(connection_write_ext_or_command(TO_CONN(c1), 0xf00d,
+ buf, 65535), ==, 0);
+ cp = buf_get_contents(TO_CONN(c1)->outbuf, &sz);
+ tt_int_op(sz, ==, 65539);
+ test_mem_op(cp, ==, "\xf0\x0d\xff\xff", 4);
+ test_mem_op(cp+4, ==, buf, 65535);
+ tor_free(cp);
+
+ done:
+ if (c1)
+ connection_free_(TO_CONN(c1));
+ tor_free(cp);
+ tor_free(buf);
+ UNMOCK(connection_write_to_buf_impl_);
+}
+
+static int
+write_bytes_to_file_fail(const char *fname, const char *str, size_t len,
+ int bin)
+{
+ (void) fname;
+ (void) str;
+ (void) len;
+ (void) bin;
+
+ return -1;
+}
+
+static void
+test_ext_or_init_auth(void *arg)
+{
+ or_options_t *options = get_options_mutable();
+ const char *fn;
+ char *cp = NULL;
+ struct stat st;
+ char cookie0[32];
+ (void)arg;
+
+ /* Check default filename location */
+ tor_free(options->DataDirectory);
+ options->DataDirectory = tor_strdup("foo");
+ cp = get_ext_or_auth_cookie_file_name();
+ tt_str_op(cp, ==, "foo"PATH_SEPARATOR"extended_orport_auth_cookie");
+ tor_free(cp);
+
+ /* Shouldn't be initialized already, or our tests will be a bit
+ * meaningless */
+ ext_or_auth_cookie = tor_malloc_zero(32);
+ test_assert(tor_mem_is_zero((char*)ext_or_auth_cookie, 32));
+
+ /* Now make sure we use a temporary file */
+ fn = get_fname("ext_cookie_file");
+ options->ExtORPortCookieAuthFile = tor_strdup(fn);
+ cp = get_ext_or_auth_cookie_file_name();
+ tt_str_op(cp, ==, fn);
+ tor_free(cp);
+
+ /* Test the initialization function with a broken
+ write_bytes_to_file(). See if the problem is handled properly. */
+ MOCK(write_bytes_to_file, write_bytes_to_file_fail);
+ tt_int_op(-1, ==, init_ext_or_cookie_authentication(1));
+ tt_int_op(ext_or_auth_cookie_is_set, ==, 0);
+ UNMOCK(write_bytes_to_file);
+
+ /* Now do the actual initialization. */
+ tt_int_op(0, ==, init_ext_or_cookie_authentication(1));
+ tt_int_op(ext_or_auth_cookie_is_set, ==, 1);
+ cp = read_file_to_str(fn, RFTS_BIN, &st);
+ tt_ptr_op(cp, !=, NULL);
+ tt_u64_op((uint64_t)st.st_size, ==, 64);
+ test_memeq(cp, "! Extended ORPort Auth Cookie !\x0a", 32);
+ test_memeq(cp+32, ext_or_auth_cookie, 32);
+ memcpy(cookie0, ext_or_auth_cookie, 32);
+ test_assert(!tor_mem_is_zero((char*)ext_or_auth_cookie, 32));
+
+ /* Operation should be idempotent. */
+ tt_int_op(0, ==, init_ext_or_cookie_authentication(1));
+ test_memeq(cookie0, ext_or_auth_cookie, 32);
+
+ done:
+ tor_free(cp);
+ ext_orport_free_all();
+}
+
+static void
+test_ext_or_cookie_auth(void *arg)
+{
+ char *reply=NULL, *reply2=NULL, *client_hash=NULL, *client_hash2=NULL;
+ size_t reply_len=0;
+ char hmac1[32], hmac2[32];
+
+ const char client_nonce[32] =
+ "Who is the third who walks alway";
+ char server_hash_input[] =
+ "ExtORPort authentication server-to-client hash"
+ "Who is the third who walks alway"
+ "................................";
+ char client_hash_input[] =
+ "ExtORPort authentication client-to-server hash"
+ "Who is the third who walks alway"
+ "................................";
+
+ (void)arg;
+
+ tt_int_op(strlen(client_hash_input), ==, 46+32+32);
+ tt_int_op(strlen(server_hash_input), ==, 46+32+32);
+
+ ext_or_auth_cookie = tor_malloc_zero(32);
+ memcpy(ext_or_auth_cookie, "s beside you? When I count, ther", 32);
+ ext_or_auth_cookie_is_set = 1;
+
+ /* For this authentication, the client sends 32 random bytes (ClientNonce)
+ * The server replies with 32 byte ServerHash and 32 byte ServerNonce,
+ * where ServerHash is:
+ * HMAC-SHA256(CookieString,
+ * "ExtORPort authentication server-to-client hash" | ClientNonce |
+ * ServerNonce)"
+ * The client must reply with 32-byte ClientHash, which we compute as:
+ * ClientHash is computed as:
+ * HMAC-SHA256(CookieString,
+ * "ExtORPort authentication client-to-server hash" | ClientNonce |
+ * ServerNonce)
+ */
+
+ /* Wrong length */
+ tt_int_op(-1, ==,
+ handle_client_auth_nonce(client_nonce, 33, &client_hash, &reply,
+ &reply_len));
+ tt_int_op(-1, ==,
+ handle_client_auth_nonce(client_nonce, 31, &client_hash, &reply,
+ &reply_len));
+
+ /* Now let's try this for real! */
+ tt_int_op(0, ==,
+ handle_client_auth_nonce(client_nonce, 32, &client_hash, &reply,
+ &reply_len));
+ tt_int_op(reply_len, ==, 64);
+ tt_ptr_op(reply, !=, NULL);
+ tt_ptr_op(client_hash, !=, NULL);
+ /* Fill in the server nonce into the hash inputs... */
+ memcpy(server_hash_input+46+32, reply+32, 32);
+ memcpy(client_hash_input+46+32, reply+32, 32);
+ /* Check the HMACs are correct... */
+ crypto_hmac_sha256(hmac1, (char*)ext_or_auth_cookie, 32, server_hash_input,
+ 46+32+32);
+ crypto_hmac_sha256(hmac2, (char*)ext_or_auth_cookie, 32, client_hash_input,
+ 46+32+32);
+ test_memeq(hmac1, reply, 32);
+ test_memeq(hmac2, client_hash, 32);
+
+ /* Now do it again and make sure that the results are *different* */
+ tt_int_op(0, ==,
+ handle_client_auth_nonce(client_nonce, 32, &client_hash2, &reply2,
+ &reply_len));
+ test_memneq(reply2, reply, reply_len);
+ test_memneq(client_hash2, client_hash, 32);
+ /* But that this one checks out too. */
+ memcpy(server_hash_input+46+32, reply2+32, 32);
+ memcpy(client_hash_input+46+32, reply2+32, 32);
+ /* Check the HMACs are correct... */
+ crypto_hmac_sha256(hmac1, (char*)ext_or_auth_cookie, 32, server_hash_input,
+ 46+32+32);
+ crypto_hmac_sha256(hmac2, (char*)ext_or_auth_cookie, 32, client_hash_input,
+ 46+32+32);
+ test_memeq(hmac1, reply2, 32);
+ test_memeq(hmac2, client_hash2, 32);
+
+ done:
+ tor_free(reply);
+ tor_free(client_hash);
+ tor_free(reply2);
+ tor_free(client_hash2);
+}
+
+static int
+crypto_rand_return_tse_str(char *to, size_t n)
+{
+ if (n != 32) {
+ TT_FAIL(("Asked for %d bytes, not 32", (int)n));
+ return -1;
+ }
+ memcpy(to, "te road There is always another ", 32);
+ return 0;
+}
+
+static void
+test_ext_or_cookie_auth_testvec(void *arg)
+{
+ char *reply=NULL, *client_hash=NULL;
+ size_t reply_len;
+ char *mem_op_hex_tmp=NULL;
+
+ const char client_nonce[] = "But when I look ahead up the whi";
+ (void)arg;
+
+ ext_or_auth_cookie = tor_malloc_zero(32);
+ memcpy(ext_or_auth_cookie, "Gliding wrapt in a brown mantle," , 32);
+ ext_or_auth_cookie_is_set = 1;
+
+ MOCK(crypto_rand, crypto_rand_return_tse_str);
+
+ tt_int_op(0, ==,
+ handle_client_auth_nonce(client_nonce, 32, &client_hash, &reply,
+ &reply_len));
+ tt_ptr_op(reply, !=, NULL );
+ tt_uint_op(reply_len, ==, 64);
+ test_memeq(reply+32, "te road There is always another ", 32);
+ /* HMACSHA256("Gliding wrapt in a brown mantle,"
+ * "ExtORPort authentication server-to-client hash"
+ * "But when I look ahead up the write road There is always another ");
+ */
+ test_memeq_hex(reply,
+ "ec80ed6e546d3b36fdfc22fe1315416b"
+ "029f1ade7610d910878b62eeb7403821");
+ /* HMACSHA256("Gliding wrapt in a brown mantle,"
+ * "ExtORPort authentication client-to-server hash"
+ * "But when I look ahead up the write road There is always another ");
+ * (Both values computed using Python CLI.)
+ */
+ test_memeq_hex(client_hash,
+ "ab391732dd2ed968cd40c087d1b1f25b"
+ "33b3cd77ff79bd80c2074bbf438119a2");
+
+ done:
+ UNMOCK(crypto_rand);
+ tor_free(reply);
+ tor_free(client_hash);
+ tor_free(mem_op_hex_tmp);
+}
+
+static void
+ignore_bootstrap_problem(const char *warn, int reason,
+ or_connection_t *conn)
+{
+ (void)warn;
+ (void)reason;
+ (void)conn;
+}
+
+static int is_reading = 1;
+static int handshake_start_called = 0;
+
+static void
+note_read_stopped(connection_t *conn)
+{
+ (void)conn;
+ is_reading=0;
+}
+static void
+note_read_started(connection_t *conn)
+{
+ (void)conn;
+ is_reading=1;
+}
+static int
+handshake_start(or_connection_t *conn, int receiving)
+{
+ if (!conn || !receiving)
+ TT_FAIL(("Bad arguments to handshake_start"));
+ handshake_start_called = 1;
+ return 0;
+}
+
+#define WRITE(s,n) \
+ do { \
+ write_to_buf((s), (n), TO_CONN(conn)->inbuf); \
+ } while (0)
+#define CONTAINS(s,n) \
+ do { \
+ tt_int_op((n), <=, sizeof(b)); \
+ tt_int_op(buf_datalen(TO_CONN(conn)->outbuf), ==, (n)); \
+ if ((n)) { \
+ fetch_from_buf(b, (n), TO_CONN(conn)->outbuf); \
+ test_memeq(b, (s), (n)); \
+ } \
+ } while (0)
+
+/* Helper: Do a successful Extended ORPort authentication handshake. */
+static void
+do_ext_or_handshake(or_connection_t *conn)
+{
+ char b[256];
+
+ tt_int_op(0, ==, connection_ext_or_start_auth(conn));
+ CONTAINS("\x01\x00", 2);
+ WRITE("\x01", 1);
+ WRITE("But when I look ahead up the whi", 32);
+ MOCK(crypto_rand, crypto_rand_return_tse_str);
+ tt_int_op(0, ==, connection_ext_or_process_inbuf(conn));
+ UNMOCK(crypto_rand);
+ tt_int_op(TO_CONN(conn)->state, ==, EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_HASH);
+ CONTAINS("\xec\x80\xed\x6e\x54\x6d\x3b\x36\xfd\xfc\x22\xfe\x13\x15\x41\x6b"
+ "\x02\x9f\x1a\xde\x76\x10\xd9\x10\x87\x8b\x62\xee\xb7\x40\x38\x21"
+ "te road There is always another ", 64);
+ /* Send the right response this time. */
+ WRITE("\xab\x39\x17\x32\xdd\x2e\xd9\x68\xcd\x40\xc0\x87\xd1\xb1\xf2\x5b"
+ "\x33\xb3\xcd\x77\xff\x79\xbd\x80\xc2\x07\x4b\xbf\x43\x81\x19\xa2",
+ 32);
+ tt_int_op(0, ==, connection_ext_or_process_inbuf(conn));
+ CONTAINS("\x01", 1);
+ tt_assert(! TO_CONN(conn)->marked_for_close);
+ tt_int_op(TO_CONN(conn)->state, ==, EXT_OR_CONN_STATE_OPEN);
+
+ done: ;
+}
+
+static void
+test_ext_or_handshake(void *arg)
+{
+ or_connection_t *conn=NULL;
+ char b[256];
+
+ (void) arg;
+ MOCK(connection_write_to_buf_impl_,
+ connection_write_to_buf_impl_replacement);
+ /* Use same authenticators as for test_ext_or_cookie_auth_testvec */
+ ext_or_auth_cookie = tor_malloc_zero(32);
+ memcpy(ext_or_auth_cookie, "Gliding wrapt in a brown mantle," , 32);
+ ext_or_auth_cookie_is_set = 1;
+
+ init_connection_lists();
+
+ conn = or_connection_new(CONN_TYPE_EXT_OR, AF_INET);
+ tt_int_op(0, ==, connection_ext_or_start_auth(conn));
+ /* The server starts by telling us about the one supported authtype. */
+ CONTAINS("\x01\x00", 2);
+ /* Say the client hasn't responded yet. */
+ tt_int_op(0, ==, connection_ext_or_process_inbuf(conn));
+ /* Let's say the client replies badly. */
+ WRITE("\x99", 1);
+ tt_int_op(-1, ==, connection_ext_or_process_inbuf(conn));
+ CONTAINS("", 0);
+ tt_assert(TO_CONN(conn)->marked_for_close);
+ close_closeable_connections();
+ conn = NULL;
+
+ /* Okay, try again. */
+ conn = or_connection_new(CONN_TYPE_EXT_OR, AF_INET);
+ tt_int_op(0, ==, connection_ext_or_start_auth(conn));
+ CONTAINS("\x01\x00", 2);
+ /* Let's say the client replies sensibly this time. "Yes, AUTHTYPE_COOKIE
+ * sounds delicious. Let's have some of that!" */
+ WRITE("\x01", 1);
+ /* Let's say that the client also sends part of a nonce. */
+ WRITE("But when I look ", 16);
+ tt_int_op(0, ==, connection_ext_or_process_inbuf(conn));
+ CONTAINS("", 0);
+ tt_int_op(TO_CONN(conn)->state, ==,
+ EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_NONCE);
+ /* Pump it again. Nothing should happen. */
+ tt_int_op(0, ==, connection_ext_or_process_inbuf(conn));
+ /* send the rest of the nonce. */
+ WRITE("ahead up the whi", 16);
+ MOCK(crypto_rand, crypto_rand_return_tse_str);
+ tt_int_op(0, ==, connection_ext_or_process_inbuf(conn));
+ UNMOCK(crypto_rand);
+ /* We should get the right reply from the server. */
+ CONTAINS("\xec\x80\xed\x6e\x54\x6d\x3b\x36\xfd\xfc\x22\xfe\x13\x15\x41\x6b"
+ "\x02\x9f\x1a\xde\x76\x10\xd9\x10\x87\x8b\x62\xee\xb7\x40\x38\x21"
+ "te road There is always another ", 64);
+ /* Send the wrong response. */
+ WRITE("not with a bang but a whimper...", 32);
+ MOCK(control_event_bootstrap_problem, ignore_bootstrap_problem);
+ tt_int_op(-1, ==, connection_ext_or_process_inbuf(conn));
+ CONTAINS("\x00", 1);
+ tt_assert(TO_CONN(conn)->marked_for_close);
+ /* XXXX Hold-open-until-flushed. */
+ close_closeable_connections();
+ conn = NULL;
+ UNMOCK(control_event_bootstrap_problem);
+
+ MOCK(connection_start_reading, note_read_started);
+ MOCK(connection_stop_reading, note_read_stopped);
+ MOCK(connection_tls_start_handshake, handshake_start);
+
+ /* Okay, this time let's succeed. */
+ conn = or_connection_new(CONN_TYPE_EXT_OR, AF_INET);
+ do_ext_or_handshake(conn);
+
+ /* Now let's run through some messages. */
+ /* First let's send some junk and make sure it's ignored. */
+ WRITE("\xff\xf0\x00\x03""ABC", 7);
+ tt_int_op(0, ==, connection_ext_or_process_inbuf(conn));
+ CONTAINS("", 0);
+ /* Now let's send a USERADDR command. */
+ WRITE("\x00\x01\x00\x0c""1.2.3.4:5678", 16);
+ tt_int_op(0, ==, connection_ext_or_process_inbuf(conn));
+ tt_int_op(TO_CONN(conn)->port, ==, 5678);
+ tt_int_op(tor_addr_to_ipv4h(&TO_CONN(conn)->addr), ==, 0x01020304);
+ /* Now let's send a TRANSPORT command. */
+ WRITE("\x00\x02\x00\x07""rfc1149", 11);
+ tt_int_op(0, ==, connection_ext_or_process_inbuf(conn));
+ tt_ptr_op(NULL, !=, conn->ext_or_transport);
+ tt_str_op("rfc1149", ==, conn->ext_or_transport);
+ tt_int_op(is_reading,==,1);
+ tt_int_op(TO_CONN(conn)->state, ==, EXT_OR_CONN_STATE_OPEN);
+ /* DONE */
+ WRITE("\x00\x00\x00\x00", 4);
+ tt_int_op(0, ==, connection_ext_or_process_inbuf(conn));
+ tt_int_op(TO_CONN(conn)->state, ==, EXT_OR_CONN_STATE_FLUSHING);
+ tt_int_op(is_reading,==,0);
+ CONTAINS("\x10\x00\x00\x00", 4);
+ tt_int_op(handshake_start_called,==,0);
+ tt_int_op(0, ==, connection_ext_or_finished_flushing(conn));
+ tt_int_op(is_reading,==,1);
+ tt_int_op(handshake_start_called,==,1);
+ tt_int_op(TO_CONN(conn)->type, ==, CONN_TYPE_OR);
+ tt_int_op(TO_CONN(conn)->state, ==, 0);
+ close_closeable_connections();
+ conn = NULL;
+
+ /* Okay, this time let's succeed the handshake but fail the USERADDR
+ command. */
+ conn = or_connection_new(CONN_TYPE_EXT_OR, AF_INET);
+ do_ext_or_handshake(conn);
+ /* USERADDR command with an extra NUL byte */
+ WRITE("\x00\x01\x00\x0d""1.2.3.4:5678\x00", 17);
+ MOCK(control_event_bootstrap_problem, ignore_bootstrap_problem);
+ tt_int_op(-1, ==, connection_ext_or_process_inbuf(conn));
+ CONTAINS("", 0);
+ tt_assert(TO_CONN(conn)->marked_for_close);
+ close_closeable_connections();
+ conn = NULL;
+ UNMOCK(control_event_bootstrap_problem);
+
+ /* Now fail the TRANSPORT command. */
+ conn = or_connection_new(CONN_TYPE_EXT_OR, AF_INET);
+ do_ext_or_handshake(conn);
+ /* TRANSPORT command with an extra NUL byte */
+ WRITE("\x00\x02\x00\x08""rfc1149\x00", 12);
+ MOCK(control_event_bootstrap_problem, ignore_bootstrap_problem);
+ tt_int_op(-1, ==, connection_ext_or_process_inbuf(conn));
+ CONTAINS("", 0);
+ tt_assert(TO_CONN(conn)->marked_for_close);
+ close_closeable_connections();
+ conn = NULL;
+ UNMOCK(control_event_bootstrap_problem);
+
+ /* Now fail the TRANSPORT command. */
+ conn = or_connection_new(CONN_TYPE_EXT_OR, AF_INET);
+ do_ext_or_handshake(conn);
+ /* TRANSPORT command with transport name with symbols (not a
+ C-identifier) */
+ WRITE("\x00\x02\x00\x07""rf*1149", 11);
+ MOCK(control_event_bootstrap_problem, ignore_bootstrap_problem);
+ tt_int_op(-1, ==, connection_ext_or_process_inbuf(conn));
+ CONTAINS("", 0);
+ tt_assert(TO_CONN(conn)->marked_for_close);
+ close_closeable_connections();
+ conn = NULL;
+ UNMOCK(control_event_bootstrap_problem);
+
+ done:
+ UNMOCK(connection_write_to_buf_impl_);
+ UNMOCK(crypto_rand);
+ if (conn)
+ connection_free_(TO_CONN(conn));
+#undef CONTAINS
+#undef WRITE
+}
+
+struct testcase_t extorport_tests[] = {
+ { "id_map", test_ext_or_id_map, TT_FORK, NULL, NULL },
+ { "write_command", test_ext_or_write_command, TT_FORK, NULL, NULL },
+ { "init_auth", test_ext_or_init_auth, TT_FORK, NULL, NULL },
+ { "cookie_auth", test_ext_or_cookie_auth, TT_FORK, NULL, NULL },
+ { "cookie_auth_testvec", test_ext_or_cookie_auth_testvec, TT_FORK,
+ NULL, NULL },
+ { "handshake", test_ext_or_handshake, TT_FORK, NULL, NULL },
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_hs.c b/src/test/test_hs.c
new file mode 100644
index 000000000..99ef7dd57
--- /dev/null
+++ b/src/test/test_hs.c
@@ -0,0 +1,129 @@
+/* Copyright (c) 2007-2013, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file test_hs.c
+ * \brief Unit tests for hidden service.
+ **/
+
+#define CONTROL_PRIVATE
+#include "or.h"
+#include "test.h"
+#include "control.h"
+
+/* mock ID digest and longname for node that's in nodelist */
+#define HSDIR_EXIST_ID "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \
+ "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
+#define STR_HSDIR_EXIST_LONGNAME \
+ "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=TestDir"
+/* mock ID digest and longname for node that's not in nodelist */
+#define HSDIR_NONE_EXIST_ID "\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB" \
+ "\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB"
+#define STR_HSDIR_NONE_EXIST_LONGNAME \
+ "$BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
+
+/* Helper global variable for hidden service descriptor event test.
+ * It's used as a pointer to dynamically created message buffer in
+ * send_control_event_string_replacement function, which mocks
+ * send_control_event_string function.
+ *
+ * Always free it after use! */
+static char *received_msg = NULL;
+
+/** Mock function for send_control_event_string
+ */
+static void
+send_control_event_string_replacement(uint16_t event, event_format_t which,
+ const char *msg)
+{
+ (void) event;
+ (void) which;
+ tor_free(received_msg);
+ received_msg = tor_strdup(msg);
+}
+
+/** Mock function for node_describe_longname_by_id, it returns either
+ * STR_HSDIR_EXIST_LONGNAME or STR_HSDIR_NONE_EXIST_LONGNAME
+ */
+static const char *
+node_describe_longname_by_id_replacement(const char *id_digest)
+{
+ if (!strcmp(id_digest, HSDIR_EXIST_ID)) {
+ return STR_HSDIR_EXIST_LONGNAME;
+ } else {
+ return STR_HSDIR_NONE_EXIST_LONGNAME;
+ }
+}
+
+/** Make sure each hidden service descriptor async event generation
+ *
+ * function generates the message in expected format.
+ */
+static void
+test_hs_desc_event(void *arg)
+{
+ #define STR_HS_ADDR "ajhb7kljbiru65qo"
+ #define STR_HS_ID "b3oeducbhjmbqmgw2i3jtz4fekkrinwj"
+
+ rend_data_t rend_query;
+ const char *expected_msg;
+
+ (void) arg;
+ MOCK(send_control_event_string,
+ send_control_event_string_replacement);
+ MOCK(node_describe_longname_by_id,
+ node_describe_longname_by_id_replacement);
+
+ /* setup rend_query struct */
+ strncpy(rend_query.onion_address, STR_HS_ADDR,
+ REND_SERVICE_ID_LEN_BASE32+1);
+ rend_query.auth_type = 0;
+
+ /* test request event */
+ control_event_hs_descriptor_requested(&rend_query, HSDIR_EXIST_ID,
+ STR_HS_ID);
+ expected_msg = "650 HS_DESC REQUESTED "STR_HS_ADDR" NO_AUTH "\
+ STR_HSDIR_EXIST_LONGNAME" "STR_HS_ID"\r\n";
+ test_assert(received_msg);
+ test_streq(received_msg, expected_msg);
+ tor_free(received_msg);
+
+ /* test received event */
+ rend_query.auth_type = 1;
+ control_event_hs_descriptor_received(&rend_query, HSDIR_EXIST_ID);
+ expected_msg = "650 HS_DESC RECEIVED "STR_HS_ADDR" BASIC_AUTH "\
+ STR_HSDIR_EXIST_LONGNAME"\r\n";
+ test_assert(received_msg);
+ test_streq(received_msg, expected_msg);
+ tor_free(received_msg);
+
+ /* test failed event */
+ rend_query.auth_type = 2;
+ control_event_hs_descriptor_failed(&rend_query, HSDIR_NONE_EXIST_ID);
+ expected_msg = "650 HS_DESC FAILED "STR_HS_ADDR" STEALTH_AUTH "\
+ STR_HSDIR_NONE_EXIST_LONGNAME"\r\n";
+ test_assert(received_msg);
+ test_streq(received_msg, expected_msg);
+ tor_free(received_msg);
+
+ /* test invalid auth type */
+ rend_query.auth_type = 999;
+ control_event_hs_descriptor_failed(&rend_query, HSDIR_EXIST_ID);
+ expected_msg = "650 HS_DESC FAILED "STR_HS_ADDR" UNKNOWN "\
+ STR_HSDIR_EXIST_LONGNAME"\r\n";
+ test_assert(received_msg);
+ test_streq(received_msg, expected_msg);
+ tor_free(received_msg);
+
+ done:
+ UNMOCK(send_control_event_string);
+ UNMOCK(node_describe_longname_by_id);
+ tor_free(received_msg);
+}
+
+struct testcase_t hs_tests[] = {
+ { "hs_desc_event", test_hs_desc_event, TT_FORK,
+ NULL, NULL },
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_logging.c b/src/test/test_logging.c
new file mode 100644
index 000000000..7e558f83b
--- /dev/null
+++ b/src/test/test_logging.c
@@ -0,0 +1,135 @@
+/* Copyright (c) 2013, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#include "orconfig.h"
+#include "or.h"
+#include "torlog.h"
+#include "test.h"
+
+static void
+dummy_cb_fn(int severity, uint32_t domain, const char *msg)
+{
+ (void)severity; (void)domain; (void)msg;
+}
+
+static void
+test_get_sigsafe_err_fds(void *arg)
+{
+ const int *fds;
+ int n;
+ log_severity_list_t include_bug, no_bug, no_bug2;
+ (void) arg;
+ init_logging();
+
+ n = tor_log_get_sigsafe_err_fds(&fds);
+ tt_int_op(n, ==, 1);
+ tt_int_op(fds[0], ==, STDERR_FILENO);
+
+ set_log_severity_config(LOG_WARN, LOG_ERR, &include_bug);
+ set_log_severity_config(LOG_WARN, LOG_ERR, &no_bug);
+ no_bug.masks[0] &= ~(LD_BUG|LD_GENERAL);
+ set_log_severity_config(LOG_INFO, LOG_NOTICE, &no_bug2);
+
+ /* Add some logs; make sure the output is as expected. */
+ mark_logs_temp();
+ add_stream_log(&include_bug, "dummy-1", 3);
+ add_stream_log(&no_bug, "dummy-2", 4);
+ add_stream_log(&no_bug2, "dummy-3", 5);
+ add_callback_log(&include_bug, dummy_cb_fn);
+ close_temp_logs();
+ tor_log_update_sigsafe_err_fds();
+
+ n = tor_log_get_sigsafe_err_fds(&fds);
+ tt_int_op(n, ==, 2);
+ tt_int_op(fds[0], ==, STDERR_FILENO);
+ tt_int_op(fds[1], ==, 3);
+
+ /* Allow STDOUT to replace STDERR. */
+ add_stream_log(&include_bug, "dummy-4", STDOUT_FILENO);
+ tor_log_update_sigsafe_err_fds();
+ n = tor_log_get_sigsafe_err_fds(&fds);
+ tt_int_op(n, ==, 2);
+ tt_int_op(fds[0], ==, 3);
+ tt_int_op(fds[1], ==, STDOUT_FILENO);
+
+ /* But don't allow it to replace explicit STDERR. */
+ add_stream_log(&include_bug, "dummy-5", STDERR_FILENO);
+ tor_log_update_sigsafe_err_fds();
+ n = tor_log_get_sigsafe_err_fds(&fds);
+ tt_int_op(n, ==, 3);
+ tt_int_op(fds[0], ==, STDERR_FILENO);
+ tt_int_op(fds[1], ==, STDOUT_FILENO);
+ tt_int_op(fds[2], ==, 3);
+
+ /* Don't overflow the array. */
+ {
+ int i;
+ for (i=5; i<20; ++i) {
+ add_stream_log(&include_bug, "x-dummy", i);
+ }
+ }
+ tor_log_update_sigsafe_err_fds();
+ n = tor_log_get_sigsafe_err_fds(&fds);
+ tt_int_op(n, ==, 8);
+
+ done:
+ ;
+}
+
+static void
+test_sigsafe_err(void *arg)
+{
+ const char *fn=get_fname("sigsafe_err_log");
+ char *content=NULL;
+ log_severity_list_t include_bug;
+ smartlist_t *lines = smartlist_new();
+ (void)arg;
+
+ set_log_severity_config(LOG_WARN, LOG_ERR, &include_bug);
+
+ init_logging();
+ mark_logs_temp();
+ add_file_log(&include_bug, fn);
+ tor_log_update_sigsafe_err_fds();
+ close_temp_logs();
+
+ close(STDERR_FILENO);
+ log_err(LD_BUG, "Say, this isn't too cool.");
+ tor_log_err_sigsafe("Minimal.\n", NULL);
+
+ set_log_time_granularity(100*1000);
+ tor_log_err_sigsafe("Testing any ",
+ "attempt to manually log ",
+ "from a signal.\n",
+ NULL);
+ mark_logs_temp();
+ close_temp_logs();
+ close(STDERR_FILENO);
+ content = read_file_to_str(fn, 0, NULL);
+
+ tt_assert(content != NULL);
+ tor_split_lines(lines, content, (int)strlen(content));
+ tt_int_op(smartlist_len(lines), >=, 5);
+
+ if (strstr(smartlist_get(lines, 0), "opening new log file"))
+ smartlist_del_keeporder(lines, 0);
+ tt_assert(strstr(smartlist_get(lines, 0), "Say, this isn't too cool"));
+ /* Next line is blank. */
+ tt_assert(!strcmpstart(smartlist_get(lines, 1), "=============="));
+ tt_assert(!strcmpstart(smartlist_get(lines, 2), "Minimal."));
+ /* Next line is blank. */
+ tt_assert(!strcmpstart(smartlist_get(lines, 3), "=============="));
+ tt_str_op(smartlist_get(lines, 4), ==,
+ "Testing any attempt to manually log from a signal.");
+
+ done:
+ tor_free(content);
+ smartlist_free(lines);
+}
+
+struct testcase_t logging_tests[] = {
+ { "sigsafe_err_fds", test_get_sigsafe_err_fds, TT_FORK, NULL, NULL },
+ { "sigsafe_err", test_sigsafe_err, TT_FORK, NULL, NULL },
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_microdesc.c b/src/test/test_microdesc.c
index 53a03a48a..78f4823b8 100644
--- a/src/test/test_microdesc.c
+++ b/src/test/test_microdesc.c
@@ -5,7 +5,10 @@
#include "or.h"
#include "config.h"
+#include "dirvote.h"
#include "microdesc.h"
+#include "routerlist.h"
+#include "routerparse.h"
#include "test.h"
@@ -261,6 +264,7 @@ test_md_cache_broken(void *data)
options = get_options_mutable();
tt_assert(options);
+ tor_free(options->DataDirectory);
options->DataDirectory = tor_strdup(get_fname("md_datadir_test2"));
#ifdef _WIN32
@@ -284,9 +288,113 @@ test_md_cache_broken(void *data)
microdesc_free_all();
}
+/* Generated by chutney. */
+static const char test_ri[] =
+ "router test005r 127.0.0.1 5005 0 7005\n"
+ "platform Tor 0.2.5.4-alpha-dev on Linux\n"
+ "protocols Link 1 2 Circuit 1\n"
+ "published 2014-05-06 22:57:55\n"
+ "fingerprint 09DE 3BA2 48C2 1C3F 3760 6CD3 8460 43A6 D5EC F59E\n"
+ "uptime 0\n"
+ "bandwidth 1073741824 1073741824 0\n"
+ "extra-info-digest 361F9428F9FA4DD854C03DDBCC159D0D9FA996C9\n"
+ "onion-key\n"
+ "-----BEGIN RSA PUBLIC KEY-----\n"
+ "MIGJAoGBANBJz8Vldl12aFeSMPLiA4nOetLDN0oxU8bB1SDhO7Uu2zdWYVYAF5J0\n"
+ "st7WvrVy/jA9v/fsezNAPskBanecHRSkdMTpkcgRPMHE7CTGEwIy1Yp1X4bPgDlC\n"
+ "VCnbs5Pcts5HnWEYNK7qHDAUn+IlmjOO+pTUY8uyq+GQVz6H9wFlAgMBAAE=\n"
+ "-----END RSA PUBLIC KEY-----\n"
+ "signing-key\n"
+ "-----BEGIN RSA PUBLIC KEY-----\n"
+ "MIGJAoGBANbGUC4802Ke6C3nOVxN0U0HhIRrs32cQFEL4v+UUMJPgjbistHBvOax\n"
+ "CWVR/sMXM2kKJeGThJ9ZUs2p9dDG4WHPUXgkMqzTTEeeFa7pQKU0brgbmLaJq0Pi\n"
+ "mxmqC5RkTHa5bQvq6QlSFprAEoovV27cWqBM9jVdV9hyc//6kwPzAgMBAAE=\n"
+ "-----END RSA PUBLIC KEY-----\n"
+ "hidden-service-dir\n"
+ "ntor-onion-key Gg73xH7+kTfT6bi1uNVx9gwQdQas9pROIfmc4NpAdC4=\n"
+ "reject *:25\n"
+ "reject *:119\n"
+ "reject *:135-139\n"
+ "reject *:445\n"
+ "reject *:563\n"
+ "reject *:1214\n"
+ "reject *:4661-4666\n"
+ "reject *:6346-6429\n"
+ "reject *:6699\n"
+ "reject *:6881-6999\n"
+ "accept *:*\n"
+ "router-signature\n"
+ "-----BEGIN SIGNATURE-----\n"
+ "ImzX5PF2vRCrG1YzGToyjoxYhgh1vtHEDjmP+tIS/iil1DSnHZNpHSuHp0L1jE9S\n"
+ "yZyrtKaqpBE/aecAM3j4CWCn/ipnAAQkHcyRLin1bYvqBtRzyopVCRlUhF+uWrLq\n"
+ "t0xkIE39ss/EwmQr7iIgkdVH4oRIMsjYnFFJBG26nYY=\n"
+ "-----END SIGNATURE-----\n";
+
+static const char test_md_8[] =
+ "onion-key\n"
+ "-----BEGIN RSA PUBLIC KEY-----\n"
+ "MIGJAoGBANBJz8Vldl12aFeSMPLiA4nOetLDN0oxU8bB1SDhO7Uu2zdWYVYAF5J0\n"
+ "st7WvrVy/jA9v/fsezNAPskBanecHRSkdMTpkcgRPMHE7CTGEwIy1Yp1X4bPgDlC\n"
+ "VCnbs5Pcts5HnWEYNK7qHDAUn+IlmjOO+pTUY8uyq+GQVz6H9wFlAgMBAAE=\n"
+ "-----END RSA PUBLIC KEY-----\n"
+ "p reject 25,119,135-139,445,563,1214,4661-4666,6346-6429,6699,6881-6999\n";
+
+static const char test_md_16[] =
+ "onion-key\n"
+ "-----BEGIN RSA PUBLIC KEY-----\n"
+ "MIGJAoGBANBJz8Vldl12aFeSMPLiA4nOetLDN0oxU8bB1SDhO7Uu2zdWYVYAF5J0\n"
+ "st7WvrVy/jA9v/fsezNAPskBanecHRSkdMTpkcgRPMHE7CTGEwIy1Yp1X4bPgDlC\n"
+ "VCnbs5Pcts5HnWEYNK7qHDAUn+IlmjOO+pTUY8uyq+GQVz6H9wFlAgMBAAE=\n"
+ "-----END RSA PUBLIC KEY-----\n"
+ "ntor-onion-key Gg73xH7+kTfT6bi1uNVx9gwQdQas9pROIfmc4NpAdC4=\n"
+ "p reject 25,119,135-139,445,563,1214,4661-4666,6346-6429,6699,6881-6999\n";
+
+static const char test_md_18[] =
+ "onion-key\n"
+ "-----BEGIN RSA PUBLIC KEY-----\n"
+ "MIGJAoGBANBJz8Vldl12aFeSMPLiA4nOetLDN0oxU8bB1SDhO7Uu2zdWYVYAF5J0\n"
+ "st7WvrVy/jA9v/fsezNAPskBanecHRSkdMTpkcgRPMHE7CTGEwIy1Yp1X4bPgDlC\n"
+ "VCnbs5Pcts5HnWEYNK7qHDAUn+IlmjOO+pTUY8uyq+GQVz6H9wFlAgMBAAE=\n"
+ "-----END RSA PUBLIC KEY-----\n"
+ "ntor-onion-key Gg73xH7+kTfT6bi1uNVx9gwQdQas9pROIfmc4NpAdC4=\n"
+ "p reject 25,119,135-139,445,563,1214,4661-4666,6346-6429,6699,6881-6999\n"
+ "id rsa1024 Cd47okjCHD83YGzThGBDptXs9Z4\n";
+
+static void
+test_md_generate(void *arg)
+{
+ routerinfo_t *ri;
+ microdesc_t *md = NULL;
+ (void)arg;
+
+ ri = router_parse_entry_from_string(test_ri, NULL, 0, 0, NULL);
+ tt_assert(ri);
+ md = dirvote_create_microdescriptor(ri, 8);
+ tt_str_op(md->body, ==, test_md_8);
+
+ /* XXXX test family lines. */
+ /* XXXX test method 14 for A lines. */
+ /* XXXX test method 15 for P6 lines. */
+
+ microdesc_free(md);
+ md = NULL;
+ md = dirvote_create_microdescriptor(ri, 16);
+ tt_str_op(md->body, ==, test_md_16);
+
+ microdesc_free(md);
+ md = NULL;
+ md = dirvote_create_microdescriptor(ri, 18);
+ tt_str_op(md->body, ==, test_md_18);
+
+ done:
+ microdesc_free(md);
+ routerinfo_free(ri);
+}
+
struct testcase_t microdesc_tests[] = {
{ "cache", test_md_cache, TT_FORK, NULL, NULL },
{ "broken_cache", test_md_cache_broken, TT_FORK, NULL, NULL },
+ { "generate", test_md_generate, 0, NULL, NULL },
END_OF_TESTCASES
};
diff --git a/src/test/test_nodelist.c b/src/test/test_nodelist.c
new file mode 100644
index 000000000..600e6a89d
--- /dev/null
+++ b/src/test/test_nodelist.c
@@ -0,0 +1,71 @@
+/* Copyright (c) 2007-2013, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file test_nodelist.c
+ * \brief Unit tests for nodelist related functions.
+ **/
+
+#include "or.h"
+#include "nodelist.h"
+#include "test.h"
+
+/** Tese the case when node_get_by_id() returns NULL,
+ * node_get_verbose_nickname_by_id should return the base 16 encoding
+ * of the id.
+ */
+static void
+test_nodelist_node_get_verbose_nickname_by_id_null_node(void *arg)
+{
+ char vname[MAX_VERBOSE_NICKNAME_LEN+1];
+ const char ID[] = "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
+ "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA";
+ (void) arg;
+
+ /* make sure node_get_by_id returns NULL */
+ test_assert(!node_get_by_id(ID));
+ node_get_verbose_nickname_by_id(ID, vname);
+ test_streq(vname, "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
+ done:
+ return;
+}
+
+/** For routers without named flag, get_verbose_nickname should return
+ * "Fingerprint~Nickname"
+ */
+static void
+test_nodelist_node_get_verbose_nickname_not_named(void *arg)
+{
+ node_t mock_node;
+ routerstatus_t mock_rs;
+
+ char vname[MAX_VERBOSE_NICKNAME_LEN+1];
+
+ (void) arg;
+
+ memset(&mock_node, 0, sizeof(node_t));
+ memset(&mock_rs, 0, sizeof(routerstatus_t));
+
+ /* verbose nickname should use ~ instead of = for unnamed routers */
+ strlcpy(mock_rs.nickname, "TestOR", sizeof(mock_rs.nickname));
+ mock_node.rs = &mock_rs;
+ memcpy(mock_node.identity,
+ "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
+ "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA",
+ DIGEST_LEN);
+ node_get_verbose_nickname(&mock_node, vname);
+ test_streq(vname, "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~TestOR");
+
+ done:
+ return;
+}
+
+#define NODE(name, flags) \
+ { #name, test_nodelist_##name, (flags), NULL, NULL }
+
+struct testcase_t nodelist_tests[] = {
+ NODE(node_get_verbose_nickname_by_id_null_node, TT_FORK),
+ NODE(node_get_verbose_nickname_not_named, TT_FORK),
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_oom.c b/src/test/test_oom.c
new file mode 100644
index 000000000..32f4803bb
--- /dev/null
+++ b/src/test/test_oom.c
@@ -0,0 +1,372 @@
+/* Copyright (c) 2014, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/* Unit tests for OOM handling logic */
+
+#define RELAY_PRIVATE
+#define BUFFERS_PRIVATE
+#define CIRCUITLIST_PRIVATE
+#define CONNECTION_PRIVATE
+#include "or.h"
+#include "buffers.h"
+#include "circuitlist.h"
+#include "compat_libevent.h"
+#include "connection.h"
+#include "config.h"
+#ifdef ENABLE_MEMPOOLS
+#include "mempool.h"
+#endif
+#include "relay.h"
+#include "test.h"
+
+/* small replacement mock for circuit_mark_for_close_ to avoid doing all
+ * the other bookkeeping that comes with marking circuits. */
+static void
+circuit_mark_for_close_dummy_(circuit_t *circ, int reason, int line,
+ const char *file)
+{
+ (void) reason;
+ if (circ->marked_for_close) {
+ TT_FAIL(("Circuit already marked for close at %s:%d, but we are marking "
+ "it again at %s:%d",
+ circ->marked_for_close_file, (int)circ->marked_for_close,
+ file, line));
+ }
+
+ circ->marked_for_close = line;
+ circ->marked_for_close_file = file;
+}
+
+static circuit_t *
+dummy_or_circuit_new(int n_p_cells, int n_n_cells)
+{
+ or_circuit_t *circ = or_circuit_new(0, NULL);
+ int i;
+ cell_t cell;
+
+ for (i=0; i < n_p_cells; ++i) {
+ crypto_rand((void*)&cell, sizeof(cell));
+ cell_queue_append_packed_copy(TO_CIRCUIT(circ), &circ->p_chan_cells,
+ 0, &cell, 1, 0);
+ }
+
+ for (i=0; i < n_n_cells; ++i) {
+ crypto_rand((void*)&cell, sizeof(cell));
+ cell_queue_append_packed_copy(TO_CIRCUIT(circ),
+ &TO_CIRCUIT(circ)->n_chan_cells,
+ 1, &cell, 1, 0);
+ }
+
+ TO_CIRCUIT(circ)->purpose = CIRCUIT_PURPOSE_OR;
+ return TO_CIRCUIT(circ);
+}
+
+static circuit_t *
+dummy_origin_circuit_new(int n_cells)
+{
+ origin_circuit_t *circ = origin_circuit_new();
+ int i;
+ cell_t cell;
+
+ for (i=0; i < n_cells; ++i) {
+ crypto_rand((void*)&cell, sizeof(cell));
+ cell_queue_append_packed_copy(TO_CIRCUIT(circ),
+ &TO_CIRCUIT(circ)->n_chan_cells,
+ 1, &cell, 1, 0);
+ }
+
+ TO_CIRCUIT(circ)->purpose = CIRCUIT_PURPOSE_C_GENERAL;
+ return TO_CIRCUIT(circ);
+}
+
+static void
+add_bytes_to_buf(generic_buffer_t *buf, size_t n_bytes)
+{
+ char b[3000];
+
+ while (n_bytes) {
+ size_t this_add = n_bytes > sizeof(b) ? sizeof(b) : n_bytes;
+ crypto_rand(b, this_add);
+ generic_buffer_add(buf, b, this_add);
+ n_bytes -= this_add;
+ }
+}
+
+static edge_connection_t *
+dummy_edge_conn_new(circuit_t *circ,
+ int type, size_t in_bytes, size_t out_bytes)
+{
+ edge_connection_t *conn;
+
+ if (type == CONN_TYPE_EXIT)
+ conn = edge_connection_new(type, AF_INET);
+ else
+ conn = ENTRY_TO_EDGE_CONN(entry_connection_new(type, AF_INET));
+
+ /* We add these bytes directly to the buffers, to avoid all the
+ * edge connection read/write machinery. */
+ add_bytes_to_buf(TO_CONN(conn)->inbuf, in_bytes);
+ add_bytes_to_buf(TO_CONN(conn)->outbuf, out_bytes);
+
+ conn->on_circuit = circ;
+ if (type == CONN_TYPE_EXIT) {
+ or_circuit_t *oc = TO_OR_CIRCUIT(circ);
+ conn->next_stream = oc->n_streams;
+ oc->n_streams = conn;
+ } else {
+ origin_circuit_t *oc = TO_ORIGIN_CIRCUIT(circ);
+ conn->next_stream = oc->p_streams;
+ oc->p_streams = conn;
+ }
+
+ return conn;
+}
+
+/** Run unit tests for buffers.c */
+static void
+test_oom_circbuf(void *arg)
+{
+ or_options_t *options = get_options_mutable();
+ circuit_t *c1 = NULL, *c2 = NULL, *c3 = NULL, *c4 = NULL;
+ struct timeval tv = { 1389631048, 0 };
+
+ (void) arg;
+
+ MOCK(circuit_mark_for_close_, circuit_mark_for_close_dummy_);
+
+#ifdef ENABLE_MEMPOOLS
+ init_cell_pool();
+#endif /* ENABLE_MEMPOOLS */
+
+ /* Far too low for real life. */
+ options->MaxMemInQueues = 256*packed_cell_mem_cost();
+ options->CellStatistics = 0;
+
+ tt_int_op(cell_queues_check_size(), ==, 0); /* We don't start out OOM. */
+ tt_int_op(cell_queues_get_total_allocation(), ==, 0);
+ tt_int_op(buf_get_total_allocation(), ==, 0);
+
+ /* Now we're going to fake up some circuits and get them added to the global
+ circuit list. */
+ tv.tv_usec = 0;
+ tor_gettimeofday_cache_set(&tv);
+ c1 = dummy_origin_circuit_new(30);
+ tv.tv_usec = 10*1000;
+ tor_gettimeofday_cache_set(&tv);
+ c2 = dummy_or_circuit_new(20, 20);
+
+#ifdef ENABLE_MEMPOOLS
+ tt_int_op(packed_cell_mem_cost(), ==,
+ sizeof(packed_cell_t) + MP_POOL_ITEM_OVERHEAD);
+#else
+ tt_int_op(packed_cell_mem_cost(), ==,
+ sizeof(packed_cell_t));
+#endif /* ENABLE_MEMPOOLS */
+ tt_int_op(cell_queues_get_total_allocation(), ==,
+ packed_cell_mem_cost() * 70);
+ tt_int_op(cell_queues_check_size(), ==, 0); /* We are still not OOM */
+
+ tv.tv_usec = 20*1000;
+ tor_gettimeofday_cache_set(&tv);
+ c3 = dummy_or_circuit_new(100, 85);
+ tt_int_op(cell_queues_check_size(), ==, 0); /* We are still not OOM */
+ tt_int_op(cell_queues_get_total_allocation(), ==,
+ packed_cell_mem_cost() * 255);
+
+ tv.tv_usec = 30*1000;
+ tor_gettimeofday_cache_set(&tv);
+ /* Adding this cell will trigger our OOM handler. */
+ c4 = dummy_or_circuit_new(2, 0);
+
+ tt_int_op(cell_queues_get_total_allocation(), ==,
+ packed_cell_mem_cost() * 257);
+
+ tt_int_op(cell_queues_check_size(), ==, 1); /* We are now OOM */
+
+ tt_assert(c1->marked_for_close);
+ tt_assert(! c2->marked_for_close);
+ tt_assert(! c3->marked_for_close);
+ tt_assert(! c4->marked_for_close);
+
+ tt_int_op(cell_queues_get_total_allocation(), ==,
+ packed_cell_mem_cost() * (257 - 30));
+
+ circuit_free(c1);
+ tv.tv_usec = 0;
+ tor_gettimeofday_cache_set(&tv); /* go back in time */
+ c1 = dummy_or_circuit_new(90, 0);
+
+ tv.tv_usec = 40*1000; /* go back to the future */
+ tor_gettimeofday_cache_set(&tv);
+
+ tt_int_op(cell_queues_check_size(), ==, 1); /* We are now OOM */
+
+ tt_assert(c1->marked_for_close);
+ tt_assert(! c2->marked_for_close);
+ tt_assert(! c3->marked_for_close);
+ tt_assert(! c4->marked_for_close);
+
+ tt_int_op(cell_queues_get_total_allocation(), ==,
+ packed_cell_mem_cost() * (257 - 30));
+
+ done:
+ circuit_free(c1);
+ circuit_free(c2);
+ circuit_free(c3);
+ circuit_free(c4);
+
+ UNMOCK(circuit_mark_for_close_);
+}
+
+/** Run unit tests for buffers.c */
+static void
+test_oom_streambuf(void *arg)
+{
+ or_options_t *options = get_options_mutable();
+ circuit_t *c1 = NULL, *c2 = NULL, *c3 = NULL, *c4 = NULL, *c5 = NULL;
+ struct timeval tv = { 1389641159, 0 };
+ uint32_t tvms;
+ int i;
+ smartlist_t *edgeconns = smartlist_new();
+
+ (void) arg;
+
+ MOCK(circuit_mark_for_close_, circuit_mark_for_close_dummy_);
+
+#ifdef ENABLE_MEMPOOLS
+ init_cell_pool();
+#endif /* ENABLE_MEMPOOLS */
+
+ /* Far too low for real life. */
+ options->MaxMemInQueues = 81*packed_cell_mem_cost() + 4096 * 34;
+ options->CellStatistics = 0;
+
+ tt_int_op(cell_queues_check_size(), ==, 0); /* We don't start out OOM. */
+ tt_int_op(cell_queues_get_total_allocation(), ==, 0);
+ tt_int_op(buf_get_total_allocation(), ==, 0);
+
+ /* Start all circuits with a bit of data queued in cells */
+ tv.tv_usec = 500*1000; /* go halfway into the second. */
+ tor_gettimeofday_cache_set(&tv);
+ c1 = dummy_or_circuit_new(10,10);
+ tv.tv_usec = 510*1000;
+ tor_gettimeofday_cache_set(&tv);
+ c2 = dummy_origin_circuit_new(20);
+ tv.tv_usec = 520*1000;
+ tor_gettimeofday_cache_set(&tv);
+ c3 = dummy_or_circuit_new(20,20);
+ tv.tv_usec = 530*1000;
+ tor_gettimeofday_cache_set(&tv);
+ c4 = dummy_or_circuit_new(0,0);
+ tt_int_op(cell_queues_get_total_allocation(), ==,
+ packed_cell_mem_cost() * 80);
+
+ tv.tv_usec = 600*1000;
+ tor_gettimeofday_cache_set(&tv);
+
+ /* Add some connections to c1...c4. */
+ for (i = 0; i < 4; ++i) {
+ edge_connection_t *ec;
+ /* link it to a circuit */
+ tv.tv_usec += 10*1000;
+ tor_gettimeofday_cache_set(&tv);
+ ec = dummy_edge_conn_new(c1, CONN_TYPE_EXIT, 1000, 1000);
+ tt_assert(ec);
+ smartlist_add(edgeconns, ec);
+ tv.tv_usec += 10*1000;
+ tor_gettimeofday_cache_set(&tv);
+ ec = dummy_edge_conn_new(c2, CONN_TYPE_AP, 1000, 1000);
+ tt_assert(ec);
+ smartlist_add(edgeconns, ec);
+ tv.tv_usec += 10*1000;
+ tor_gettimeofday_cache_set(&tv);
+ ec = dummy_edge_conn_new(c4, CONN_TYPE_EXIT, 1000, 1000); /* Yes, 4 twice*/
+ tt_assert(ec);
+ smartlist_add(edgeconns, ec);
+ tv.tv_usec += 10*1000;
+ tor_gettimeofday_cache_set(&tv);
+ ec = dummy_edge_conn_new(c4, CONN_TYPE_EXIT, 1000, 1000);
+ smartlist_add(edgeconns, ec);
+ tt_assert(ec);
+ }
+
+ tv.tv_sec += 1;
+ tv.tv_usec = 0;
+ tvms = (uint32_t) tv_to_msec(&tv);
+
+ tt_int_op(circuit_max_queued_cell_age(c1, tvms), ==, 500);
+ tt_int_op(circuit_max_queued_cell_age(c2, tvms), ==, 490);
+ tt_int_op(circuit_max_queued_cell_age(c3, tvms), ==, 480);
+ tt_int_op(circuit_max_queued_cell_age(c4, tvms), ==, 0);
+
+ tt_int_op(circuit_max_queued_data_age(c1, tvms), ==, 390);
+ tt_int_op(circuit_max_queued_data_age(c2, tvms), ==, 380);
+ tt_int_op(circuit_max_queued_data_age(c3, tvms), ==, 0);
+ tt_int_op(circuit_max_queued_data_age(c4, tvms), ==, 370);
+
+ tt_int_op(circuit_max_queued_item_age(c1, tvms), ==, 500);
+ tt_int_op(circuit_max_queued_item_age(c2, tvms), ==, 490);
+ tt_int_op(circuit_max_queued_item_age(c3, tvms), ==, 480);
+ tt_int_op(circuit_max_queued_item_age(c4, tvms), ==, 370);
+
+ tt_int_op(cell_queues_get_total_allocation(), ==,
+ packed_cell_mem_cost() * 80);
+ tt_int_op(buf_get_total_allocation(), ==, 4096*16*2);
+
+ /* Now give c4 a very old buffer of modest size */
+ {
+ edge_connection_t *ec;
+ tv.tv_sec -= 1;
+ tv.tv_usec = 0;
+ tor_gettimeofday_cache_set(&tv);
+ ec = dummy_edge_conn_new(c4, CONN_TYPE_EXIT, 1000, 1000);
+ tt_assert(ec);
+ smartlist_add(edgeconns, ec);
+ }
+ tt_int_op(buf_get_total_allocation(), ==, 4096*17*2);
+ tt_int_op(circuit_max_queued_item_age(c4, tvms), ==, 1000);
+
+ tt_int_op(cell_queues_check_size(), ==, 0);
+
+ /* And run over the limit. */
+ tv.tv_usec = 800*1000;
+ tor_gettimeofday_cache_set(&tv);
+ c5 = dummy_or_circuit_new(0,5);
+
+ tt_int_op(cell_queues_get_total_allocation(), ==,
+ packed_cell_mem_cost() * 85);
+ tt_int_op(buf_get_total_allocation(), ==, 4096*17*2);
+
+ tt_int_op(cell_queues_check_size(), ==, 1); /* We are now OOM */
+
+ /* C4 should have died. */
+ tt_assert(! c1->marked_for_close);
+ tt_assert(! c2->marked_for_close);
+ tt_assert(! c3->marked_for_close);
+ tt_assert(c4->marked_for_close);
+ tt_assert(! c5->marked_for_close);
+
+ tt_int_op(cell_queues_get_total_allocation(), ==,
+ packed_cell_mem_cost() * 85);
+ tt_int_op(buf_get_total_allocation(), ==, 4096*8*2);
+
+ done:
+ circuit_free(c1);
+ circuit_free(c2);
+ circuit_free(c3);
+ circuit_free(c4);
+ circuit_free(c5);
+
+ SMARTLIST_FOREACH(edgeconns, edge_connection_t *, ec,
+ connection_free_(TO_CONN(ec)));
+ smartlist_free(edgeconns);
+
+ UNMOCK(circuit_mark_for_close_);
+}
+
+struct testcase_t oom_tests[] = {
+ { "circbuf", test_oom_circbuf, TT_FORK, NULL, NULL },
+ { "streambuf", test_oom_streambuf, TT_FORK, NULL, NULL },
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_options.c b/src/test/test_options.c
new file mode 100644
index 000000000..737f658e2
--- /dev/null
+++ b/src/test/test_options.c
@@ -0,0 +1,170 @@
+/* Copyright (c) 2001-2004, Roger Dingledine.
+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
+ * Copyright (c) 2007-2013, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#define CONFIG_PRIVATE
+#include "or.h"
+#include "confparse.h"
+#include "config.h"
+#include "test.h"
+
+typedef struct {
+ int severity;
+ uint32_t domain;
+ char *msg;
+} logmsg_t;
+
+static smartlist_t *messages = NULL;
+
+static void
+log_cback(int severity, uint32_t domain, const char *msg)
+{
+ logmsg_t *x = tor_malloc(sizeof(*x));
+ x->severity = severity;
+ x->domain = domain;
+ x->msg = tor_strdup(msg);
+ if (!messages)
+ messages = smartlist_new();
+ smartlist_add(messages, x);
+}
+
+static void
+setup_log_callback(void)
+{
+ log_severity_list_t lst;
+ memset(&lst, 0, sizeof(lst));
+ lst.masks[LOG_ERR - LOG_ERR] = ~0;
+ lst.masks[LOG_WARN - LOG_ERR] = ~0;
+ lst.masks[LOG_NOTICE - LOG_ERR] = ~0;
+ add_callback_log(&lst, log_cback);
+}
+
+static char *
+dump_logs(void)
+{
+ smartlist_t *msgs;
+ char *out;
+ if (! messages)
+ return tor_strdup("");
+ msgs = smartlist_new();
+ SMARTLIST_FOREACH_BEGIN(messages, logmsg_t *, x) {
+ smartlist_add_asprintf(msgs, "[%s] %s",
+ log_level_to_string(x->severity), x->msg);
+ } SMARTLIST_FOREACH_END(x);
+ out = smartlist_join_strings(msgs, "", 0, NULL);
+ SMARTLIST_FOREACH(msgs, char *, cp, tor_free(cp));
+ smartlist_free(msgs);
+ return out;
+}
+
+static void
+clear_log_messages(void)
+{
+ if (!messages)
+ return;
+ SMARTLIST_FOREACH(messages, logmsg_t *, m,
+ { tor_free(m->msg); tor_free(m); });
+ smartlist_free(messages);
+ messages = NULL;
+}
+
+static void
+test_options_validate_impl(const char *configuration,
+ const char *expect_errmsg,
+ int expect_log_severity,
+ const char *expect_log)
+{
+ or_options_t *opt = options_new();
+ or_options_t *dflt;
+ config_line_t *cl=NULL;
+ char *msg=NULL;
+ int r;
+ opt->command = CMD_RUN_TOR;
+ options_init(opt);
+
+ dflt = config_dup(&options_format, opt);
+ clear_log_messages();
+
+ r = config_get_lines(configuration, &cl, 1);
+ tt_int_op(r, ==, 0);
+
+ r = config_assign(&options_format, opt, cl, 0, 0, &msg);
+ tt_int_op(r, ==, 0);
+
+ r = options_validate(NULL, opt, dflt, 0, &msg);
+ if (expect_errmsg && !msg) {
+ TT_DIE(("Expected error message <%s> from <%s>, but got none.",
+ expect_errmsg, configuration));
+ } else if (expect_errmsg && !strstr(msg, expect_errmsg)) {
+ TT_DIE(("Expected error message <%s> from <%s>, but got <%s>.",
+ expect_errmsg, configuration, msg));
+ } else if (!expect_errmsg && msg) {
+ TT_DIE(("Expected no error message from <%s> but got <%s>.",
+ configuration, msg));
+ }
+ tt_int_op((r == 0), ==, (msg == NULL));
+
+ if (expect_log) {
+ int found = 0;
+ if (messages) {
+ SMARTLIST_FOREACH_BEGIN(messages, logmsg_t *, m) {
+ if (m->severity == expect_log_severity &&
+ strstr(m->msg, expect_log)) {
+ found = 1;
+ break;
+ }
+ } SMARTLIST_FOREACH_END(m);
+ }
+ if (!found) {
+ tor_free(msg);
+ msg = dump_logs();
+ TT_DIE(("Expected log message [%s] %s from <%s>, but got <%s>.",
+ log_level_to_string(expect_log_severity), expect_log,
+ configuration, msg));
+ }
+ }
+
+ done:
+ config_free_lines(cl);
+ or_options_free(opt);
+ or_options_free(dflt);
+ tor_free(msg);
+ clear_log_messages();
+}
+
+#define WANT_ERR(config, msg) \
+ test_options_validate_impl((config), (msg), 0, NULL)
+#define WANT_LOG(config, severity, msg) \
+ test_options_validate_impl((config), NULL, (severity), (msg))
+#define WANT_ERR_LOG(config, msg, severity, logmsg) \
+ test_options_validate_impl((config), (msg), (severity), (logmsg))
+#define OK(config) \
+ test_options_validate_impl((config), NULL, 0, NULL)
+
+static void
+test_options_validate(void *arg)
+{
+ (void)arg;
+ setup_log_callback();
+
+ WANT_ERR("ExtORPort 500000", "Invalid ExtORPort");
+
+ WANT_ERR_LOG("ServerTransportOptions trebuchet",
+ "ServerTransportOptions did not parse",
+ LOG_WARN, "Too few arguments");
+ OK("ServerTransportOptions trebuchet sling=snappy");
+ OK("ServerTransportOptions trebuchet sling=");
+ WANT_ERR_LOG("ServerTransportOptions trebuchet slingsnappy",
+ "ServerTransportOptions did not parse",
+ LOG_WARN, "\"slingsnappy\" is not a k=v");
+
+ clear_log_messages();
+ return;
+}
+
+struct testcase_t options_tests[] = {
+ { "validate", test_options_validate, TT_FORK, NULL, NULL },
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_policy.c b/src/test/test_policy.c
new file mode 100644
index 000000000..4cdcd034b
--- /dev/null
+++ b/src/test/test_policy.c
@@ -0,0 +1,437 @@
+/* Copyright (c) 2013, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#include "or.h"
+#include "router.h"
+#include "routerparse.h"
+#include "policies.h"
+#include "test.h"
+
+/* Helper: assert that short_policy parses and writes back out as itself,
+ or as <b>expected</b> if that's provided. */
+static void
+test_short_policy_parse(const char *input,
+ const char *expected)
+{
+ short_policy_t *short_policy = NULL;
+ char *out = NULL;
+
+ if (expected == NULL)
+ expected = input;
+
+ short_policy = parse_short_policy(input);
+ tt_assert(short_policy);
+ out = write_short_policy(short_policy);
+ tt_str_op(out, ==, expected);
+
+ done:
+ tor_free(out);
+ short_policy_free(short_policy);
+}
+
+/** Helper: Parse the exit policy string in <b>policy_str</b>, and make sure
+ * that policies_summarize() produces the string <b>expected_summary</b> from
+ * it. */
+static void
+test_policy_summary_helper(const char *policy_str,
+ const char *expected_summary)
+{
+ config_line_t line;
+ smartlist_t *policy = smartlist_new();
+ char *summary = NULL;
+ char *summary_after = NULL;
+ int r;
+ short_policy_t *short_policy = NULL;
+
+ line.key = (char*)"foo";
+ line.value = (char *)policy_str;
+ line.next = NULL;
+
+ r = policies_parse_exit_policy(&line, &policy, 1, 0, 0, 1);
+ test_eq(r, 0);
+ summary = policy_summarize(policy, AF_INET);
+
+ test_assert(summary != NULL);
+ test_streq(summary, expected_summary);
+
+ short_policy = parse_short_policy(summary);
+ tt_assert(short_policy);
+ summary_after = write_short_policy(short_policy);
+ test_streq(summary, summary_after);
+
+ done:
+ tor_free(summary_after);
+ tor_free(summary);
+ if (policy)
+ addr_policy_list_free(policy);
+ short_policy_free(short_policy);
+}
+
+/** Run unit tests for generating summary lines of exit policies */
+static void
+test_policies_general(void *arg)
+{
+ int i;
+ smartlist_t *policy = NULL, *policy2 = NULL, *policy3 = NULL,
+ *policy4 = NULL, *policy5 = NULL, *policy6 = NULL,
+ *policy7 = NULL;
+ addr_policy_t *p;
+ tor_addr_t tar;
+ config_line_t line;
+ smartlist_t *sm = NULL;
+ char *policy_str = NULL;
+ short_policy_t *short_parsed = NULL;
+ (void)arg;
+
+ policy = smartlist_new();
+
+ p = router_parse_addr_policy_item_from_string("reject 192.168.0.0/16:*",-1);
+ test_assert(p != NULL);
+ test_eq(ADDR_POLICY_REJECT, p->policy_type);
+ tor_addr_from_ipv4h(&tar, 0xc0a80000u);
+ test_eq(0, tor_addr_compare(&p->addr, &tar, CMP_EXACT));
+ test_eq(16, p->maskbits);
+ test_eq(1, p->prt_min);
+ test_eq(65535, p->prt_max);
+
+ smartlist_add(policy, p);
+
+ tor_addr_from_ipv4h(&tar, 0x01020304u);
+ test_assert(ADDR_POLICY_ACCEPTED ==
+ compare_tor_addr_to_addr_policy(&tar, 2, policy));
+ tor_addr_make_unspec(&tar);
+ test_assert(ADDR_POLICY_PROBABLY_ACCEPTED ==
+ compare_tor_addr_to_addr_policy(&tar, 2, policy));
+ tor_addr_from_ipv4h(&tar, 0xc0a80102);
+ test_assert(ADDR_POLICY_REJECTED ==
+ compare_tor_addr_to_addr_policy(&tar, 2, policy));
+
+ test_assert(0 == policies_parse_exit_policy(NULL, &policy2, 1, 1, 0, 1));
+ test_assert(policy2);
+
+ policy3 = smartlist_new();
+ p = router_parse_addr_policy_item_from_string("reject *:*",-1);
+ test_assert(p != NULL);
+ smartlist_add(policy3, p);
+ p = router_parse_addr_policy_item_from_string("accept *:*",-1);
+ test_assert(p != NULL);
+ smartlist_add(policy3, p);
+
+ policy4 = smartlist_new();
+ p = router_parse_addr_policy_item_from_string("accept *:443",-1);
+ test_assert(p != NULL);
+ smartlist_add(policy4, p);
+ p = router_parse_addr_policy_item_from_string("accept *:443",-1);
+ test_assert(p != NULL);
+ smartlist_add(policy4, p);
+
+ policy5 = smartlist_new();
+ p = router_parse_addr_policy_item_from_string("reject 0.0.0.0/8:*",-1);
+ test_assert(p != NULL);
+ smartlist_add(policy5, p);
+ p = router_parse_addr_policy_item_from_string("reject 169.254.0.0/16:*",-1);
+ test_assert(p != NULL);
+ smartlist_add(policy5, p);
+ p = router_parse_addr_policy_item_from_string("reject 127.0.0.0/8:*",-1);
+ test_assert(p != NULL);
+ smartlist_add(policy5, p);
+ p = router_parse_addr_policy_item_from_string("reject 192.168.0.0/16:*",-1);
+ test_assert(p != NULL);
+ smartlist_add(policy5, p);
+ p = router_parse_addr_policy_item_from_string("reject 10.0.0.0/8:*",-1);
+ test_assert(p != NULL);
+ smartlist_add(policy5, p);
+ p = router_parse_addr_policy_item_from_string("reject 172.16.0.0/12:*",-1);
+ test_assert(p != NULL);
+ smartlist_add(policy5, p);
+ p = router_parse_addr_policy_item_from_string("reject 80.190.250.90:*",-1);
+ test_assert(p != NULL);
+ smartlist_add(policy5, p);
+ p = router_parse_addr_policy_item_from_string("reject *:1-65534",-1);
+ test_assert(p != NULL);
+ smartlist_add(policy5, p);
+ p = router_parse_addr_policy_item_from_string("reject *:65535",-1);
+ test_assert(p != NULL);
+ smartlist_add(policy5, p);
+ p = router_parse_addr_policy_item_from_string("accept *:1-65535",-1);
+ test_assert(p != NULL);
+ smartlist_add(policy5, p);
+
+ policy6 = smartlist_new();
+ p = router_parse_addr_policy_item_from_string("accept 43.3.0.0/9:*",-1);
+ test_assert(p != NULL);
+ smartlist_add(policy6, p);
+
+ policy7 = smartlist_new();
+ p = router_parse_addr_policy_item_from_string("accept 0.0.0.0/8:*",-1);
+ test_assert(p != NULL);
+ smartlist_add(policy7, p);
+
+ test_assert(!exit_policy_is_general_exit(policy));
+ test_assert(exit_policy_is_general_exit(policy2));
+ test_assert(!exit_policy_is_general_exit(NULL));
+ test_assert(!exit_policy_is_general_exit(policy3));
+ test_assert(!exit_policy_is_general_exit(policy4));
+ test_assert(!exit_policy_is_general_exit(policy5));
+ test_assert(!exit_policy_is_general_exit(policy6));
+ test_assert(!exit_policy_is_general_exit(policy7));
+
+ test_assert(cmp_addr_policies(policy, policy2));
+ test_assert(cmp_addr_policies(policy, NULL));
+ test_assert(!cmp_addr_policies(policy2, policy2));
+ test_assert(!cmp_addr_policies(NULL, NULL));
+
+ test_assert(!policy_is_reject_star(policy2, AF_INET));
+ test_assert(policy_is_reject_star(policy, AF_INET));
+ test_assert(policy_is_reject_star(NULL, AF_INET));
+
+ addr_policy_list_free(policy);
+ policy = NULL;
+
+ /* make sure compacting logic works. */
+ policy = NULL;
+ line.key = (char*)"foo";
+ line.value = (char*)"accept *:80,reject private:*,reject *:*";
+ line.next = NULL;
+ test_assert(0 == policies_parse_exit_policy(&line, &policy, 1, 0, 0, 1));
+ test_assert(policy);
+ //test_streq(policy->string, "accept *:80");
+ //test_streq(policy->next->string, "reject *:*");
+ test_eq(smartlist_len(policy), 4);
+
+ /* test policy summaries */
+ /* check if we properly ignore private IP addresses */
+ test_policy_summary_helper("reject 192.168.0.0/16:*,"
+ "reject 0.0.0.0/8:*,"
+ "reject 10.0.0.0/8:*,"
+ "accept *:10-30,"
+ "accept *:90,"
+ "reject *:*",
+ "accept 10-30,90");
+ /* check all accept policies, and proper counting of rejects */
+ test_policy_summary_helper("reject 11.0.0.0/9:80,"
+ "reject 12.0.0.0/9:80,"
+ "reject 13.0.0.0/9:80,"
+ "reject 14.0.0.0/9:80,"
+ "accept *:*", "accept 1-65535");
+ test_policy_summary_helper("reject 11.0.0.0/9:80,"
+ "reject 12.0.0.0/9:80,"
+ "reject 13.0.0.0/9:80,"
+ "reject 14.0.0.0/9:80,"
+ "reject 15.0.0.0:81,"
+ "accept *:*", "accept 1-65535");
+ test_policy_summary_helper("reject 11.0.0.0/9:80,"
+ "reject 12.0.0.0/9:80,"
+ "reject 13.0.0.0/9:80,"
+ "reject 14.0.0.0/9:80,"
+ "reject 15.0.0.0:80,"
+ "accept *:*",
+ "reject 80");
+ /* no exits */
+ test_policy_summary_helper("accept 11.0.0.0/9:80,"
+ "reject *:*",
+ "reject 1-65535");
+ /* port merging */
+ test_policy_summary_helper("accept *:80,"
+ "accept *:81,"
+ "accept *:100-110,"
+ "accept *:111,"
+ "reject *:*",
+ "accept 80-81,100-111");
+ /* border ports */
+ test_policy_summary_helper("accept *:1,"
+ "accept *:3,"
+ "accept *:65535,"
+ "reject *:*",
+ "accept 1,3,65535");
+ /* holes */
+ test_policy_summary_helper("accept *:1,"
+ "accept *:3,"
+ "accept *:5,"
+ "accept *:7,"
+ "reject *:*",
+ "accept 1,3,5,7");
+ test_policy_summary_helper("reject *:1,"
+ "reject *:3,"
+ "reject *:5,"
+ "reject *:7,"
+ "accept *:*",
+ "reject 1,3,5,7");
+
+ /* Short policies with unrecognized formats should get accepted. */
+ test_short_policy_parse("accept fred,2,3-5", "accept 2,3-5");
+ test_short_policy_parse("accept 2,fred,3", "accept 2,3");
+ test_short_policy_parse("accept 2,fred,3,bob", "accept 2,3");
+ test_short_policy_parse("accept 2,-3,500-600", "accept 2,500-600");
+ /* Short policies with nil entries are accepted too. */
+ test_short_policy_parse("accept 1,,3", "accept 1,3");
+ test_short_policy_parse("accept 100-200,,", "accept 100-200");
+ test_short_policy_parse("reject ,1-10,,,,30-40", "reject 1-10,30-40");
+
+ /* Try parsing various broken short policies */
+#define TT_BAD_SHORT_POLICY(s) \
+ do { \
+ tt_ptr_op(NULL, ==, (short_parsed = parse_short_policy((s)))); \
+ } while (0)
+ TT_BAD_SHORT_POLICY("accept 200-199");
+ TT_BAD_SHORT_POLICY("");
+ TT_BAD_SHORT_POLICY("rejekt 1,2,3");
+ TT_BAD_SHORT_POLICY("reject ");
+ TT_BAD_SHORT_POLICY("reject");
+ TT_BAD_SHORT_POLICY("rej");
+ TT_BAD_SHORT_POLICY("accept 2,3,100000");
+ TT_BAD_SHORT_POLICY("accept 2,3x,4");
+ TT_BAD_SHORT_POLICY("accept 2,3x,4");
+ TT_BAD_SHORT_POLICY("accept 2-");
+ TT_BAD_SHORT_POLICY("accept 2-x");
+ TT_BAD_SHORT_POLICY("accept 1-,3");
+ TT_BAD_SHORT_POLICY("accept 1-,3");
+
+ /* Test a too-long policy. */
+ {
+ int i;
+ char *policy = NULL;
+ smartlist_t *chunks = smartlist_new();
+ smartlist_add(chunks, tor_strdup("accept "));
+ for (i=1; i<10000; ++i)
+ smartlist_add_asprintf(chunks, "%d,", i);
+ smartlist_add(chunks, tor_strdup("20000"));
+ policy = smartlist_join_strings(chunks, "", 0, NULL);
+ SMARTLIST_FOREACH(chunks, char *, ch, tor_free(ch));
+ smartlist_free(chunks);
+ short_parsed = parse_short_policy(policy);/* shouldn't be accepted */
+ tor_free(policy);
+ tt_ptr_op(NULL, ==, short_parsed);
+ }
+
+ /* truncation ports */
+ sm = smartlist_new();
+ for (i=1; i<2000; i+=2) {
+ char buf[POLICY_BUF_LEN];
+ tor_snprintf(buf, sizeof(buf), "reject *:%d", i);
+ smartlist_add(sm, tor_strdup(buf));
+ }
+ smartlist_add(sm, tor_strdup("accept *:*"));
+ policy_str = smartlist_join_strings(sm, ",", 0, NULL);
+ test_policy_summary_helper( policy_str,
+ "accept 2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,"
+ "46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,"
+ "92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,"
+ "130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,"
+ "166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200,"
+ "202,204,206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,236,"
+ "238,240,242,244,246,248,250,252,254,256,258,260,262,264,266,268,270,272,"
+ "274,276,278,280,282,284,286,288,290,292,294,296,298,300,302,304,306,308,"
+ "310,312,314,316,318,320,322,324,326,328,330,332,334,336,338,340,342,344,"
+ "346,348,350,352,354,356,358,360,362,364,366,368,370,372,374,376,378,380,"
+ "382,384,386,388,390,392,394,396,398,400,402,404,406,408,410,412,414,416,"
+ "418,420,422,424,426,428,430,432,434,436,438,440,442,444,446,448,450,452,"
+ "454,456,458,460,462,464,466,468,470,472,474,476,478,480,482,484,486,488,"
+ "490,492,494,496,498,500,502,504,506,508,510,512,514,516,518,520,522");
+
+ done:
+ addr_policy_list_free(policy);
+ addr_policy_list_free(policy2);
+ addr_policy_list_free(policy3);
+ addr_policy_list_free(policy4);
+ addr_policy_list_free(policy5);
+ addr_policy_list_free(policy6);
+ addr_policy_list_free(policy7);
+ tor_free(policy_str);
+ if (sm) {
+ SMARTLIST_FOREACH(sm, char *, s, tor_free(s));
+ smartlist_free(sm);
+ }
+ short_policy_free(short_parsed);
+}
+
+static void
+test_dump_exit_policy_to_string(void *arg)
+{
+ char *ep;
+ addr_policy_t *policy_entry;
+
+ routerinfo_t *ri = tor_malloc_zero(sizeof(routerinfo_t));
+
+ (void)arg;
+
+ ri->policy_is_reject_star = 1;
+ ri->exit_policy = NULL; // expecting "reject *:*"
+ ep = router_dump_exit_policy_to_string(ri,1,1);
+
+ test_streq("reject *:*",ep);
+
+ tor_free(ep);
+
+ ri->exit_policy = smartlist_new();
+ ri->policy_is_reject_star = 0;
+
+ policy_entry = router_parse_addr_policy_item_from_string("accept *:*",-1);
+
+ smartlist_add(ri->exit_policy,policy_entry);
+
+ ep = router_dump_exit_policy_to_string(ri,1,1);
+
+ test_streq("accept *:*",ep);
+
+ tor_free(ep);
+
+ policy_entry = router_parse_addr_policy_item_from_string("reject *:25",-1);
+
+ smartlist_add(ri->exit_policy,policy_entry);
+
+ ep = router_dump_exit_policy_to_string(ri,1,1);
+
+ test_streq("accept *:*\nreject *:25",ep);
+
+ tor_free(ep);
+
+ policy_entry =
+ router_parse_addr_policy_item_from_string("reject 8.8.8.8:*",-1);
+
+ smartlist_add(ri->exit_policy,policy_entry);
+
+ ep = router_dump_exit_policy_to_string(ri,1,1);
+
+ test_streq("accept *:*\nreject *:25\nreject 8.8.8.8:*",ep);
+ tor_free(ep);
+
+ policy_entry =
+ router_parse_addr_policy_item_from_string("reject6 [FC00::]/7:*",-1);
+
+ smartlist_add(ri->exit_policy,policy_entry);
+
+ ep = router_dump_exit_policy_to_string(ri,1,1);
+
+ test_streq("accept *:*\nreject *:25\nreject 8.8.8.8:*\n"
+ "reject6 [fc00::]/7:*",ep);
+ tor_free(ep);
+
+ policy_entry =
+ router_parse_addr_policy_item_from_string("accept6 [c000::]/3:*",-1);
+
+ smartlist_add(ri->exit_policy,policy_entry);
+
+ ep = router_dump_exit_policy_to_string(ri,1,1);
+
+ test_streq("accept *:*\nreject *:25\nreject 8.8.8.8:*\n"
+ "reject6 [fc00::]/7:*\naccept6 [c000::]/3:*",ep);
+
+ done:
+
+ if (ri->exit_policy) {
+ SMARTLIST_FOREACH(ri->exit_policy, addr_policy_t *,
+ entry, addr_policy_free(entry));
+ smartlist_free(ri->exit_policy);
+ }
+ tor_free(ri);
+ tor_free(ep);
+}
+
+struct testcase_t policy_tests[] = {
+ { "router_dump_exit_policy_to_string", test_dump_exit_policy_to_string, 0,
+ NULL, NULL },
+ { "general", test_policies_general, 0, NULL, NULL },
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_pt.c b/src/test/test_pt.c
index 80707f437..f71627df1 100644
--- a/src/test/test_pt.c
+++ b/src/test/test_pt.c
@@ -5,9 +5,17 @@
#include "orconfig.h"
#define PT_PRIVATE
+#define UTIL_PRIVATE
+#define STATEFILE_PRIVATE
+#define CONTROL_PRIVATE
#include "or.h"
+#include "config.h"
+#include "confparse.h"
+#include "control.h"
#include "transports.h"
#include "circuitbuild.h"
+#include "util.h"
+#include "statefile.h"
#include "test.h"
static void
@@ -22,71 +30,163 @@ static void
test_pt_parsing(void)
{
char line[200];
+ transport_t *transport = NULL;
+ tor_addr_t test_addr;
managed_proxy_t *mp = tor_malloc(sizeof(managed_proxy_t));
mp->conf_state = PT_PROTO_INFANT;
mp->transports = smartlist_new();
/* incomplete cmethod */
- strcpy(line,"CMETHOD trebuchet");
+ strlcpy(line,"CMETHOD trebuchet",sizeof(line));
test_assert(parse_cmethod_line(line, mp) < 0);
reset_mp(mp);
/* wrong proxy type */
- strcpy(line,"CMETHOD trebuchet dog 127.0.0.1:1999");
+ strlcpy(line,"CMETHOD trebuchet dog 127.0.0.1:1999",sizeof(line));
test_assert(parse_cmethod_line(line, mp) < 0);
reset_mp(mp);
/* wrong addrport */
- strcpy(line,"CMETHOD trebuchet socks4 abcd");
+ strlcpy(line,"CMETHOD trebuchet socks4 abcd",sizeof(line));
test_assert(parse_cmethod_line(line, mp) < 0);
reset_mp(mp);
/* correct line */
- strcpy(line,"CMETHOD trebuchet socks5 127.0.0.1:1999");
+ strlcpy(line,"CMETHOD trebuchet socks5 127.0.0.1:1999",sizeof(line));
test_assert(parse_cmethod_line(line, mp) == 0);
- test_assert(smartlist_len(mp->transports));
+ test_assert(smartlist_len(mp->transports) == 1);
+ transport = smartlist_get(mp->transports, 0);
+ /* test registered address of transport */
+ tor_addr_parse(&test_addr, "127.0.0.1");
+ test_assert(tor_addr_eq(&test_addr, &transport->addr));
+ /* test registered port of transport */
+ test_assert(transport->port == 1999);
+ /* test registered SOCKS version of transport */
+ test_assert(transport->socks_version == PROXY_SOCKS5);
+ /* test registered name of transport */
+ test_streq(transport->name, "trebuchet");
reset_mp(mp);
/* incomplete smethod */
- strcpy(line,"SMETHOD trebuchet");
+ strlcpy(line,"SMETHOD trebuchet",sizeof(line));
test_assert(parse_smethod_line(line, mp) < 0);
reset_mp(mp);
/* wrong addr type */
- strcpy(line,"SMETHOD trebuchet abcd");
+ strlcpy(line,"SMETHOD trebuchet abcd",sizeof(line));
test_assert(parse_smethod_line(line, mp) < 0);
reset_mp(mp);
/* cowwect */
- strcpy(line,"SMETHOD trebuchy 127.0.0.1:1999");
+ strlcpy(line,"SMETHOD trebuchy 127.0.0.2:2999",sizeof(line));
test_assert(parse_smethod_line(line, mp) == 0);
+ test_assert(smartlist_len(mp->transports) == 1);
+ transport = smartlist_get(mp->transports, 0);
+ /* test registered address of transport */
+ tor_addr_parse(&test_addr, "127.0.0.2");
+ test_assert(tor_addr_eq(&test_addr, &transport->addr));
+ /* test registered port of transport */
+ test_assert(transport->port == 2999);
+ /* test registered name of transport */
+ test_streq(transport->name, "trebuchy");
reset_mp(mp);
+ /* Include some arguments. Good ones. */
+ strlcpy(line,"SMETHOD trebuchet 127.0.0.1:9999 "
+ "ARGS:counterweight=3,sling=snappy",
+ sizeof(line));
+ test_assert(parse_smethod_line(line, mp) == 0);
+ tt_int_op(1, ==, smartlist_len(mp->transports));
+ {
+ const transport_t *transport = smartlist_get(mp->transports, 0);
+ tt_assert(transport);
+ tt_str_op(transport->name, ==, "trebuchet");
+ tt_int_op(transport->port, ==, 9999);
+ tt_str_op(fmt_addr(&transport->addr), ==, "127.0.0.1");
+ tt_str_op(transport->extra_info_args, ==,
+ "counterweight=3,sling=snappy");
+ }
+ reset_mp(mp);
+
/* unsupported version */
- strcpy(line,"VERSION 666");
+ strlcpy(line,"VERSION 666",sizeof(line));
test_assert(parse_version(line, mp) < 0);
/* incomplete VERSION */
- strcpy(line,"VERSION ");
+ strlcpy(line,"VERSION ",sizeof(line));
test_assert(parse_version(line, mp) < 0);
/* correct VERSION */
- strcpy(line,"VERSION 1");
+ strlcpy(line,"VERSION 1",sizeof(line));
test_assert(parse_version(line, mp) == 0);
done:
+ reset_mp(mp);
+ smartlist_free(mp->transports);
tor_free(mp);
}
static void
+test_pt_get_transport_options(void *arg)
+{
+ char **execve_args;
+ smartlist_t *transport_list = smartlist_new();
+ managed_proxy_t *mp;
+ or_options_t *options = get_options_mutable();
+ char *opt_str = NULL;
+ config_line_t *cl = NULL;
+ (void)arg;
+
+ execve_args = tor_malloc(sizeof(char*)*2);
+ execve_args[0] = tor_strdup("cheeseshop");
+ execve_args[1] = NULL;
+
+ mp = managed_proxy_create(transport_list, execve_args, 1);
+ tt_ptr_op(mp, !=, NULL);
+ opt_str = get_transport_options_for_server_proxy(mp);
+ tt_ptr_op(opt_str, ==, NULL);
+
+ smartlist_add(mp->transports_to_launch, tor_strdup("gruyere"));
+ smartlist_add(mp->transports_to_launch, tor_strdup("roquefort"));
+ smartlist_add(mp->transports_to_launch, tor_strdup("stnectaire"));
+
+ tt_assert(options);
+
+ cl = tor_malloc_zero(sizeof(config_line_t));
+ cl->value = tor_strdup("gruyere melty=10 hardness=se;ven");
+ options->ServerTransportOptions = cl;
+
+ cl = tor_malloc_zero(sizeof(config_line_t));
+ cl->value = tor_strdup("stnectaire melty=4 hardness=three");
+ cl->next = options->ServerTransportOptions;
+ options->ServerTransportOptions = cl;
+
+ cl = tor_malloc_zero(sizeof(config_line_t));
+ cl->value = tor_strdup("pepperjack melty=12 hardness=five");
+ cl->next = options->ServerTransportOptions;
+ options->ServerTransportOptions = cl;
+
+ opt_str = get_transport_options_for_server_proxy(mp);
+ tt_str_op(opt_str, ==,
+ "gruyere:melty=10;gruyere:hardness=se\\;ven;"
+ "stnectaire:melty=4;stnectaire:hardness=three");
+
+ done:
+ tor_free(opt_str);
+ config_free_lines(cl);
+ managed_proxy_destroy(mp, 0);
+ smartlist_free(transport_list);
+}
+
+static void
test_pt_protocol(void)
{
char line[200];
@@ -99,36 +199,254 @@ test_pt_protocol(void)
/* various wrong protocol runs: */
- strcpy(line,"VERSION 1");
+ strlcpy(line,"VERSION 1",sizeof(line));
handle_proxy_line(line, mp);
test_assert(mp->conf_state == PT_PROTO_ACCEPTING_METHODS);
- strcpy(line,"VERSION 1");
+ strlcpy(line,"VERSION 1",sizeof(line));
handle_proxy_line(line, mp);
test_assert(mp->conf_state == PT_PROTO_BROKEN);
reset_mp(mp);
- strcpy(line,"CMETHOD trebuchet socks5 127.0.0.1:1999");
+ strlcpy(line,"CMETHOD trebuchet socks5 127.0.0.1:1999",sizeof(line));
handle_proxy_line(line, mp);
test_assert(mp->conf_state == PT_PROTO_BROKEN);
reset_mp(mp);
/* correct protocol run: */
- strcpy(line,"VERSION 1");
+ strlcpy(line,"VERSION 1",sizeof(line));
handle_proxy_line(line, mp);
test_assert(mp->conf_state == PT_PROTO_ACCEPTING_METHODS);
- strcpy(line,"CMETHOD trebuchet socks5 127.0.0.1:1999");
+ strlcpy(line,"CMETHOD trebuchet socks5 127.0.0.1:1999",sizeof(line));
handle_proxy_line(line, mp);
test_assert(mp->conf_state == PT_PROTO_ACCEPTING_METHODS);
- strcpy(line,"CMETHODS DONE");
+ strlcpy(line,"CMETHODS DONE",sizeof(line));
handle_proxy_line(line, mp);
test_assert(mp->conf_state == PT_PROTO_CONFIGURED);
done:
+ reset_mp(mp);
+ smartlist_free(mp->transports);
+ tor_free(mp->argv[0]);
+ tor_free(mp->argv);
+ tor_free(mp);
+}
+
+static void
+test_pt_get_extrainfo_string(void *arg)
+{
+ managed_proxy_t *mp1 = NULL, *mp2 = NULL;
+ char **argv1, **argv2;
+ smartlist_t *t1 = smartlist_new(), *t2 = smartlist_new();
+ int r;
+ char *s = NULL;
+ (void) arg;
+
+ argv1 = tor_malloc_zero(sizeof(char*)*3);
+ argv1[0] = tor_strdup("ewige");
+ argv1[1] = tor_strdup("Blumenkraft");
+ argv1[2] = NULL;
+ argv2 = tor_malloc_zero(sizeof(char*)*4);
+ argv2[0] = tor_strdup("und");
+ argv2[1] = tor_strdup("ewige");
+ argv2[2] = tor_strdup("Schlangenkraft");
+ argv2[3] = NULL;
+
+ mp1 = managed_proxy_create(t1, argv1, 1);
+ mp2 = managed_proxy_create(t2, argv2, 1);
+
+ r = parse_smethod_line("SMETHOD hagbard 127.0.0.1:5555", mp1);
+ tt_int_op(r, ==, 0);
+ r = parse_smethod_line("SMETHOD celine 127.0.0.1:1723 ARGS:card=no-enemy",
+ mp2);
+ tt_int_op(r, ==, 0);
+
+ /* Force these proxies to look "completed" or they won't generate output. */
+ mp1->conf_state = mp2->conf_state = PT_PROTO_COMPLETED;
+
+ s = pt_get_extra_info_descriptor_string();
+ tt_assert(s);
+ tt_str_op(s, ==,
+ "transport hagbard 127.0.0.1:5555\n"
+ "transport celine 127.0.0.1:1723 card=no-enemy\n");
+
+ done:
+ /* XXXX clean up better */
+ smartlist_free(t1);
+ smartlist_free(t2);
+ tor_free(s);
+}
+
+#ifdef _WIN32
+#define STDIN_HANDLE HANDLE
+#else
+#define STDIN_HANDLE FILE
+#endif
+
+static smartlist_t *
+tor_get_lines_from_handle_replacement(STDIN_HANDLE *handle,
+ enum stream_status *stream_status_out)
+{
+ static int times_called = 0;
+ smartlist_t *retval_sl = smartlist_new();
+
+ (void) handle;
+ (void) stream_status_out;
+
+ /* Generate some dummy CMETHOD lines the first 5 times. The 6th
+ time, send 'CMETHODS DONE' to finish configuring the proxy. */
+ if (times_called++ != 5) {
+ smartlist_add_asprintf(retval_sl, "SMETHOD mock%d 127.0.0.1:555%d",
+ times_called, times_called);
+ } else {
+ smartlist_add(retval_sl, tor_strdup("SMETHODS DONE"));
+ }
+
+ return retval_sl;
+}
+
+/* NOP mock */
+static void
+tor_process_handle_destroy_replacement(process_handle_t *process_handle,
+ int also_terminate_process)
+{
+ (void) process_handle;
+ (void) also_terminate_process;
+}
+
+static or_state_t *dummy_state = NULL;
+
+static or_state_t *
+get_or_state_replacement(void)
+{
+ return dummy_state;
+}
+
+static int controlevent_n = 0;
+static uint16_t controlevent_event = 0;
+static smartlist_t *controlevent_msgs = NULL;
+
+static void
+send_control_event_string_replacement(uint16_t event, event_format_t which,
+ const char *msg)
+{
+ (void) which;
+ ++controlevent_n;
+ controlevent_event = event;
+ if (!controlevent_msgs)
+ controlevent_msgs = smartlist_new();
+ smartlist_add(controlevent_msgs, tor_strdup(msg));
+}
+
+/* Test the configure_proxy() function. */
+static void
+test_pt_configure_proxy(void *arg)
+{
+ int i, retval;
+ managed_proxy_t *mp = NULL;
+ (void) arg;
+
+ dummy_state = tor_malloc_zero(sizeof(or_state_t));
+
+ MOCK(tor_get_lines_from_handle,
+ tor_get_lines_from_handle_replacement);
+ MOCK(tor_process_handle_destroy,
+ tor_process_handle_destroy_replacement);
+ MOCK(get_or_state,
+ get_or_state_replacement);
+ MOCK(send_control_event_string,
+ send_control_event_string_replacement);
+
+ control_testing_set_global_event_mask(EVENT_TRANSPORT_LAUNCHED);
+
+ mp = tor_malloc(sizeof(managed_proxy_t));
+ mp->conf_state = PT_PROTO_ACCEPTING_METHODS;
+ mp->transports = smartlist_new();
+ mp->transports_to_launch = smartlist_new();
+ mp->process_handle = tor_malloc_zero(sizeof(process_handle_t));
+ mp->argv = tor_malloc_zero(sizeof(char*)*2);
+ mp->argv[0] = tor_strdup("<testcase>");
+ mp->is_server = 1;
+
+ /* Test the return value of configure_proxy() by calling it some
+ times while it is uninitialized and then finally finalizing its
+ configuration. */
+ for (i = 0 ; i < 5 ; i++) {
+ retval = configure_proxy(mp);
+ /* retval should be zero because proxy hasn't finished configuring yet */
+ test_assert(retval == 0);
+ /* check the number of registered transports */
+ test_assert(smartlist_len(mp->transports) == i+1);
+ /* check that the mp is still waiting for transports */
+ test_assert(mp->conf_state == PT_PROTO_ACCEPTING_METHODS);
+ }
+
+ /* this last configure_proxy() should finalize the proxy configuration. */
+ retval = configure_proxy(mp);
+ /* retval should be 1 since the proxy finished configuring */
+ test_assert(retval == 1);
+ /* check the mp state */
+ test_assert(mp->conf_state == PT_PROTO_COMPLETED);
+
+ tt_int_op(controlevent_n, ==, 5);
+ tt_int_op(controlevent_event, ==, EVENT_TRANSPORT_LAUNCHED);
+ tt_int_op(smartlist_len(controlevent_msgs), ==, 5);
+ smartlist_sort_strings(controlevent_msgs);
+ tt_str_op(smartlist_get(controlevent_msgs, 0), ==,
+ "650 TRANSPORT_LAUNCHED server mock1 127.0.0.1 5551\r\n");
+ tt_str_op(smartlist_get(controlevent_msgs, 1), ==,
+ "650 TRANSPORT_LAUNCHED server mock2 127.0.0.1 5552\r\n");
+ tt_str_op(smartlist_get(controlevent_msgs, 2), ==,
+ "650 TRANSPORT_LAUNCHED server mock3 127.0.0.1 5553\r\n");
+ tt_str_op(smartlist_get(controlevent_msgs, 3), ==,
+ "650 TRANSPORT_LAUNCHED server mock4 127.0.0.1 5554\r\n");
+ tt_str_op(smartlist_get(controlevent_msgs, 4), ==,
+ "650 TRANSPORT_LAUNCHED server mock5 127.0.0.1 5555\r\n");
+
+ { /* check that the transport info were saved properly in the tor state */
+ config_line_t *transport_in_state = NULL;
+ smartlist_t *transport_info_sl = smartlist_new();
+ char *name_of_transport = NULL;
+ char *bindaddr = NULL;
+
+ /* Get the bindaddr for "mock1" and check it against the bindaddr
+ that the mocked tor_get_lines_from_handle() generated. */
+ transport_in_state = get_transport_in_state_by_name("mock1");
+ test_assert(transport_in_state);
+ smartlist_split_string(transport_info_sl, transport_in_state->value,
+ NULL, 0, 0);
+ name_of_transport = smartlist_get(transport_info_sl, 0);
+ bindaddr = smartlist_get(transport_info_sl, 1);
+ tt_str_op(name_of_transport, ==, "mock1");
+ tt_str_op(bindaddr, ==, "127.0.0.1:5551");
+
+ SMARTLIST_FOREACH(transport_info_sl, char *, cp, tor_free(cp));
+ smartlist_free(transport_info_sl);
+ }
+
+ done:
+ or_state_free(dummy_state);
+ UNMOCK(tor_get_lines_from_handle);
+ UNMOCK(tor_process_handle_destroy);
+ UNMOCK(get_or_state);
+ UNMOCK(send_control_event_string);
+ if (controlevent_msgs) {
+ SMARTLIST_FOREACH(controlevent_msgs, char *, cp, tor_free(cp));
+ smartlist_free(controlevent_msgs);
+ controlevent_msgs = NULL;
+ }
+ if (mp->transports) {
+ SMARTLIST_FOREACH(mp->transports, transport_t *, t, transport_free(t));
+ smartlist_free(mp->transports);
+ }
+ smartlist_free(mp->transports_to_launch);
+ tor_free(mp->process_handle);
+ tor_free(mp->argv[0]);
+ tor_free(mp->argv);
tor_free(mp);
}
@@ -138,6 +456,12 @@ test_pt_protocol(void)
struct testcase_t pt_tests[] = {
PT_LEGACY(parsing),
PT_LEGACY(protocol),
+ { "get_transport_options", test_pt_get_transport_options, TT_FORK,
+ NULL, NULL },
+ { "get_extrainfo_string", test_pt_get_extrainfo_string, TT_FORK,
+ NULL, NULL },
+ { "configure_proxy",test_pt_configure_proxy, TT_FORK,
+ NULL, NULL },
END_OF_TESTCASES
};
diff --git a/src/test/test_relaycell.c b/src/test/test_relaycell.c
new file mode 100644
index 000000000..5deb36260
--- /dev/null
+++ b/src/test/test_relaycell.c
@@ -0,0 +1,249 @@
+/* Copyright (c) 2014, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/* Unit tests for handling different kinds of relay cell */
+
+#define RELAY_PRIVATE
+#include "or.h"
+#include "config.h"
+#include "connection.h"
+#include "connection_edge.h"
+#include "relay.h"
+#include "test.h"
+
+static int srm_ncalls;
+static entry_connection_t *srm_conn;
+static int srm_atype;
+static size_t srm_alen;
+static int srm_answer_is_set;
+static uint8_t srm_answer[512];
+static int srm_ttl;
+static time_t srm_expires;
+
+/* Mock replacement for connection_ap_hannshake_socks_resolved() */
+static void
+socks_resolved_mock(entry_connection_t *conn,
+ int answer_type,
+ size_t answer_len,
+ const uint8_t *answer,
+ int ttl,
+ time_t expires)
+{
+ srm_ncalls++;
+ srm_conn = conn;
+ srm_atype = answer_type;
+ srm_alen = answer_len;
+ if (answer) {
+ memset(srm_answer, 0, sizeof(srm_answer));
+ memcpy(srm_answer, answer, answer_len < 512 ? answer_len : 512);
+ srm_answer_is_set = 1;
+ } else {
+ srm_answer_is_set = 0;
+ }
+ srm_ttl = ttl;
+ srm_expires = expires;
+}
+
+static int mum_ncalls;
+static entry_connection_t *mum_conn;
+static int mum_endreason;
+
+/* Mock replacement for connection_mark_unattached_ap_() */
+static void
+mark_unattached_mock(entry_connection_t *conn, int endreason,
+ int line, const char *file)
+{
+ ++mum_ncalls;
+ mum_conn = conn;
+ mum_endreason = endreason;
+ (void) line;
+ (void) file;
+}
+
+/* Tests for connection_edge_process_resolved_cell().
+
+ The point of ..process_resolved_cell() is to handle an incoming cell
+ on an entry connection, and call connection_mark_unattached_ap() and/or
+ connection_ap_handshake_socks_resolved().
+ */
+static void
+test_relaycell_resolved(void *arg)
+{
+ entry_connection_t *entryconn;
+ edge_connection_t *edgeconn;
+ cell_t cell;
+ relay_header_t rh;
+ int r;
+ or_options_t *options = get_options_mutable();
+
+#define SET_CELL(s) do { \
+ memset(&cell, 0, sizeof(cell)); \
+ memset(&rh, 0, sizeof(rh)); \
+ memcpy(cell.payload + RELAY_HEADER_SIZE, (s), sizeof((s))-1); \
+ rh.length = sizeof((s))-1; \
+ rh.command = RELAY_COMMAND_RESOLVED; \
+ } while (0)
+#define MOCK_RESET() do { \
+ srm_ncalls = mum_ncalls = 0; \
+ } while (0)
+#define ASSERT_MARK_CALLED(reason) do { \
+ tt_int_op(mum_ncalls, ==, 1); \
+ tt_ptr_op(mum_conn, ==, entryconn); \
+ tt_int_op(mum_endreason, ==, (reason)); \
+ } while (0)
+#define ASSERT_RESOLVED_CALLED(atype, answer, ttl, expires) do { \
+ tt_int_op(srm_ncalls, ==, 1); \
+ tt_ptr_op(srm_conn, ==, entryconn); \
+ tt_int_op(srm_atype, ==, (atype)); \
+ if (answer) { \
+ tt_int_op(srm_alen, ==, sizeof(answer)-1); \
+ tt_int_op(srm_alen, <, 512); \
+ tt_int_op(srm_answer_is_set, ==, 1); \
+ tt_mem_op(srm_answer, ==, answer, sizeof(answer)-1); \
+ } else { \
+ tt_int_op(srm_answer_is_set, ==, 0); \
+ } \
+ tt_int_op(srm_ttl, ==, ttl); \
+ tt_int_op(srm_expires, ==, expires); \
+ } while (0)
+
+ (void)arg;
+
+ MOCK(connection_mark_unattached_ap_, mark_unattached_mock);
+ MOCK(connection_ap_handshake_socks_resolved, socks_resolved_mock);
+
+ options->ClientDNSRejectInternalAddresses = 0;
+
+ SET_CELL(/* IPv4: 127.0.1.2, ttl 256 */
+ "\x04\x04\x7f\x00\x01\x02\x00\x00\x01\x00"
+ /* IPv4: 18.0.0.1, ttl 512 */
+ "\x04\x04\x12\x00\x00\x01\x00\x00\x02\x00"
+ /* IPv6: 2003::3, ttl 1024 */
+ "\x06\x10"
+ "\x20\x02\x00\x00\x00\x00\x00\x00"
+ "\x00\x00\x00\x00\x00\x00\x00\x03"
+ "\x00\x00\x04\x00");
+
+ entryconn = entry_connection_new(CONN_TYPE_AP, AF_INET);
+ edgeconn = ENTRY_TO_EDGE_CONN(entryconn);
+
+ /* Try with connection in non-RESOLVE_WAIT state: cell gets ignored */
+ MOCK_RESET();
+ r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh);
+ tt_int_op(r, ==, 0);
+ tt_int_op(srm_ncalls, ==, 0);
+ tt_int_op(mum_ncalls, ==, 0);
+
+ /* Now put it in the right state. */
+ ENTRY_TO_CONN(entryconn)->state = AP_CONN_STATE_RESOLVE_WAIT;
+ entryconn->socks_request->command = SOCKS_COMMAND_RESOLVE;
+ entryconn->ipv4_traffic_ok = 1;
+ entryconn->ipv6_traffic_ok = 1;
+ entryconn->prefer_ipv6_traffic = 0;
+
+ /* We prefer ipv4, so we should get the first ipv4 answer */
+ MOCK_RESET();
+ r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh);
+ tt_int_op(r, ==, 0);
+ ASSERT_MARK_CALLED(END_STREAM_REASON_DONE|
+ END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED);
+ ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_IPV4, "\x7f\x00\x01\x02", 256, -1);
+
+ /* But we may be discarding private answers. */
+ MOCK_RESET();
+ options->ClientDNSRejectInternalAddresses = 1;
+ r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh);
+ tt_int_op(r, ==, 0);
+ ASSERT_MARK_CALLED(END_STREAM_REASON_DONE|
+ END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED);
+ ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_IPV4, "\x12\x00\x00\x01", 512, -1);
+
+ /* now prefer ipv6, and get the first ipv6 answer */
+ entryconn->prefer_ipv6_traffic = 1;
+ MOCK_RESET();
+ r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh);
+ tt_int_op(r, ==, 0);
+ ASSERT_MARK_CALLED(END_STREAM_REASON_DONE|
+ END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED);
+ ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_IPV6,
+ "\x20\x02\x00\x00\x00\x00\x00\x00"
+ "\x00\x00\x00\x00\x00\x00\x00\x03",
+ 1024, -1);
+
+ /* With a cell that only has IPv4, we report IPv4 even if we prefer IPv6 */
+ MOCK_RESET();
+ SET_CELL("\x04\x04\x12\x00\x00\x01\x00\x00\x02\x00");
+ r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh);
+ tt_int_op(r, ==, 0);
+ ASSERT_MARK_CALLED(END_STREAM_REASON_DONE|
+ END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED);
+ ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_IPV4, "\x12\x00\x00\x01", 512, -1);
+
+ /* But if we don't allow IPv4, we report nothing if the cell contains only
+ * ipv4 */
+ MOCK_RESET();
+ entryconn->ipv4_traffic_ok = 0;
+ r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh);
+ tt_int_op(r, ==, 0);
+ ASSERT_MARK_CALLED(END_STREAM_REASON_DONE|
+ END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED);
+ ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_ERROR, NULL, -1, -1);
+
+ /* If we wanted hostnames, we report nothing, since we only had IPs. */
+ MOCK_RESET();
+ entryconn->ipv4_traffic_ok = 1;
+ entryconn->socks_request->command = SOCKS_COMMAND_RESOLVE_PTR;
+ r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh);
+ tt_int_op(r, ==, 0);
+ ASSERT_MARK_CALLED(END_STREAM_REASON_DONE|
+ END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED);
+ ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_ERROR, NULL, -1, -1);
+
+ /* A hostname cell is fine though. */
+ MOCK_RESET();
+ SET_CELL("\x00\x0fwww.example.com\x00\x01\x00\x00");
+ r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh);
+ tt_int_op(r, ==, 0);
+ ASSERT_MARK_CALLED(END_STREAM_REASON_DONE|
+ END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED);
+ ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_HOSTNAME, "www.example.com", 65536, -1);
+
+ /* error on malformed cell */
+ MOCK_RESET();
+ entryconn->socks_request->command = SOCKS_COMMAND_RESOLVE;
+ SET_CELL("\x04\x04\x01\x02\x03\x04"); /* no ttl */
+ r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh);
+ tt_int_op(r, ==, 0);
+ ASSERT_MARK_CALLED(END_STREAM_REASON_TORPROTOCOL);
+ tt_int_op(srm_ncalls, ==, 0);
+
+ /* error on all addresses private */
+ MOCK_RESET();
+ SET_CELL(/* IPv4: 127.0.1.2, ttl 256 */
+ "\x04\x04\x7f\x00\x01\x02\x00\x00\x01\x00"
+ /* IPv4: 192.168.1.1, ttl 256 */
+ "\x04\x04\xc0\xa8\x01\x01\x00\x00\x01\x00");
+ r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh);
+ tt_int_op(r, ==, 0);
+ ASSERT_MARK_CALLED(END_STREAM_REASON_TORPROTOCOL);
+ ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_ERROR_TRANSIENT, NULL, 0, TIME_MAX);
+
+ /* Legit error code */
+ MOCK_RESET();
+ SET_CELL("\xf0\x15" "quiet and meaningless" "\x00\x00\x0f\xff");
+ r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh);
+ tt_int_op(r, ==, 0);
+ ASSERT_MARK_CALLED(END_STREAM_REASON_DONE|
+ END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED);
+ ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_ERROR_TRANSIENT, NULL, -1, -1);
+
+ done:
+ UNMOCK(connection_mark_unattached_ap_);
+ UNMOCK(connection_ap_handshake_socks_resolved);
+}
+
+struct testcase_t relaycell_tests[] = {
+ { "resolved", test_relaycell_resolved, TT_FORK, NULL, NULL },
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_replay.c b/src/test/test_replay.c
index de841ad59..b48f582f5 100644
--- a/src/test/test_replay.c
+++ b/src/test/test_replay.c
@@ -32,6 +32,40 @@ test_replaycache_alloc(void)
}
static void
+test_replaycache_badalloc(void)
+{
+ replaycache_t *r = NULL;
+
+ /* Negative horizon should fail */
+ r = replaycache_new(-600, 300);
+ test_assert(r == NULL);
+ /* Negative interval should get adjusted to zero */
+ r = replaycache_new(600, -300);
+ test_assert(r != NULL);
+ test_eq(r->scrub_interval, 0);
+ replaycache_free(r);
+ /* Negative horizon and negative interval should still fail */
+ r = replaycache_new(-600, -300);
+ test_assert(r == NULL);
+
+ done:
+ if (r) replaycache_free(r);
+
+ return;
+}
+
+static void
+test_replaycache_free_null(void)
+{
+ replaycache_free(NULL);
+ /* Assert that we're here without horrible death */
+ test_assert(1);
+
+ done:
+ return;
+}
+
+static void
test_replaycache_miss(void)
{
replaycache_t *r = NULL;
@@ -42,7 +76,13 @@ test_replaycache_miss(void)
result =
replaycache_add_and_test_internal(1200, r, test_buffer,
- (int)strlen(test_buffer), NULL);
+ strlen(test_buffer), NULL);
+ test_eq(result, 0);
+
+ /* poke the bad-parameter error case too */
+ result =
+ replaycache_add_and_test_internal(1200, NULL, test_buffer,
+ strlen(test_buffer), NULL);
test_eq(result, 0);
done:
@@ -62,12 +102,12 @@ test_replaycache_hit(void)
result =
replaycache_add_and_test_internal(1200, r, test_buffer,
- (int)strlen(test_buffer), NULL);
+ strlen(test_buffer), NULL);
test_eq(result, 0);
result =
replaycache_add_and_test_internal(1300, r, test_buffer,
- (int)strlen(test_buffer), NULL);
+ strlen(test_buffer), NULL);
test_eq(result, 1);
done:
@@ -87,17 +127,17 @@ test_replaycache_age(void)
result =
replaycache_add_and_test_internal(1200, r, test_buffer,
- (int)strlen(test_buffer), NULL);
+ strlen(test_buffer), NULL);
test_eq(result, 0);
result =
replaycache_add_and_test_internal(1300, r, test_buffer,
- (int)strlen(test_buffer), NULL);
+ strlen(test_buffer), NULL);
test_eq(result, 1);
result =
replaycache_add_and_test_internal(3000, r, test_buffer,
- (int)strlen(test_buffer), NULL);
+ strlen(test_buffer), NULL);
test_eq(result, 0);
done:
@@ -118,12 +158,12 @@ test_replaycache_elapsed(void)
result =
replaycache_add_and_test_internal(1200, r, test_buffer,
- (int)strlen(test_buffer), NULL);
+ strlen(test_buffer), NULL);
test_eq(result, 0);
result =
replaycache_add_and_test_internal(1300, r, test_buffer,
- (int)strlen(test_buffer), &elapsed);
+ strlen(test_buffer), &elapsed);
test_eq(result, 1);
test_eq(elapsed, 100);
@@ -144,18 +184,102 @@ test_replaycache_noexpire(void)
result =
replaycache_add_and_test_internal(1200, r, test_buffer,
- (int)strlen(test_buffer), NULL);
+ strlen(test_buffer), NULL);
test_eq(result, 0);
result =
replaycache_add_and_test_internal(1300, r, test_buffer,
- (int)strlen(test_buffer), NULL);
+ strlen(test_buffer), NULL);
test_eq(result, 1);
result =
replaycache_add_and_test_internal(3000, r, test_buffer,
- (int)strlen(test_buffer), NULL);
+ strlen(test_buffer), NULL);
+ test_eq(result, 1);
+
+ done:
+ if (r) replaycache_free(r);
+
+ return;
+}
+
+static void
+test_replaycache_scrub(void)
+{
+ replaycache_t *r = NULL;
+ int result;
+
+ r = replaycache_new(600, 300);
+ test_assert(r != NULL);
+
+ /* Set up like in test_replaycache_hit() */
+ result =
+ replaycache_add_and_test_internal(100, r, test_buffer,
+ strlen(test_buffer), NULL);
+ test_eq(result, 0);
+
+ result =
+ replaycache_add_and_test_internal(200, r, test_buffer,
+ strlen(test_buffer), NULL);
+ test_eq(result, 1);
+
+ /*
+ * Poke a few replaycache_scrub_if_needed_internal() error cases that
+ * can't happen through replaycache_add_and_test_internal()
+ */
+
+ /* Null cache */
+ replaycache_scrub_if_needed_internal(300, NULL);
+ /* Assert we're still here */
+ test_assert(1);
+
+ /* Make sure we hit the aging-out case too */
+ replaycache_scrub_if_needed_internal(1500, r);
+ /* Assert that we aged it */
+ test_eq(digestmap_size(r->digests_seen), 0);
+
+ done:
+ if (r) replaycache_free(r);
+
+ return;
+}
+
+static void
+test_replaycache_future(void)
+{
+ replaycache_t *r = NULL;
+ int result;
+ time_t elapsed = 0;
+
+ r = replaycache_new(600, 300);
+ test_assert(r != NULL);
+
+ /* Set up like in test_replaycache_hit() */
+ result =
+ replaycache_add_and_test_internal(100, r, test_buffer,
+ strlen(test_buffer), &elapsed);
+ test_eq(result, 0);
+ /* elapsed should still be 0, since it wasn't written */
+ test_eq(elapsed, 0);
+
+ result =
+ replaycache_add_and_test_internal(200, r, test_buffer,
+ strlen(test_buffer), &elapsed);
+ test_eq(result, 1);
+ /* elapsed should be the time since the last hit */
+ test_eq(elapsed, 100);
+
+ /*
+ * Now let's turn the clock back to get coverage on the cache entry from the
+ * future not-supposed-to-happen case.
+ */
+ result =
+ replaycache_add_and_test_internal(150, r, test_buffer,
+ strlen(test_buffer), &elapsed);
+ /* We should still get a hit */
test_eq(result, 1);
+ /* ...but it shouldn't let us see a negative elapsed time */
+ test_eq(elapsed, 0);
done:
if (r) replaycache_free(r);
@@ -163,16 +287,62 @@ test_replaycache_noexpire(void)
return;
}
+static void
+test_replaycache_realtime(void)
+{
+ replaycache_t *r = NULL;
+ /*
+ * Negative so we fail if replaycache_add_test_and_elapsed() doesn't
+ * write to elapsed.
+ */
+ time_t elapsed = -1;
+ int result;
+
+ /* Test the realtime as well as *_internal() entry points */
+ r = replaycache_new(600, 300);
+ test_assert(r != NULL);
+
+ /* This should miss */
+ result =
+ replaycache_add_and_test(r, test_buffer, strlen(test_buffer));
+ test_eq(result, 0);
+
+ /* This should hit */
+ result =
+ replaycache_add_and_test(r, test_buffer, strlen(test_buffer));
+ test_eq(result, 1);
+
+ /* This should hit and return a small elapsed time */
+ result =
+ replaycache_add_test_and_elapsed(r, test_buffer,
+ strlen(test_buffer), &elapsed);
+ test_eq(result, 1);
+ test_assert(elapsed >= 0);
+ test_assert(elapsed <= 5);
+
+ /* Scrub it to exercise that entry point too */
+ replaycache_scrub_if_needed(r);
+
+ done:
+ if (r) replaycache_free(r);
+ return;
+}
+
#define REPLAYCACHE_LEGACY(name) \
{ #name, legacy_test_helper, 0, &legacy_setup, test_replaycache_ ## name }
struct testcase_t replaycache_tests[] = {
REPLAYCACHE_LEGACY(alloc),
+ REPLAYCACHE_LEGACY(badalloc),
+ REPLAYCACHE_LEGACY(free_null),
REPLAYCACHE_LEGACY(miss),
REPLAYCACHE_LEGACY(hit),
REPLAYCACHE_LEGACY(age),
REPLAYCACHE_LEGACY(elapsed),
REPLAYCACHE_LEGACY(noexpire),
+ REPLAYCACHE_LEGACY(scrub),
+ REPLAYCACHE_LEGACY(future),
+ REPLAYCACHE_LEGACY(realtime),
END_OF_TESTCASES
};
diff --git a/src/test/test_routerkeys.c b/src/test/test_routerkeys.c
new file mode 100644
index 000000000..182e0f6f8
--- /dev/null
+++ b/src/test/test_routerkeys.c
@@ -0,0 +1,85 @@
+/* Copyright (c) 2001-2004, Roger Dingledine.
+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
+ * Copyright (c) 2007-2013, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#include "orconfig.h"
+#define ROUTER_PRIVATE
+#include "or.h"
+#include "config.h"
+#include "router.h"
+#include "util.h"
+#include "crypto.h"
+
+#include "test.h"
+
+static void
+test_routerkeys_write_fingerprint(void *arg)
+{
+ crypto_pk_t *key = pk_generate(2);
+ or_options_t *options = get_options_mutable();
+ const char *ddir = get_fname("write_fingerprint");
+ char *cp = NULL, *cp2 = NULL;
+ char fp[FINGERPRINT_LEN+1];
+
+ (void)arg;
+
+ tt_assert(key);
+
+ options->ORPort_set = 1; /* So that we can get the server ID key */
+ tor_free(options->DataDirectory);
+ options->DataDirectory = tor_strdup(ddir);
+ options->Nickname = tor_strdup("haflinger");
+ set_server_identity_key(key);
+ set_client_identity_key(crypto_pk_dup_key(key));
+
+ tt_int_op(0, ==, check_private_dir(ddir, CPD_CREATE, NULL));
+ tt_int_op(crypto_pk_cmp_keys(get_server_identity_key(),key),==,0);
+
+ /* Write fingerprint file */
+ tt_int_op(0, ==, router_write_fingerprint(0));
+ cp = read_file_to_str(get_fname("write_fingerprint/fingerprint"),
+ 0, NULL);
+ crypto_pk_get_fingerprint(key, fp, 0);
+ tor_asprintf(&cp2, "haflinger %s\n", fp);
+ tt_str_op(cp, ==, cp2);
+ tor_free(cp);
+ tor_free(cp2);
+
+ /* Write hashed-fingerprint file */
+ tt_int_op(0, ==, router_write_fingerprint(1));
+ cp = read_file_to_str(get_fname("write_fingerprint/hashed-fingerprint"),
+ 0, NULL);
+ crypto_pk_get_hashed_fingerprint(key, fp);
+ tor_asprintf(&cp2, "haflinger %s\n", fp);
+ tt_str_op(cp, ==, cp2);
+ tor_free(cp);
+ tor_free(cp2);
+
+ /* Replace outdated file */
+ write_str_to_file(get_fname("write_fingerprint/hashed-fingerprint"),
+ "junk goes here", 0);
+ tt_int_op(0, ==, router_write_fingerprint(1));
+ cp = read_file_to_str(get_fname("write_fingerprint/hashed-fingerprint"),
+ 0, NULL);
+ crypto_pk_get_hashed_fingerprint(key, fp);
+ tor_asprintf(&cp2, "haflinger %s\n", fp);
+ tt_str_op(cp, ==, cp2);
+ tor_free(cp);
+ tor_free(cp2);
+
+ done:
+ crypto_pk_free(key);
+ set_client_identity_key(NULL);
+ tor_free(cp);
+ tor_free(cp2);
+}
+
+#define TEST(name, flags) \
+ { #name , test_routerkeys_ ## name, (flags), NULL, NULL }
+
+struct testcase_t routerkeys_tests[] = {
+ TEST(write_fingerprint, TT_FORK),
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_socks.c b/src/test/test_socks.c
new file mode 100644
index 000000000..4ce61e068
--- /dev/null
+++ b/src/test/test_socks.c
@@ -0,0 +1,393 @@
+/* Copyright (c) 2001-2004, Roger Dingledine.
+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
+ * Copyright (c) 2007-2013, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#include "or.h"
+#include "buffers.h"
+#include "config.h"
+#include "test.h"
+
+typedef struct socks_test_data_t {
+ socks_request_t *req;
+ buf_t *buf;
+} socks_test_data_t;
+
+static void *
+socks_test_setup(const struct testcase_t *testcase)
+{
+ socks_test_data_t *data = tor_malloc(sizeof(socks_test_data_t));
+ (void)testcase;
+ data->buf = buf_new_with_capacity(256);
+ data->req = socks_request_new();
+ config_register_addressmaps(get_options());
+ return data;
+}
+static int
+socks_test_cleanup(const struct testcase_t *testcase, void *ptr)
+{
+ socks_test_data_t *data = ptr;
+ (void)testcase;
+ buf_free(data->buf);
+ socks_request_free(data->req);
+ tor_free(data);
+ return 1;
+}
+
+const struct testcase_setup_t socks_setup = {
+ socks_test_setup, socks_test_cleanup
+};
+
+#define SOCKS_TEST_INIT() \
+ socks_test_data_t *testdata = ptr; \
+ buf_t *buf = testdata->buf; \
+ socks_request_t *socks = testdata->req;
+#define ADD_DATA(buf, s) \
+ write_to_buf(s, sizeof(s)-1, buf)
+
+static void
+socks_request_clear(socks_request_t *socks)
+{
+ tor_free(socks->username);
+ tor_free(socks->password);
+ memset(socks, 0, sizeof(socks_request_t));
+}
+
+/** Perform unsupported SOCKS 4 commands */
+static void
+test_socks_4_unsupported_commands(void *ptr)
+{
+ SOCKS_TEST_INIT();
+
+ /* SOCKS 4 Send BIND [02] to IP address 2.2.2.2:4369 */
+ ADD_DATA(buf, "\x04\x02\x11\x11\x02\x02\x02\x02\x00");
+ test_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
+ get_options()->SafeSocks) == -1);
+ test_eq(4, socks->socks_version);
+ test_eq(0, socks->replylen); /* XXX: shouldn't tor reply? */
+
+ done:
+ ;
+}
+
+/** Perform supported SOCKS 4 commands */
+static void
+test_socks_4_supported_commands(void *ptr)
+{
+ SOCKS_TEST_INIT();
+
+ test_eq(0, buf_datalen(buf));
+
+ /* SOCKS 4 Send CONNECT [01] to IP address 2.2.2.2:4370 */
+ ADD_DATA(buf, "\x04\x01\x11\x12\x02\x02\x02\x03\x00");
+ test_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
+ get_options()->SafeSocks) == 1);
+ test_eq(4, socks->socks_version);
+ test_eq(0, socks->replylen); /* XXX: shouldn't tor reply? */
+ test_eq(SOCKS_COMMAND_CONNECT, socks->command);
+ test_streq("2.2.2.3", socks->address);
+ test_eq(4370, socks->port);
+ test_assert(socks->got_auth == 0);
+ test_assert(! socks->username);
+
+ test_eq(0, buf_datalen(buf));
+ socks_request_clear(socks);
+
+ /* SOCKS 4 Send CONNECT [01] to IP address 2.2.2.2:4369 with userid*/
+ ADD_DATA(buf, "\x04\x01\x11\x12\x02\x02\x02\x04me\x00");
+ test_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
+ get_options()->SafeSocks) == 1);
+ test_eq(4, socks->socks_version);
+ test_eq(0, socks->replylen); /* XXX: shouldn't tor reply? */
+ test_eq(SOCKS_COMMAND_CONNECT, socks->command);
+ test_streq("2.2.2.4", socks->address);
+ test_eq(4370, socks->port);
+ test_assert(socks->got_auth == 1);
+ test_assert(socks->username);
+ test_eq(2, socks->usernamelen);
+ test_memeq("me", socks->username, 2);
+
+ test_eq(0, buf_datalen(buf));
+ socks_request_clear(socks);
+
+ /* SOCKS 4a Send RESOLVE [F0] request for torproject.org */
+ ADD_DATA(buf, "\x04\xF0\x01\x01\x00\x00\x00\x02me\x00torproject.org\x00");
+ test_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
+ get_options()->SafeSocks) == 1);
+ test_eq(4, socks->socks_version);
+ test_eq(0, socks->replylen); /* XXX: shouldn't tor reply? */
+ test_streq("torproject.org", socks->address);
+
+ test_eq(0, buf_datalen(buf));
+
+ done:
+ ;
+}
+
+/** Perform unsupported SOCKS 5 commands */
+static void
+test_socks_5_unsupported_commands(void *ptr)
+{
+ SOCKS_TEST_INIT();
+
+ /* SOCKS 5 Send unsupported BIND [02] command */
+ ADD_DATA(buf, "\x05\x02\x00\x01");
+
+ test_eq(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
+ get_options()->SafeSocks), 0);
+ test_eq(0, buf_datalen(buf));
+ test_eq(5, socks->socks_version);
+ test_eq(2, socks->replylen);
+ test_eq(5, socks->reply[0]);
+ test_eq(0, socks->reply[1]);
+ ADD_DATA(buf, "\x05\x02\x00\x01\x02\x02\x02\x01\x01\x01");
+ test_eq(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
+ get_options()->SafeSocks), -1);
+ /* XXX: shouldn't tor reply 'command not supported' [07]? */
+
+ buf_clear(buf);
+ socks_request_clear(socks);
+
+ /* SOCKS 5 Send unsupported UDP_ASSOCIATE [03] command */
+ ADD_DATA(buf, "\x05\x03\x00\x01\x02");
+ test_eq(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
+ get_options()->SafeSocks), 0);
+ test_eq(5, socks->socks_version);
+ test_eq(2, socks->replylen);
+ test_eq(5, socks->reply[0]);
+ test_eq(2, socks->reply[1]);
+ ADD_DATA(buf, "\x05\x03\x00\x01\x02\x02\x02\x01\x01\x01");
+ test_eq(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
+ get_options()->SafeSocks), -1);
+ /* XXX: shouldn't tor reply 'command not supported' [07]? */
+
+ done:
+ ;
+}
+
+/** Perform supported SOCKS 5 commands */
+static void
+test_socks_5_supported_commands(void *ptr)
+{
+ SOCKS_TEST_INIT();
+
+ /* SOCKS 5 Send CONNECT [01] to IP address 2.2.2.2:4369 */
+ ADD_DATA(buf, "\x05\x01\x00");
+ test_eq(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
+ get_options()->SafeSocks), 0);
+ test_eq(5, socks->socks_version);
+ test_eq(2, socks->replylen);
+ test_eq(5, socks->reply[0]);
+ test_eq(0, socks->reply[1]);
+
+ ADD_DATA(buf, "\x05\x01\x00\x01\x02\x02\x02\x02\x11\x11");
+ test_eq(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
+ get_options()->SafeSocks), 1);
+ test_streq("2.2.2.2", socks->address);
+ test_eq(4369, socks->port);
+
+ test_eq(0, buf_datalen(buf));
+ socks_request_clear(socks);
+
+ /* SOCKS 5 Send CONNECT [01] to FQDN torproject.org:4369 */
+ ADD_DATA(buf, "\x05\x01\x00");
+ ADD_DATA(buf, "\x05\x01\x00\x03\x0Etorproject.org\x11\x11");
+ test_eq(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
+ get_options()->SafeSocks), 1);
+
+ test_eq(5, socks->socks_version);
+ test_eq(2, socks->replylen);
+ test_eq(5, socks->reply[0]);
+ test_eq(0, socks->reply[1]);
+ test_streq("torproject.org", socks->address);
+ test_eq(4369, socks->port);
+
+ test_eq(0, buf_datalen(buf));
+ socks_request_clear(socks);
+
+ /* SOCKS 5 Send RESOLVE [F0] request for torproject.org:4369 */
+ ADD_DATA(buf, "\x05\x01\x00");
+ ADD_DATA(buf, "\x05\xF0\x00\x03\x0Etorproject.org\x01\x02");
+ test_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
+ get_options()->SafeSocks) == 1);
+ test_eq(5, socks->socks_version);
+ test_eq(2, socks->replylen);
+ test_eq(5, socks->reply[0]);
+ test_eq(0, socks->reply[1]);
+ test_streq("torproject.org", socks->address);
+
+ test_eq(0, buf_datalen(buf));
+ socks_request_clear(socks);
+
+ /* SOCKS 5 Send RESOLVE_PTR [F1] for IP address 2.2.2.5 */
+ ADD_DATA(buf, "\x05\x01\x00");
+ ADD_DATA(buf, "\x05\xF1\x00\x01\x02\x02\x02\x05\x01\x03");
+ test_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
+ get_options()->SafeSocks) == 1);
+ test_eq(5, socks->socks_version);
+ test_eq(2, socks->replylen);
+ test_eq(5, socks->reply[0]);
+ test_eq(0, socks->reply[1]);
+ test_streq("2.2.2.5", socks->address);
+
+ test_eq(0, buf_datalen(buf));
+
+ done:
+ ;
+}
+
+/** Perform SOCKS 5 authentication */
+static void
+test_socks_5_no_authenticate(void *ptr)
+{
+ SOCKS_TEST_INIT();
+
+ /*SOCKS 5 No Authentication */
+ ADD_DATA(buf,"\x05\x01\x00");
+ test_assert(!fetch_from_buf_socks(buf, socks,
+ get_options()->TestSocks,
+ get_options()->SafeSocks));
+ test_eq(2, socks->replylen);
+ test_eq(5, socks->reply[0]);
+ test_eq(SOCKS_NO_AUTH, socks->reply[1]);
+
+ test_eq(0, buf_datalen(buf));
+
+ /*SOCKS 5 Send username/password anyway - pretend to be broken */
+ ADD_DATA(buf,"\x01\x02\x01\x01\x02\x01\x01");
+ test_assert(!fetch_from_buf_socks(buf, socks,
+ get_options()->TestSocks,
+ get_options()->SafeSocks));
+ test_eq(5, socks->socks_version);
+ test_eq(2, socks->replylen);
+ test_eq(1, socks->reply[0]);
+ test_eq(0, socks->reply[1]);
+
+ test_eq(2, socks->usernamelen);
+ test_eq(2, socks->passwordlen);
+
+ test_memeq("\x01\x01", socks->username, 2);
+ test_memeq("\x01\x01", socks->password, 2);
+
+ done:
+ ;
+}
+
+/** Perform SOCKS 5 authentication */
+static void
+test_socks_5_authenticate(void *ptr)
+{
+ SOCKS_TEST_INIT();
+
+ /* SOCKS 5 Negotiate username/password authentication */
+ ADD_DATA(buf, "\x05\x01\x02");
+
+ test_assert(!fetch_from_buf_socks(buf, socks,
+ get_options()->TestSocks,
+ get_options()->SafeSocks));
+ test_eq(2, socks->replylen);
+ test_eq(5, socks->reply[0]);
+ test_eq(SOCKS_USER_PASS, socks->reply[1]);
+ test_eq(5, socks->socks_version);
+
+ test_eq(0, buf_datalen(buf));
+
+ /* SOCKS 5 Send username/password */
+ ADD_DATA(buf, "\x01\x02me\x08mypasswd");
+ test_assert(!fetch_from_buf_socks(buf, socks,
+ get_options()->TestSocks,
+ get_options()->SafeSocks));
+ test_eq(5, socks->socks_version);
+ test_eq(2, socks->replylen);
+ test_eq(1, socks->reply[0]);
+ test_eq(0, socks->reply[1]);
+
+ test_eq(2, socks->usernamelen);
+ test_eq(8, socks->passwordlen);
+
+ test_memeq("me", socks->username, 2);
+ test_memeq("mypasswd", socks->password, 8);
+
+ done:
+ ;
+}
+
+/** Perform SOCKS 5 authentication and send data all in one go */
+static void
+test_socks_5_authenticate_with_data(void *ptr)
+{
+ SOCKS_TEST_INIT();
+
+ /* SOCKS 5 Negotiate username/password authentication */
+ ADD_DATA(buf, "\x05\x01\x02");
+
+ test_assert(!fetch_from_buf_socks(buf, socks,
+ get_options()->TestSocks,
+ get_options()->SafeSocks));
+ test_eq(2, socks->replylen);
+ test_eq(5, socks->reply[0]);
+ test_eq(SOCKS_USER_PASS, socks->reply[1]);
+ test_eq(5, socks->socks_version);
+
+ test_eq(0, buf_datalen(buf));
+
+ /* SOCKS 5 Send username/password */
+ /* SOCKS 5 Send CONNECT [01] to IP address 2.2.2.2:4369 */
+ ADD_DATA(buf, "\x01\x02me\x03you\x05\x01\x00\x01\x02\x02\x02\x02\x11\x11");
+ test_assert(fetch_from_buf_socks(buf, socks,
+ get_options()->TestSocks,
+ get_options()->SafeSocks) == 1);
+ test_eq(5, socks->socks_version);
+ test_eq(2, socks->replylen);
+ test_eq(1, socks->reply[0]);
+ test_eq(0, socks->reply[1]);
+
+ test_streq("2.2.2.2", socks->address);
+ test_eq(4369, socks->port);
+
+ test_eq(2, socks->usernamelen);
+ test_eq(3, socks->passwordlen);
+ test_memeq("me", socks->username, 2);
+ test_memeq("you", socks->password, 3);
+
+ done:
+ ;
+}
+
+/** Perform SOCKS 5 authentication before method negotiated */
+static void
+test_socks_5_auth_before_negotiation(void *ptr)
+{
+ SOCKS_TEST_INIT();
+
+ /* SOCKS 5 Send username/password */
+ ADD_DATA(buf, "\x01\x02me\x02me");
+ test_assert(fetch_from_buf_socks(buf, socks,
+ get_options()->TestSocks,
+ get_options()->SafeSocks) == -1);
+ test_eq(0, socks->socks_version);
+ test_eq(0, socks->replylen);
+ test_eq(0, socks->reply[0]);
+ test_eq(0, socks->reply[1]);
+
+ done:
+ ;
+}
+
+#define SOCKSENT(name) \
+ { #name, test_socks_##name, TT_FORK, &socks_setup, NULL }
+
+struct testcase_t socks_tests[] = {
+ SOCKSENT(4_unsupported_commands),
+ SOCKSENT(4_supported_commands),
+
+ SOCKSENT(5_unsupported_commands),
+ SOCKSENT(5_supported_commands),
+ SOCKSENT(5_no_authenticate),
+ SOCKSENT(5_auth_before_negotiation),
+ SOCKSENT(5_authenticate),
+ SOCKSENT(5_authenticate_with_data),
+
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_status.c b/src/test/test_status.c
new file mode 100644
index 000000000..46dd47313
--- /dev/null
+++ b/src/test/test_status.c
@@ -0,0 +1,1114 @@
+#define STATUS_PRIVATE
+#define HIBERNATE_PRIVATE
+#define LOG_PRIVATE
+#define REPHIST_PRIVATE
+
+#include <float.h>
+#include <math.h>
+
+#include "or.h"
+#include "torlog.h"
+#include "tor_queue.h"
+#include "status.h"
+#include "circuitlist.h"
+#include "config.h"
+#include "hibernate.h"
+#include "rephist.h"
+#include "relay.h"
+#include "router.h"
+#include "main.h"
+#include "nodelist.h"
+#include "statefile.h"
+#include "test.h"
+
+#define NS_MODULE status
+
+#define NS_SUBMODULE count_circuits
+
+/*
+ * Test that count_circuits() is correctly counting the number of
+ * global circuits.
+ */
+
+struct global_circuitlist_s mock_global_circuitlist =
+ TOR_LIST_HEAD_INITIALIZER(global_circuitlist);
+
+NS_DECL(struct global_circuitlist_s *, circuit_get_global_list, (void));
+
+static void
+NS(test_main)(void *arg)
+{
+ /* Choose origin_circuit_t wlog. */
+ origin_circuit_t *mock_circuit1, *mock_circuit2;
+ circuit_t *circ, *tmp;
+ int expected_circuits = 2, actual_circuits;
+
+ (void)arg;
+
+ mock_circuit1 = tor_malloc_zero(sizeof(origin_circuit_t));
+ mock_circuit2 = tor_malloc_zero(sizeof(origin_circuit_t));
+ TOR_LIST_INSERT_HEAD(
+ &mock_global_circuitlist, TO_CIRCUIT(mock_circuit1), head);
+ TOR_LIST_INSERT_HEAD(
+ &mock_global_circuitlist, TO_CIRCUIT(mock_circuit2), head);
+
+ NS_MOCK(circuit_get_global_list);
+
+ actual_circuits = count_circuits();
+
+ tt_assert(expected_circuits == actual_circuits);
+
+ done:
+ TOR_LIST_FOREACH_SAFE(
+ circ, NS(circuit_get_global_list)(), head, tmp);
+ tor_free(circ);
+ NS_UNMOCK(circuit_get_global_list);
+}
+
+static struct global_circuitlist_s *
+NS(circuit_get_global_list)(void)
+{
+ return &mock_global_circuitlist;
+}
+
+#undef NS_SUBMODULE
+#define NS_SUBMODULE secs_to_uptime
+
+/*
+ * Test that secs_to_uptime() is converting the number of seconds that
+ * Tor is up for into the appropriate string form containing hours and minutes.
+ */
+
+static void
+NS(test_main)(void *arg)
+{
+ const char *expected;
+ char *actual;
+ (void)arg;
+
+ expected = "0:00 hours";
+ actual = secs_to_uptime(0);
+ tt_str_op(actual, ==, expected);
+ tor_free(actual);
+
+ expected = "0:00 hours";
+ actual = secs_to_uptime(1);
+ tt_str_op(actual, ==, expected);
+ tor_free(actual);
+
+ expected = "0:01 hours";
+ actual = secs_to_uptime(60);
+ tt_str_op(actual, ==, expected);
+ tor_free(actual);
+
+ expected = "0:59 hours";
+ actual = secs_to_uptime(60 * 59);
+ tt_str_op(actual, ==, expected);
+ tor_free(actual);
+
+ expected = "1:00 hours";
+ actual = secs_to_uptime(60 * 60);
+ tt_str_op(actual, ==, expected);
+ tor_free(actual);
+
+ expected = "23:59 hours";
+ actual = secs_to_uptime(60 * 60 * 23 + 60 * 59);
+ tt_str_op(actual, ==, expected);
+ tor_free(actual);
+
+ expected = "1 day 0:00 hours";
+ actual = secs_to_uptime(60 * 60 * 23 + 60 * 60);
+ tt_str_op(actual, ==, expected);
+ tor_free(actual);
+
+ expected = "1 day 0:00 hours";
+ actual = secs_to_uptime(86400 + 1);
+ tt_str_op(actual, ==, expected);
+ tor_free(actual);
+
+ expected = "1 day 0:01 hours";
+ actual = secs_to_uptime(86400 + 60);
+ tt_str_op(actual, ==, expected);
+ tor_free(actual);
+
+ expected = "10 days 0:00 hours";
+ actual = secs_to_uptime(86400 * 10);
+ tt_str_op(actual, ==, expected);
+ tor_free(actual);
+
+ expected = "10 days 0:00 hours";
+ actual = secs_to_uptime(864000 + 1);
+ tt_str_op(actual, ==, expected);
+ tor_free(actual);
+
+ expected = "10 days 0:01 hours";
+ actual = secs_to_uptime(864000 + 60);
+ tt_str_op(actual, ==, expected);
+ tor_free(actual);
+
+ done:
+ if (actual != NULL)
+ tor_free(actual);
+}
+
+#undef NS_SUBMODULE
+#define NS_SUBMODULE bytes_to_usage
+
+/*
+ * Test that bytes_to_usage() is correctly converting the number of bytes that
+ * Tor has read/written into the appropriate string form containing kilobytes,
+ * megabytes, or gigabytes.
+ */
+
+static void
+NS(test_main)(void *arg)
+{
+ const char *expected;
+ char *actual;
+ (void)arg;
+
+ expected = "0 kB";
+ actual = bytes_to_usage(0);
+ tt_str_op(actual, ==, expected);
+ tor_free(actual);
+
+ expected = "0 kB";
+ actual = bytes_to_usage(1);
+ tt_str_op(actual, ==, expected);
+ tor_free(actual);
+
+ expected = "1 kB";
+ actual = bytes_to_usage(1024);
+ tt_str_op(actual, ==, expected);
+ tor_free(actual);
+
+ expected = "1023 kB";
+ actual = bytes_to_usage((1 << 20) - 1);
+ tt_str_op(actual, ==, expected);
+ tor_free(actual);
+
+ expected = "1.00 MB";
+ actual = bytes_to_usage((1 << 20));
+ tt_str_op(actual, ==, expected);
+ tor_free(actual);
+
+ expected = "1.00 MB";
+ actual = bytes_to_usage((1 << 20) + 5242);
+ tt_str_op(actual, ==, expected);
+ tor_free(actual);
+
+ expected = "1.01 MB";
+ actual = bytes_to_usage((1 << 20) + 5243);
+ tt_str_op(actual, ==, expected);
+ tor_free(actual);
+
+ expected = "1024.00 MB";
+ actual = bytes_to_usage((1 << 30) - 1);
+ tt_str_op(actual, ==, expected);
+ tor_free(actual);
+
+ expected = "1.00 GB";
+ actual = bytes_to_usage((1 << 30));
+ tt_str_op(actual, ==, expected);
+ tor_free(actual);
+
+ expected = "1.00 GB";
+ actual = bytes_to_usage((1 << 30) + 5368709);
+ tt_str_op(actual, ==, expected);
+ tor_free(actual);
+
+ expected = "1.01 GB";
+ actual = bytes_to_usage((1 << 30) + 5368710);
+ tt_str_op(actual, ==, expected);
+ tor_free(actual);
+
+ expected = "10.00 GB";
+ actual = bytes_to_usage((U64_LITERAL(1) << 30) * 10L);
+ tt_str_op(actual, ==, expected);
+ tor_free(actual);
+
+ done:
+ if (actual != NULL)
+ tor_free(actual);
+}
+
+#undef NS_SUBMODULE
+#define NS_SUBMODULE ASPECT(log_heartbeat, fails)
+
+/*
+ * Tests that log_heartbeat() fails when in the public server mode,
+ * not hibernating, and we couldn't get the current routerinfo.
+ */
+
+NS_DECL(double, tls_get_write_overhead_ratio, (void));
+NS_DECL(int, we_are_hibernating, (void));
+NS_DECL(const or_options_t *, get_options, (void));
+NS_DECL(int, public_server_mode, (const or_options_t *options));
+NS_DECL(const routerinfo_t *, router_get_my_routerinfo, (void));
+
+static void
+NS(test_main)(void *arg)
+{
+ int expected, actual;
+ (void)arg;
+
+ NS_MOCK(tls_get_write_overhead_ratio);
+ NS_MOCK(we_are_hibernating);
+ NS_MOCK(get_options);
+ NS_MOCK(public_server_mode);
+ NS_MOCK(router_get_my_routerinfo);
+
+ expected = -1;
+ actual = log_heartbeat(0);
+
+ tt_int_op(actual, ==, expected);
+
+ done:
+ NS_UNMOCK(tls_get_write_overhead_ratio);
+ NS_UNMOCK(we_are_hibernating);
+ NS_UNMOCK(get_options);
+ NS_UNMOCK(public_server_mode);
+ NS_UNMOCK(router_get_my_routerinfo);
+}
+
+static double
+NS(tls_get_write_overhead_ratio)(void)
+{
+ return 2.0;
+}
+
+static int
+NS(we_are_hibernating)(void)
+{
+ return 0;
+}
+
+static const or_options_t *
+NS(get_options)(void)
+{
+ return NULL;
+}
+
+static int
+NS(public_server_mode)(const or_options_t *options)
+{
+ (void)options;
+
+ return 1;
+}
+
+static const routerinfo_t *
+NS(router_get_my_routerinfo)(void)
+{
+ return NULL;
+}
+
+#undef NS_SUBMODULE
+#define NS_SUBMODULE ASPECT(log_heartbeat, not_in_consensus)
+
+/*
+ * Tests that log_heartbeat() logs appropriately if we are not in the cached
+ * consensus.
+ */
+
+NS_DECL(double, tls_get_write_overhead_ratio, (void));
+NS_DECL(int, we_are_hibernating, (void));
+NS_DECL(const or_options_t *, get_options, (void));
+NS_DECL(int, public_server_mode, (const or_options_t *options));
+NS_DECL(const routerinfo_t *, router_get_my_routerinfo, (void));
+NS_DECL(const node_t *, node_get_by_id, (const char *identity_digest));
+NS_DECL(void, logv, (int severity, log_domain_mask_t domain,
+ const char *funcname, const char *suffix, const char *format, va_list ap));
+NS_DECL(int, server_mode, (const or_options_t *options));
+
+static routerinfo_t *mock_routerinfo;
+extern int onion_handshakes_requested[MAX_ONION_HANDSHAKE_TYPE+1];
+extern int onion_handshakes_assigned[MAX_ONION_HANDSHAKE_TYPE+1];
+
+static void
+NS(test_main)(void *arg)
+{
+ int expected, actual;
+ (void)arg;
+
+ NS_MOCK(tls_get_write_overhead_ratio);
+ NS_MOCK(we_are_hibernating);
+ NS_MOCK(get_options);
+ NS_MOCK(public_server_mode);
+ NS_MOCK(router_get_my_routerinfo);
+ NS_MOCK(node_get_by_id);
+ NS_MOCK(logv);
+ NS_MOCK(server_mode);
+
+ log_global_min_severity_ = LOG_DEBUG;
+ onion_handshakes_requested[ONION_HANDSHAKE_TYPE_TAP] = 1;
+ onion_handshakes_assigned[ONION_HANDSHAKE_TYPE_TAP] = 1;
+ onion_handshakes_requested[ONION_HANDSHAKE_TYPE_NTOR] = 1;
+ onion_handshakes_assigned[ONION_HANDSHAKE_TYPE_NTOR] = 1;
+
+ expected = 0;
+ actual = log_heartbeat(0);
+
+ tt_int_op(actual, ==, expected);
+ tt_int_op(CALLED(logv), ==, 3);
+
+ done:
+ NS_UNMOCK(tls_get_write_overhead_ratio);
+ NS_UNMOCK(we_are_hibernating);
+ NS_UNMOCK(get_options);
+ NS_UNMOCK(public_server_mode);
+ NS_UNMOCK(router_get_my_routerinfo);
+ NS_UNMOCK(node_get_by_id);
+ NS_UNMOCK(logv);
+ NS_UNMOCK(server_mode);
+ tor_free(mock_routerinfo);
+}
+
+static double
+NS(tls_get_write_overhead_ratio)(void)
+{
+ return 1.0;
+}
+
+static int
+NS(we_are_hibernating)(void)
+{
+ return 0;
+}
+
+static const or_options_t *
+NS(get_options)(void)
+{
+ return NULL;
+}
+
+static int
+NS(public_server_mode)(const or_options_t *options)
+{
+ (void)options;
+
+ return 1;
+}
+
+static const routerinfo_t *
+NS(router_get_my_routerinfo)(void)
+{
+ mock_routerinfo = tor_malloc(sizeof(routerinfo_t));
+
+ return mock_routerinfo;
+}
+
+static const node_t *
+NS(node_get_by_id)(const char *identity_digest)
+{
+ (void)identity_digest;
+
+ return NULL;
+}
+
+static void
+NS(logv)(int severity, log_domain_mask_t domain,
+ const char *funcname, const char *suffix, const char *format, va_list ap)
+{
+ switch (CALLED(logv))
+ {
+ case 0:
+ tt_int_op(severity, ==, LOG_NOTICE);
+ tt_int_op(domain, ==, LD_HEARTBEAT);
+ tt_ptr_op(strstr(funcname, "log_heartbeat"), !=, NULL);
+ tt_ptr_op(suffix, ==, NULL);
+ tt_str_op(format, ==,
+ "Heartbeat: It seems like we are not in the cached consensus.");
+ break;
+ case 1:
+ tt_int_op(severity, ==, LOG_NOTICE);
+ tt_int_op(domain, ==, LD_HEARTBEAT);
+ tt_ptr_op(strstr(funcname, "log_heartbeat"), !=, NULL);
+ tt_ptr_op(suffix, ==, NULL);
+ tt_str_op(format, ==,
+ "Heartbeat: Tor's uptime is %s, with %d circuits open. "
+ "I've sent %s and received %s.%s");
+ tt_str_op(va_arg(ap, char *), ==, "0:00 hours"); /* uptime */
+ tt_int_op(va_arg(ap, int), ==, 0); /* count_circuits() */
+ tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* bw_sent */
+ tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* bw_rcvd */
+ tt_str_op(va_arg(ap, char *), ==, ""); /* hibernating */
+ break;
+ case 2:
+ tt_int_op(severity, ==, LOG_NOTICE);
+ tt_int_op(domain, ==, LD_HEARTBEAT);
+ tt_ptr_op(
+ strstr(funcname, "rep_hist_log_circuit_handshake_stats"), !=, NULL);
+ tt_ptr_op(suffix, ==, NULL);
+ tt_str_op(format, ==,
+ "Circuit handshake stats since last time: %d/%d TAP, %d/%d NTor.");
+ tt_int_op(va_arg(ap, int), ==, 1); /* handshakes assigned (TAP) */
+ tt_int_op(va_arg(ap, int), ==, 1); /* handshakes requested (TAP) */
+ tt_int_op(va_arg(ap, int), ==, 1); /* handshakes assigned (NTOR) */
+ tt_int_op(va_arg(ap, int), ==, 1); /* handshakes requested (NTOR) */
+ break;
+ default:
+ tt_abort_msg("unexpected call to logv()"); // TODO: prettyprint args
+ break;
+ }
+
+ done:
+ CALLED(logv)++;
+}
+
+static int
+NS(server_mode)(const or_options_t *options)
+{
+ (void)options;
+
+ return 0;
+}
+
+#undef NS_SUBMODULE
+#define NS_SUBMODULE ASPECT(log_heartbeat, simple)
+
+/*
+ * Tests that log_heartbeat() correctly logs heartbeat information
+ * normally.
+ */
+
+NS_DECL(double, tls_get_write_overhead_ratio, (void));
+NS_DECL(int, we_are_hibernating, (void));
+NS_DECL(const or_options_t *, get_options, (void));
+NS_DECL(int, public_server_mode, (const or_options_t *options));
+NS_DECL(long, get_uptime, (void));
+NS_DECL(uint64_t, get_bytes_read, (void));
+NS_DECL(uint64_t, get_bytes_written, (void));
+NS_DECL(void, logv, (int severity, log_domain_mask_t domain,
+ const char *funcname, const char *suffix, const char *format, va_list ap));
+NS_DECL(int, server_mode, (const or_options_t *options));
+
+static void
+NS(test_main)(void *arg)
+{
+ int expected, actual;
+ (void)arg;
+
+ NS_MOCK(tls_get_write_overhead_ratio);
+ NS_MOCK(we_are_hibernating);
+ NS_MOCK(get_options);
+ NS_MOCK(public_server_mode);
+ NS_MOCK(get_uptime);
+ NS_MOCK(get_bytes_read);
+ NS_MOCK(get_bytes_written);
+ NS_MOCK(logv);
+ NS_MOCK(server_mode);
+
+ log_global_min_severity_ = LOG_DEBUG;
+
+ expected = 0;
+ actual = log_heartbeat(0);
+
+ tt_int_op(actual, ==, expected);
+
+ done:
+ NS_UNMOCK(tls_get_write_overhead_ratio);
+ NS_UNMOCK(we_are_hibernating);
+ NS_UNMOCK(get_options);
+ NS_UNMOCK(public_server_mode);
+ NS_UNMOCK(get_uptime);
+ NS_UNMOCK(get_bytes_read);
+ NS_UNMOCK(get_bytes_written);
+ NS_UNMOCK(logv);
+ NS_UNMOCK(server_mode);
+}
+
+static double
+NS(tls_get_write_overhead_ratio)(void)
+{
+ return 1.0;
+}
+
+static int
+NS(we_are_hibernating)(void)
+{
+ return 1;
+}
+
+static const or_options_t *
+NS(get_options)(void)
+{
+ return NULL;
+}
+
+static int
+NS(public_server_mode)(const or_options_t *options)
+{
+ (void)options;
+
+ return 0;
+}
+
+static long
+NS(get_uptime)(void)
+{
+ return 0;
+}
+
+static uint64_t
+NS(get_bytes_read)(void)
+{
+ return 0;
+}
+
+static uint64_t
+NS(get_bytes_written)(void)
+{
+ return 0;
+}
+
+static void
+NS(logv)(int severity, log_domain_mask_t domain, const char *funcname,
+ const char *suffix, const char *format, va_list ap)
+{
+ tt_int_op(severity, ==, LOG_NOTICE);
+ tt_int_op(domain, ==, LD_HEARTBEAT);
+ tt_ptr_op(strstr(funcname, "log_heartbeat"), !=, NULL);
+ tt_ptr_op(suffix, ==, NULL);
+ tt_str_op(format, ==,
+ "Heartbeat: Tor's uptime is %s, with %d circuits open. "
+ "I've sent %s and received %s.%s");
+ tt_str_op(va_arg(ap, char *), ==, "0:00 hours"); /* uptime */
+ tt_int_op(va_arg(ap, int), ==, 0); /* count_circuits() */
+ tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* bw_sent */
+ tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* bw_rcvd */
+ tt_str_op(va_arg(ap, char *), ==, " We are currently hibernating.");
+
+ done:
+ ;
+}
+
+static int
+NS(server_mode)(const or_options_t *options)
+{
+ (void)options;
+
+ return 0;
+}
+
+#undef NS_SUBMODULE
+#define NS_SUBMODULE ASPECT(log_heartbeat, calls_log_accounting)
+
+/*
+ * Tests that log_heartbeat() correctly logs heartbeat information
+ * and accounting information when configured.
+ */
+
+NS_DECL(double, tls_get_write_overhead_ratio, (void));
+NS_DECL(int, we_are_hibernating, (void));
+NS_DECL(const or_options_t *, get_options, (void));
+NS_DECL(int, public_server_mode, (const or_options_t *options));
+NS_DECL(long, get_uptime, (void));
+NS_DECL(uint64_t, get_bytes_read, (void));
+NS_DECL(uint64_t, get_bytes_written, (void));
+NS_DECL(void, logv, (int severity, log_domain_mask_t domain,
+ const char *funcname, const char *suffix, const char *format, va_list ap));
+NS_DECL(int, server_mode, (const or_options_t *options));
+NS_DECL(or_state_t *, get_or_state, (void));
+NS_DECL(int, accounting_is_enabled, (const or_options_t *options));
+NS_DECL(time_t, accounting_get_end_time, (void));
+
+static or_state_t * NS(mock_state) = NULL;
+static or_options_t * NS(mock_options) = NULL;
+
+static void
+NS(test_main)(void *arg)
+{
+ int expected, actual;
+ (void)arg;
+
+ NS_MOCK(tls_get_write_overhead_ratio);
+ NS_MOCK(we_are_hibernating);
+ NS_MOCK(get_options);
+ NS_MOCK(public_server_mode);
+ NS_MOCK(get_uptime);
+ NS_MOCK(get_bytes_read);
+ NS_MOCK(get_bytes_written);
+ NS_MOCK(logv);
+ NS_MOCK(server_mode);
+ NS_MOCK(get_or_state);
+ NS_MOCK(accounting_is_enabled);
+ NS_MOCK(accounting_get_end_time);
+
+ log_global_min_severity_ = LOG_DEBUG;
+
+ expected = 0;
+ actual = log_heartbeat(0);
+
+ tt_int_op(actual, ==, expected);
+ tt_int_op(CALLED(logv), ==, 2);
+
+ done:
+ NS_UNMOCK(tls_get_write_overhead_ratio);
+ NS_UNMOCK(we_are_hibernating);
+ NS_UNMOCK(get_options);
+ NS_UNMOCK(public_server_mode);
+ NS_UNMOCK(get_uptime);
+ NS_UNMOCK(get_bytes_read);
+ NS_UNMOCK(get_bytes_written);
+ NS_UNMOCK(logv);
+ NS_UNMOCK(server_mode);
+ NS_UNMOCK(accounting_is_enabled);
+ NS_UNMOCK(accounting_get_end_time);
+ tor_free_(NS(mock_state));
+ tor_free_(NS(mock_options));
+}
+
+static double
+NS(tls_get_write_overhead_ratio)(void)
+{
+ return 1.0;
+}
+
+static int
+NS(we_are_hibernating)(void)
+{
+ return 0;
+}
+
+static const or_options_t *
+NS(get_options)(void)
+{
+ NS(mock_options) = tor_malloc_zero(sizeof(or_options_t));
+ NS(mock_options)->AccountingMax = 0;
+
+ return NS(mock_options);
+}
+
+static int
+NS(public_server_mode)(const or_options_t *options)
+{
+ (void)options;
+
+ return 0;
+}
+
+static long
+NS(get_uptime)(void)
+{
+ return 0;
+}
+
+static uint64_t
+NS(get_bytes_read)(void)
+{
+ return 0;
+}
+
+static uint64_t
+NS(get_bytes_written)(void)
+{
+ return 0;
+}
+
+static void
+NS(logv)(int severity, log_domain_mask_t domain,
+ const char *funcname, const char *suffix, const char *format, va_list ap)
+{
+ switch (CALLED(logv))
+ {
+ case 0:
+ tt_int_op(severity, ==, LOG_NOTICE);
+ tt_int_op(domain, ==, LD_HEARTBEAT);
+ tt_ptr_op(strstr(funcname, "log_heartbeat"), !=, NULL);
+ tt_ptr_op(suffix, ==, NULL);
+ tt_str_op(format, ==,
+ "Heartbeat: Tor's uptime is %s, with %d circuits open. "
+ "I've sent %s and received %s.%s");
+ tt_str_op(va_arg(ap, char *), ==, "0:00 hours"); /* uptime */
+ tt_int_op(va_arg(ap, int), ==, 0); /* count_circuits() */
+ tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* bw_sent */
+ tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* bw_rcvd */
+ tt_str_op(va_arg(ap, char *), ==, ""); /* hibernating */
+ break;
+ case 1:
+ tt_int_op(severity, ==, LOG_NOTICE);
+ tt_int_op(domain, ==, LD_HEARTBEAT);
+ tt_ptr_op(strstr(funcname, "log_accounting"), !=, NULL);
+ tt_ptr_op(suffix, ==, NULL);
+ tt_str_op(format, ==,
+ "Heartbeat: Accounting enabled. Sent: %s / %s, Received: %s / %s. "
+ "The current accounting interval ends on %s, in %s.");
+ tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* acc_sent */
+ tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* acc_max */
+ tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* acc_rcvd */
+ tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* acc_max */
+ /* format_local_iso_time uses local tz, just check mins and secs. */
+ tt_ptr_op(strstr(va_arg(ap, char *), ":01:00"), !=, NULL); /* end_buf */
+ tt_str_op(va_arg(ap, char *), ==, "0:01 hours"); /* remaining */
+ break;
+ default:
+ tt_abort_msg("unexpected call to logv()"); // TODO: prettyprint args
+ break;
+ }
+
+ done:
+ CALLED(logv)++;
+}
+
+static int
+NS(server_mode)(const or_options_t *options)
+{
+ (void)options;
+
+ return 1;
+}
+
+static int
+NS(accounting_is_enabled)(const or_options_t *options)
+{
+ (void)options;
+
+ return 1;
+}
+
+static time_t
+NS(accounting_get_end_time)(void)
+{
+ return 60;
+}
+
+static or_state_t *
+NS(get_or_state)(void)
+{
+ NS(mock_state) = tor_malloc_zero(sizeof(or_state_t));
+ NS(mock_state)->AccountingBytesReadInInterval = 0;
+ NS(mock_state)->AccountingBytesWrittenInInterval = 0;
+
+ return NS(mock_state);
+}
+
+#undef NS_SUBMODULE
+#define NS_SUBMODULE ASPECT(log_heartbeat, packaged_cell_fullness)
+
+/*
+ * Tests that log_heartbeat() correctly logs packaged cell
+ * fullness information.
+ */
+
+NS_DECL(double, tls_get_write_overhead_ratio, (void));
+NS_DECL(int, we_are_hibernating, (void));
+NS_DECL(const or_options_t *, get_options, (void));
+NS_DECL(int, public_server_mode, (const or_options_t *options));
+NS_DECL(long, get_uptime, (void));
+NS_DECL(uint64_t, get_bytes_read, (void));
+NS_DECL(uint64_t, get_bytes_written, (void));
+NS_DECL(void, logv, (int severity, log_domain_mask_t domain,
+ const char *funcname, const char *suffix, const char *format, va_list ap));
+NS_DECL(int, server_mode, (const or_options_t *options));
+NS_DECL(int, accounting_is_enabled, (const or_options_t *options));
+
+static void
+NS(test_main)(void *arg)
+{
+ int expected, actual;
+ (void)arg;
+
+ NS_MOCK(tls_get_write_overhead_ratio);
+ NS_MOCK(we_are_hibernating);
+ NS_MOCK(get_options);
+ NS_MOCK(public_server_mode);
+ NS_MOCK(get_uptime);
+ NS_MOCK(get_bytes_read);
+ NS_MOCK(get_bytes_written);
+ NS_MOCK(logv);
+ NS_MOCK(server_mode);
+ NS_MOCK(accounting_is_enabled);
+ log_global_min_severity_ = LOG_DEBUG;
+
+ stats_n_data_bytes_packaged = RELAY_PAYLOAD_SIZE;
+ stats_n_data_cells_packaged = 1;
+ expected = 0;
+ actual = log_heartbeat(0);
+
+ tt_int_op(actual, ==, expected);
+ tt_int_op(CALLED(logv), ==, 2);
+
+ done:
+ stats_n_data_bytes_packaged = 0;
+ stats_n_data_cells_packaged = 0;
+ NS_UNMOCK(tls_get_write_overhead_ratio);
+ NS_UNMOCK(we_are_hibernating);
+ NS_UNMOCK(get_options);
+ NS_UNMOCK(public_server_mode);
+ NS_UNMOCK(get_uptime);
+ NS_UNMOCK(get_bytes_read);
+ NS_UNMOCK(get_bytes_written);
+ NS_UNMOCK(logv);
+ NS_UNMOCK(server_mode);
+ NS_UNMOCK(accounting_is_enabled);
+}
+
+static double
+NS(tls_get_write_overhead_ratio)(void)
+{
+ return 1.0;
+}
+
+static int
+NS(we_are_hibernating)(void)
+{
+ return 0;
+}
+
+static const or_options_t *
+NS(get_options)(void)
+{
+ return NULL;
+}
+
+static int
+NS(public_server_mode)(const or_options_t *options)
+{
+ (void)options;
+
+ return 0;
+}
+
+static long
+NS(get_uptime)(void)
+{
+ return 0;
+}
+
+static uint64_t
+NS(get_bytes_read)(void)
+{
+ return 0;
+}
+
+static uint64_t
+NS(get_bytes_written)(void)
+{
+ return 0;
+}
+
+static void
+NS(logv)(int severity, log_domain_mask_t domain, const char *funcname,
+ const char *suffix, const char *format, va_list ap)
+{
+ switch (CALLED(logv))
+ {
+ case 0:
+ tt_int_op(severity, ==, LOG_NOTICE);
+ tt_int_op(domain, ==, LD_HEARTBEAT);
+ tt_ptr_op(strstr(funcname, "log_heartbeat"), !=, NULL);
+ tt_ptr_op(suffix, ==, NULL);
+ tt_str_op(format, ==,
+ "Heartbeat: Tor's uptime is %s, with %d circuits open. "
+ "I've sent %s and received %s.%s");
+ tt_str_op(va_arg(ap, char *), ==, "0:00 hours"); /* uptime */
+ tt_int_op(va_arg(ap, int), ==, 0); /* count_circuits() */
+ tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* bw_sent */
+ tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* bw_rcvd */
+ tt_str_op(va_arg(ap, char *), ==, ""); /* hibernating */
+ break;
+ case 1:
+ tt_int_op(severity, ==, LOG_NOTICE);
+ tt_int_op(domain, ==, LD_HEARTBEAT);
+ tt_ptr_op(strstr(funcname, "log_heartbeat"), !=, NULL);
+ tt_ptr_op(suffix, ==, NULL);
+ tt_str_op(format, ==,
+ "Average packaged cell fullness: %2.3f%%");
+ tt_int_op(fabs(va_arg(ap, double) - 100.0) <= DBL_EPSILON, ==, 1);
+ break;
+ default:
+ tt_abort_msg("unexpected call to logv()"); // TODO: prettyprint args
+ break;
+ }
+
+ done:
+ CALLED(logv)++;
+}
+
+static int
+NS(server_mode)(const or_options_t *options)
+{
+ (void)options;
+
+ return 0;
+}
+
+static int
+NS(accounting_is_enabled)(const or_options_t *options)
+{
+ (void)options;
+
+ return 0;
+}
+
+#undef NS_SUBMODULE
+#define NS_SUBMODULE ASPECT(log_heartbeat, tls_write_overhead)
+
+/*
+ * Tests that log_heartbeat() correctly logs the TLS write overhead information
+ * when the TLS write overhead ratio exceeds 1.
+ */
+
+NS_DECL(double, tls_get_write_overhead_ratio, (void));
+NS_DECL(int, we_are_hibernating, (void));
+NS_DECL(const or_options_t *, get_options, (void));
+NS_DECL(int, public_server_mode, (const or_options_t *options));
+NS_DECL(long, get_uptime, (void));
+NS_DECL(uint64_t, get_bytes_read, (void));
+NS_DECL(uint64_t, get_bytes_written, (void));
+NS_DECL(void, logv, (int severity, log_domain_mask_t domain,
+ const char *funcname, const char *suffix, const char *format, va_list ap));
+NS_DECL(int, server_mode, (const or_options_t *options));
+NS_DECL(int, accounting_is_enabled, (const or_options_t *options));
+
+static void
+NS(test_main)(void *arg)
+{
+ int expected, actual;
+ (void)arg;
+
+ NS_MOCK(tls_get_write_overhead_ratio);
+ NS_MOCK(we_are_hibernating);
+ NS_MOCK(get_options);
+ NS_MOCK(public_server_mode);
+ NS_MOCK(get_uptime);
+ NS_MOCK(get_bytes_read);
+ NS_MOCK(get_bytes_written);
+ NS_MOCK(logv);
+ NS_MOCK(server_mode);
+ NS_MOCK(accounting_is_enabled);
+ stats_n_data_cells_packaged = 0;
+ log_global_min_severity_ = LOG_DEBUG;
+
+ expected = 0;
+ actual = log_heartbeat(0);
+
+ tt_int_op(actual, ==, expected);
+ tt_int_op(CALLED(logv), ==, 2);
+
+ done:
+ NS_UNMOCK(tls_get_write_overhead_ratio);
+ NS_UNMOCK(we_are_hibernating);
+ NS_UNMOCK(get_options);
+ NS_UNMOCK(public_server_mode);
+ NS_UNMOCK(get_uptime);
+ NS_UNMOCK(get_bytes_read);
+ NS_UNMOCK(get_bytes_written);
+ NS_UNMOCK(logv);
+ NS_UNMOCK(server_mode);
+ NS_UNMOCK(accounting_is_enabled);
+}
+
+static double
+NS(tls_get_write_overhead_ratio)(void)
+{
+ return 2.0;
+}
+
+static int
+NS(we_are_hibernating)(void)
+{
+ return 0;
+}
+
+static const or_options_t *
+NS(get_options)(void)
+{
+ return NULL;
+}
+
+static int
+NS(public_server_mode)(const or_options_t *options)
+{
+ (void)options;
+
+ return 0;
+}
+
+static long
+NS(get_uptime)(void)
+{
+ return 0;
+}
+
+static uint64_t
+NS(get_bytes_read)(void)
+{
+ return 0;
+}
+
+static uint64_t
+NS(get_bytes_written)(void)
+{
+ return 0;
+}
+
+static void
+NS(logv)(int severity, log_domain_mask_t domain,
+ const char *funcname, const char *suffix, const char *format, va_list ap)
+{
+ switch (CALLED(logv))
+ {
+ case 0:
+ tt_int_op(severity, ==, LOG_NOTICE);
+ tt_int_op(domain, ==, LD_HEARTBEAT);
+ tt_ptr_op(strstr(funcname, "log_heartbeat"), !=, NULL);
+ tt_ptr_op(suffix, ==, NULL);
+ tt_str_op(format, ==,
+ "Heartbeat: Tor's uptime is %s, with %d circuits open. "
+ "I've sent %s and received %s.%s");
+ tt_str_op(va_arg(ap, char *), ==, "0:00 hours"); /* uptime */
+ tt_int_op(va_arg(ap, int), ==, 0); /* count_circuits() */
+ tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* bw_sent */
+ tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* bw_rcvd */
+ tt_str_op(va_arg(ap, char *), ==, ""); /* hibernating */
+ break;
+ case 1:
+ tt_int_op(severity, ==, LOG_NOTICE);
+ tt_int_op(domain, ==, LD_HEARTBEAT);
+ tt_ptr_op(strstr(funcname, "log_heartbeat"), !=, NULL);
+ tt_ptr_op(suffix, ==, NULL);
+ tt_str_op(format, ==, "TLS write overhead: %.f%%");
+ tt_int_op(fabs(va_arg(ap, double) - 100.0) <= DBL_EPSILON, ==, 1);
+ break;
+ default:
+ tt_abort_msg("unexpected call to logv()"); // TODO: prettyprint args
+ break;
+ }
+
+ done:
+ CALLED(logv)++;
+}
+
+static int
+NS(server_mode)(const or_options_t *options)
+{
+ (void)options;
+
+ return 0;
+}
+
+static int
+NS(accounting_is_enabled)(const or_options_t *options)
+{
+ (void)options;
+
+ return 0;
+}
+
+#undef NS_SUBMODULE
+
+struct testcase_t status_tests[] = {
+ TEST_CASE(count_circuits),
+ TEST_CASE(secs_to_uptime),
+ TEST_CASE(bytes_to_usage),
+ TEST_CASE_ASPECT(log_heartbeat, fails),
+ TEST_CASE_ASPECT(log_heartbeat, simple),
+ TEST_CASE_ASPECT(log_heartbeat, not_in_consensus),
+ TEST_CASE_ASPECT(log_heartbeat, calls_log_accounting),
+ TEST_CASE_ASPECT(log_heartbeat, packaged_cell_fullness),
+ TEST_CASE_ASPECT(log_heartbeat, tls_write_overhead),
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_util.c b/src/test/test_util.c
index 65d9d2f87..c7fa14118 100644
--- a/src/test/test_util.c
+++ b/src/test/test_util.c
@@ -4,6 +4,7 @@
/* See LICENSE for licensing information */
#include "orconfig.h"
+#define COMPAT_PRIVATE
#define CONTROL_PRIVATE
#define MEMPOOL_PRIVATE
#define UTIL_PRIVATE
@@ -11,7 +12,9 @@
#include "config.h"
#include "control.h"
#include "test.h"
+#ifdef ENABLE_MEMPOOLS
#include "mempool.h"
+#endif /* ENABLE_MEMPOOLS */
#include "memarea.h"
#ifdef _WIN32
@@ -101,6 +104,107 @@ test_util_read_file_eof_zero_bytes(void *arg)
test_util_read_until_eof_impl("tor_test_fifo_empty", 0, 10000);
}
+/* Test the basic expected behaviour for write_chunks_to_file.
+ * NOTE: This will need to be updated if we ever change the tempfile location
+ * or extension */
+static void
+test_util_write_chunks_to_file(void *arg)
+{
+ char *fname = NULL;
+ char *tempname = NULL;
+ char *str = NULL;
+ int r;
+ struct stat st;
+
+ /* These should be two different sizes to ensure the data is different
+ * between the data file and the temp file's 'known string' */
+ int temp_str_len = 1024;
+ int data_str_len = 512;
+ char *data_str = tor_malloc(data_str_len);
+ char *temp_str = tor_malloc(temp_str_len);
+
+ smartlist_t *chunks = smartlist_new();
+ sized_chunk_t c = {data_str, data_str_len/2};
+ sized_chunk_t c2 = {data_str + data_str_len/2, data_str_len/2};
+ (void)arg;
+
+ crypto_rand(temp_str, temp_str_len);
+ crypto_rand(data_str, data_str_len);
+
+ // Ensure it can write multiple chunks
+
+ smartlist_add(chunks, &c);
+ smartlist_add(chunks, &c2);
+
+ /*
+ * Check if it writes using a tempfile
+ */
+ fname = tor_strdup(get_fname("write_chunks_with_tempfile"));
+ tor_asprintf(&tempname, "%s.tmp", fname);
+
+ // write a known string to a file where the tempfile will be
+ r = write_bytes_to_file(tempname, temp_str, temp_str_len, 1);
+ tt_int_op(r, ==, 0);
+
+ // call write_chunks_to_file
+ r = write_chunks_to_file(fname, chunks, 1, 0);
+ tt_int_op(r, ==, 0);
+
+ // assert the file has been written (expected size)
+ str = read_file_to_str(fname, RFTS_BIN, &st);
+ tt_assert(str != NULL);
+ tt_u64_op((uint64_t)st.st_size, ==, data_str_len);
+ test_mem_op(data_str, ==, str, data_str_len);
+ tor_free(str);
+
+ // assert that the tempfile is removed (should not leave artifacts)
+ str = read_file_to_str(tempname, RFTS_BIN|RFTS_IGNORE_MISSING, &st);
+ tt_assert(str == NULL);
+
+ // Remove old testfile for second test
+ r = unlink(fname);
+ tt_int_op(r, ==, 0);
+ tor_free(fname);
+ tor_free(tempname);
+
+ /*
+ * Check if it skips using a tempfile with flags
+ */
+ fname = tor_strdup(get_fname("write_chunks_with_no_tempfile"));
+ tor_asprintf(&tempname, "%s.tmp", fname);
+
+ // write a known string to a file where the tempfile will be
+ r = write_bytes_to_file(tempname, temp_str, temp_str_len, 1);
+ tt_int_op(r, ==, 0);
+
+ // call write_chunks_to_file with no_tempfile = true
+ r = write_chunks_to_file(fname, chunks, 1, 1);
+ tt_int_op(r, ==, 0);
+
+ // assert the file has been written (expected size)
+ str = read_file_to_str(fname, RFTS_BIN, &st);
+ tt_assert(str != NULL);
+ tt_u64_op((uint64_t)st.st_size, ==, data_str_len);
+ test_mem_op(data_str, ==, str, data_str_len);
+ tor_free(str);
+
+ // assert the tempfile still contains the known string
+ str = read_file_to_str(tempname, RFTS_BIN, &st);
+ tt_assert(str != NULL);
+ tt_u64_op((uint64_t)st.st_size, ==, temp_str_len);
+ test_mem_op(temp_str, ==, str, temp_str_len);
+
+ done:
+ unlink(fname);
+ unlink(tempname);
+ smartlist_free(chunks);
+ tor_free(fname);
+ tor_free(tempname);
+ tor_free(str);
+ tor_free(data_str);
+ tor_free(temp_str);
+}
+
static void
test_util_time(void)
{
@@ -242,7 +346,7 @@ test_util_time(void)
tv.tv_sec = (time_t)1326296338;
tv.tv_usec = 3060;
- format_iso_time(timestr, tv.tv_sec);
+ format_iso_time(timestr, (time_t)tv.tv_sec);
test_streq("2012-01-11 15:38:58", timestr);
/* The output of format_local_iso_time will vary by timezone, and setting
our timezone for testing purposes would be a nontrivial flaky pain.
@@ -250,7 +354,7 @@ test_util_time(void)
format_local_iso_time(timestr, tv.tv_sec);
test_streq("2012-01-11 10:38:58", timestr);
*/
- format_iso_time_nospace(timestr, tv.tv_sec);
+ format_iso_time_nospace(timestr, (time_t)tv.tv_sec);
test_streq("2012-01-11T15:38:58", timestr);
test_eq(strlen(timestr), ISO_TIME_LEN);
format_iso_time_nospace_usec(timestr, &tv);
@@ -796,6 +900,64 @@ test_util_expand_filename(void)
}
#endif
+/** Test tor_escape_str_for_pt_args(). */
+static void
+test_util_escape_string_socks(void)
+{
+ char *escaped_string = NULL;
+
+ /** Simple backslash escape. */
+ escaped_string = tor_escape_str_for_pt_args("This is a backslash: \\",";\\");
+ test_assert(escaped_string);
+ test_streq(escaped_string, "This is a backslash: \\\\");
+ tor_free(escaped_string);
+
+ /** Simple semicolon escape. */
+ escaped_string = tor_escape_str_for_pt_args("First rule:Do not use ;",";\\");
+ test_assert(escaped_string);
+ test_streq(escaped_string, "First rule:Do not use \\;");
+ tor_free(escaped_string);
+
+ /** Empty string. */
+ escaped_string = tor_escape_str_for_pt_args("", ";\\");
+ test_assert(escaped_string);
+ test_streq(escaped_string, "");
+ tor_free(escaped_string);
+
+ /** Escape all characters. */
+ escaped_string = tor_escape_str_for_pt_args(";\\;\\", ";\\");
+ test_assert(escaped_string);
+ test_streq(escaped_string, "\\;\\\\\\;\\\\");
+ tor_free(escaped_string);
+
+ escaped_string = tor_escape_str_for_pt_args(";", ";\\");
+ test_assert(escaped_string);
+ test_streq(escaped_string, "\\;");
+ tor_free(escaped_string);
+
+ done:
+ tor_free(escaped_string);
+}
+
+static void
+test_util_string_is_key_value(void *ptr)
+{
+ (void)ptr;
+ test_assert(string_is_key_value(LOG_WARN, "key=value"));
+ test_assert(string_is_key_value(LOG_WARN, "k=v"));
+ test_assert(string_is_key_value(LOG_WARN, "key="));
+ test_assert(string_is_key_value(LOG_WARN, "x="));
+ test_assert(string_is_key_value(LOG_WARN, "xx="));
+ test_assert(!string_is_key_value(LOG_WARN, "=value"));
+ test_assert(!string_is_key_value(LOG_WARN, "=x"));
+ test_assert(!string_is_key_value(LOG_WARN, "="));
+
+ /* ??? */
+ /* test_assert(!string_is_key_value(LOG_WARN, "===")); */
+ done:
+ ;
+}
+
/** Test basic string functionality. */
static void
test_util_strmisc(void)
@@ -867,6 +1029,8 @@ test_util_strmisc(void)
test_eq(0L, tor_parse_long("10",-2,0,100,NULL,NULL));
test_eq(68284L, tor_parse_long("10abc",16,0,70000,NULL,NULL));
test_eq(68284L, tor_parse_long("10ABC",16,0,70000,NULL,NULL));
+ test_eq(0, tor_parse_long("10ABC",-1,0,70000,&i,NULL));
+ test_eq(i, 0);
/* Test parse_ulong */
test_eq(0UL, tor_parse_ulong("",10,0,100,NULL,NULL));
@@ -878,6 +1042,8 @@ test_util_strmisc(void)
test_eq(0UL, tor_parse_ulong("8",8,0,100,NULL,NULL));
test_eq(50UL, tor_parse_ulong("50",10,50,100,NULL,NULL));
test_eq(0UL, tor_parse_ulong("-50",10,-100,100,NULL,NULL));
+ test_eq(0UL, tor_parse_ulong("50",-1,50,100,&i,NULL));
+ test_eq(0, i);
/* Test parse_uint64 */
test_assert(U64_LITERAL(10) == tor_parse_uint64("10 x",10,0,100, &i, &cp));
@@ -890,6 +1056,9 @@ test_util_strmisc(void)
test_assert(U64_LITERAL(0) ==
tor_parse_uint64("12345678901",10,500,INT32_MAX, &i, &cp));
test_eq(0, i);
+ test_assert(U64_LITERAL(0) ==
+ tor_parse_uint64("123",-1,0,INT32_MAX, &i, &cp));
+ test_eq(0, i);
{
/* Test parse_double */
@@ -923,7 +1092,7 @@ test_util_strmisc(void)
test_eq(i, 0);
test_eq(0UL, tor_parse_ulong(TOOBIG, 10, 0, ULONG_MAX, &i, NULL));
test_eq(i, 0);
- test_eq(U64_LITERAL(0), tor_parse_uint64(TOOBIG, 10,
+ tt_u64_op(U64_LITERAL(0), ==, tor_parse_uint64(TOOBIG, 10,
0, UINT64_MAX, &i, NULL));
test_eq(i, 0);
}
@@ -1022,19 +1191,19 @@ test_util_strmisc(void)
}
/* Test str-foo functions */
- cp = tor_strdup("abcdef");
- test_assert(tor_strisnonupper(cp));
- cp[3] = 'D';
- test_assert(!tor_strisnonupper(cp));
- tor_strupper(cp);
- test_streq(cp, "ABCDEF");
- tor_strlower(cp);
- test_streq(cp, "abcdef");
- test_assert(tor_strisnonupper(cp));
- test_assert(tor_strisprint(cp));
- cp[3] = 3;
- test_assert(!tor_strisprint(cp));
- tor_free(cp);
+ cp_tmp = tor_strdup("abcdef");
+ test_assert(tor_strisnonupper(cp_tmp));
+ cp_tmp[3] = 'D';
+ test_assert(!tor_strisnonupper(cp_tmp));
+ tor_strupper(cp_tmp);
+ test_streq(cp_tmp, "ABCDEF");
+ tor_strlower(cp_tmp);
+ test_streq(cp_tmp, "abcdef");
+ test_assert(tor_strisnonupper(cp_tmp));
+ test_assert(tor_strisprint(cp_tmp));
+ cp_tmp[3] = 3;
+ test_assert(!tor_strisprint(cp_tmp));
+ tor_free(cp_tmp);
/* Test memmem and memstr */
{
@@ -1045,6 +1214,10 @@ test_util_strmisc(void)
test_assert(!tor_memmem(haystack, 4, "cde", 3));
haystack = "ababcad";
test_eq_ptr(tor_memmem(haystack, 7, "abc", 3), haystack + 2);
+ test_eq_ptr(tor_memmem(haystack, 7, "ad", 2), haystack + 5);
+ test_eq_ptr(tor_memmem(haystack, 7, "cad", 3), haystack + 4);
+ test_assert(!tor_memmem(haystack, 7, "dadad", 5));
+ test_assert(!tor_memmem(haystack, 7, "abcdefghij", 10));
/* memstr */
test_eq_ptr(tor_memstr(haystack, 7, "abc"), haystack + 2);
test_eq_ptr(tor_memstr(haystack, 7, "cad"), haystack + 4);
@@ -1117,21 +1290,21 @@ test_util_pow2(void)
test_eq(tor_log2(UINT64_MAX), 63);
/* Test round_to_power_of_2 */
- test_eq(round_to_power_of_2(120), 128);
- test_eq(round_to_power_of_2(128), 128);
- test_eq(round_to_power_of_2(130), 128);
- test_eq(round_to_power_of_2(U64_LITERAL(40000000000000000)),
- U64_LITERAL(1)<<55);
- test_eq(round_to_power_of_2(U64_LITERAL(0xffffffffffffffff)),
+ tt_u64_op(round_to_power_of_2(120), ==, 128);
+ tt_u64_op(round_to_power_of_2(128), ==, 128);
+ tt_u64_op(round_to_power_of_2(130), ==, 128);
+ tt_u64_op(round_to_power_of_2(U64_LITERAL(40000000000000000)), ==,
+ U64_LITERAL(1)<<55);
+ tt_u64_op(round_to_power_of_2(U64_LITERAL(0xffffffffffffffff)), ==,
U64_LITERAL(1)<<63);
- test_eq(round_to_power_of_2(0), 1);
- test_eq(round_to_power_of_2(1), 1);
- test_eq(round_to_power_of_2(2), 2);
- test_eq(round_to_power_of_2(3), 2);
- test_eq(round_to_power_of_2(4), 4);
- test_eq(round_to_power_of_2(5), 4);
- test_eq(round_to_power_of_2(6), 4);
- test_eq(round_to_power_of_2(7), 8);
+ tt_u64_op(round_to_power_of_2(0), ==, 1);
+ tt_u64_op(round_to_power_of_2(1), ==, 1);
+ tt_u64_op(round_to_power_of_2(2), ==, 2);
+ tt_u64_op(round_to_power_of_2(3), ==, 2);
+ tt_u64_op(round_to_power_of_2(4), ==, 4);
+ tt_u64_op(round_to_power_of_2(5), ==, 4);
+ tt_u64_op(round_to_power_of_2(6), ==, 4);
+ tt_u64_op(round_to_power_of_2(7), ==, 8);
done:
;
@@ -1410,14 +1583,14 @@ test_util_mmap(void)
test_eq(mapping->size, strlen("Short file."));
test_streq(mapping->data, "Short file.");
#ifdef _WIN32
- tor_munmap_file(mapping);
+ tt_int_op(0, ==, tor_munmap_file(mapping));
mapping = NULL;
test_assert(unlink(fname1) == 0);
#else
/* make sure we can unlink. */
test_assert(unlink(fname1) == 0);
test_streq(mapping->data, "Short file.");
- tor_munmap_file(mapping);
+ tt_int_op(0, ==, tor_munmap_file(mapping));
mapping = NULL;
#endif
@@ -1438,7 +1611,7 @@ test_util_mmap(void)
test_assert(mapping);
test_eq(mapping->size, buflen);
test_memeq(mapping->data, buf, buflen);
- tor_munmap_file(mapping);
+ tt_int_op(0, ==, tor_munmap_file(mapping));
mapping = NULL;
/* Now try a big aligned file. */
@@ -1447,7 +1620,7 @@ test_util_mmap(void)
test_assert(mapping);
test_eq(mapping->size, 16384);
test_memeq(mapping->data, buf, 16384);
- tor_munmap_file(mapping);
+ tt_int_op(0, ==, tor_munmap_file(mapping));
mapping = NULL;
done:
@@ -1460,8 +1633,7 @@ test_util_mmap(void)
tor_free(fname3);
tor_free(buf);
- if (mapping)
- tor_munmap_file(mapping);
+ tor_munmap_file(mapping);
}
/** Run unit tests for escaping/unescaping data for use by controllers. */
@@ -1729,6 +1901,8 @@ test_util_path_is_relative(void)
;
}
+#ifdef ENABLE_MEMPOOLS
+
/** Run unittests for memory pool allocator */
static void
test_util_mempool(void)
@@ -1787,6 +1961,8 @@ test_util_mempool(void)
mp_pool_destroy(pool);
}
+#endif /* ENABLE_MEMPOOLS */
+
/** Run unittests for memory area allocator */
static void
test_util_memarea(void)
@@ -2071,18 +2247,21 @@ test_util_asprintf(void *ptr)
test_assert(cp);
test_streq("simple string 100% safe", cp);
test_eq(strlen(cp), r);
+ tor_free(cp);
/* empty string */
r = tor_asprintf(&cp, "%s", "");
test_assert(cp);
test_streq("", cp);
test_eq(strlen(cp), r);
+ tor_free(cp);
/* numbers (%i) */
r = tor_asprintf(&cp, "I like numbers-%2i, %i, etc.", -1, 2);
test_assert(cp);
test_streq("I like numbers--1, 2, etc.", cp);
test_eq(strlen(cp), r);
+ /* don't free cp; next test uses it. */
/* numbers (%d) */
r = tor_asprintf(&cp2, "First=%d, Second=%d", 101, 202);
@@ -2155,6 +2334,8 @@ test_util_listdir(void *ptr)
done:
tor_free(fname1);
tor_free(fname2);
+ tor_free(fname3);
+ tor_free(dir1);
tor_free(dirname);
if (dir_contents) {
SMARTLIST_FOREACH(dir_contents, char *, cp, tor_free(cp));
@@ -2223,6 +2404,7 @@ test_util_load_win_lib(void *ptr)
}
#endif
+#ifndef _WIN32
static void
clear_hex_errno(char *hex_errno)
{
@@ -2267,6 +2449,7 @@ test_util_exit_status(void *ptr)
done:
;
}
+#endif
#ifndef _WIN32
/** Check that fgets waits until a full line, and not return a partial line, on
@@ -2568,14 +2751,14 @@ test_util_spawn_background_partial_read(void *ptr)
}
/**
- * Test for format_hex_number_for_helper_exit_status()
+ * Test for format_hex_number_sigsafe()
*/
static void
test_util_format_hex_number(void *ptr)
{
int i, len;
- char buf[HEX_ERRNO_SIZE + 1];
+ char buf[33];
const struct {
const char *str;
unsigned int x;
@@ -2584,6 +2767,8 @@ test_util_format_hex_number(void *ptr)
{"1", 1},
{"273A", 0x273a},
{"FFFF", 0xffff},
+ {"7FFFFFFF", 0x7fffffff},
+ {"FFFFFFFF", 0xffffffff},
#if UINT_MAX >= 0xffffffff
{"31BC421D", 0x31bc421d},
{"FFFFFFFF", 0xffffffff},
@@ -2594,19 +2779,73 @@ test_util_format_hex_number(void *ptr)
(void)ptr;
for (i = 0; test_data[i].str != NULL; ++i) {
- len = format_hex_number_for_helper_exit_status(test_data[i].x,
- buf, HEX_ERRNO_SIZE);
+ len = format_hex_number_sigsafe(test_data[i].x, buf, sizeof(buf));
+ test_neq(len, 0);
+ test_eq(len, strlen(buf));
+ test_streq(buf, test_data[i].str);
+ }
+
+ test_eq(4, format_hex_number_sigsafe(0xffff, buf, 5));
+ test_streq(buf, "FFFF");
+ test_eq(0, format_hex_number_sigsafe(0xffff, buf, 4));
+ test_eq(0, format_hex_number_sigsafe(0, buf, 1));
+
+ done:
+ return;
+}
+
+/**
+ * Test for format_hex_number_sigsafe()
+ */
+
+static void
+test_util_format_dec_number(void *ptr)
+{
+ int i, len;
+ char buf[33];
+ const struct {
+ const char *str;
+ unsigned int x;
+ } test_data[] = {
+ {"0", 0},
+ {"1", 1},
+ {"1234", 1234},
+ {"12345678", 12345678},
+ {"99999999", 99999999},
+ {"100000000", 100000000},
+ {"4294967295", 4294967295u},
+#if UINT_MAX > 0xffffffff
+ {"18446744073709551615", 18446744073709551615u },
+#endif
+ {NULL, 0}
+ };
+
+ (void)ptr;
+
+ for (i = 0; test_data[i].str != NULL; ++i) {
+ len = format_dec_number_sigsafe(test_data[i].x, buf, sizeof(buf));
test_neq(len, 0);
- buf[len] = '\0';
+ test_eq(len, strlen(buf));
+ test_streq(buf, test_data[i].str);
+
+ len = format_dec_number_sigsafe(test_data[i].x, buf,
+ (int)(strlen(test_data[i].str) + 1));
+ test_eq(len, strlen(buf));
test_streq(buf, test_data[i].str);
}
+ test_eq(4, format_dec_number_sigsafe(7331, buf, 5));
+ test_streq(buf, "7331");
+ test_eq(0, format_dec_number_sigsafe(7331, buf, 4));
+ test_eq(1, format_dec_number_sigsafe(0, buf, 2));
+ test_eq(0, format_dec_number_sigsafe(0, buf, 1));
+
done:
return;
}
/**
- * Test that we can properly format q Windows command line
+ * Test that we can properly format a Windows command line
*/
static void
test_util_join_win_cmdline(void *ptr)
@@ -2817,7 +3056,7 @@ test_util_eat_whitespace(void *ptr)
(void)ptr;
/* Try one leading ws */
- strcpy(str, "fuubaar");
+ strlcpy(str, "fuubaar", sizeof(str));
for (i = 0; i < sizeof(ws); ++i) {
str[0] = ws[i];
test_eq_ptr(str + 1, eat_whitespace(str));
@@ -2832,14 +3071,14 @@ test_util_eat_whitespace(void *ptr)
test_eq_ptr(str, eat_whitespace_eos_no_nl(str, str + strlen(str)));
/* Empty string */
- strcpy(str, "");
+ strlcpy(str, "", sizeof(str));
test_eq_ptr(str, eat_whitespace(str));
test_eq_ptr(str, eat_whitespace_eos(str, str));
test_eq_ptr(str, eat_whitespace_no_nl(str));
test_eq_ptr(str, eat_whitespace_eos_no_nl(str, str));
/* Only ws */
- strcpy(str, " \t\r\n");
+ strlcpy(str, " \t\r\n", sizeof(str));
test_eq_ptr(str + strlen(str), eat_whitespace(str));
test_eq_ptr(str + strlen(str), eat_whitespace_eos(str, str + strlen(str)));
test_eq_ptr(str + strlen(str) - 1,
@@ -2847,7 +3086,7 @@ test_util_eat_whitespace(void *ptr)
test_eq_ptr(str + strlen(str) - 1,
eat_whitespace_eos_no_nl(str, str + strlen(str)));
- strcpy(str, " \t\r ");
+ strlcpy(str, " \t\r ", sizeof(str));
test_eq_ptr(str + strlen(str), eat_whitespace(str));
test_eq_ptr(str + strlen(str),
eat_whitespace_eos(str, str + strlen(str)));
@@ -2856,7 +3095,7 @@ test_util_eat_whitespace(void *ptr)
eat_whitespace_eos_no_nl(str, str + strlen(str)));
/* Multiple ws */
- strcpy(str, "fuubaar");
+ strlcpy(str, "fuubaar", sizeof(str));
for (i = 0; i < sizeof(ws); ++i)
str[i] = ws[i];
test_eq_ptr(str + sizeof(ws), eat_whitespace(str));
@@ -2866,28 +3105,28 @@ test_util_eat_whitespace(void *ptr)
eat_whitespace_eos_no_nl(str, str + strlen(str)));
/* Eat comment */
- strcpy(str, "# Comment \n No Comment");
+ strlcpy(str, "# Comment \n No Comment", sizeof(str));
test_streq("No Comment", eat_whitespace(str));
test_streq("No Comment", eat_whitespace_eos(str, str + strlen(str)));
test_eq_ptr(str, eat_whitespace_no_nl(str));
test_eq_ptr(str, eat_whitespace_eos_no_nl(str, str + strlen(str)));
/* Eat comment & ws mix */
- strcpy(str, " # \t Comment \n\t\nNo Comment");
+ strlcpy(str, " # \t Comment \n\t\nNo Comment", sizeof(str));
test_streq("No Comment", eat_whitespace(str));
test_streq("No Comment", eat_whitespace_eos(str, str + strlen(str)));
test_eq_ptr(str + 1, eat_whitespace_no_nl(str));
test_eq_ptr(str + 1, eat_whitespace_eos_no_nl(str, str + strlen(str)));
/* Eat entire comment */
- strcpy(str, "#Comment");
+ strlcpy(str, "#Comment", sizeof(str));
test_eq_ptr(str + strlen(str), eat_whitespace(str));
test_eq_ptr(str + strlen(str), eat_whitespace_eos(str, str + strlen(str)));
test_eq_ptr(str, eat_whitespace_no_nl(str));
test_eq_ptr(str, eat_whitespace_eos_no_nl(str, str + strlen(str)));
/* Blank line, then comment */
- strcpy(str, " \t\n # Comment");
+ strlcpy(str, " \t\n # Comment", sizeof(str));
test_eq_ptr(str + strlen(str), eat_whitespace(str));
test_eq_ptr(str + strlen(str), eat_whitespace_eos(str, str + strlen(str)));
test_eq_ptr(str + 2, eat_whitespace_no_nl(str));
@@ -2913,6 +3152,8 @@ smartlist_new_from_text_lines(const char *lines)
last_line = smartlist_pop_last(sl);
if (last_line != NULL && *last_line != '\0') {
smartlist_add(sl, last_line);
+ } else {
+ tor_free(last_line);
}
return sl;
@@ -3212,12 +3453,204 @@ test_util_mathlog(void *arg)
;
}
+static void
+test_util_round_to_next_multiple_of(void *arg)
+{
+ (void)arg;
+
+ test_assert(round_uint64_to_next_multiple_of(0,1) == 0);
+ test_assert(round_uint64_to_next_multiple_of(0,7) == 0);
+
+ test_assert(round_uint64_to_next_multiple_of(99,1) == 99);
+ test_assert(round_uint64_to_next_multiple_of(99,7) == 105);
+ test_assert(round_uint64_to_next_multiple_of(99,9) == 99);
+
+ done:
+ ;
+}
+
+static void
+test_util_strclear(void *arg)
+{
+ static const char *vals[] = { "", "a", "abcdef", "abcdefgh", NULL };
+ int i;
+ char *v = NULL;
+ (void)arg;
+
+ for (i = 0; vals[i]; ++i) {
+ size_t n;
+ v = tor_strdup(vals[i]);
+ n = strlen(v);
+ tor_strclear(v);
+ tt_assert(tor_mem_is_zero(v, n+1));
+ tor_free(v);
+ }
+ done:
+ tor_free(v);
+}
+
#define UTIL_LEGACY(name) \
{ #name, legacy_test_helper, 0, &legacy_setup, test_util_ ## name }
#define UTIL_TEST(name, flags) \
{ #name, test_util_ ## name, flags, NULL, NULL }
+#ifdef FD_CLOEXEC
+#define CAN_CHECK_CLOEXEC
+static int
+fd_is_cloexec(tor_socket_t fd)
+{
+ int flags = fcntl(fd, F_GETFD, 0);
+ return (flags & FD_CLOEXEC) == FD_CLOEXEC;
+}
+#endif
+
+#ifndef _WIN32
+#define CAN_CHECK_NONBLOCK
+static int
+fd_is_nonblocking(tor_socket_t fd)
+{
+ int flags = fcntl(fd, F_GETFL, 0);
+ return (flags & O_NONBLOCK) == O_NONBLOCK;
+}
+#endif
+
+static void
+test_util_socket(void *arg)
+{
+ tor_socket_t fd1 = TOR_INVALID_SOCKET;
+ tor_socket_t fd2 = TOR_INVALID_SOCKET;
+ tor_socket_t fd3 = TOR_INVALID_SOCKET;
+ tor_socket_t fd4 = TOR_INVALID_SOCKET;
+ int n = get_n_open_sockets();
+
+ TT_BLATHER(("Starting with %d open sockets.", n));
+
+ (void)arg;
+
+ fd1 = tor_open_socket_with_extensions(AF_INET, SOCK_STREAM, 0, 0, 0);
+ fd2 = tor_open_socket_with_extensions(AF_INET, SOCK_STREAM, 0, 0, 1);
+ tt_assert(SOCKET_OK(fd1));
+ tt_assert(SOCKET_OK(fd2));
+ tt_int_op(get_n_open_sockets(), ==, n + 2);
+ //fd3 = tor_open_socket_with_extensions(AF_INET, SOCK_STREAM, 0, 1, 0);
+ //fd4 = tor_open_socket_with_extensions(AF_INET, SOCK_STREAM, 0, 1, 1);
+ fd3 = tor_open_socket(AF_INET, SOCK_STREAM, 0);
+ fd4 = tor_open_socket_nonblocking(AF_INET, SOCK_STREAM, 0);
+ tt_assert(SOCKET_OK(fd3));
+ tt_assert(SOCKET_OK(fd4));
+ tt_int_op(get_n_open_sockets(), ==, n + 4);
+
+#ifdef CAN_CHECK_CLOEXEC
+ tt_int_op(fd_is_cloexec(fd1), ==, 0);
+ tt_int_op(fd_is_cloexec(fd2), ==, 0);
+ tt_int_op(fd_is_cloexec(fd3), ==, 1);
+ tt_int_op(fd_is_cloexec(fd4), ==, 1);
+#endif
+#ifdef CAN_CHECK_NONBLOCK
+ tt_int_op(fd_is_nonblocking(fd1), ==, 0);
+ tt_int_op(fd_is_nonblocking(fd2), ==, 1);
+ tt_int_op(fd_is_nonblocking(fd3), ==, 0);
+ tt_int_op(fd_is_nonblocking(fd4), ==, 1);
+#endif
+
+ tor_close_socket(fd1);
+ tor_close_socket(fd2);
+ fd1 = fd2 = TOR_INVALID_SOCKET;
+ tt_int_op(get_n_open_sockets(), ==, n + 2);
+ tor_close_socket(fd3);
+ tor_close_socket(fd4);
+ fd3 = fd4 = TOR_INVALID_SOCKET;
+ tt_int_op(get_n_open_sockets(), ==, n);
+
+ done:
+ if (SOCKET_OK(fd1))
+ tor_close_socket(fd1);
+ if (SOCKET_OK(fd2))
+ tor_close_socket(fd2);
+ if (SOCKET_OK(fd3))
+ tor_close_socket(fd3);
+ if (SOCKET_OK(fd4))
+ tor_close_socket(fd4);
+}
+
+static void *
+socketpair_test_setup(const struct testcase_t *testcase)
+{
+ return testcase->setup_data;
+}
+static int
+socketpair_test_cleanup(const struct testcase_t *testcase, void *ptr)
+{
+ (void)testcase;
+ (void)ptr;
+ return 1;
+}
+
+static const struct testcase_setup_t socketpair_setup = {
+ socketpair_test_setup, socketpair_test_cleanup
+};
+
+/* Test for socketpair and ersatz_socketpair(). We test them both, since
+ * the latter is a tolerably good way to exersize tor_accept_socket(). */
+static void
+test_util_socketpair(void *arg)
+{
+ const int ersatz = !strcmp(arg, "1");
+ int (*const tor_socketpair_fn)(int, int, int, tor_socket_t[2]) =
+ ersatz ? tor_ersatz_socketpair : tor_socketpair;
+ int n = get_n_open_sockets();
+ tor_socket_t fds[2] = {TOR_INVALID_SOCKET, TOR_INVALID_SOCKET};
+ const int family = AF_UNIX;
+
+ tt_int_op(0, ==, tor_socketpair_fn(family, SOCK_STREAM, 0, fds));
+ tt_assert(SOCKET_OK(fds[0]));
+ tt_assert(SOCKET_OK(fds[1]));
+ tt_int_op(get_n_open_sockets(), ==, n + 2);
+#ifdef CAN_CHECK_CLOEXEC
+ tt_int_op(fd_is_cloexec(fds[0]), ==, 1);
+ tt_int_op(fd_is_cloexec(fds[1]), ==, 1);
+#endif
+#ifdef CAN_CHECK_NONBLOCK
+ tt_int_op(fd_is_nonblocking(fds[0]), ==, 0);
+ tt_int_op(fd_is_nonblocking(fds[1]), ==, 0);
+#endif
+
+ done:
+ if (SOCKET_OK(fds[0]))
+ tor_close_socket(fds[0]);
+ if (SOCKET_OK(fds[1]))
+ tor_close_socket(fds[1]);
+}
+
+static void
+test_util_max_mem(void *arg)
+{
+ size_t memory1, memory2;
+ int r, r2;
+ (void) arg;
+
+ r = get_total_system_memory(&memory1);
+ r2 = get_total_system_memory(&memory2);
+ tt_int_op(r, ==, r2);
+ tt_uint_op(memory2, ==, memory1);
+
+ TT_BLATHER(("System memory: "U64_FORMAT, U64_PRINTF_ARG(memory1)));
+
+ if (r==0) {
+ /* You have at least a megabyte. */
+ tt_uint_op(memory1, >, (1<<20));
+ } else {
+ /* You do not have a petabyte. */
+#if SIZEOF_SIZE_T == SIZEOF_UINT64_T
+ tt_uint_op(memory1, <, (U64_LITERAL(1)<<50));
+#endif
+ }
+
+ done:
+ ;
+}
+
struct testcase_t util_tests[] = {
UTIL_LEGACY(time),
UTIL_TEST(parse_http_time, 0),
@@ -3228,11 +3661,15 @@ struct testcase_t util_tests[] = {
#ifndef _WIN32
UTIL_LEGACY(expand_filename),
#endif
+ UTIL_LEGACY(escape_string_socks),
+ UTIL_LEGACY(string_is_key_value),
UTIL_LEGACY(strmisc),
UTIL_LEGACY(pow2),
UTIL_LEGACY(gzip),
UTIL_LEGACY(datadir),
+#ifdef ENABLE_MEMPOOLS
UTIL_LEGACY(mempool),
+#endif
UTIL_LEGACY(memarea),
UTIL_LEGACY(control_formats),
UTIL_LEGACY(mmap),
@@ -3241,6 +3678,8 @@ struct testcase_t util_tests[] = {
UTIL_LEGACY(path_is_relative),
UTIL_LEGACY(strtok),
UTIL_LEGACY(di_ops),
+ UTIL_TEST(round_to_next_multiple_of, 0),
+ UTIL_TEST(strclear, 0),
UTIL_TEST(find_str_at_start_of_line, 0),
UTIL_TEST(string_is_C_identifier, 0),
UTIL_TEST(asprintf, 0),
@@ -3249,14 +3688,15 @@ struct testcase_t util_tests[] = {
#ifdef _WIN32
UTIL_TEST(load_win_lib, 0),
#endif
- UTIL_TEST(exit_status, 0),
#ifndef _WIN32
+ UTIL_TEST(exit_status, 0),
UTIL_TEST(fgets_eagain, TT_SKIP),
#endif
UTIL_TEST(spawn_background_ok, 0),
UTIL_TEST(spawn_background_fail, 0),
UTIL_TEST(spawn_background_partial_read, 0),
UTIL_TEST(format_hex_number, 0),
+ UTIL_TEST(format_dec_number, 0),
UTIL_TEST(join_win_cmdline, 0),
UTIL_TEST(split_lines, 0),
UTIL_TEST(n_bits_set, 0),
@@ -3268,8 +3708,15 @@ struct testcase_t util_tests[] = {
UTIL_TEST(read_file_eof_tiny_limit, 0),
UTIL_TEST(read_file_eof_two_loops, 0),
UTIL_TEST(read_file_eof_zero_bytes, 0),
+ UTIL_TEST(write_chunks_to_file, 0),
UTIL_TEST(mathlog, 0),
UTIL_TEST(weak_random, 0),
+ UTIL_TEST(socket, TT_FORK),
+ { "socketpair", test_util_socketpair, TT_FORK, &socketpair_setup,
+ (void*)"0" },
+ { "socketpair_ersatz", test_util_socketpair, TT_FORK,
+ &socketpair_setup, (void*)"1" },
+ UTIL_TEST(max_mem, 0),
END_OF_TESTCASES
};
diff --git a/src/tools/tor-checkkey.c b/src/tools/tor-checkkey.c
index a3860ca4b..d50f12ed2 100644
--- a/src/tools/tor-checkkey.c
+++ b/src/tools/tor-checkkey.c
@@ -1,8 +1,6 @@
/* Copyright (c) 2008-2013, The Tor Project, Inc. */
/* See LICENSE for licensing information */
-#define CRYPTO_PRIVATE
-
#include "orconfig.h"
#include <stdio.h>
diff --git a/src/tools/tor-fw-helper/include.am b/src/tools/tor-fw-helper/include.am
index 275a0e237..1f862e6f0 100644
--- a/src/tools/tor-fw-helper/include.am
+++ b/src/tools/tor-fw-helper/include.am
@@ -33,4 +33,4 @@ endif
src_tools_tor_fw_helper_tor_fw_helper_LDFLAGS = $(nat_pmp_ldflags) $(miniupnpc_ldflags)
src_tools_tor_fw_helper_tor_fw_helper_LDADD = src/common/libor.a $(nat_pmp_ldadd) $(miniupnpc_ldadd) -lm @TOR_LIB_WS32@
-src_tools_tor_fw_helper_tor_fw_helper_CPPFLAGS = $(nat_pmp_cppflags) $(miniupnpc_cppflags)
+src_tools_tor_fw_helper_tor_fw_helper_CPPFLAGS = $(nat_pmp_cppflags) $(miniupnpc_cppflags) -I"$(top_srcdir)/src/ext"
diff --git a/src/tools/tor-fw-helper/tor-fw-helper.c b/src/tools/tor-fw-helper/tor-fw-helper.c
index bb6e70aaa..84cc21e34 100644
--- a/src/tools/tor-fw-helper/tor-fw-helper.c
+++ b/src/tools/tor-fw-helper/tor-fw-helper.c
@@ -496,6 +496,6 @@ main(int argc, char **argv)
smartlist_free(tor_fw_options.ports_to_forward);
}
- exit(r);
+ exit(0);
}
diff --git a/src/tools/tor-gencert.c b/src/tools/tor-gencert.c
index 3809b22d4..e799df5ca 100644
--- a/src/tools/tor-gencert.c
+++ b/src/tools/tor-gencert.c
@@ -27,8 +27,6 @@
#include <assert.h>
#endif
-#define CRYPTO_PRIVATE
-
#include "compat.h"
#include "../common/util.h"
#include "../common/torlog.h"
@@ -36,7 +34,7 @@
#include "address.h"
#define IDENTITY_KEY_BITS 3072
-#define SIGNING_KEY_BITS 1024
+#define SIGNING_KEY_BITS 2048
#define DEFAULT_LIFETIME 12
/* These globals are set via command line options. */
@@ -304,6 +302,7 @@ load_identity_key(void)
if (!identity_key) {
log_err(LD_GENERAL, "Couldn't read identity key from %s",
identity_key_file);
+ fclose(f);
return 1;
}
fclose(f);
@@ -324,6 +323,7 @@ load_signing_key(void)
}
if (!(signing_key = PEM_read_PrivateKey(f, NULL, NULL, NULL))) {
log_err(LD_GENERAL, "Couldn't read siging key from %s", signing_key_file);
+ fclose(f);
return 1;
}
fclose(f);
@@ -549,6 +549,9 @@ main(int argc, char **argv)
if (signing_key)
EVP_PKEY_free(signing_key);
tor_free(address);
+ tor_free(identity_key_file);
+ tor_free(signing_key_file);
+ tor_free(certificate_file);
crypto_global_cleanup();
return r;
diff --git a/src/win32/orconfig.h b/src/win32/orconfig.h
index f5d5cf446..7b5877cf9 100644
--- a/src/win32/orconfig.h
+++ b/src/win32/orconfig.h
@@ -241,7 +241,7 @@
#define USING_TWOS_COMPLEMENT
/* Version number of package */
-#define VERSION "0.2.4.10-alpha-dev"
+#define VERSION "0.2.5.4-alpha-dev"