diff options
Diffstat (limited to 'src')
86 files changed, 5021 insertions, 5198 deletions
diff --git a/src/common/address.c b/src/common/address.c index c89e8797c6..2693239146 100644 --- a/src/common/address.c +++ b/src/common/address.c @@ -159,6 +159,8 @@ tor_addr_from_sockaddr(tor_addr_t *a, const struct sockaddr *sa, tor_assert(a); tor_assert(sa); + /* This memset is redundant; leaving it in to avoid any future accidents, + however. */ memset(a, 0, sizeof(*a)); if (sa->sa_family == AF_INET) { @@ -235,8 +237,8 @@ tor_addr_make_null(tor_addr_t *a, sa_family_t family) * * Return 0 on success, -1 on failure; 1 on transient failure. */ -int -tor_addr_lookup(const char *name, uint16_t family, tor_addr_t *addr) +MOCK_IMPL(int, +tor_addr_lookup,(const char *name, uint16_t family, tor_addr_t *addr)) { /* Perhaps eventually this should be replaced by a tor_getaddrinfo or * something. diff --git a/src/common/address.h b/src/common/address.h index 41daf012e6..0dc6edae37 100644 --- a/src/common/address.h +++ b/src/common/address.h @@ -190,7 +190,8 @@ tor_addr_eq_ipv4h(const tor_addr_t *a, uint32_t u) */ #define TOR_ADDR_BUF_LEN 48 -int tor_addr_lookup(const char *name, uint16_t family, tor_addr_t *addr_out); +MOCK_DECL(int, tor_addr_lookup,(const char *name, uint16_t family, + tor_addr_t *addr_out)); char *tor_addr_to_str_dup(const tor_addr_t *addr) ATTR_MALLOC; /** Wrapper function of fmt_addr_impl(). It does not decorate IPv6 diff --git a/src/common/ciphers.inc b/src/common/ciphers.inc index ab4ac40724..a336e2dfa0 100644 --- a/src/common/ciphers.inc +++ b/src/common/ciphers.inc @@ -14,6 +14,26 @@ #else XCIPHER(0xc02f, TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256) #endif +#ifdef TLS1_TXT_ECDHE_ECDSA_WITH_CHACHA20_POLY1305 + CIPHER(0xcca9, TLS1_TXT_ECDHE_ECDSA_WITH_CHACHA20_POLY1305) +#else + XCIPHER(0xcca9, TLS1_TXT_ECDHE_ECDSA_WITH_CHACHA20_POLY1305) +#endif +#ifdef TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305 + CIPHER(0xcca8, TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305) +#else + XCIPHER(0xcca8, TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305) +#endif +#ifdef TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 + CIPHER(0xc02c, TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384) +#else + XCIPHER(0xc02c, TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384) +#endif +#ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_256_GCM_SHA384 + CIPHER(0xc030, TLS1_TXT_ECDHE_RSA_WITH_AES_256_GCM_SHA384) +#else + XCIPHER(0xc030, TLS1_TXT_ECDHE_RSA_WITH_AES_256_GCM_SHA384) +#endif #ifdef TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA CIPHER(0xc00a, TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA) #else @@ -34,88 +54,28 @@ #else XCIPHER(0xc014, TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_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 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_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_DHE_RSA_WITH_AES_128_SHA CIPHER(0x0033, TLS1_TXT_DHE_RSA_WITH_AES_128_SHA) #else XCIPHER(0x0033, TLS1_TXT_DHE_RSA_WITH_AES_128_SHA) #endif -#ifdef TLS1_TXT_DHE_DSS_WITH_AES_128_SHA - CIPHER(0x0032, TLS1_TXT_DHE_DSS_WITH_AES_128_SHA) -#else - XCIPHER(0x0032, TLS1_TXT_DHE_DSS_WITH_AES_128_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_RSA_WITH_AES_256_SHA CIPHER(0x0039, TLS1_TXT_DHE_RSA_WITH_AES_256_SHA) #else XCIPHER(0x0039, TLS1_TXT_DHE_RSA_WITH_AES_256_SHA) #endif -#ifdef TLS1_TXT_DHE_DSS_WITH_AES_256_SHA - CIPHER(0x0038, TLS1_TXT_DHE_DSS_WITH_AES_256_SHA) -#else - XCIPHER(0x0038, TLS1_TXT_DHE_DSS_WITH_AES_256_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 SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA - CIPHER(0x0016, SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA) -#else - 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_RSA_WITH_CAMELLIA_128_CBC_SHA - CIPHER(0x0041, TLS1_TXT_RSA_WITH_CAMELLIA_128_CBC_SHA) -#else - XCIPHER(0x0041, TLS1_TXT_RSA_WITH_CAMELLIA_128_CBC_SHA) -#endif #ifdef TLS1_TXT_RSA_WITH_AES_256_SHA CIPHER(0x0035, TLS1_TXT_RSA_WITH_AES_256_SHA) #else XCIPHER(0x0035, TLS1_TXT_RSA_WITH_AES_256_SHA) #endif -#ifdef TLS1_TXT_RSA_WITH_CAMELLIA_256_CBC_SHA - CIPHER(0x0084, TLS1_TXT_RSA_WITH_CAMELLIA_256_CBC_SHA) -#else - XCIPHER(0x0084, TLS1_TXT_RSA_WITH_CAMELLIA_256_CBC_SHA) -#endif #ifdef SSL3_TXT_RSA_DES_192_CBC3_SHA CIPHER(0x000a, SSL3_TXT_RSA_DES_192_CBC3_SHA) #else XCIPHER(0x000a, SSL3_TXT_RSA_DES_192_CBC3_SHA) #endif -#ifdef SSL3_TXT_RSA_RC4_128_SHA - CIPHER(0x0005, SSL3_TXT_RSA_RC4_128_SHA) -#else - XCIPHER(0x0005, SSL3_TXT_RSA_RC4_128_SHA) -#endif -#ifdef SSL3_TXT_RSA_RC4_128_MD5 - CIPHER(0x0004, SSL3_TXT_RSA_RC4_128_MD5) -#else - XCIPHER(0x0004, SSL3_TXT_RSA_RC4_128_MD5) -#endif diff --git a/src/common/compat.c b/src/common/compat.c index ebf05f59e1..0dbede6bed 100644 --- a/src/common/compat.c +++ b/src/common/compat.c @@ -258,6 +258,12 @@ tor_mmap_file(const char *filename) page_size = getpagesize(); size += (size%page_size) ? page_size-(size%page_size) : 0; + if (st.st_size > SSIZE_T_CEILING || (off_t)size < st.st_size) { + log_warn(LD_FS, "File \"%s\" is too large. Ignoring.",filename); + errno = EFBIG; + close(fd); + return NULL; + } if (!size) { /* Zero-length file. If we call mmap on it, it will succeed but * return NULL, and bad things will happen. So just fail. */ diff --git a/src/common/compat_time.c b/src/common/compat_time.c index 3493ea0c22..d044bbe1d7 100644 --- a/src/common/compat_time.c +++ b/src/common/compat_time.c @@ -324,10 +324,27 @@ monotime_diff_nsec(const monotime_t *start, /* end of "__APPLE__" */ #elif defined(HAVE_CLOCK_GETTIME) +#ifdef CLOCK_MONOTONIC_COARSE +/** + * Which clock should we use for coarse-grained monotonic time? By default + * this is CLOCK_MONOTONIC_COARSE, but it might not work -- for example, + * if we're compiled with newer Linux headers and then we try to run on + * an old Linux kernel. In that case, we will fall back to CLOCK_MONOTONIC. + */ +static int clock_monotonic_coarse = CLOCK_MONOTONIC_COARSE; +#endif + static void monotime_init_internal(void) { - /* no action needed. */ +#ifdef CLOCK_MONOTONIC_COARSE + struct timespec ts; + if (clock_gettime(CLOCK_MONOTONIC_COARSE, &ts) < 0) { + log_info(LD_GENERAL, "CLOCK_MONOTONIC_COARSE isn't working (%s); " + "falling back to CLOCK_MONOTONIC.", strerror(errno)); + clock_monotonic_coarse = CLOCK_MONOTONIC; + } +#endif } void @@ -355,7 +372,18 @@ monotime_coarse_get(monotime_coarse_t *out) return; } #endif - int r = clock_gettime(CLOCK_MONOTONIC_COARSE, &out->ts_); + int r = clock_gettime(clock_monotonic_coarse, &out->ts_); + if (PREDICT_UNLIKELY(r < 0) && + errno == EINVAL && + clock_monotonic_coarse == CLOCK_MONOTONIC_COARSE) { + /* We should have caught this at startup in monotime_init_internal! + */ + log_warn(LD_BUG, "Falling back to non-coarse monotonic time %s initial " + "system start?", monotime_initialized?"after":"without"); + clock_monotonic_coarse = CLOCK_MONOTONIC; + r = clock_gettime(clock_monotonic_coarse, &out->ts_); + } + tor_assert(r == 0); } #endif diff --git a/src/common/crypto.h b/src/common/crypto.h index 43328f5bce..42345f80e8 100644 --- a/src/common/crypto.h +++ b/src/common/crypto.h @@ -59,10 +59,12 @@ #define DIGEST256_LEN 32 /** Length of the output of our 64-bit optimized message digests (SHA512). */ #define DIGEST512_LEN 64 -/** Length of our symmetric cipher's keys. */ +/** Length of our symmetric cipher's keys of 128-bit. */ #define CIPHER_KEY_LEN 16 -/** Length of our symmetric cipher's IV. */ +/** Length of our symmetric cipher's IV of 128-bit. */ #define CIPHER_IV_LEN 16 +/** Length of our symmetric cipher's keys of 256-bit. */ +#define CIPHER256_KEY_LEN 32 /** Length of our public keys. */ #define PK_BYTES (1024/8) /** Length of our DH keys. */ diff --git a/src/common/crypto_curve25519.c b/src/common/crypto_curve25519.c index fcbee3aba2..5f328e124c 100644 --- a/src/common/crypto_curve25519.c +++ b/src/common/crypto_curve25519.c @@ -80,7 +80,7 @@ curve25519_impl(uint8_t *output, const uint8_t *secret, /** * Helper function: Multiply the scalar "secret" by the Curve25519 * basepoint (X=9), and store the result in "output". Return 0 on - * success, -1 on false. + * success, -1 on failure. */ STATIC int curve25519_basepoint_impl(uint8_t *output, const uint8_t *secret) diff --git a/src/common/crypto_format.c b/src/common/crypto_format.c index 483013ee68..aa2a9d1fb0 100644 --- a/src/common/crypto_format.c +++ b/src/common/crypto_format.c @@ -161,16 +161,21 @@ curve25519_public_from_base64(curve25519_public_key_t *pkey, } } -/** For convenience: Convert <b>pkey</b> to a statically allocated base64 - * string and return it. Not threadsafe. Subsequent calls invalidate +/** For logging convenience: Convert <b>pkey</b> to a statically allocated + * base64 string and return it. Not threadsafe. Format not meant to be + * computer-readable; it may change in the future. Subsequent calls invalidate * previous returns. */ const char * ed25519_fmt(const ed25519_public_key_t *pkey) { static char formatted[ED25519_BASE64_LEN+1]; if (pkey) { - int r = ed25519_public_to_base64(formatted, pkey); - tor_assert(!r); + if (ed25519_public_key_is_zero(pkey)) { + strlcpy(formatted, "<unset>", sizeof(formatted)); + } else { + int r = ed25519_public_to_base64(formatted, pkey); + tor_assert(!r); + } } else { strlcpy(formatted, "<null>", sizeof(formatted)); } diff --git a/src/common/tortls.c b/src/common/tortls.c index 2efb3baa73..1fe91edf0e 100644 --- a/src/common/tortls.c +++ b/src/common/tortls.c @@ -585,6 +585,12 @@ static const char UNRESTRICTED_SERVER_CIPHER_LIST[] = #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_CCM + TLS1_TXT_DHE_RSA_WITH_AES_256_CCM ":" +#endif +#ifdef TLS1_TXT_DHE_RSA_WITH_AES_128_CCM + TLS1_TXT_DHE_RSA_WITH_AES_128_CCM ":" +#endif #ifdef TLS1_TXT_DHE_RSA_WITH_AES_256_SHA256 TLS1_TXT_DHE_RSA_WITH_AES_256_SHA256 ":" #endif @@ -594,8 +600,14 @@ static const char UNRESTRICTED_SERVER_CIPHER_LIST[] = /* Required */ TLS1_TXT_DHE_RSA_WITH_AES_256_SHA ":" /* Required */ - TLS1_TXT_DHE_RSA_WITH_AES_128_SHA - ; + TLS1_TXT_DHE_RSA_WITH_AES_128_SHA ":" +#ifdef TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305 + TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305 ":" +#endif +#ifdef TLS1_TXT_DHE_RSA_WITH_CHACHA20_POLY1305 + TLS1_TXT_DHE_RSA_WITH_CHACHA20_POLY1305 +#endif + ; /* Note: to set up your own private testing network with link crypto * disabled, set your Tors' cipher list to diff --git a/src/common/util.c b/src/common/util.c index 9d134c1bb2..824b4fbc67 100644 --- a/src/common/util.c +++ b/src/common/util.c @@ -187,8 +187,9 @@ tor_malloc_zero_(size_t size DMALLOC_PARAMS) * 0xfffe0001. */ #define SQRT_SIZE_MAX_P1 (((size_t)1) << (sizeof(size_t)*4)) -/** Return non-zero if and only if the product of the arguments is exact. */ -static inline int +/** Return non-zero if and only if the product of the arguments is exact, + * and cannot overflow. */ +int size_mul_check(const size_t x, const size_t y) { /* This first check is equivalent to @@ -202,15 +203,6 @@ size_mul_check(const size_t x, const size_t y) x <= SIZE_MAX / y); } -#ifdef TOR_UNIT_TESTS -/** Exposed for unit tests only */ -int -size_mul_check__(const size_t x, const size_t y) -{ - return size_mul_check(x,y); -} -#endif - /** Allocate a chunk of <b>nmemb</b>*<b>size</b> bytes of memory, fill * the memory with zero bytes, and return a pointer to the result. * Log and terminate the process on error. (Same as diff --git a/src/common/util.h b/src/common/util.h index 2b3e48ea8e..ff566151cb 100644 --- a/src/common/util.h +++ b/src/common/util.h @@ -553,9 +553,7 @@ STATIC int format_helper_exit_status(unsigned char child_state, #endif -#ifdef TOR_UNIT_TESTS -int size_mul_check__(const size_t x, const size_t y); -#endif +int size_mul_check(const size_t x, const size_t y); #define ARRAY_LENGTH(x) ((sizeof(x)) / sizeof(x[0])) diff --git a/src/common/util_format.c b/src/common/util_format.c index aef9db85c8..6e0a04586a 100644 --- a/src/common/util_format.c +++ b/src/common/util_format.c @@ -398,7 +398,7 @@ base64_decode(char *dest, size_t destlen, const char *src, size_t srclen) * Number of bytes required to hold all bits == (srclen*6)/8. * Yes, we want to round down: anything that hangs over the end of a * byte is padding. */ - if (destlen < (srclen*3)/4) + if (!size_mul_check(srclen, 3) || destlen < (srclen*3)/4) return -1; if (destlen > SIZE_T_CEILING) return -1; diff --git a/src/config/geoip b/src/config/geoip index 406fff09e7..68ae3759c1 100644 --- a/src/config/geoip +++ b/src/config/geoip @@ -1,4 +1,4 @@ -# Last updated based on December 7 2016 Maxmind GeoLite2 Country +# Last updated based on January 4 2017 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 @@ -361,7 +361,7 @@ 86222616,86222847,JE 86222848,86226943,NL 86226944,86228991,SE -86228992,86231039,BE +86228992,86231039,GB 86231040,86233087,ES 86233088,86235135,RO 86235136,86237183,ES @@ -454,7 +454,9 @@ 86446680,86446683,ES 86446684,86446727,FR 86446728,86446731,DE -86446732,86446931,FR +86446732,86446767,FR +86446768,86446771,GB +86446772,86446931,FR 86446932,86446935,CZ 86446936,86447091,FR 86447092,86447103,ES @@ -464,7 +466,9 @@ 86447288,86447288,DE 86447289,86447335,FR 86447336,86447339,ES -86447340,86448559,FR +86447340,86447351,FR +86447352,86447355,GB +86447356,86448559,FR 86448560,86448575,GB 86448576,86448803,FR 86448804,86448807,FI @@ -499,7 +503,10 @@ 86450336,86450339,GB 86450340,86450775,FR 86450776,86450779,PL -86450780,86450863,FR +86450780,86450783,FR +86450784,86450815,DE +86450816,86450847,FR +86450848,86450863,ES 86450864,86450867,PT 86450868,86450875,FR 86450876,86450879,GB @@ -591,7 +598,9 @@ 86457456,86457456,DE 86457457,86457471,FR 86457472,86457519,ES -86457520,86457799,FR +86457520,86457703,FR +86457704,86457707,ES +86457708,86457799,FR 86457800,86457803,ES 86457804,86467207,FR 86467208,86467211,IE @@ -821,17 +830,17 @@ 87761408,87761663,CZ 87761664,87761919,RU 87761920,87762431,FR -87762432,87762943,CZ +87762432,87762943,UA 87762944,87763967,KZ -87763968,87766015,RU -87766016,87818239,CZ +87763968,87766527,RU +87766528,87818239,CZ 87818240,87883775,PL 87883776,87885823,IT 87885824,87889919,RU -87889920,87890431,IR -87890432,87890943,US +87889920,87890687,IR +87890688,87890943,US 87890944,87891199,NL -87891200,87891967,US +87891200,87891967,IR 87891968,87902207,DE 87902208,87904255,IR 87904256,87906303,DE @@ -934,9 +943,7 @@ 90516480,90516735,DE 90516736,90516991,RO 90516992,90517503,NL -90517504,90518527,RU -90518528,90519551,NL -90519552,90529791,RU +90517504,90529791,RU 90529792,90533119,NL 90533120,90533375,DE 90533376,90533631,NL @@ -1165,7 +1172,9 @@ 92734832,92734847,ES 92734848,92735103,FR 92735104,92735119,GB -92735120,92735615,FR +92735120,92735347,FR +92735348,92735351,GB +92735352,92735615,FR 92735616,92735616,DE 92735617,92735619,FR 92735620,92735623,ES @@ -1243,7 +1252,11 @@ 92748517,92748517,BE 92748518,92748543,FR 92748544,92748799,PT -92748800,92748983,FR +92748800,92748843,FR +92748844,92748847,GB +92748848,92748863,FR +92748864,92748879,ES +92748880,92748983,FR 92748984,92748991,GB 92748992,92748999,ES 92749000,92749007,PT @@ -1360,11 +1373,14 @@ 92784668,92784671,IE 92784672,92784895,FR 92784896,92784959,ES -92784960,92785363,FR +92784960,92785183,FR +92785184,92785199,ES +92785200,92785363,FR 92785364,92785367,PT 92785368,92785407,FR 92785408,92785439,ES -92785440,92785611,FR +92785440,92785455,DE +92785456,92785611,FR 92785612,92785615,ES 92785616,92785735,FR 92785736,92785739,DE @@ -1416,9 +1432,7 @@ 92794692,92794695,ES 92794696,92795631,FR 92795632,92795639,CZ -92795640,92796575,FR -92796576,92796579,GB -92796580,92796687,FR +92795640,92796687,FR 92796688,92796691,DE 92796692,92796879,FR 92796880,92796895,FI @@ -1432,7 +1446,9 @@ 93323264,93335551,CH 93335552,93339647,IL 93339648,93343743,RU -93343744,93347839,GB +93343744,93345791,GB +93345792,93346303,NL +93346304,93347839,GB 93347840,93356031,RU 93356032,93358079,IR 93358080,93360127,FR @@ -1762,7 +1778,11 @@ 96172800,96173055,GP 96173056,96174079,MF 96174080,96206847,HU -96206848,96305151,RU +96206848,96262143,RU +96262144,96262399,NL +96262400,96266239,RU +96266240,96266495,NL +96266496,96305151,RU 96305152,96321535,DE 96321536,96323583,RU 96323584,96323711,ZA @@ -1852,7 +1872,9 @@ 96763456,96763471,ES 96763472,96763551,FR 96763552,96763555,GB -96763556,96764239,FR +96763556,96763575,FR +96763576,96763579,ES +96763580,96764239,FR 96764240,96764255,DE 96764256,96764383,FR 96764384,96764399,FI @@ -1923,7 +1945,9 @@ 96778868,96778871,BE 96778872,96779007,FR 96779008,96779011,PT -96779012,96779167,FR +96779012,96779015,FR +96779016,96779023,ES +96779024,96779167,FR 96779168,96779199,PT 96779200,96779247,FR 96779248,96779255,CZ @@ -2414,7 +2438,9 @@ 225079808,225080319,PR 225080320,225443839,US 225443840,225705983,JP -225705984,234881023,US +225705984,226230271,US +226230272,226295807,KR +226295808,234881023,US 234881024,234883071,CN 234883072,234884095,JP 234884096,234885119,CN @@ -2464,7 +2490,7 @@ 241606656,241607679,IN 241607680,241608703,JP 241608704,241609727,PH -241609728,241610751,PK +241609728,241610751,US 241610752,241611775,JP 241611776,241612799,CN 241612800,241613823,HK @@ -3179,7 +3205,9 @@ 391872512,391888895,CA 391888896,391897087,US 391897088,391905279,CA -391905280,391938047,US +391905280,391937535,US +391937536,391937791,CA +391937792,391938047,IE 391938048,391946239,CA 391946240,391960639,US 391960640,391960647,RO @@ -3428,8 +3456,8 @@ 394264576,394264831,CA 394270720,394271231,NL 394296320,394296831,NL -394330112,394330367,US -394395648,394789119,US +394297344,394297599,US +394330112,394789119,US 394854400,394854655,CA 394919936,395051007,US 395051008,395051263,CA @@ -3625,9 +3653,7 @@ 400888576,400888831,GB 400888832,400895551,US 400895552,400895615,GB -400895616,400897535,US -400897536,400897791,GB -400897792,400911103,US +400895616,400911103,US 400911104,400911359,PA 400911360,400911583,AU 400911584,400911615,US @@ -3771,7 +3797,9 @@ 402260272,402260279,GB 402260280,402262455,US 402262456,402262463,FI -402262464,402266727,US +402262464,402265690,US +402265691,402265691,BD +402265692,402266727,US 402266728,402266735,NO 402266736,402279935,US 402279936,402280063,CA @@ -3791,7 +3819,8 @@ 402524264,402524271,FI 402524272,402550015,US 402550016,402550271,CA -402550272,402550783,GB +402550272,402550527,US +402550528,402550783,GB 402550784,402591663,US 402591664,402591671,AU 402591672,402593535,US @@ -4229,7 +4258,8 @@ 461101056,461102079,IN 461102080,461103103,ID 461103104,461104127,AU -461104128,461105151,HK +461104128,461104383,CN +461104384,461105151,HK 461105152,461106175,CN 461106176,461107199,JP 461107200,461108223,IN @@ -4463,7 +4493,8 @@ 521023488,521023743,NL 521023744,521023999,RO 521024000,521024511,BE -521024512,521026559,RO +521024512,521024767,TR +521024768,521026559,RO 521026560,521027583,ES 521027584,521027839,RO 521027840,521028607,GB @@ -4708,10 +4739,8 @@ 523182080,523190271,IR 523190272,523192319,FI 523192320,523194367,ES -523194368,523197183,DE -523197184,523197951,AE -523197952,523198207,DE -523198208,523198463,AE +523194368,523196415,DE +523196416,523198463,AE 523198464,523202559,CZ 523202560,523223039,RU 523223040,523225087,AM @@ -4840,9 +4869,8 @@ 529838080,529842175,UA 529842176,529843199,ES 529843200,529843711,RU -529843712,529845247,CZ -529845248,529846271,UZ -529846272,529847295,CZ +529843712,529846271,CZ +529846272,529847295,UZ 529847296,529848319,GB 529848320,529848575,NL 529848576,529848831,CZ @@ -4963,7 +4991,9 @@ 531430824,531430831,IT 531430832,531430847,GB 531430848,531430855,IT -531430856,531431423,GB +531430856,531430911,GB +531430912,531430919,IT +531430920,531431423,GB 531431424,531496959,RU 531496960,531628031,PL 531628032,531660799,TR @@ -5442,7 +5472,7 @@ 620703744,620704767,NZ 620704768,620705791,BD 620705792,620706815,HK -620706816,620707839,AU +620706816,620707839,US 620707840,620708863,IN 620708864,620709887,HK 620709888,620711935,AU @@ -5474,7 +5504,7 @@ 620743936,620744191,AU 620744192,620744703,HK 620744704,620745727,IN -620745728,620746751,AU +620745728,620746751,US 620746752,620747775,JP 620747776,620748799,PH 620748800,620751871,IN @@ -5734,7 +5764,9 @@ 623077858,623077861,NZ 623077862,623083519,CH 623083520,623116287,ES -623116288,623378431,KW +623116288,623191332,KW +623191333,623191333,SA +623191334,623378431,KW 623378432,623509503,OM 623509504,623575807,SA 623575808,623576063,RO @@ -5774,7 +5806,8 @@ 623812608,623820799,SE 623820800,623821823,NL 623821824,623822335,US -623822336,623822847,NL +623822336,623822591,NL +623822592,623822847,DE 623822848,623824895,GB 623824896,623826943,CZ 623826944,623837183,UA @@ -5853,9 +5886,7 @@ 624643232,624643235,DE 624643236,624643243,FR 624643244,624643247,ES -624643248,624643315,FR -624643316,624643319,IE -624643320,624643423,FR +624643248,624643423,FR 624643424,624643459,ES 624643460,624643999,FR 624644000,624644015,GB @@ -5921,8 +5952,7 @@ 624657616,624657631,GB 624657632,624657711,FR 624657712,624657715,ES -624657716,624657719,PT -624657720,624657831,FR +624657716,624657831,FR 624657832,624657839,ES 624657840,624657883,FR 624657884,624657887,ES @@ -5945,7 +5975,9 @@ 624659072,624659135,ES 624659136,624660103,FR 624660104,624660107,PT -624660108,624660607,FR +624660108,624660127,FR +624660128,624660131,IE +624660132,624660607,FR 624660608,624660639,IE 624660640,624660827,FR 624660828,624660839,ES @@ -6061,7 +6093,9 @@ 624670660,624670663,IE 624670664,624670915,FR 624670916,624670919,ES -624670920,624671287,FR +624670920,624670935,FR +624670936,624670939,GB +624670940,624671287,FR 624671288,624671291,ES 624671292,624671455,FR 624671456,624671471,ES @@ -6081,7 +6115,9 @@ 624673804,624673807,NL 624673808,624673903,FR 624673904,624673919,ES -624673920,624674411,FR +624673920,624673931,FR +624673932,624673935,GB +624673936,624674411,FR 624674412,624674415,ES 624674416,624674447,FR 624674448,624674451,GB @@ -6100,7 +6136,9 @@ 624675776,624675779,ES 624675780,624676003,FR 624676004,624676007,DE -624676008,624676071,FR +624676008,624676015,FR +624676016,624676019,GB +624676020,624676071,FR 624676072,624676075,ES 624676076,624676087,FR 624676088,624676091,DE @@ -6108,9 +6146,7 @@ 624676628,624676631,GB 624676632,624676715,FR 624676716,624676719,ES -624676720,624676923,FR -624676924,624676927,ES -624676928,624677463,FR +624676720,624677463,FR 624677464,624677467,ES 624677468,624677471,GB 624677472,624677583,FR @@ -6151,9 +6187,7 @@ 624681536,624681599,ES 624681600,624681807,FR 624681808,624681823,BE -624681824,624682059,FR -624682060,624682063,IE -624682064,624682263,FR +624681824,624682263,FR 624682264,624682267,ES 624682268,624682319,FR 624682320,624682323,ES @@ -6161,7 +6195,9 @@ 624682496,624682527,ES 624682528,624682623,FR 624682624,624682639,ES -624682640,624683015,FR +624682640,624683007,FR +624683008,624683011,GB +624683012,624683015,FR 624683016,624683023,ES 624683024,624683031,FR 624683032,624683039,GB @@ -6217,7 +6253,9 @@ 624686712,624686719,ES 624686720,624686783,FR 624686784,624686815,ES -624686816,624687343,FR +624686816,624686895,FR +624686896,624686911,IE +624686912,624687343,FR 624687344,624687346,CZ 624687347,624687347,ES 624687348,624687783,FR @@ -6408,7 +6446,8 @@ 628023296,628029439,RU 628029440,628031487,GB 628031488,628064255,MM -628064256,628097023,HU +628064256,628080639,PK +628080640,628097023,HU 628097024,628230143,RU 628230144,628232191,IT 628232192,628236287,RU @@ -6667,7 +6706,8 @@ 631037952,631038207,BG 631038208,631039999,RO 631040000,631043071,IR -631043072,631043839,RO +631043072,631043583,RO +631043584,631043839,TR 631043840,631044095,MD 631044096,631045119,IR 631045120,631046143,RO @@ -6840,7 +6880,9 @@ 635200168,635200175,IT 635200176,635200263,GB 635200264,635200271,IT -635200272,635200335,GB +635200272,635200319,GB +635200320,635200327,IT +635200328,635200335,GB 635200336,635200343,IT 635200344,635200431,GB 635200432,635200439,IT @@ -6929,7 +6971,9 @@ 635864832,635865087,ES 635865088,635865855,RU 635865856,635866111,US -635866112,635882495,RU +635866112,635871487,RU +635871488,635871743,UA +635871744,635882495,RU 635882496,635882751,GE 635882752,635893503,RU 635893504,635893759,AZ @@ -7207,9 +7251,9 @@ 644835072,644835327,CA 644835328,644836351,US 644836352,644837375,CA -644837376,644838336,US -644838337,644838337,CA -644838338,644838911,US +644837376,644838143,US +644838144,644838399,CA +644838400,644838911,US 644838912,644839679,CA 644839680,644840447,US 644840448,644841471,CA @@ -7267,7 +7311,9 @@ 645576999,645577215,CA 645577216,645612543,US 645612544,645613567,MX -645613568,645644351,US +645613568,645614591,US +645614592,645614847,MX +645614848,645644351,US 645644352,645644415,MX 645644416,645644927,US 645644928,645645055,MX @@ -7297,7 +7343,9 @@ 646194176,646194943,CA 646194944,646195199,US 646195200,646198783,CA -646198784,646254591,US +646198784,646199384,US +646199385,646199385,CA +646199386,646254591,US 646254592,646256639,CA 646256640,646262783,US 646262784,646264831,CA @@ -8951,7 +8999,8 @@ 736380928,736381951,IN 736381952,736382975,CN 736382976,736383999,TH -736384000,736385023,LA +736384000,736384767,LA +736384768,736385023,TH 736385024,736386047,HK 736386048,736388095,IN 736388096,736389119,CN @@ -9819,8 +9868,8 @@ 757125120,757125151,NL 757125152,757125215,US 757125216,757125247,NL -757125248,757125279,US -757125280,757125631,NL +757125248,757125407,US +757125408,757125631,NL 757125632,757131263,US 757131264,757133311,NL 757133312,757135359,AU @@ -10092,7 +10141,7 @@ 758982016,758982143,TV 758982144,758982271,US 758982272,758982399,KM -758982400,758982527,US +758982400,758982527,CD 758982528,758982655,ST 758982656,758982783,MV 758982784,758982911,AR @@ -10101,7 +10150,8 @@ 758983680,758983807,US 758983808,758983935,VA 758983936,758984063,ZW -758984064,758984703,US +758984064,758984191,SO +758984192,758984703,US 758984704,758988799,CA 758988800,758994943,US 758994944,758996991,IN @@ -10208,8 +10258,8 @@ 759791616,759824639,US 759824640,759824895,SA 759824896,759825151,CR -759825152,759825407,NO -759825408,759825663,BE +759825152,759825407,US +759825408,759825663,DE 759825664,759828735,US 759828736,759828863,GT 759828864,759828991,SV @@ -10254,10 +10304,12 @@ 759860736,759860991,US 759860992,759955455,CA 759955456,759963647,US -759963648,759965695,NL -759965696,759975935,US +759963648,759965759,NL +759965760,759975935,US 759975936,759977471,DE -759977472,759980031,US +759977472,759977983,US +759977984,759979007,DE +759979008,759980031,US 759980032,759984127,JP 759984128,759985151,AU 759985152,759988223,US @@ -10267,10 +10319,8 @@ 759996416,760004607,US 760004608,760006967,JP 760006968,760007039,US -760007040,760007103,JP -760007104,760007167,US -760007168,760011263,JP -760011264,760111103,US +760007040,760012799,JP +760012800,760111103,US 760111104,760119295,CA 760119296,760127487,US 760127488,760152063,CA @@ -10595,6 +10645,7 @@ 762816512,762824703,IN 762824704,762825727,SG 762825728,762826751,JP +762826752,762827775,US 762827776,762829823,VN 762829824,762830847,AU 762830848,762832895,IN @@ -10798,6 +10849,7 @@ 763194368,763196415,HK 763196416,763197439,IN 763197440,763199487,AU +763199488,763199743,DE 763200512,763201535,IN 763201536,763202559,CN 763202560,763207679,IN @@ -10925,14 +10977,26 @@ 768606208,768868351,GH 768868352,769130495,ZM 769130496,769392639,MA +769400832,769404927,ZA +769405440,769405951,CI +769405952,769406975,GN +769406976,769409023,ZA +769409024,769425407,SC 769425408,769458175,ZA 769458176,769459199,MU +769459200,769460223,CD +769460224,769461247,UG +769461248,769462271,ZA 769462272,769463295,MU 769463296,769464319,AO +769464320,769464575,GH +769464576,769464831,MW +769464832,769465087,ZA 769465088,769465343,EG 769465344,769466367,CI -769466368,769474559,ZA -769474560,769476607,SC +769466368,769474815,ZA +769474816,769475583,NG +769475584,769476607,ZA 769476608,769478655,UG 769478656,769507327,ZA 769507328,769509375,TZ @@ -10980,7 +11044,9 @@ 771316480,771316735,HK 771316736,771317759,CN 771317760,771318783,HK -771318784,771320063,SG +771318784,771319295,SG +771319296,771319551,BD +771319552,771320063,SG 771320064,771320319,TW 771320320,771320831,AU 771320832,771321855,IN @@ -11865,7 +11931,9 @@ 778667348,778667351,GB 778667352,778667499,FR 778667500,778667503,GB -778667504,778668391,FR +778667504,778667999,FR +778668000,778668003,GB +778668004,778668391,FR 778668392,778668395,FI 778668396,778668399,ES 778668400,778668479,FR @@ -11876,7 +11944,9 @@ 778668628,778668631,ES 778668632,778668719,FR 778668720,778668723,PT -778668724,778668863,FR +778668724,778668731,FR +778668732,778668735,GB +778668736,778668863,FR 778668864,778668895,DE 778668896,778669055,FR 778669056,778669087,ES @@ -12091,7 +12161,9 @@ 778696220,778696223,GB 778696224,778696271,FR 778696272,778696287,ES -778696288,778696495,FR +778696288,778696435,FR +778696436,778696439,GB +778696440,778696495,FR 778696496,778696499,ES 778696500,778696811,FR 778696812,778696815,DE @@ -12109,9 +12181,7 @@ 778697176,778697179,ES 778697180,778697279,FR 778697280,778697287,IE -778697288,778697343,FR -778697344,778697347,IE -778697348,778697435,FR +778697288,778697435,FR 778697436,778697439,GB 778697440,778697471,FR 778697472,778697479,CZ @@ -12206,7 +12276,8 @@ 781651968,781654015,PL 781654016,781656063,RU 781656064,781658111,RO -781658112,781662207,UA +781658112,781660159,UA +781660160,781662207,RU 781662208,781664255,SK 781664256,781666303,RU 781666304,781668351,PL @@ -12313,7 +12384,9 @@ 782745600,782761983,CZ 782761984,783024127,PL 783024128,783040511,RU -783040512,783048703,UA +783040512,783047423,UA +783047424,783047679,RU +783047680,783048703,UA 783048704,783056895,RU 783056896,783065087,UA 783065088,783073279,RU @@ -12452,7 +12525,9 @@ 784039936,784072703,PL 784072704,784105471,RU 784105472,784138239,HR -784138240,784155487,DE +784138240,784145617,DE +784145618,784145618,BE +784145619,784155487,DE 784155488,784155491,NL 784155492,784155495,BE 784155496,784155503,AT @@ -12726,7 +12801,8 @@ 787165184,787167231,RU 787167232,787169279,CH 787169280,787171327,RU -787171328,787173375,KG +787171328,787172863,KG +787172864,787173375,RU 787173376,787175423,KZ 787175424,787177471,SA 787177472,787179519,RS @@ -12817,10 +12893,19 @@ 787715328,787715583,YE 787715584,787715839,BH 787715840,787718143,NL -787718144,787741951,RU +787718144,787718399,RU +787718400,787720959,NL +787720960,787721471,RU +787721472,787722751,NL +787722752,787725311,RU +787725312,787726335,NL +787726336,787738623,RU +787738624,787739903,NL +787739904,787740159,RU +787740160,787741951,NL 787741952,787742207,BZ -787742208,787742719,RU -787742720,787750143,NL +787742208,787742463,RU +787742464,787750143,NL 787750144,787750159,BD 787750160,787750175,BT 787750176,787750191,BN @@ -13154,7 +13239,10 @@ 835715072,835977215,CN 835977216,836042751,JP 836042752,836046847,HK -836046848,836050943,SG +836046848,836048895,SG +836048896,836049919,HK +836049920,836050431,SG +836050432,836050943,HK 836050944,836059135,IN 836059136,836075519,VN 836075520,836501503,TW @@ -13193,7 +13281,9 @@ 839009024,839009279,HU 839009280,839016191,US 839016192,839016447,CA -839016448,839078911,US +839016448,839075839,US +839075840,839076863,DE +839076864,839078911,US 839078912,839079935,DE 839079936,839339607,US 839339610,839340031,US @@ -13341,9 +13431,15 @@ 872297824,872297855,ES 872297856,872299103,FR 872299104,872299135,PT -872299136,872300031,FR +872299136,872299239,FR +872299240,872299247,ES +872299248,872299967,FR +872299968,872299983,ES +872299984,872300031,FR 872300032,872300063,ES -872300064,872300543,FR +872300064,872300215,FR +872300216,872300223,BE +872300224,872300543,FR 872300544,872300559,GB 872300560,872300639,FR 872300640,872300671,PT @@ -13405,7 +13501,9 @@ 872323072,872323135,FR 872323136,872323199,ES 872323200,872323327,GB -872323328,872323551,FR +872323328,872323407,FR +872323408,872323423,FI +872323424,872323551,FR 872323552,872323583,GB 872323584,872323775,FR 872323776,872323839,ES @@ -13419,7 +13517,9 @@ 872326152,872326155,CZ 872326156,872326175,FR 872326176,872326207,PT -872326208,872327615,FR +872326208,872326271,FR +872326272,872326275,FI +872326276,872327615,FR 872327616,872327679,ES 872327680,872327807,FR 872327808,872327811,FI @@ -13491,12 +13591,16 @@ 872356416,872357423,FR 872357424,872357439,PT 872357440,872357503,ES -872357504,872363135,FR +872357504,872363071,FR +872363072,872363103,ES +872363104,872363135,FR 872363136,872363199,PL 872363200,872363871,FR 872363872,872363903,PT 872363904,872364863,FR -872364864,872364927,NL +872364864,872364898,NL +872364899,872364899,FR +872364900,872364927,NL 872364928,872365311,FR 872365312,872365319,PT 872365320,872374459,FR @@ -13533,7 +13637,9 @@ 872382144,872382207,ES 872382208,872382335,FR 872382336,872382463,GB -872382464,872383519,FR +872382464,872382779,FR +872382780,872382783,ES +872382784,872383519,FR 872383520,872383551,ES 872383552,872383583,GB 872383584,872383743,FR @@ -13580,7 +13686,9 @@ 872406816,872406847,FI 872406848,872406879,FR 872406880,872406911,ES -872406912,872408383,FR +872406912,872407167,FR +872407168,872407171,FI +872407172,872408383,FR 872408384,872408447,IE 872408448,872409215,FR 872409216,872409343,GB @@ -14600,7 +14708,9 @@ 1023315712,1023315967,AU 1023315968,1023317503,US 1023317504,1023317759,IN -1023317760,1023328255,US +1023317760,1023323429,US +1023323430,1023323430,CN +1023323431,1023328255,US 1023328256,1023344639,JP 1023344640,1023410175,CN 1023410176,1023672319,IN @@ -15040,7 +15150,9 @@ 1044676608,1044684799,RU 1044684800,1044685158,GG 1044685159,1044685159,JE -1044685160,1044692991,GG +1044685160,1044692422,GG +1044692423,1044692423,IM +1044692424,1044692991,GG 1044692992,1044697087,AT 1044697088,1044697343,DE 1044697344,1044697599,AT @@ -15275,7 +15387,9 @@ 1046498688,1046498695,DE 1046498696,1046498799,GB 1046498800,1046498807,DE -1046498808,1046502106,GB +1046498808,1046499255,GB +1046499256,1046499263,DE +1046499264,1046502106,GB 1046502107,1046502108,DE 1046502109,1046503095,GB 1046503096,1046503103,DE @@ -15413,8 +15527,13 @@ 1047461888,1047494655,DE 1047494656,1047527423,PL 1047527424,1047529471,GB -1047529472,1047535103,BE -1047535104,1047535359,US +1047529472,1047530495,NL +1047530496,1047531007,GB +1047531008,1047531263,RS +1047531264,1047533567,BE +1047533568,1047534847,DE +1047534848,1047535103,BE +1047535104,1047535359,GB 1047535360,1047535615,BE 1047535616,1047551999,DE 1047552000,1047560191,RU @@ -15671,7 +15790,9 @@ 1051125472,1051125479,BE 1051125480,1051131903,NL 1051131904,1051197439,CH -1051197440,1051213823,CZ +1051197440,1051198531,CZ +1051198532,1051198535,SK +1051198536,1051213823,CZ 1051213824,1051230207,SK 1051230208,1051238399,SE 1051238400,1051246591,GE @@ -17444,8 +17565,8 @@ 1077964032,1077967103,US 1077967104,1077967359,CA 1077967360,1077967615,US -1077967616,1077967871,GB -1077967872,1077977087,US +1077967616,1077968127,GB +1077968128,1077977087,US 1077977088,1077985279,CA 1077985280,1077993471,US 1077993472,1078001663,CA @@ -17556,8 +17677,8 @@ 1079320576,1079322831,CA 1079322832,1079322839,US 1079322840,1079328767,CA -1079328768,1079377919,US -1079377920,1079378943,CA +1079328768,1079378175,US +1079378176,1079378943,CA 1079378944,1079379199,US 1079379200,1079379455,CA 1079379456,1079383039,US @@ -17616,7 +17737,11 @@ 1079433216,1079435263,CR 1079435264,1079435775,CO 1079435776,1079436031,CA -1079436032,1079440191,US +1079436032,1079439359,US +1079439360,1079439391,CA +1079439392,1079439615,US +1079439616,1079439871,CA +1079439872,1079440191,US 1079440192,1079440207,CA 1079440208,1079459839,US 1079459840,1079508991,CA @@ -17966,7 +18091,9 @@ 1089462784,1089463039,CA 1089463040,1089463295,US 1089463296,1089464319,CA -1089464320,1089526783,US +1089464320,1089465855,US +1089465856,1089466367,GB +1089466368,1089526783,US 1089526784,1089527039,VE 1089527040,1089579519,US 1089579520,1089580031,VE @@ -18190,7 +18317,9 @@ 1096925184,1096941567,CA 1096941568,1097007103,US 1097007104,1097031679,JP -1097031680,1097076123,US +1097031680,1097039871,US +1097039872,1097056255,SE +1097056256,1097076123,US 1097076124,1097076127,DE 1097076128,1097727999,US 1097728000,1097736191,CA @@ -18514,8 +18643,7 @@ 1112530944,1112539135,CA 1112539136,1112869887,US 1112869888,1112870143,CA -1112870400,1112870911,US -1112871936,1112873983,US +1112870144,1112873983,US 1112873984,1112875007,CA 1112875008,1112875519,US 1112875520,1112875775,CA @@ -18550,7 +18678,9 @@ 1113661440,1113669631,US 1113669632,1113677823,CA 1113677824,1113681919,US -1113686016,1113718783,US +1113686016,1113696575,US +1113696576,1113696639,CA +1113696640,1113718783,US 1113718784,1113743359,DO 1113743360,1113854207,US 1113854208,1113854463,CA @@ -18773,24 +18903,7 @@ 1119109120,1119109887,CA 1119109888,1119110143,US 1119110144,1119111167,CA -1119111168,1119166723,US -1119166848,1119166855,US -1119166864,1119166871,HT -1119166952,1119166959,US -1119166976,1119167007,US -1119167072,1119167079,US -1119167080,1119167087,CA -1119167088,1119167095,US -1119167200,1119167215,US -1119167232,1119167495,US -1119167496,1119167503,CA -1119167512,1119167519,US -1119167536,1119167543,US -1119167552,1119167999,US -1119168024,1119168031,CA -1119168032,1119168047,US -1119168112,1119168119,US -1119168128,1119170559,US +1119111168,1119166463,US 1119171072,1119171327,US 1119171360,1119171383,US 1119171384,1119171391,CA @@ -18801,18 +18914,7 @@ 1119172200,1119172207,CA 1119172256,1119172263,US 1119172352,1119172863,US -1119172864,1119174015,MX -1119174024,1119174031,GT -1119174032,1119174039,MX -1119174048,1119174207,MX -1119174208,1119174271,GT -1119174272,1119174335,MX -1119174344,1119174351,GT -1119174352,1119174359,MX -1119174400,1119174407,GT -1119174408,1119174415,MX -1119174424,1119174527,MX -1119174536,1119174543,MX +1119172864,1119173631,MX 1119174656,1119199231,US 1119199232,1119207169,MN 1119207170,1119207170,US @@ -18836,9 +18938,7 @@ 1119502336,1119510527,CA 1119510528,1119558143,US 1119558144,1119558655,PR -1119558656,1119568383,US -1119568384,1119568639,GB -1119568640,1119570559,US +1119558656,1119570559,US 1119570560,1119570687,GB 1119570688,1119571967,US 1119571968,1119576063,CA @@ -19189,7 +19289,9 @@ 1137376356,1137376356,CA 1137376357,1137378815,US 1137378816,1137379071,UA -1137379072,1137426431,US +1137379072,1137385471,US +1137385472,1137387519,IL +1137387520,1137426431,US 1137426432,1137442815,PR 1137442816,1137491967,US 1137491968,1137508351,CA @@ -19266,7 +19368,9 @@ 1138375424,1138375679,AS 1138375680,1138419711,US 1138419712,1138419967,DE -1138419968,1138499583,US +1138419968,1138474239,US +1138474240,1138474751,CA +1138474752,1138499583,US 1138499584,1138503679,CA 1138503680,1138508575,US 1138508576,1138508591,IT @@ -19395,9 +19499,7 @@ 1157931008,1157935103,BS 1157935104,1157943295,US 1157943296,1157947391,CA -1157947392,1157984255,US -1157984256,1157984767,CA -1157984768,1158027263,US +1157947392,1158027263,US 1158027264,1158027519,CA 1158027520,1158028287,US 1158028288,1158028543,CA @@ -19614,7 +19716,11 @@ 1161834980,1161834980,BZ 1161834981,1161835058,US 1161835059,1161835059,BZ -1161835060,1161835230,US +1161835060,1161835109,US +1161835110,1161835110,BZ +1161835111,1161835226,US +1161835227,1161835227,BZ +1161835228,1161835230,US 1161835231,1161835231,PH 1161835232,1161837174,US 1161837175,1161837175,BZ @@ -19860,7 +19966,7 @@ 1168867328,1168875519,CA 1168875520,1168916479,US 1168916480,1168924671,HK -1168924672,1168932863,CA +1168924672,1168932863,IT 1168932864,1168936959,US 1168936960,1168949247,CA 1168949248,1168949503,US @@ -20024,7 +20130,7 @@ 1192296448,1192361983,CA 1192361984,1192427519,US 1192427520,1192460287,CA -1192464384,1192468479,US +1192460288,1192468479,US 1192468480,1192476671,CA 1192476672,1192488959,US 1192488960,1192493055,CA @@ -20272,7 +20378,11 @@ 1224201216,1224202239,NL 1224202240,1224210431,US 1224210432,1224212479,NL -1224212480,1224329215,US +1224212480,1224327167,US +1224327168,1224327295,NL +1224327296,1224327935,US +1224327936,1224327943,CA +1224327944,1224329215,US 1224329216,1224329471,CA 1224329472,1224331263,US 1224331264,1224333311,PR @@ -20361,9 +20471,7 @@ 1248936960,1248939007,CA 1248939008,1248946175,US 1248946176,1248947199,VG -1248947200,1248958463,US -1248958464,1248959487,CA -1248959488,1248964607,US +1248947200,1248964607,US 1248964608,1248966655,CA 1248966656,1248997375,US 1248997376,1248998399,ID @@ -20447,12 +20555,12 @@ 1249359872,1249361919,CA 1249361920,1249379327,US 1249379328,1249380351,CA -1249380352,1249383423,US +1249380352,1249384447,US 1249384448,1249386495,PR 1249386496,1249391615,US 1249391616,1249392639,CA 1249392640,1249396735,US -1249396736,1249397759,CA +1249396736,1249398783,CA 1249398784,1249409023,US 1249409024,1249410047,CA 1249410048,1249434623,US @@ -20907,7 +21015,9 @@ 1296262144,1296262383,IE 1296262384,1296262399,IN 1296262400,1296262655,US -1296262656,1296263679,IE +1296262656,1296263523,IE +1296263524,1296263527,CH +1296263528,1296263679,IE 1296263680,1296263935,US 1296263936,1296264263,IE 1296264264,1296264271,GB @@ -21039,7 +21149,8 @@ 1296769024,1296771071,TR 1296771072,1296773119,LT 1296773120,1296774143,FR -1296775168,1296779263,FR +1296774145,1296774287,FR +1296774912,1296779263,FR 1296779264,1296781311,CZ 1296781312,1296783359,DK 1296783360,1296785407,LB @@ -22262,7 +22373,21 @@ 1334316032,1334316159,NO 1334316160,1334345727,SE 1334345728,1334378495,RU -1334378496,1334411263,IT +1334378496,1334379263,IT +1334379264,1334379519,PL +1334379520,1334379971,IT +1334379972,1334379975,DE +1334379976,1334383001,IT +1334383002,1334383002,GB +1334383003,1334383103,IT +1334383104,1334383359,FR +1334383360,1334386895,IT +1334386896,1334386896,FR +1334386897,1334389823,IT +1334389824,1334389887,ES +1334389888,1334390015,IT +1334390016,1334390271,ES +1334390272,1334411263,IT 1334411264,1334444031,RU 1334444032,1334503935,SE 1334503936,1334504191,DK @@ -23066,9 +23191,15 @@ 1347559424,1347567615,RU 1347567616,1347567888,SC 1347567889,1347567889,NL -1347567890,1347569663,SC +1347567890,1347569125,SC +1347569126,1347569126,NL +1347569127,1347569314,SC +1347569315,1347569315,NL +1347569316,1347569663,SC 1347569664,1347570687,NL -1347570688,1347571711,SC +1347570688,1347571538,SC +1347571539,1347571539,NL +1347571540,1347571711,SC 1347571712,1347575807,RU 1347575808,1347579903,DK 1347579904,1347588095,GB @@ -23220,7 +23351,8 @@ 1348009984,1348014079,RU 1348014080,1348018175,DK 1348018176,1348026367,NO -1348026368,1348030463,DE +1348026368,1348028415,DE +1348028416,1348030463,LV 1348030464,1348034559,GB 1348034560,1348038655,AT 1348038656,1348042751,FR @@ -23229,7 +23361,9 @@ 1348055040,1348059135,LB 1348059136,1348063231,RU 1348063232,1348067327,CH -1348067328,1348071423,NL +1348067328,1348070399,NL +1348070400,1348070911,DE +1348070912,1348071423,NL 1348071424,1348075519,DE 1348075520,1348076287,LV 1348076288,1348076543,RU @@ -23491,6 +23625,8 @@ 1357318400,1357318655,FR 1357318912,1357319167,DE 1357319168,1357319171,PL +1357319172,1357319178,GB +1357319180,1357319187,GB 1357321024,1357321087,KE 1357321984,1357322239,GB 1357322240,1357322255,DE @@ -23558,7 +23694,7 @@ 1357375216,1357375223,ES 1357375224,1357375423,GB 1357375424,1357375487,IE -1357377536,1357378639,FR +1357377536,1357378647,FR 1357378816,1357379071,FR 1357381632,1357414399,NO 1357414400,1357447167,LV @@ -23669,9 +23805,7 @@ 1357985016,1357985023,IT 1357985024,1357985575,GB 1357985576,1357985583,IT -1357985584,1357985775,GB -1357985776,1357985783,IT -1357985784,1357985791,GB +1357985584,1357985791,GB 1357985792,1357987839,DE 1357987840,1357991935,GB 1357991936,1357996031,NO @@ -24250,9 +24384,9 @@ 1360986632,1360986635,US 1360986636,1360986755,GB 1360986756,1360986763,US -1360986764,1360989653,GB -1360989654,1360989654,FR -1360989655,1360989929,GB +1360986764,1360989439,GB +1360989440,1360989695,FR +1360989696,1360989929,GB 1360989930,1360989930,FR 1360989931,1360989935,GB 1360989936,1360989943,FR @@ -24378,7 +24512,6 @@ 1364885504,1364889599,GB 1364889600,1364893695,IR 1364893696,1364897791,CZ -1364897792,1364901887,SI 1364901888,1364905983,DE 1364905984,1364910079,RU 1364910080,1364914175,UA @@ -24586,7 +24719,9 @@ 1370302976,1370303487,NO 1370303488,1370312703,NL 1370312704,1370316799,CH -1370316800,1370324991,NL +1370316800,1370318847,NL +1370318848,1370320895,ES +1370320896,1370324991,NL 1370324992,1370357759,DE 1370357760,1370390527,IT 1370390528,1370423295,GB @@ -24617,14 +24752,18 @@ 1371734016,1371799551,RU 1371799552,1371865087,RO 1371865088,1371930623,FI -1371930624,1371996159,LV +1371930624,1371979007,LV +1371979008,1371979263,LT +1371979264,1371996159,LV 1371996160,1371996671,GB 1371996672,1371996927,GA 1371996928,1372000255,GB 1372000256,1372001279,UG 1372001280,1372012543,GB 1372012544,1372013567,ZM -1372013568,1372016127,GB +1372013568,1372014079,GB +1372014080,1372014335,NG +1372014336,1372016127,GB 1372016128,1372016383,GH 1372016384,1372017583,GB 1372017584,1372017599,CD @@ -25092,7 +25231,7 @@ 1386444800,1386445823,DK 1386445824,1386447871,GB 1386447872,1386448895,DK -1386448896,1386449151,GB +1386448896,1386449151,IL 1386449152,1386449343,NL 1386449344,1386449347,GB 1386449348,1386449359,NL @@ -25110,7 +25249,10 @@ 1386449404,1386449407,DE 1386449408,1386449663,GB 1386449664,1386449919,HK -1386449920,1386450943,IL +1386449920,1386449920,US +1386449921,1386450175,IL +1386450176,1386450431,US +1386450432,1386450943,IL 1386450944,1386455039,GB 1386455040,1386456063,DK 1386456064,1386457087,GB @@ -25448,7 +25590,7 @@ 1399848960,1400111103,FR 1400111104,1400373247,NL 1400373248,1400635391,IR -1400635392,1400768511,DE +1400700928,1400768511,DE 1400897536,1400963071,NL 1400963072,1401028607,DE 1401028608,1401094143,IL @@ -25485,7 +25627,6 @@ 1401470976,1401473023,NL 1401473024,1401475071,CZ 1401475072,1401477119,FR -1401477120,1401479167,BE 1401479168,1401481215,PL 1401481216,1401485311,RU 1401485312,1401487834,GB @@ -25603,8 +25744,7 @@ 1401923584,1401925631,GG 1401925632,1401927679,BG 1401927680,1401929727,NL -1401929728,1401931775,RU -1401931776,1401933823,UA +1401929728,1401933823,RU 1401933824,1401935871,DE 1401935872,1401937919,FI 1401937920,1401939967,GB @@ -25791,8 +25931,7 @@ 1404043264,1404051455,EE 1404051456,1404059647,HR 1404059648,1404076543,SE -1404076544,1404081663,LV -1404081664,1404084223,SE +1404076544,1404084223,LV 1404084224,1404099327,LT 1404099328,1404099583,SE 1404099584,1404103167,LT @@ -25803,8 +25942,8 @@ 1404125184,1404133375,HR 1404133376,1404141567,SE 1404141568,1404149759,LV -1404149760,1404157951,SE -1404157952,1404174335,LV +1404149760,1404151807,SE +1404151808,1404174335,LV 1404174336,1404182527,EE 1404182528,1404187519,SE 1404187520,1404187535,LV @@ -25876,8 +26015,7 @@ 1404788736,1404796927,LT 1404796928,1404801023,EE 1404801024,1404803071,SE -1404803072,1404804095,LV -1404804096,1404805119,SE +1404803072,1404805119,LV 1404805120,1404813311,AT 1404813312,1404815871,EE 1404815872,1404816383,LT @@ -26354,6 +26492,7 @@ 1411850240,1411858431,FR 1411858432,1411870719,DE 1411870720,1411870975,CH +1411871232,1411871487,GB 1411871744,1411871771,GB 1411871772,1411871775,FR 1411871776,1411872015,GB @@ -26485,7 +26624,9 @@ 1422400408,1422400415,IN 1422400416,1422402175,DE 1422402176,1422402239,IN -1422402240,1422406655,DE +1422402240,1422406487,DE +1422406488,1422406495,IN +1422406496,1422406655,DE 1422406656,1422406783,IN 1422406784,1422406911,DE 1422406912,1422407039,IN @@ -26567,7 +26708,9 @@ 1424608084,1424608087,FR 1424608088,1424608743,GB 1424608744,1424608751,ES -1424608752,1424610643,GB +1424608752,1424609543,GB +1424609544,1424609551,CH +1424609552,1424610643,GB 1424610644,1424610644,PL 1424610645,1424610992,GB 1424610993,1424610993,FR @@ -26843,7 +26986,9 @@ 1432092672,1432100863,RU 1432100864,1432109055,CZ 1432109056,1432117247,GB -1432125440,1432131583,NL +1432125440,1432130703,NL +1432130704,1432130711,GB +1432130712,1432131583,NL 1432131584,1432133631,US 1432133632,1432150015,GB 1432150016,1432158207,BA @@ -27093,18 +27238,20 @@ 1437073408,1437335551,FR 1437335552,1437597695,RU 1437597696,1438121983,DE -1438121984,1438127103,NL -1438127104,1438127359,GB +1438121984,1438126079,NL +1438126080,1438127359,CZ 1438127360,1438127615,SE 1438127616,1438127871,BE -1438127872,1438146559,NL +1438127872,1438130175,CZ +1438130176,1438138367,NL +1438138368,1438146559,FR 1438146560,1438154751,MT 1438154752,1438171135,DK 1438171136,1438173183,GB 1438173184,1438179327,IM 1438179328,1438181375,NL 1438181376,1438183423,SA -1438183424,1438184447,NL +1438183424,1438184447,PS 1438184448,1438185471,CH 1438185472,1438186495,DE 1438186496,1438187519,CH @@ -27363,10 +27510,8 @@ 1440213257,1440251903,DE 1440251904,1440284671,SK 1440284672,1440317439,FI -1440317440,1440320255,BG -1440320256,1440320511,DE -1440320512,1440322047,BG -1440322048,1440323071,DE +1440317440,1440322559,BG +1440322560,1440323071,DE 1440323072,1440325631,BG 1440325632,1440326655,DE 1440326656,1440328703,BG @@ -27656,7 +27801,9 @@ 1449816576,1449817855,GB 1449817856,1449818111,RO 1449818112,1449818367,DE -1449818368,1449820927,RO +1449818368,1449818623,RO +1449818624,1449819135,TR +1449819136,1449820927,RO 1449820928,1449821183,DE 1449821184,1449822719,RO 1449822720,1449823743,GB @@ -27760,7 +27907,9 @@ 1450311680,1450442751,FI 1450442752,1450704895,CH 1450704896,1451229183,RO -1451229184,1455423487,GB +1451229184,1451415166,GB +1451415167,1451415167,US +1451415168,1455423487,GB 1455423488,1456726527,FR 1456726528,1456726783,RE 1456726784,1459617791,FR @@ -27788,10 +27937,13 @@ 1466040320,1466073087,EE 1466073088,1466086016,FR 1466086017,1466086017,ES -1466086018,1466097663,FR -1466097664,1466099711,ES +1466086018,1466097919,FR +1466097920,1466099711,ES 1466099712,1466101759,PL -1466101760,1466103807,DE +1466101760,1466102271,FR +1466102272,1466102527,DE +1466102528,1466102783,FR +1466102784,1466103807,DE 1466103808,1466104575,GB 1466104576,1466104942,FR 1466104943,1466104943,BE @@ -27884,9 +28036,7 @@ 1467582464,1467584511,DE 1467584512,1467593727,BG 1467593728,1467597823,DE -1467597824,1467600895,BG -1467600896,1467601407,DE -1467601408,1467604991,BG +1467597824,1467604991,BG 1467604992,1467744255,DE 1467744256,1467777023,GB 1467777024,1467875327,ES @@ -28469,8 +28619,13 @@ 1489666048,1489674239,GB 1489674240,1489676287,NL 1489676288,1489688575,GB -1489688576,1489690111,IL -1489690112,1489690623,NL +1489688576,1489688831,IL +1489688832,1489689087,GB +1489689088,1489689343,IL +1489689344,1489689599,GB +1489689600,1489689855,IL +1489689856,1489690367,NL +1489690368,1489690623,IL 1489690624,1489692415,GB 1489692416,1489692422,AU 1489692423,1489692423,GB @@ -28524,9 +28679,7 @@ 1490328576,1490337791,GB 1490337792,1490354175,RU 1490354176,1490386943,SA -1490386944,1490391039,IT -1490391040,1490395135,CH -1490395136,1490403327,IT +1490386944,1490403327,CH 1490403328,1490419711,BG 1490419712,1490420735,DE 1490420736,1490421759,IR @@ -28679,8 +28832,15 @@ 1495160256,1495160263,GB 1495160320,1495160575,FR 1495162112,1495162367,DE +1495162496,1495162499,DE 1495162608,1495162623,GB -1495162624,1495164927,FR +1495162624,1495163399,FR +1495163400,1495163403,GB +1495163404,1495163407,FR +1495163408,1495163411,ES +1495163412,1495163415,IT +1495163416,1495164927,FR +1495165192,1495165195,NL 1495165408,1495165439,FR 1495165696,1495165951,ES 1495167488,1495167503,GB @@ -28690,6 +28850,7 @@ 1495168384,1495168415,FR 1495168640,1495168655,FR 1495169024,1495169279,FR +1495170128,1495170143,FR 1495170760,1495170763,DE 1495170816,1495171071,FR 1495171072,1495203839,NL @@ -29086,7 +29247,8 @@ 1495688704,1495689215,IR 1495689216,1495689727,RO 1495689728,1495690239,DE -1495690240,1495693311,RO +1495690240,1495691263,RO +1495691264,1495693311,DE 1495693312,1495695359,GB 1495695360,1495699455,RO 1495699456,1495700479,GB @@ -29220,7 +29382,8 @@ 1495866112,1495866879,GB 1495866880,1495867391,RO 1495867392,1495867903,IR -1495867904,1495869439,RO +1495867904,1495868415,DE +1495868416,1495869439,RO 1495869440,1495870463,IR 1495870464,1495871487,RO 1495871488,1495871743,ES @@ -29331,9 +29494,10 @@ 1496018944,1496019967,FR 1496019968,1496020735,RO 1496020736,1496020991,AU -1496020992,1496023039,RO +1496020992,1496023039,DE 1496023040,1496024063,MD -1496024064,1496027135,RO +1496024064,1496025087,TR +1496025088,1496027135,RO 1496027136,1496029183,IR 1496029184,1496032255,RO 1496032256,1496033279,KZ @@ -29410,7 +29574,8 @@ 1496142848,1496143871,CH 1496143872,1496144895,RO 1496144896,1496145151,US -1496145152,1496145663,RO +1496145152,1496145407,RO +1496145408,1496145663,TR 1496145664,1496145919,IT 1496145920,1496150015,RO 1496150016,1496152063,IR @@ -29468,7 +29633,9 @@ 1496238080,1496240127,IQ 1496240128,1496242175,RO 1496242176,1496243199,IR -1496243200,1496253439,RO +1496243200,1496248595,RO +1496248596,1496248596,MD +1496248597,1496253439,RO 1496253440,1496254463,ES 1496254464,1496260607,RO 1496260608,1496261119,IT @@ -29846,7 +30013,9 @@ 1505607680,1505615871,SE 1505615872,1505624063,SA 1505624064,1505632255,FI -1505632256,1505646847,CZ +1505632256,1505644799,CZ +1505644800,1505645055,PL +1505645056,1505646847,CZ 1505646848,1505647103,PL 1505647104,1505648639,CZ 1505648640,1505656831,LT @@ -30133,7 +30302,9 @@ 1509453824,1509457919,RU 1509457920,1509462015,NL 1509462016,1509466111,LI -1509466112,1509470207,SC +1509466112,1509469749,SC +1509469750,1509469750,NL +1509469751,1509470207,SC 1509470208,1509478399,RU 1509478400,1509482495,FR 1509482496,1509486591,RU @@ -30444,7 +30615,8 @@ 1518403584,1518436351,SE 1518436352,1518452735,NO 1518452736,1518460927,AT -1518460928,1518472191,SE +1518460928,1518469119,LV +1518469120,1518472191,SE 1518472192,1518475263,LT 1518475264,1518476287,SE 1518476288,1518476799,EE @@ -30476,7 +30648,8 @@ 1518727168,1518731263,SE 1518731264,1518780415,LT 1518780416,1518796799,HR -1518796800,1518927871,SE +1518796800,1518862335,LT +1518862336,1518927871,SE 1518927872,1518961663,LT 1518961664,1518962175,EE 1518962176,1518962687,LV @@ -30582,27 +30755,28 @@ 1532682240,1532690431,LV 1532690432,1532755967,FR 1532755968,1532756991,DE -1532756992,1532784639,BG +1532756992,1532774143,BG +1532774144,1532774399,CH +1532774400,1532784639,BG 1532784640,1532785151,TR 1532785152,1532787711,BG 1532787712,1532789759,DE -1532789760,1532791807,BG -1532791808,1532794879,DE -1532794880,1532795903,BG +1532789760,1532795903,BG 1532795904,1532796927,DE 1532796928,1532797951,BG 1532797952,1532798975,DE 1532798976,1532799999,BG 1532800000,1532801023,DE 1532801024,1532802047,BG -1532802048,1532805119,DE -1532805120,1532808191,BG -1532808192,1532811263,DE -1532811264,1532812031,BG +1532802048,1532803071,DE +1532803072,1532808191,BG +1532808192,1532809215,DE +1532809216,1532812031,BG 1532812032,1532812287,RO 1532812288,1532813311,DE 1532813312,1532816383,BG -1532816384,1532821503,DE +1532816384,1532817407,DE +1532817408,1532821503,BG 1532821504,1532887039,TR 1532887040,1532952575,PL 1532952576,1533018111,SE @@ -30707,14 +30881,20 @@ 1533761536,1533763583,NL 1533763584,1533768703,RU 1533768704,1533768959,GB -1533768960,1533771519,RU +1533768960,1533769727,RU +1533769728,1533770751,BZ +1533770752,1533771519,RU 1533771520,1533771775,GB 1533771776,1533804543,IR 1533804544,1533805567,RU 1533805568,1533807615,NL 1533807616,1533808639,US 1533808640,1533809663,SG -1533809664,1533818879,RU +1533809664,1533810687,GB +1533810688,1533811199,RU +1533811200,1533811711,GB +1533811712,1533812735,RU +1533812736,1533818879,GB 1533818880,1533819903,NL 1533819904,1533820927,RU 1533820928,1533825407,DE @@ -30755,9 +30935,7 @@ 1533929472,1533932799,GB 1533932800,1533933055,DE 1533933056,1534066687,GB -1534066688,1534300159,AT -1534300160,1534300415,DE -1534300416,1534328831,AT +1534066688,1534328831,AT 1534328832,1534459903,ES 1534459904,1534590975,AT 1534590976,1534656511,HU @@ -31012,7 +31190,9 @@ 1535562404,1535562407,GB 1535562408,1535562591,FR 1535562592,1535562623,FI -1535562624,1535562879,FR +1535562624,1535562699,FR +1535562700,1535562703,PT +1535562704,1535562879,FR 1535562880,1535563007,ES 1535563008,1535563371,FR 1535563372,1535563375,FI @@ -31960,7 +32140,7 @@ 1539774720,1539774975,PL 1539774976,1539775231,RU 1539775488,1539775743,UA -1539775744,1539775999,IL +1539775744,1539775999,NL 1539776256,1539776511,SK 1539776768,1539777023,UA 1539777024,1539777279,RU @@ -32124,7 +32304,7 @@ 1539825408,1539825919,RU 1539825920,1539826175,DE 1539826176,1539826431,AM -1539826432,1539826687,BE +1539826432,1539826687,NL 1539826688,1539826943,CH 1539826944,1539827199,RU 1539827200,1539827455,ES @@ -32208,9 +32388,9 @@ 1539902464,1539903487,LV 1539903488,1539904511,PL 1539904512,1539905535,CZ -1539905536,1539906047,UA -1539906048,1539906303,RU -1539906304,1539906559,UA +1539905536,1539905791,RU +1539905792,1539906047,UA +1539906048,1539906559,RU 1539908608,1539909631,UA 1539909632,1539910655,RU 1539910656,1539911679,PL @@ -32293,7 +32473,9 @@ 1540008960,1540011007,PL 1540011008,1540014079,RU 1540014080,1540015103,PL -1540015104,1540016193,RU +1540015104,1540016127,RU +1540016128,1540016135,DE +1540016136,1540016193,RU 1540016194,1540016194,NL 1540016195,1540016393,RU 1540016394,1540016394,IE @@ -32353,7 +32535,7 @@ 1540081664,1540082687,DE 1540082688,1540083711,NO 1540083712,1540084735,RU -1540084736,1540085759,NL +1540084736,1540085759,DE 1540085760,1540087807,PL 1540087808,1540092927,RU 1540092928,1540094975,PL @@ -33575,7 +33757,7 @@ 1540740096,1540740351,GB 1540740352,1540740607,SA 1540740608,1540740863,NL -1540740864,1540741119,RO +1540740864,1540741119,ES 1540741120,1540741375,GB 1540741632,1540742143,NL 1540742400,1540742655,DE @@ -36347,7 +36529,7 @@ 1542357504,1542357759,GB 1542357760,1542358015,FR 1542358016,1542358271,UA -1542358272,1542358527,CZ +1542358272,1542358527,RU 1542358528,1542359039,PL 1542359040,1542360319,RU 1542360320,1542360575,NL @@ -36544,7 +36726,6 @@ 1542462208,1542462463,GE 1542462464,1542463487,PL 1542463488,1542463743,FR -1542463744,1542463999,ES 1542464000,1542464255,DE 1542464256,1542464511,CZ 1542464512,1542464767,RU @@ -36761,7 +36942,6 @@ 1542691328,1542691839,PT 1542691840,1542692863,RU 1542692864,1542696959,IR -1542696960,1542701055,RU 1542701056,1542709247,UA 1542709248,1542717439,RU 1542717440,1542733823,UA @@ -37167,7 +37347,9 @@ 1547665408,1547669503,GB 1547669504,1547673599,AT 1547673600,1547677695,NL -1547677696,1547683839,RU +1547677696,1547682559,RU +1547682560,1547682815,NL +1547682816,1547683839,RU 1547683840,1547683967,PL 1547683968,1547684031,EE 1547684032,1547684095,LV @@ -37182,11 +37364,15 @@ 1548159236,1548159487,NL 1548159488,1548159999,GB 1548160000,1548160257,NL -1548160260,1548160607,NL +1548160260,1548160567,NL +1548160568,1548160575,DE +1548160576,1548160607,NL 1548160608,1548160639,GB 1548160640,1548161375,NL 1548161376,1548161407,GB -1548161408,1548162463,NL +1548161408,1548161727,NL +1548161728,1548161791,GB +1548161792,1548162463,NL 1548162464,1548162495,FR 1548162496,1548169215,NL 1548169216,1548171263,DE @@ -37306,7 +37492,9 @@ 1558083960,1558083963,CZ 1558083964,1558084208,FR 1558084209,1558084209,ES -1558084210,1558084655,FR +1558084210,1558084649,FR +1558084650,1558084650,IT +1558084651,1558084655,FR 1558084656,1558084659,BE 1558084660,1558085055,FR 1558085056,1558085071,GB @@ -37332,7 +37520,9 @@ 1558112096,1558112127,ES 1558112128,1558112191,FR 1558112192,1558112192,ES -1558112193,1558112207,FR +1558112193,1558112198,FR +1558112199,1558112199,ES +1558112200,1558112207,FR 1558112208,1558112208,ES 1558112209,1558112209,FR 1558112210,1558112211,ES @@ -37347,9 +37537,20 @@ 1558126592,1558128639,RU 1558128640,1558129663,LU 1558129664,1558130687,US -1558130688,1558141439,LU +1558130688,1558138879,LU +1558138880,1558139135,RU +1558139136,1558139391,NL +1558139392,1558139903,US +1558139904,1558140159,DE +1558140160,1558140415,RU +1558140416,1558140671,SG +1558140672,1558140927,RU +1558140928,1558141439,LU 1558141440,1558141695,CY -1558141696,1558147583,LU +1558141696,1558141951,RU +1558141952,1558144255,LU +1558144256,1558144767,RU +1558144768,1558147583,LU 1558147584,1558147839,RU 1558147840,1558148095,LU 1558148096,1558148351,SG @@ -37369,7 +37570,9 @@ 1558180024,1558180039,IT 1558180040,1558180071,NL 1558180072,1558180079,IT -1558180080,1558180287,NL +1558180080,1558180095,NL +1558180096,1558180111,IT +1558180112,1558180287,NL 1558180288,1558180367,IT 1558180368,1558180863,NL 1558180864,1558183935,IT @@ -37444,7 +37647,7 @@ 1559941888,1559943167,DE 1559943168,1559944191,LU 1559944192,1559945727,FR -1559945728,1559946751,LU +1559945728,1559946751,GB 1559946752,1559947519,DE 1559947520,1559949311,LU 1559949312,1559950335,DE @@ -37737,13 +37940,15 @@ 1567699968,1567702015,RO 1567702016,1567703039,TR 1567703040,1567705087,MD -1567705088,1567707135,BG +1567705088,1567705599,BG +1567705600,1567705855,MD +1567705856,1567707135,BG 1567707136,1567709183,MD 1567709184,1567709439,RO 1567709440,1567709695,IT 1567709696,1567710207,RO 1567710208,1567711231,MD -1567711232,1567711487,RO +1567711232,1567711487,TR 1567711488,1567711743,PL 1567711744,1567712511,RO 1567712512,1567712767,PL @@ -37753,7 +37958,9 @@ 1567715328,1567717375,MD 1567717376,1567719167,RO 1567719168,1567719423,GB -1567719424,1567721471,RO +1567719424,1567720191,RO +1567720192,1567720447,NO +1567720448,1567721471,RO 1567721472,1567723519,ES 1567723520,1567727359,RO 1567727360,1567727615,GB @@ -38180,7 +38387,9 @@ 1571704832,1571706879,GB 1571706880,1571708179,SC 1571708180,1571708180,NL -1571708181,1571708927,SC +1571708181,1571708338,SC +1571708339,1571708339,NL +1571708340,1571708927,SC 1571708928,1571709439,GB 1571709440,1571709567,DE 1571709568,1571709695,GB @@ -38216,7 +38425,8 @@ 1571748608,1571748863,GB 1571748864,1571749119,US 1571749120,1571749375,SG -1571749376,1571749887,GB +1571749376,1571749631,GB +1571749632,1571749887,SG 1571749888,1571758079,RU 1571758080,1571766271,IL 1571766272,1571786751,PL @@ -38253,8 +38463,7 @@ 1572035584,1572036607,GB 1572036608,1572039679,RU 1572039680,1572043263,GB -1572043264,1572043775,RU -1572043776,1572044799,GB +1572043264,1572044799,RU 1572044800,1572061183,IT 1572061184,1572077567,PL 1572077568,1572093951,RU @@ -39093,7 +39302,9 @@ 1586233344,1586241535,FR 1586241536,1586249727,SE 1586249728,1586257919,SI -1586257920,1586264063,SE +1586257920,1586261503,SE +1586261504,1586261759,RS +1586261760,1586264063,SE 1586264064,1586265087,LV 1586265088,1586266111,SE 1586266112,1586274303,RU @@ -39244,7 +39455,9 @@ 1588682752,1588684799,RO 1588684800,1588685055,TH 1588685056,1588685311,VG -1588685312,1588688383,RO +1588685312,1588686847,RO +1588686848,1588687103,NO +1588687104,1588688383,RO 1588688384,1588688639,GB 1588688640,1588689407,RO 1588689408,1588689663,GB @@ -39282,7 +39495,8 @@ 1589510144,1589542911,RU 1589542912,1589560319,BG 1589560320,1589561343,GI -1589561344,1589575679,BG +1589561344,1589563391,NL +1589563392,1589575679,BG 1589575680,1589608447,RU 1589608448,1589622783,SE 1589622784,1589641215,DK @@ -39610,7 +39824,9 @@ 1596873472,1596873727,RU 1596873728,1596873983,UZ 1596873984,1596874751,RU -1596874752,1596875775,UA +1596874752,1596875007,UA +1596875008,1596875263,RU +1596875264,1596875775,UA 1596875776,1596876799,UZ 1596876800,1596877311,RU 1596877312,1596877596,CZ @@ -39681,8 +39897,7 @@ 1596956160,1596956671,RU 1596956672,1596956927,CZ 1596956928,1596957183,RU -1596957184,1596957695,UA -1596957696,1596957951,RU +1596957184,1596957951,UA 1596957952,1596958207,CZ 1596958208,1596958463,RU 1596958464,1596958719,UA @@ -40133,9 +40348,7 @@ 1605099520,1605107711,RU 1605107712,1605108247,GB 1605108248,1605108255,IT -1605108256,1605108567,GB -1605108568,1605108575,IT -1605108576,1605108583,GB +1605108256,1605108583,GB 1605108584,1605108591,IT 1605108592,1605109079,GB 1605109080,1605109087,IT @@ -40165,9 +40378,7 @@ 1605111904,1605111911,IT 1605111912,1605111935,GB 1605111936,1605111943,IT -1605111944,1605112119,GB -1605112120,1605112127,IT -1605112128,1605113383,GB +1605111944,1605113383,GB 1605113384,1605113391,IT 1605113392,1605113407,GB 1605113408,1605113415,IT @@ -40573,7 +40784,7 @@ 1698004992,1698013183,IN 1698013184,1698021375,US 1698021376,1698029567,NZ -1698029568,1698037759,AU +1698029568,1698037759,PK 1698037760,1698103295,CN 1698103296,1698136063,KR 1698136064,1698160639,JP @@ -40699,8 +40910,7 @@ 1728153600,1728154623,SG 1728154624,1728155647,JP 1728155648,1728157695,MY -1728157696,1728157951,HK -1728157952,1728158463,MY +1728157696,1728158463,HK 1728158464,1728158719,NL 1728158720,1728159743,HK 1728159744,1728161791,TH @@ -40769,8 +40979,7 @@ 1728286720,1728287743,AU 1728287744,1728290815,CN 1728290816,1728291839,AU -1728291840,1728292607,US -1728292608,1728292863,SG +1728291840,1728292863,SG 1728292864,1728293887,PG 1728293888,1728294911,MY 1728294912,1728295935,TH @@ -41263,6 +41472,7 @@ 1728751616,1728751871,IN 1728751872,1728752639,ID 1728752640,1728753663,HK +1728753664,1728754687,PH 1728754688,1728755711,IN 1728755712,1728756735,ID 1728756736,1728757759,IN @@ -42579,7 +42789,13 @@ 1730017792,1730019327,PH 1730019328,1730020351,ID 1730020352,1730021375,HK -1730022400,1730023423,IN +1730022400,1730023169,IN +1730023170,1730023231,US +1730023232,1730023232,IN +1730023233,1730023296,US +1730023297,1730023297,IN +1730023298,1730023359,US +1730023360,1730023423,IN 1730023424,1730024447,HK 1730024448,1730025471,CN 1730025472,1730026495,HK @@ -42902,9 +43118,7 @@ 1730599936,1730604031,CN 1730604032,1730605055,NP 1730605056,1730607103,IN -1730608128,1730608639,CN -1730608640,1730608895,HK -1730608896,1730609151,CN +1730608128,1730609151,CN 1730609152,1730610687,IN 1730610688,1730610943,MY 1730610944,1730611199,SG @@ -42925,7 +43139,6 @@ 1730623488,1730624511,HK 1730624512,1730625535,AU 1730625536,1730626559,CN -1730626560,1730627583,HK 1730628608,1730629631,HK 1730629632,1730630655,PK 1730630656,1730631679,AU @@ -43047,7 +43260,6 @@ 1730801664,1730802687,JP 1730802688,1730803199,BD 1730803200,1730803711,ID -1730803712,1730804735,HK 1730804736,1730805759,JP 1730805760,1730806783,AF 1730807808,1730808831,CN @@ -43937,7 +44149,9 @@ 1731940352,1731942655,IN 1731942656,1731942911,JP 1731942912,1731943423,HK -1731943424,1731944447,KR +1731943424,1731944258,KR +1731944259,1731944259,CH +1731944260,1731944447,KR 1731944448,1731945471,IN 1731945472,1731946495,CN 1731946496,1731947519,IN @@ -43966,6 +44180,7 @@ 1731987456,1731987711,SG 1731987712,1731987967,ID 1731987968,1731988479,SG +1731988480,1731989503,US 1731989504,1731990527,VN 1731990528,1731990783,AU 1731990784,1731991039,IN @@ -44143,7 +44358,8 @@ 1732242432,1732243455,HK 1732243456,1732249599,CN 1732249600,1732250623,SG -1732250624,1732251135,MY +1732250624,1732250879,HK +1732250880,1732251135,MY 1732251136,1732251647,ID 1732251648,1732252671,SG 1732252672,1732253695,MM @@ -44287,9 +44503,8 @@ 1732504576,1732505599,IN 1732505600,1732506623,ID 1732506624,1732507647,IN -1732507648,1732507902,AU -1732507903,1732507903,PH -1732507904,1732508671,AU +1732507648,1732507648,PH +1732507649,1732508671,AU 1732508672,1732509695,CN 1732509696,1732510719,ID 1732510720,1732511743,BD @@ -44328,8 +44543,7 @@ 1732546560,1732547583,JP 1732547584,1732549631,KR 1732549632,1732550655,PH -1732550656,1732551679,AU -1732551680,1732552703,SG +1732550656,1732552703,AU 1732552704,1732554751,HK 1732554752,1732555263,IN 1732555264,1732555775,AU @@ -44541,7 +44755,7 @@ 1732800512,1732806655,CN 1732806656,1732808703,IN 1732808704,1732809727,CN -1732809728,1732809983,KR +1732809728,1732809983,US 1732809984,1732810751,CN 1732810752,1732811775,HK 1732811776,1732812799,IN @@ -44938,7 +45152,7 @@ 1733249024,1733249279,AU 1733249280,1733249791,IN 1733249792,1733250047,AU -1733250048,1733251071,GB +1733250048,1733251071,US 1733251072,1733253119,CN 1733253120,1733253631,AU 1733253632,1733254143,ID @@ -45029,6 +45243,127 @@ 1733345280,1733346303,CN 1733346304,1733347327,IN 1733347328,1733348351,CN +1733348352,1733349375,JP +1733349376,1733349631,NZ +1733349632,1733349887,AU +1733349888,1733350399,MN +1733350400,1733351423,CN +1733351424,1733352447,TH +1733352448,1733352959,HK +1733352960,1733353471,JP +1733353472,1733354495,BD +1733354496,1733355519,AU +1733355520,1733356543,CN +1733356544,1733358591,ID +1733358592,1733359615,AU +1733359616,1733360383,IN +1733360384,1733360639,AU +1733360640,1733361151,HK +1733361152,1733361663,AU +1733361664,1733362687,IN +1733362688,1733364735,CN +1733364736,1733365759,IN +1733365760,1733367807,CN +1733367808,1733371903,IN +1733371904,1733372927,AU +1733372928,1733374975,CN +1733374976,1733375743,AU +1733375744,1733377023,IN +1733377024,1733379071,ID +1733379072,1733380095,BD +1733380096,1733381119,JP +1733381120,1733381375,AU +1733381376,1733382143,IN +1733382144,1733384191,VN +1733384192,1733386239,IN +1733386240,1733387263,CN +1733387264,1733387775,ID +1733387776,1733388031,AU +1733388032,1733388287,IN +1733388288,1733388799,BD +1733388800,1733390591,IN +1733390592,1733391359,MM +1733391360,1733392383,IN +1733392384,1733393407,CN +1733393408,1733394431,AU +1733394432,1733395455,SG +1733395456,1733396479,ID +1733396480,1733396735,NP +1733396736,1733396991,IN +1733396992,1733397247,ID +1733397248,1733397503,IN +1733397504,1733399551,JP +1733399552,1733400575,CN +1733400576,1733402879,IN +1733402880,1733403135,AU +1733403136,1733403391,MY +1733403392,1733403647,SG +1733403648,1733405695,CN +1733405696,1733406719,BD +1733406720,1733407743,JP +1733407744,1733407999,TH +1733408000,1733408511,IN +1733408512,1733409279,CN +1733409280,1733409535,DE +1733409536,1733409791,CN +1733409792,1733411327,IN +1733411328,1733411839,ID +1733411840,1733412863,BD +1733412864,1733413887,CN +1733413888,1733414911,BD +1733414912,1733416959,IN +1733419008,1733420031,NZ +1733420032,1733420287,SG +1733420288,1733421055,IN +1733421056,1733422079,CN +1733422080,1733424127,IN +1733424128,1733424383,AU +1733424384,1733424639,IN +1733424640,1733424895,ID +1733424896,1733425151,HK +1733425152,1733425663,ID +1733425664,1733427199,IN +1733427200,1733428223,GB +1733428224,1733428735,HK +1733428736,1733429247,ID +1733429248,1733430271,BD +1733430272,1733431295,ID +1733431296,1733432319,HK +1733432320,1733437439,VN +1733437440,1733438975,IN +1733438976,1733439487,PH +1733439488,1733440511,IN +1733440512,1733441535,CN +1733441536,1733442559,LA +1733442560,1733443583,CN +1733443584,1733444095,GB +1733444096,1733444607,IN +1733444608,1733445631,CN +1733445632,1733448703,IN +1733448704,1733449727,CN +1733449728,1733450751,JP +1733450752,1733453823,IN +1733453824,1733454847,CN +1733454848,1733455871,AU +1733455872,1733456895,JP +1733456896,1733457919,PH +1733457920,1733458943,PK +1733458944,1733459199,AU +1733459200,1733459455,IN +1733459456,1733459967,ID +1733459968,1733460991,GB +1733460992,1733462015,VN +1733462016,1733463039,AU +1733463040,1733464063,HK +1733464064,1733466111,IN +1733466112,1733467135,AU +1733467136,1733469183,IN +1733469184,1733470207,ID +1733470208,1733471231,HK +1733471232,1733472255,BD +1733472256,1733473279,IN +1733473280,1733474303,ID +1733474304,1733476351,IN 1740636160,1740644351,CN 1740644352,1740645375,IN 1740645376,1740647423,HK @@ -45324,6 +45659,7 @@ 1741020160,1741022207,IN 1741022208,1741023231,CN 1741023232,1741025279,AU +1741025280,1741026303,IN 1741026304,1741027327,TH 1741027328,1741028351,BD 1741028352,1741028519,CN @@ -45360,7 +45696,7 @@ 1741051904,1741052927,PH 1741052928,1741053183,AU 1741053184,1741053439,ID -1741053440,1741055999,IN +1741053952,1741055999,IN 1741056000,1741056511,NZ 1741056512,1741057023,AU 1741057024,1741058047,JP @@ -45463,7 +45799,9 @@ 1741243392,1741245439,HK 1741245440,1741257727,CN 1741257728,1741258751,IN -1741258752,1741259775,JP +1741258752,1741259007,JP +1741259008,1741259263,HK +1741259264,1741259775,JP 1741259776,1741264895,IN 1741264896,1741303807,CN 1741303808,1741304831,HK @@ -45647,7 +45985,7 @@ 1741572608,1741573119,KR 1741573120,1741574143,JP 1741574144,1741575167,PH -1741575168,1741576191,PK +1741575168,1741576191,US 1741576192,1741577215,JP 1741577216,1741578239,HK 1741578240,1741578751,IN @@ -45792,7 +46130,7 @@ 1741756416,1741756927,AU 1741756928,1741757439,IN 1741757440,1741758463,HK -1741758464,1741759487,AU +1741758464,1741759487,US 1741759488,1741760511,IN 1741760512,1741761535,HK 1741761536,1741762559,AU @@ -45855,9 +46193,8 @@ 1741815808,1741816831,CN 1741816832,1741817855,PK 1741817856,1741818367,PH -1741818368,1741819135,AU -1741819136,1741819391,PK -1741819392,1741819903,AU +1741818368,1741818879,AU +1741818880,1741819903,US 1741819904,1741820927,BD 1741820928,1741821951,PH 1741821952,1741822975,AU @@ -46267,7 +46604,7 @@ 1742340096,1742341119,CN 1742341120,1742342143,HK 1742342144,1742346239,CN -1742346240,1742347263,SG +1742346240,1742347263,BD 1742347264,1742364671,CN 1742364672,1742365695,PH 1742365696,1742366719,IN @@ -46785,7 +47122,7 @@ 1743125504,1743126527,JP 1743126528,1743127551,CN 1743127552,1743128575,BD -1743128576,1743129599,JP +1743128576,1743129599,PH 1743129600,1743130623,HK 1743130624,1743131647,BD 1743131648,1743132671,IN @@ -46844,7 +47181,6 @@ 1743185920,1743186943,SG 1743186944,1743187967,CN 1743187968,1743188991,HK -1743188992,1743190015,JP 1743190016,1743191039,SG 1743191040,1743192063,AF 1743192064,1743195135,IN @@ -47437,7 +47773,9 @@ 1743897600,1743899647,AU 1743899648,1743900671,ID 1743900672,1743901695,JP -1743901696,1743902463,AU +1743901696,1743901951,AU +1743901952,1743902207,US +1743902208,1743902463,AU 1743902464,1743902719,US 1743902720,1743903743,AU 1743903744,1743904767,CN @@ -47551,7 +47889,7 @@ 1744018432,1744019455,MY 1744019456,1744020479,NZ 1744020480,1744021503,HK -1744021504,1744022527,TH +1744022016,1744022271,TH 1744022528,1744023551,SG 1744023552,1744023807,IN 1744023808,1744024319,ID @@ -47780,7 +48118,7 @@ 1744245760,1744247807,ID 1744247808,1744248831,IN 1744248832,1744249855,ID -1744249856,1744250367,HK +1744249856,1744250367,US 1744250368,1744250879,PH 1744250880,1744251903,ID 1744251904,1744252927,BD @@ -48123,7 +48461,8 @@ 1744602112,1744603135,HK 1744604160,1744607231,IN 1744607232,1744608255,AU -1744608256,1744609791,IN +1744608256,1744609279,IN +1744609536,1744609791,IN 1744609792,1744610047,HK 1744610048,1744610303,ID 1744610304,1744612351,IN @@ -48570,14 +48909,14 @@ 1749188608,1749196799,US 1749196800,1749204991,NL 1749204992,1749221375,US -1749221376,1749237759,NL -1749237760,1749327871,US +1749221376,1749229567,NL +1749229568,1749327871,US 1749327872,1749336063,NL 1749336064,1749340159,US 1749340160,1749344255,NL 1749344256,1749364735,US -1749364736,1749389311,NL -1749389312,1749397503,US +1749364736,1749381119,NL +1749381120,1749397503,US 1749397504,1749406719,NL 1749406720,1749413887,US 1749413888,1749422079,NL @@ -48772,8 +49111,8 @@ 1751834624,1751838719,NL 1751838720,1751879679,US 1751879680,1751883775,NL -1751883776,1751885311,US -1751885312,1751885823,NL +1751883776,1751884799,US +1751884800,1751885823,NL 1751885824,1751896063,US 1751896064,1751896831,NL 1751896832,1751897087,US @@ -48854,7 +49193,9 @@ 1752940544,1752946175,NL 1752946176,1752948735,US 1752948736,1752952831,NL -1752952832,1752982527,US +1752952832,1752971007,US +1752971008,1752971263,NL +1752971264,1752982527,US 1752982528,1753005055,NL 1753005056,1753006079,US 1753006080,1753014271,NL @@ -48862,7 +49203,9 @@ 1753022976,1753026047,NL 1753026048,1753026559,US 1753026560,1753042943,NL -1753042944,1753077247,US +1753042944,1753046015,US +1753046016,1753046271,NL +1753046272,1753077247,US 1753077248,1753077503,NL 1753077504,1753097727,US 1753097728,1753117183,NL @@ -48911,7 +49254,8 @@ 1753487680,1753487727,GB 1753487728,1753489407,US 1753489408,1753489663,GB -1753489664,1753490175,US +1753489664,1753489919,HK +1753489920,1753490175,US 1753490176,1753490431,AU 1753490432,1753490687,IL 1753490688,1753491455,US @@ -48920,7 +49264,9 @@ 1753494528,1753494783,IL 1753494784,1753497407,US 1753497408,1753497455,PH -1753497456,1753512703,US +1753497456,1753499391,US +1753499392,1753499647,PH +1753499648,1753512703,US 1753512704,1753512959,SG 1753512960,1753516543,US 1753516544,1753516799,ES @@ -48942,11 +49288,10 @@ 1753532416,1753532671,JP 1753532672,1753538815,US 1753538816,1753539071,PH -1753539072,1753539583,US +1753539072,1753539327,US +1753539328,1753539583,IE 1753539584,1753539839,CH -1753539840,1753547007,US -1753547008,1753547263,DE -1753547264,1753735167,US +1753539840,1753735167,US 1753735168,1753743359,IE 1753743360,1754136575,US 1754136576,1754169343,CA @@ -49115,7 +49460,9 @@ 1754869760,1754870783,CA 1754870784,1754871807,US 1754871808,1754872831,CA -1754872832,1754890239,US +1754872832,1754886143,US +1754886144,1754888191,IL +1754888192,1754890239,US 1754890240,1754892287,BB 1754892288,1754894335,CA 1754894336,1754899455,US @@ -49297,7 +49644,9 @@ 1757424640,1757425663,CA 1757425664,1757426687,US 1757426688,1757427711,CA -1757427712,1757443071,US +1757427712,1757432831,US +1757432832,1757433855,CA +1757433856,1757443071,US 1757443072,1757446143,CA 1757446144,1757447167,US 1757447168,1757447343,CA @@ -49346,7 +49695,11 @@ 1757957888,1757958143,US 1757958144,1757962239,CA 1757962240,1757966335,BB -1757966336,1758199807,US +1757966336,1757996287,US +1757996288,1757996543,GB +1757996544,1758002431,US +1758002432,1758002687,GB +1758002688,1758199807,US 1758199808,1758330879,CA 1758330880,1758412799,US 1758412800,1758413055,BG @@ -49544,15 +49897,14 @@ 1759526144,1759526399,CC 1759526400,1759526655,JE 1759526656,1759526911,FO -1759526912,1759535103,US +1759526912,1759528959,IL +1759528960,1759535103,US 1759535104,1759543295,CA 1759543296,1759547391,US 1759547392,1759548415,NL 1759548416,1759707735,US 1759707736,1759707743,NO -1759707744,1759709183,US -1759709184,1759709439,LT -1759709440,1759721831,US +1759707744,1759721831,US 1759721832,1759721839,NO 1759721840,1759727103,US 1759727104,1759727359,IN @@ -49598,12 +49950,14 @@ 1760475136,1760476159,GB 1760476160,1760477183,FR 1760477184,1760657407,US -1760657408,1760677887,CA -1760677888,1760690175,US +1760657408,1760673791,CA +1760673792,1760690175,US 1760690176,1760755711,CA 1760755712,1760776191,US 1760776192,1760784383,CA -1760784384,1760812543,US +1760784384,1760811007,US +1760811008,1760812031,NL +1760812032,1760812543,US 1760812544,1760813055,CA 1760813056,1760817151,US 1760817152,1760817407,MO @@ -49618,7 +49972,7 @@ 1760819456,1760819711,GB 1760819712,1760819967,MA 1760819968,1760820223,HK -1760820224,1760820479,JP +1760820224,1760820479,US 1760820480,1760820735,CA 1760820736,1760823295,US 1760823296,1760824319,PT @@ -49669,7 +50023,9 @@ 1761019648,1761019903,VE 1761019904,1761023231,US 1761023232,1761023487,JP -1761023488,1761043711,US +1761023488,1761038335,US +1761038336,1761039871,CA +1761039872,1761043711,US 1761043712,1761043967,PH 1761043968,1761044479,US 1761044480,1761044735,AU @@ -49736,7 +50092,7 @@ 1761259008,1761259031,PT 1761259032,1761259032,US 1761259033,1761259263,PT -1761259264,1761259519,FR +1761259264,1761259519,US 1761259520,1761259775,KH 1761259776,1761260031,AZ 1761260032,1761260287,ET @@ -49747,7 +50103,7 @@ 1761261312,1761261567,PR 1761261568,1761261823,VG 1761261824,1761262079,SG -1761262080,1761262335,IN +1761262080,1761262335,US 1761262336,1761262591,PK 1761262592,1761262847,US 1761262848,1761263103,RU @@ -49795,7 +50151,9 @@ 1761544192,1761546239,CA 1761546240,1761554431,US 1761554432,1761555455,CA -1761555456,1761581055,US +1761555456,1761556479,US +1761556480,1761558527,IL +1761558528,1761581055,US 1761581056,1761583103,CA 1761583104,1761587199,US 1761587200,1761588223,AI @@ -50008,7 +50366,8 @@ 1805000059,1805000059,CA 1805000060,1805010175,US 1805010176,1805010431,CA -1805010432,1805016063,US +1805010432,1805010687,KR +1805010688,1805016063,US 1805016064,1805016319,EE 1805016320,1805016575,RU 1805016576,1805016831,NZ @@ -50706,7 +51065,9 @@ 1835917856,1835917863,IT 1835917864,1835917919,GB 1835917920,1835917935,IT -1835917936,1835918439,GB +1835917936,1835917959,GB +1835917960,1835917967,IT +1835917968,1835918439,GB 1835918440,1835918447,IT 1835918448,1835918519,GB 1835918520,1835918527,IT @@ -50722,9 +51083,7 @@ 1835919512,1835919519,IT 1835919520,1835919751,GB 1835919752,1835919759,IT -1835919760,1835920839,GB -1835920840,1835920847,IT -1835920848,1835921079,GB +1835919760,1835921079,GB 1835921080,1835921087,IT 1835921088,1835921111,GB 1835921112,1835921127,IT @@ -50774,7 +51133,9 @@ 1835991040,1835999231,RU 1835999232,1836007423,IR 1836007424,1836015615,RU -1836015616,1836023807,AD +1836015616,1836017968,AD +1836017969,1836017969,ES +1836017970,1836023807,AD 1836023808,1836040191,RU 1836040192,1836048383,GB 1836048384,1836056575,RS @@ -51552,10 +51913,7 @@ 1844772864,1844838399,RS 1844838400,1844903935,GB 1844903936,1844969471,NO -1844969472,1844973567,EE -1844973568,1844994047,RU -1844994048,1845002239,EE -1845002240,1845006335,RU +1844969472,1845006335,RU 1845006336,1845010431,KZ 1845010432,1845022719,RU 1845022720,1845023743,KZ @@ -52040,7 +52398,9 @@ 1897170944,1897172991,ID 1897172992,1897175039,PH 1897175040,1897176063,JP -1897176064,1897177087,SG +1897176064,1897176319,SG +1897176320,1897176575,HK +1897176576,1897177087,SG 1897177088,1897201663,JP 1897201664,1897209855,KR 1897209856,1897213951,AU @@ -52072,8 +52432,8 @@ 1897736032,1897736223,CN 1897736224,1897736255,US 1897736256,1897736351,CN -1897736352,1897736383,HK -1897736384,1897737984,CN +1897736352,1897736415,HK +1897736416,1897737984,CN 1897737985,1897742335,US 1897742336,1897743575,SI 1897743576,1897743583,SG @@ -53140,6 +53500,7 @@ 1998520320,1998553087,TH 1998553088,1998561279,JP 1998561280,1998562559,IN +1998562688,1998562703,CN 1998562816,1998562863,IN 1998562864,1998562864,HK 1998562865,1998565375,IN @@ -54022,7 +54383,8 @@ 2080778240,2080780287,US 2080780288,2080780799,ID 2080780800,2080781311,MY -2080781312,2080784383,SG +2080781312,2080781823,JP +2080781824,2080784383,SG 2080784384,2080800767,CN 2080800768,2080817151,PH 2080817152,2080825343,NZ @@ -54344,7 +54706,8 @@ 2113863680,2113929215,AU 2113929216,2130706431,JP 2147483648,2147483903,NL -2147483904,2147485695,RO +2147483904,2147484671,RO +2147484672,2147485695,TR 2147485696,2147487743,DK 2147487744,2147489791,NO 2147489792,2147491839,RU @@ -54352,7 +54715,7 @@ 2147494912,2147495167,RO 2147495168,2147495423,DE 2147495424,2147496959,RO -2147496960,2147497215,DE +2147496960,2147497215,ES 2147497216,2147497471,RO 2147497472,2147498239,DE 2147498240,2147498495,RO @@ -56257,7 +56620,9 @@ 2303342460,2303342463,DE 2303342464,2303343039,FR 2303343040,2303343103,PT -2303343104,2303343487,FR +2303343104,2303343435,FR +2303343436,2303343439,GB +2303343440,2303343487,FR 2303343488,2303343615,IE 2303343616,2303343827,FR 2303343828,2303343831,DE @@ -56275,7 +56640,9 @@ 2303353216,2303353343,GB 2303353344,2303353783,FR 2303353784,2303353787,GB -2303353788,2303354639,FR +2303353788,2303354555,FR +2303354556,2303354559,FI +2303354560,2303354639,FR 2303354640,2303354643,GB 2303354644,2303361079,FR 2303361080,2303361087,GB @@ -56283,9 +56650,13 @@ 2303361536,2303361599,GB 2303361600,2303362063,FR 2303362064,2303362079,DE -2303362080,2303365279,FR +2303362080,2303362303,FR +2303362304,2303362559,DE +2303362560,2303365279,FR 2303365280,2303365295,GB -2303365296,2303374745,FR +2303365296,2303368579,FR +2303368580,2303368583,ES +2303368584,2303374745,FR 2303374746,2303374746,ES 2303374747,2303376807,FR 2303376808,2303376815,ES @@ -56295,13 +56666,15 @@ 2303382880,2303382895,ES 2303382896,2303383503,FR 2303383504,2303383519,GB -2303383520,2303384287,FR -2303384288,2303384303,GB -2303384304,2303384959,FR +2303383520,2303384959,FR 2303384960,2303384991,GB 2303384992,2303388415,FR 2303388416,2303388543,ES -2303388544,2303393791,FR +2303388544,2303392843,FR +2303392844,2303392847,FI +2303392848,2303393535,FR +2303393536,2303393567,PT +2303393568,2303393791,FR 2303393792,2303459327,US 2303459328,2303524863,AU 2303524864,2303852543,US @@ -56999,6 +57372,7 @@ 2331508736,2331574271,GB 2331574272,2331639807,FI 2331639808,2331770879,GB +2331770880,2331836415,AU 2331836416,2331901951,GB 2331901952,2331967487,US 2331967488,2331980799,BR @@ -57084,9 +57458,7 @@ 2334064640,2334916607,US 2334916608,2334982143,AU 2334982144,2335113215,US -2335113216,2335129599,NL -2335129600,2335145983,ES -2335145984,2335154175,NL +2335113216,2335154175,ES 2335154176,2335178751,DE 2335178752,2335244287,CA 2335244288,2335309823,US @@ -57102,7 +57474,9 @@ 2335928320,2335932415,IN 2335932416,2335940607,DE 2335940608,2335948799,GB -2335948800,2335952895,SG +2335948800,2335951266,SG +2335951267,2335951267,GB +2335951268,2335952895,SG 2335952896,2335954943,DE 2335954944,2335965183,SG 2335965184,2336010239,US @@ -57175,8 +57549,7 @@ 2342518784,2342584319,FR 2342584320,2342649855,US 2342649856,2342666239,SG -2342666240,2342674431,JP -2342674432,2342682623,US +2342666240,2342682623,JP 2342682624,2342699007,DE 2342699008,2342715391,GB 2342715392,2342780927,AU @@ -57392,12 +57765,10 @@ 2372218880,2372222207,FR 2372222208,2372222975,CH 2372222976,2372223487,NL -2372223488,2372224255,FR -2372224256,2372224511,US +2372223488,2372224511,FR 2372224512,2372225023,GB 2372225024,2372225791,US -2372225792,2372226047,NL -2372226048,2372226303,JP +2372225792,2372226303,NL 2372226304,2372226559,SG 2372226560,2372227583,SE 2372227584,2372228607,KR @@ -57674,7 +58045,9 @@ 2388393984,2389245951,CA 2389245952,2389311487,US 2389311488,2389639167,CA -2389639168,2389704703,US +2389639168,2389671935,US +2389671936,2389688319,CN +2389688320,2389704703,US 2389704704,2390818815,CA 2390818816,2390884351,US 2390884352,2390995455,CA @@ -57959,10 +58332,13 @@ 2416085760,2416086015,GB 2416086016,2416086271,SG 2416086272,2416087039,GB -2416087040,2416095231,NL +2416087040,2416091135,NL +2416091136,2416093183,ES +2416093184,2416095231,NL 2416095232,2416111615,US 2416111616,2416113663,IE -2416113664,2416115711,NL +2416113664,2416114687,ES +2416114688,2416115711,NL 2416115712,2416181247,US 2416181248,2416246783,FI 2416246784,2416312319,US @@ -58127,8 +58503,8 @@ 2419081216,2419082239,CN 2419082240,2419083263,HK 2419083264,2419085311,IN -2419085312,2419086079,MM -2419086080,2419086335,HK +2419085312,2419085823,MM +2419085824,2419086335,HK 2419086336,2419087359,BD 2419087360,2419088383,CN 2419088384,2419089407,KR @@ -58137,7 +58513,9 @@ 2419090176,2419090431,JP 2419090432,2419091455,KR 2419091456,2419091711,US -2419091712,2419092479,SG +2419091712,2419091967,SG +2419091968,2419092223,US +2419092224,2419092479,SG 2419092480,2419094527,BD 2419094528,2419095551,AU 2419095552,2419096575,PK @@ -58282,7 +58660,9 @@ 2432630784,2432696319,CN 2432696320,2433247231,NL 2433247232,2433247487,GB -2433247488,2433810431,NL +2433247488,2433646591,NL +2433646592,2433679359,DE +2433679360,2433810431,NL 2433810432,2433875967,GB 2433875968,2435055615,NL 2435055616,2435121151,GB @@ -58336,7 +58716,7 @@ 2449039360,2449041407,RO 2449041408,2449042431,ES 2449042432,2449042687,GB -2449042944,2449043199,GB +2449042944,2449043199,RO 2449043200,2449043455,FR 2449043456,2449043967,MD 2449043968,2449044223,GB @@ -58545,7 +58925,7 @@ 2457341952,2457342975,UZ 2457342976,2457343999,RU 2457344000,2457346047,UA -2457346048,2457348095,CZ +2457346048,2457348095,BY 2457348096,2457362175,RU 2457362176,2457362431,UA 2457362432,2457364479,GB @@ -58554,9 +58934,7 @@ 2457366016,2457366527,RU 2457366528,2457367551,GB 2457367552,2457370623,CZ -2457370624,2457374719,BY -2457374720,2457375743,CZ -2457375744,2457376767,RU +2457370624,2457376767,BY 2457376768,2457378815,DE 2457378816,2457379839,NL 2457379840,2457380095,CZ @@ -58815,7 +59193,10 @@ 2465988608,2466054143,US 2466054144,2466185215,SE 2466185216,2466189311,GB -2466189312,2466191359,ES +2466189312,2466189567,ES +2466189568,2466191103,NL +2466191104,2466191167,ES +2466191168,2466191359,NL 2466191360,2466193407,CZ 2466193408,2466199551,NL 2466199552,2466201599,AT @@ -58892,8 +59273,9 @@ 2471219200,2471219423,IL 2471219424,2471219439,US 2471219440,2471219455,CA -2471219456,2471219679,FR +2471219456,2471219690,FR 2471219691,2471219691,GB +2471219692,2471219711,FR 2471219712,2471223295,IL 2471223296,2471231487,US 2471231488,2471297023,AU @@ -59384,7 +59766,9 @@ 2503518081,2503518082,US 2503518083,2503525055,CA 2503525056,2503525119,US -2503525120,2503540735,CA +2503525120,2503530911,CA +2503530912,2503530943,US +2503530944,2503540735,CA 2503540736,2503671807,US 2503671808,2503737343,NL 2503737344,2503868415,US @@ -59668,7 +60052,9 @@ 2513078432,2513078463,PT 2513078464,2513078671,FR 2513078672,2513078687,IE -2513078688,2513078911,FR +2513078688,2513078887,FR +2513078888,2513078891,GB +2513078892,2513078911,FR 2513078912,2513079039,GB 2513079040,2513079250,FR 2513079251,2513079254,ES @@ -59676,7 +60062,9 @@ 2513079328,2513079343,IE 2513079344,2513080031,FR 2513080032,2513080063,IT -2513080064,2513081327,FR +2513080064,2513080395,FR +2513080396,2513080399,GB +2513080400,2513081327,FR 2513081328,2513081343,ES 2513081344,2513081935,FR 2513081936,2513081939,DE @@ -59699,7 +60087,15 @@ 2513104820,2513104823,PL 2513104824,2513106239,FR 2513106240,2513106303,IE -2513106304,2513107455,FR +2513106304,2513107079,FR +2513107080,2513107083,FI +2513107084,2513107087,ES +2513107088,2513107231,FR +2513107232,2513107263,GB +2513107264,2513107279,ES +2513107280,2513107311,FR +2513107312,2513107327,PT +2513107328,2513107455,FR 2513107456,2513107583,GB 2513107584,2513108991,FR 2513108992,2513502207,DE @@ -60141,6 +60537,7 @@ 2546039040,2547187711,US 2547187712,2547318783,GB 2547318784,2547515391,US +2547515392,2547523583,EE 2547523584,2547524607,DE 2547524608,2547525631,IR 2547525632,2547535871,GB @@ -60156,11 +60553,17 @@ 2548829974,2548829974,DE 2548829975,2548830035,AT 2548830036,2548830036,DE -2548830037,2548830975,AT +2548830037,2548830949,AT +2548830950,2548830950,IT +2548830951,2548830975,AT 2548830976,2548831231,GB 2548831232,2548831297,AT 2548831298,2548831298,HK -2548831299,2548831501,AT +2548831299,2548831383,AT +2548831384,2548831384,HK +2548831385,2548831404,AT +2548831405,2548831405,HK +2548831406,2548831501,AT 2548831502,2548831502,FR 2548831503,2548831505,AT 2548831506,2548831506,FR @@ -60172,7 +60575,11 @@ 2548831964,2548831964,US 2548831965,2548832017,AT 2548832018,2548832018,ES -2548832019,2548832767,AT +2548832019,2548832049,AT +2548832050,2548832050,ES +2548832051,2548832628,AT +2548832629,2548832629,PL +2548832630,2548832767,AT 2548832768,2548833279,CH 2548833280,2548833535,AT 2548833536,2548833791,NL @@ -60249,7 +60656,9 @@ 2549882384,2549882399,FI 2549882400,2549882879,SE 2549882880,2549884927,CH -2549884928,2549891071,DE +2549884928,2549886207,DE +2549886208,2549886463,CH +2549886464,2549891071,DE 2549891072,2549899263,RU 2549899264,2549901311,PS 2549901312,2549903359,RU @@ -60265,7 +60674,9 @@ 2550136832,2550202367,DO 2550202368,2553544703,US 2553544704,2553610239,IN -2553610240,2554211327,US +2553610240,2553806847,US +2553806848,2554068991,SG +2554068992,2554211327,US 2554211328,2554211383,CN 2554211388,2554211583,CN 2554211584,2554227967,US @@ -60612,20 +61023,26 @@ 2584753280,2584753407,DE 2584753408,2584753663,US 2584753664,2584753727,AE -2584753728,2584753919,ZA +2584753728,2584753791,ZA +2584753792,2584753919,DE 2584753920,2584754175,US -2584754176,2584754431,ZA +2584754176,2584754303,ZA +2584754304,2584754431,DE 2584754432,2584754687,US -2584754688,2584754943,ZA +2584754688,2584754751,ZA +2584754752,2584754943,DE 2584754944,2584755199,US 2584755200,2584755263,AR 2584755264,2584755279,DE -2584755280,2584755455,ZA +2584755280,2584755327,ZA +2584755328,2584755455,DE 2584755456,2584755711,US 2584755712,2584755775,AR -2584755776,2584755967,ZA +2584755776,2584755839,ZA +2584755840,2584755967,DE 2584755968,2584756223,GB -2584756224,2584756479,ZA +2584756224,2584756351,ZA +2584756352,2584756479,DE 2584756480,2584756735,US 2584756736,2584756991,ZA 2584756992,2584757247,US @@ -60674,7 +61091,9 @@ 2584767232,2584767487,TR 2584767488,2584768511,US 2584768512,2584770559,IL -2584770560,2584775423,US +2584770560,2584773631,US +2584773632,2584773887,GB +2584773888,2584775423,US 2584775424,2584775679,KE 2584775680,2584779775,US 2584779776,2584780031,NL @@ -60779,8 +61198,8 @@ 2586953728,2586953983,MX 2586953984,2586954239,PE 2586954240,2586956287,US -2586956288,2586956799,FR -2586956800,2586968127,US +2586956288,2586957311,FR +2586957312,2586968127,US 2586968128,2586968319,FR 2586968320,2587017215,US 2587017216,2587017471,IE @@ -61086,6 +61505,7 @@ 2592038912,2592043007,DZ 2592043008,2592047103,ZA 2592047104,2592079871,AO +2592079872,2593128447,EG 2596274176,2596339711,SC 2596339712,2597322751,ZA 2597322752,2598371327,US @@ -61587,7 +62007,9 @@ 2626945024,2627010559,IT 2627010560,2627076095,NZ 2627076096,2627141631,NL -2627141632,2627469311,US +2627141632,2627354706,US +2627354707,2627354707,HK +2627354708,2627403775,US 2627469312,2627731455,TZ 2627731456,2631925759,EG 2631925760,2632450047,ZA @@ -61774,8 +62196,8 @@ 2640411392,2640411647,NL 2640411648,2640412671,US 2640412672,2640423935,NL -2640423936,2640427007,ES -2640427008,2640445439,NL +2640423936,2640429055,ES +2640429056,2640445439,NL 2640445440,2640510975,US 2640510976,2640576511,FR 2640576512,2640642047,EC @@ -62318,7 +62740,10 @@ 2673803264,2673868799,FR 2673868800,2674130943,US 2674130944,2674139135,DE -2674139136,2674163711,NL +2674139136,2674145791,NL +2674145792,2674146303,GB +2674146304,2674147327,TR +2674147328,2674163711,NL 2674163712,2674164175,GB 2674164176,2674164191,FR 2674164192,2674171903,GB @@ -62340,9 +62765,18 @@ 2674917376,2675048447,US 2675048448,2675113983,GB 2675113984,2675245055,US -2675245056,2675286015,NZ +2675245056,2675255295,NZ +2675255296,2675257343,PH +2675257344,2675261439,US +2675261440,2675269631,NZ +2675269632,2675271679,PH +2675271680,2675286015,NZ 2675286016,2675294207,US -2675294208,2675302399,NZ +2675294208,2675296255,NL +2675296256,2675296767,NZ +2675296768,2675298303,NL +2675298304,2675301375,US +2675301376,2675302399,NZ 2675302400,2675310591,HK 2675310592,2675574239,US 2675574240,2675574271,IT @@ -62376,7 +62810,8 @@ 2675609488,2675609503,CN 2675609504,2675610191,US 2675610192,2675610207,IL -2675610208,2675611295,US +2675610208,2675610215,IT +2675610216,2675611295,US 2675611296,2675611359,IT 2675611360,2675612487,US 2675612488,2675612495,IT @@ -62694,7 +63129,9 @@ 2685427712,2685452287,JP 2685452288,2685454335,CN 2685454336,2685460479,JP -2685460480,2685463039,CN +2685460480,2685462580,CN +2685462581,2685462581,JP +2685462582,2685463039,CN 2685463040,2685463295,JP 2685463296,2685468671,CN 2685468672,2685599743,JP @@ -62823,9 +63260,7 @@ 2697630720,2697632767,CN 2697632768,2697633791,IN 2697633792,2697634815,KR -2697634816,2697635072,US -2697635073,2697635327,NZ -2697635328,2697635583,US +2697634816,2697635583,US 2697635584,2697635839,NZ 2697635840,2697636863,CN 2697636864,2697638911,KR @@ -62910,8 +63345,8 @@ 2701459456,2701524991,AT 2701524992,2701656063,US 2701656064,2701688831,RU -2701688832,2701721343,US -2701721344,2701721599,RU +2701688832,2701721087,US +2701721088,2701721599,RU 2701721600,2701787135,TR 2701787136,2701852671,CO 2701852672,2701918207,US @@ -62954,7 +63389,9 @@ 2704277504,2704343039,FR 2704343040,2704408575,US 2704408576,2704474111,AU -2704474112,2704484351,US +2704474112,2704478207,US +2704478208,2704478463,SG +2704478464,2704484351,US 2704484352,2704485375,AU 2704485376,2704539647,US 2704539648,2704605183,SE @@ -63013,35 +63450,35 @@ 2708865024,2708930559,JP 2708930560,2709127167,US 2709127168,2709192703,KR -2709192704,2709225471,ZA +2709192704,2709225471,ZM 2709225472,2709225727,ES -2709225728,2709225983,ZA +2709225728,2709225983,ZM 2709225984,2709226239,ES -2709226240,2709242111,ZA +2709226240,2709242111,ZM 2709242112,2709242367,US -2709242368,2709242623,ZA +2709242368,2709242623,ZM 2709242624,2709242879,US -2709242880,2709243135,ZA +2709242880,2709243135,ZM 2709243136,2709243391,US -2709243392,2709243647,ZA +2709243392,2709243647,ZM 2709243648,2709243903,US -2709243904,2709244159,ZA +2709243904,2709244159,ZM 2709244160,2709244415,US -2709244416,2709244671,ZA +2709244416,2709244671,ZM 2709244672,2709244927,US -2709244928,2709245183,ZA +2709244928,2709245183,ZM 2709245184,2709245439,US -2709245440,2709245695,ZA +2709245440,2709245695,ZM 2709245696,2709245951,US -2709245952,2709246207,ZA +2709245952,2709246207,ZM 2709246208,2709246463,US -2709246464,2709247231,ZA +2709246464,2709247231,ZM 2709247232,2709247487,MY -2709247488,2709247743,ZA +2709247488,2709247743,ZM 2709247744,2709247999,US -2709248000,2709248255,ZA +2709248000,2709248255,ZM 2709248256,2709248511,US -2709248512,2709258239,ZA +2709248512,2709258239,ZM 2709258240,2709389311,US 2709389312,2709454847,SG 2709454848,2709716991,US @@ -63133,11 +63570,11 @@ 2714412656,2714412671,VN 2714412672,2714413343,US 2714413344,2714413359,PH -2714413360,2714416375,US -2714416376,2714416383,IN -2714416384,2714417215,US +2714413360,2714417215,US 2714417216,2714417247,JP -2714417248,2714419743,US +2714417248,2714419079,US +2714419080,2714419087,MU +2714419088,2714419743,US 2714419744,2714419775,SG 2714419776,2714419871,US 2714419872,2714419903,SG @@ -63828,7 +64265,9 @@ 2746351616,2746417151,CR 2746417152,2746482687,CN 2746482688,2746548223,KR -2746548224,2747072511,US +2746548224,2746662911,US +2746662912,2746679295,CA +2746679296,2747072511,US 2747072512,2747138047,AU 2747138048,2747465727,US 2747465728,2748055551,ZA @@ -63990,7 +64429,9 @@ 2760120840,2760120843,PT 2760120844,2760121663,FR 2760121664,2760121727,ES -2760121728,2760129999,FR +2760121728,2760121827,FR +2760121828,2760121831,ES +2760121832,2760129999,FR 2760130000,2760130015,ES 2760130016,2760130399,FR 2760130400,2760130431,ES @@ -64035,7 +64476,9 @@ 2760150263,2760150263,PL 2760150264,2760150871,FR 2760150872,2760150872,DE -2760150873,2760151208,FR +2760150873,2760151039,FR +2760151040,2760151055,GB +2760151056,2760151208,FR 2760151209,2760151209,CZ 2760151210,2760151335,FR 2760151336,2760151339,GB @@ -64066,7 +64509,9 @@ 2760162682,2760162682,PL 2760162683,2760163135,FR 2760163136,2760163199,ES -2760163200,2760167583,FR +2760163200,2760166682,FR +2760166683,2760166683,DE +2760166684,2760167583,FR 2760167584,2760167599,ES 2760167600,2760167647,FR 2760167648,2760167679,GB @@ -64207,6 +64652,7 @@ 2769158144,2769223679,JP 2769289216,2769321983,LY 2769321984,2769338367,ZA +2769338368,2769340415,TZ 2769340416,2769342463,ZA 2769342464,2769346559,BF 2769346560,2769354751,ZA @@ -64526,7 +64972,8 @@ 2807587328,2807587583,QA 2807587584,2807587839,IN 2807587840,2807588095,AE -2807588096,2807588351,ES +2807588096,2807588223,US +2807588224,2807588351,ES 2807588352,2807588863,CN 2807588864,2807589119,JP 2807589120,2807589375,RO @@ -65251,7 +65698,9 @@ 2838299440,2838299455,US 2838299456,2838299695,NL 2838299696,2838299775,US -2838299776,2838300671,NL +2838299776,2838300367,NL +2838300368,2838300383,US +2838300384,2838300671,NL 2838300672,2838300927,US 2838300928,2838301119,NL 2838301120,2838301183,US @@ -65267,7 +65716,9 @@ 2838304448,2838304511,US 2838304512,2838304703,NL 2838304704,2838304767,US -2838304768,2838307055,NL +2838304768,2838305119,NL +2838305120,2838305151,US +2838305152,2838307055,NL 2838307056,2838307063,US 2838307064,2838307135,NL 2838307136,2838307167,US @@ -65301,7 +65752,9 @@ 2838317902,2838317903,US 2838317904,2838318511,NL 2838318512,2838318527,US -2838318528,2838319135,NL +2838318528,2838318655,NL +2838318656,2838318687,US +2838318688,2838319135,NL 2838319136,2838319167,US 2838319168,2838320191,NL 2838320192,2838320192,US @@ -65357,7 +65810,9 @@ 2838334336,2838334351,US 2838334352,2838337279,NL 2838337280,2838337295,US -2838337296,2838337759,NL +2838337296,2838337375,NL +2838337376,2838337407,US +2838337408,2838337759,NL 2838337760,2838337761,IN 2838337762,2838337763,US 2838337764,2838338271,NL @@ -65389,7 +65844,9 @@ 2838341952,2838341967,US 2838341968,2838343071,NL 2838343072,2838343103,US -2838343104,2838344451,NL +2838343104,2838343711,NL +2838343712,2838343743,US +2838343744,2838344451,NL 2838344452,2838344455,US 2838344456,2838344457,NL 2838344458,2838344459,US @@ -65405,9 +65862,7 @@ 2838345744,2838345751,US 2838345752,2838346015,NL 2838346016,2838346047,US -2838346048,2838346239,NL -2838346240,2838346271,US -2838346272,2838346559,NL +2838346048,2838346559,NL 2838346560,2838346591,US 2838346592,2838346623,NL 2838346624,2838346655,US @@ -65507,7 +65962,9 @@ 2838405184,2838405215,US 2838405216,2838405767,NL 2838405768,2838405775,US -2838405776,2838406087,NL +2838405776,2838405855,NL +2838405856,2838405887,US +2838405888,2838406087,NL 2838406088,2838406095,US 2838406096,2838406271,NL 2838406272,2838406279,US @@ -65537,7 +65994,13 @@ 2838413312,2838415359,US 2838415360,2838415391,NL 2838415392,2838415423,US -2838415424,2838429983,NL +2838415424,2838415655,NL +2838415656,2838415663,US +2838415664,2838415839,NL +2838415840,2838415871,US +2838415872,2838416479,NL +2838416480,2838416511,US +2838416512,2838429983,NL 2838429984,2838430015,US 2838430016,2838431039,NL 2838431040,2838431135,US @@ -65579,7 +66042,19 @@ 2838441536,2838441567,US 2838441568,2838441695,NL 2838441696,2838441711,US -2838441712,2838560767,NL +2838441712,2838442767,NL +2838442768,2838442783,US +2838442784,2838443135,NL +2838443136,2838443167,US +2838443168,2838443295,NL +2838443296,2838443303,US +2838443304,2838443679,NL +2838443680,2838443711,US +2838443712,2838444095,NL +2838444096,2838444159,US +2838444160,2838444223,NL +2838444224,2838444255,US +2838444256,2838560767,NL 2838560768,2838626303,CH 2838626304,2838626399,US 2838626400,2838626431,SA @@ -65599,13 +66074,17 @@ 2838632096,2838632127,DE 2838632128,2838633295,US 2838633296,2838633311,SA -2838633312,2838643407,US +2838633312,2838642719,US +2838642720,2838642723,AE +2838642724,2838643407,US 2838643408,2838643408,GB 2838643409,2838643487,US 2838643488,2838643519,HK 2838643520,2838643696,US 2838643697,2838643697,GB -2838643698,2838645839,US +2838643698,2838644943,US +2838644944,2838644951,AE +2838644952,2838645839,US 2838645840,2838645855,GB 2838645856,2838646207,US 2838646208,2838646239,GB @@ -65613,17 +66092,15 @@ 2838646736,2838646751,CN 2838646752,2838646863,US 2838646864,2838646879,CN -2838646880,2838649167,US -2838649168,2838649183,GB -2838649184,2838649391,US -2838649392,2838649399,GB -2838649400,2838650527,US +2838646880,2838647103,US +2838647104,2838647111,AE +2838647112,2838650527,US 2838650528,2838650559,GB 2838650560,2838653631,US 2838653632,2838653639,GB -2838653640,2838655527,US -2838655528,2838655535,GB -2838655536,2838658607,US +2838653640,2838657295,US +2838657296,2838657299,AE +2838657300,2838658607,US 2838658608,2838658623,NL 2838658624,2838659007,US 2838659008,2838659023,GB @@ -65641,9 +66118,9 @@ 2838664728,2838664735,ZA 2838664736,2838665759,US 2838665760,2838665791,JP -2838665792,2838667103,US -2838667104,2838667135,NL -2838667136,2838708223,US +2838665792,2838669519,US +2838669520,2838669535,NL +2838669536,2838708223,US 2838708224,2838724607,NO 2838724608,2838757375,US 2838757376,2838822911,CH @@ -65695,7 +66172,9 @@ 2838931668,2838931671,CZ 2838931672,2838933919,US 2838933920,2838933951,NL -2838933952,2838938991,US +2838933952,2838937733,US +2838937734,2838937735,IN +2838937736,2838938991,US 2838938992,2838939007,AU 2838939008,2838946735,US 2838946736,2838946751,CA @@ -65764,8 +66243,7 @@ 2848212992,2848215039,GB 2848215040,2848244735,US 2848244736,2848245759,GB -2848245760,2848276479,US -2848325632,2848522239,US +2848245760,2848522239,US 2848587776,2848653311,ZA 2848653312,2848980991,US 2848980992,2850029567,KR @@ -65979,7 +66457,9 @@ 2857335808,2857336831,MX 2857336832,2857340927,BR 2857340928,2857341951,DO -2857341952,2857350143,BR +2857341952,2857348351,BR +2857348352,2857348607,US +2857348608,2857350143,BR 2857350144,2857351167,AR 2857351168,2857363455,BR 2857363456,2857364479,CL @@ -65992,31 +66472,84 @@ 2857374720,2857375743,GT 2857375744,2857376767,AR 2857376768,2857377791,MX -2857377792,2857387007,BR +2857377792,2857388031,BR 2857388032,2857389055,CL -2857389056,2857390079,BR +2857389056,2857392127,BR 2857392128,2857393151,CR 2857393152,2857394175,CL -2857394176,2857399295,BR +2857394176,2857395199,CO +2857395200,2857397247,BR +2857397248,2857398271,AR +2857398272,2857399295,BR 2857399296,2857400319,AR -2857400320,2857402367,BR -2857403392,2857404415,BR +2857400320,2857404415,BR 2857404416,2857405439,AR 2857405440,2857406463,HN -2857406464,2857411583,BR +2857406464,2857412607,BR 2857412608,2857414655,AR 2857414656,2857420799,BR 2857420800,2857421823,AR -2857421824,2857437183,BR +2857421824,2857427967,BR +2857427968,2857428991,AR +2857428992,2857431039,BR +2857431040,2857432063,MX +2857432064,2857433087,BR +2857433088,2857434111,HT +2857434112,2857437183,BR 2857437184,2857438207,DO -2857440256,2857441279,BR +2857438208,2857441279,BR 2857441280,2857442303,CO 2857443328,2857444351,CR -2857444352,2857445375,BR -2857446400,2857447423,BR +2857444352,2857448447,BR 2857448448,2857449471,HN -2857451520,2857459711,BR +2857449472,2857466879,BR 2857466880,2857467903,HN +2857467904,2857470719,BR +2857470720,2857470975,AR +2857470976,2857471999,MX +2857472000,2857473023,VE +2857473024,2857485311,BR +2857485312,2857486335,HN +2857486336,2857489407,BR +2857489408,2857490431,AR +2857490432,2857493503,BR +2857493504,2857494527,AR +2857494528,2857496575,BR +2857496576,2857497599,PE +2857497600,2857499647,BR +2857499648,2857500671,CO +2857500672,2857501695,HN +2857501696,2857506815,BR +2857506816,2857507839,DO +2857507840,2857509887,BR +2857509888,2857510911,HN +2857510912,2857511423,CO +2857511424,2857511679,BR +2857511936,2857525247,BR +2857525248,2857526271,PE +2857526272,2857529343,BR +2857529344,2857530367,EC +2857533440,2857534463,CL +2857534464,2857537535,BR +2857537536,2857538559,PY +2857538560,2857539583,BR +2857540608,2857541631,EC +2857544704,2857545727,BR +2857546752,2857547775,BR +2857548800,2857549823,CL +2857549824,2857553919,BR +2857553920,2857554943,TT +2857555968,2857556991,TT +2857556992,2857558015,BR +2857558016,2857559039,CL +2857561088,2857562111,BR +2857563904,2857564159,PA +2857564160,2857565183,BR +2857567232,2857568255,AR +2857568256,2857569279,CR +2857572352,2857574399,BR +2857574400,2857575423,AR +2857575424,2857576447,BR 2857631744,2857633791,BR 2857633792,2857634815,TT 2857634816,2857643007,BR @@ -66167,6 +66700,8 @@ 2867728384,2867729407,PY 2867729408,2867730431,AR 2867730432,2867731455,CL +2867731456,2867732479,BR +2867732480,2867733503,CL 2867733504,2867734527,BR 2867734528,2867735551,AR 2867735552,2867740671,BR @@ -66184,13 +66719,14 @@ 2867776512,2867777535,AR 2867777536,2867780607,BR 2867780608,2867781631,MX +2867781888,2867782143,BR 2867782144,2867782655,CO 2867782656,2867784703,BR 2867784704,2867785727,CO 2867785728,2867787775,AR 2867787776,2867788799,BR 2867788800,2867789823,MX -2867789824,2867791871,BR +2867789824,2867792895,BR 2867792896,2867793919,HT 2867793920,2867796991,BR 2867796992,2867799039,AR @@ -66205,7 +66741,7 @@ 2867812352,2867813375,AR 2867813376,2867815423,BR 2867815424,2867816447,PE -2867816448,2867819519,BR +2867816448,2867820543,BR 2867820544,2867821567,BO 2867821568,2867822591,BR 2867822592,2867823615,AR @@ -66221,8 +66757,7 @@ 2867837952,2867838975,CL 2867838976,2867842047,BR 2867842048,2867843071,EC -2867843072,2867848191,BR -2867849216,2867850239,BR +2867843072,2867850239,BR 2867850240,2867851263,SV 2867851264,2867852287,BR 2867852288,2867853311,AR @@ -66413,8 +66948,7 @@ 2868829184,2868831231,BR 2868831232,2868832255,CO 2868832256,2868833279,PE -2868833280,2868834303,UY -2868834304,2868838399,BR +2868833280,2868838399,BR 2868838400,2868903935,BE 2868903936,2869035007,SG 2869035008,2869166079,JP @@ -66508,17 +67042,7 @@ 2882469888,2882535423,SG 2882535424,2883583999,CN 2883584000,2885681151,VN -2885681152,2886667007,US -2886667008,2886667136,DE -2886667137,2886667137,US -2886667138,2886667195,DE -2886667196,2886667196,US -2886667197,2886667240,DE -2886667241,2886667241,US -2886667242,2886667257,DE -2886667258,2886667258,US -2886667259,2886667263,DE -2886667264,2886729727,US +2885681152,2886729727,US 2887778304,2890137599,US 2890137600,2890138623,AU 2890138624,2890139647,TH @@ -66537,7 +67061,9 @@ 2890164224,2890165247,TH 2890165248,2890167295,US 2890167296,2890168319,AU -2890168320,2890956799,US +2890168320,2890174463,US +2890174464,2890174719,SG +2890174720,2890956799,US 2890956800,2890989567,AE 2890989568,2891017215,US 2891017216,2891017471,JP @@ -66566,20 +67092,23 @@ 2891807488,2891807743,US 2891807744,2891808767,CA 2891808768,2891841535,US -2891841536,2891842303,SE +2891841536,2891841791,SE +2891841792,2891842303,US 2891842304,2891843327,GB -2891843328,2891843839,SE -2891843840,2891844095,GB -2891844096,2891845119,FR -2891845120,2891846399,DE -2891846400,2891846911,CH -2891846912,2891847679,NL -2891847680,2891847935,SG -2891847936,2891848447,MY +2891843328,2891844095,US +2891844096,2891844351,FR +2891844352,2891845119,US +2891845120,2891845631,DE +2891845632,2891845887,US +2891845888,2891846399,DE +2891846400,2891846655,CH +2891846656,2891846911,US +2891846912,2891847167,NL +2891847168,2891848447,US 2891848448,2891848959,JP -2891848960,2891849471,BN -2891849472,2891849983,PH -2891849984,2891850495,TH +2891848960,2891849215,BN +2891849216,2891850239,US +2891850240,2891850495,TH 2891850496,2891850751,SG 2891850752,2891853567,US 2891853568,2891853823,SG @@ -66593,7 +67122,8 @@ 2891858432,2891858687,CA 2891858688,2891862527,US 2891862528,2891863039,KR -2891863040,2891863551,AU +2891863040,2891863295,FR +2891863296,2891863551,AU 2891863552,2891864063,JP 2891864064,2891864575,SG 2891864576,2891865087,US @@ -66603,7 +67133,9 @@ 2891865856,2891866111,US 2891866112,2891867647,AU 2891867648,2891867903,US -2891867904,2891868927,AU +2891867904,2891868159,AU +2891868160,2891868671,IT +2891868672,2891868927,AU 2891868928,2891869439,US 2891869440,2891869695,AT 2891869696,2891869951,US @@ -66643,8 +67175,8 @@ 2892068864,2892069887,CA 2892069888,2892070911,US 2892070912,2892103679,CA -2892103680,2892120831,US -2892120832,2892121087,CA +2892103680,2892120575,US +2892120576,2892121087,CA 2892121088,2892122367,US 2892122368,2892122623,CA 2892122624,2892140543,US @@ -66671,9 +67203,14 @@ 2892399104,2892399231,TG 2892399232,2892399615,US 2892399616,2892399743,FJ -2892399744,2892401023,US +2892399744,2892399871,US +2892399872,2892399999,CW +2892400000,2892401023,US 2892401024,2892401151,ER -2892401152,2892401919,US +2892401152,2892401279,NR +2892401280,2892401407,US +2892401408,2892401535,MR +2892401536,2892401919,US 2892401920,2892402047,MF 2892402048,2892402175,US 2892402176,2892402303,MP @@ -66736,20 +67273,19 @@ 2892994816,2892995327,GB 2892995328,2892995839,AU 2892995840,2892996095,GB -2892996096,2892996351,KW -2892996352,2892996607,US +2892996096,2892996607,US 2892996608,2892996863,CA 2892996864,2892997119,AU 2892997120,2892997375,CA 2892997376,2892997631,BG 2892997632,2892997887,AU 2892997888,2892998143,JP -2892998144,2892998655,GB +2892998144,2892998399,US +2892998400,2892998655,GB 2892998656,2892998911,HK 2892998912,2892999167,MX 2892999168,2892999423,CR -2892999424,2892999551,TW -2892999552,2892999935,US +2892999424,2892999935,US 2892999936,2893000191,IT 2893000192,2893000447,JP 2893000448,2893000959,HK @@ -66776,9 +67312,10 @@ 2893007104,2893007359,US 2893007360,2893007615,IE 2893007616,2893007871,DE -2893007872,2893009151,US -2893009152,2893009407,AM -2893009408,2893009663,US +2893007872,2893008639,GB +2893008640,2893008895,US +2893008896,2893009151,GB +2893009152,2893009663,US 2893009664,2893010175,GB 2893010176,2893010431,US 2893010432,2893010687,DE @@ -66795,7 +67332,18 @@ 2893015296,2893015551,BS 2893015552,2893016575,US 2893016576,2893016831,SE -2893016832,2893676543,US +2893016832,2893017343,CA +2893017344,2893017599,SG +2893017600,2893017855,DE +2893017856,2893018111,FR +2893018112,2893018623,BE +2893018624,2893019135,SE +2893019136,2893019647,AU +2893019648,2893019903,DE +2893019904,2893020159,SG +2893020160,2893020415,NL +2893020416,2893020671,AT +2893020672,2893676543,US 2893676544,2893807615,JP 2893807616,2894921727,US 2894921728,2895118335,GB @@ -66833,7 +67381,15 @@ 2899968000,2900099071,CA 2900099072,2901740455,US 2901740456,2901740463,CA -2901740464,2902405119,US +2901740464,2902200319,US +2902200320,2902204415,CN +2902204416,2902208511,US +2902208512,2902212607,CN +2902212608,2902228991,US +2902228992,2902245375,CN +2902245376,2902246143,US +2902246144,2902246399,CN +2902246400,2902405119,US 2902405120,2902405935,CA 2902405936,2902405951,US 2902405952,2902408191,CA @@ -66907,8 +67463,8 @@ 2915520512,2915520642,AU 2915520643,2915520643,US 2915520644,2915520671,AU -2915520672,2915520703,US -2915520704,2915521023,AU +2915520672,2915520735,US +2915520736,2915521023,AU 2915521024,2915521279,JP 2915521280,2915521535,PL 2915521536,2915526911,US @@ -66932,8 +67488,8 @@ 2915528928,2915528943,NL 2915528944,2915528959,US 2915528960,2915529023,NL -2915529024,2915529183,US -2915529184,2915529215,NL +2915529024,2915529151,US +2915529152,2915529215,NL 2915529216,2915795013,US 2915795014,2915795014,MX 2915795015,2915894575,US @@ -67506,7 +68062,9 @@ 2954824288,2954824319,ES 2954824320,2954824415,FR 2954824416,2954824431,GB -2954824432,2954824639,FR +2954824432,2954824511,FR +2954824512,2954824527,FI +2954824528,2954824639,FR 2954824640,2954824655,GB 2954824656,2954824687,FR 2954824688,2954824703,FI @@ -67789,7 +68347,9 @@ 2954855528,2954855535,ES 2954855536,2954855663,FR 2954855664,2954855679,PT -2954855680,2954855879,FR +2954855680,2954855807,FR +2954855808,2954855871,DE +2954855872,2954855879,FR 2954855880,2954855887,ES 2954855888,2954856179,FR 2954856180,2954856183,ES @@ -67863,7 +68423,9 @@ 2954870844,2954870847,ES 2954870848,2954870903,FR 2954870904,2954870907,ES -2954870908,2954871807,FR +2954870908,2954871679,FR +2954871680,2954871695,FI +2954871696,2954871807,FR 2954871808,2954871823,ES 2954871824,2954871955,FR 2954871956,2954871959,PT @@ -67933,7 +68495,9 @@ 2954877968,2954877983,PT 2954877984,2954878143,FR 2954878144,2954878207,ES -2954878208,2954878607,FR +2954878208,2954878471,FR +2954878472,2954878475,GB +2954878476,2954878607,FR 2954878608,2954878623,FI 2954878624,2954878695,FR 2954878696,2954878703,IE @@ -68057,8 +68621,6 @@ 2956607488,2956611583,PS 2956611584,2956613631,IT 2956613632,2956614911,GB -2956614912,2956615167,NL -2956615168,2956615423,FR 2956615680,2956623871,GB 2956623872,2956656639,GR 2956656640,2956722175,RU @@ -68395,7 +68957,8 @@ 2960351232,2960353279,UA 2960353280,2960369663,RU 2960369664,2960371711,IT -2960371712,2960383999,RU +2960371712,2960375807,US +2960375808,2960383999,RU 2960384000,2960388095,RO 2960388096,2960392191,PL 2960392192,2960400383,RU @@ -68428,7 +68991,9 @@ 2960506880,2960523263,RU 2960523264,2960525311,LT 2960525312,2960527359,RU -2960527360,2960531455,LT +2960527360,2960529407,LT +2960529408,2960530431,RU +2960530432,2960531455,LT 2960533504,2960537599,UA 2960537600,2960539647,RO 2960539648,2960543743,RU @@ -68660,9 +69225,7 @@ 2967446784,2967447039,DE 2967447040,2967451647,RO 2967451648,2967452671,KZ -2967452672,2967453183,RO -2967453184,2967453439,NL -2967453440,2967453695,RO +2967452672,2967453695,RO 2967468032,2967470079,US 2967470080,2967601151,SA 2967601152,2967633919,HU @@ -68729,7 +69292,11 @@ 2984939520,2984951807,BR 2984951808,2984968191,EC 2984968192,2985033727,BR -2985033728,2985951231,MX +2985033728,2985639935,MX +2985639936,2985644031,US +2985644032,2985799679,MX +2985799680,2985803775,US +2985803776,2985951231,MX 2985951232,2986082303,PY 2986082304,2986344447,CO 2986344448,2987393023,DE @@ -68963,7 +69530,9 @@ 2988444116,2988444119,IT 2988444120,2988444208,FR 2988444209,2988444209,FI -2988444210,2988444671,FR +2988444210,2988444231,FR +2988444232,2988444239,FI +2988444240,2988444671,FR 2988444672,2988444679,ES 2988444680,2988444719,FR 2988444720,2988444735,ES @@ -69018,7 +69587,9 @@ 2988459536,2988459539,ES 2988459540,2988459599,FR 2988459600,2988459603,GB -2988459604,2988459647,FR +2988459604,2988459619,FR +2988459620,2988459623,GB +2988459624,2988459647,FR 2988459648,2988459679,GB 2988459680,2988459687,FR 2988459688,2988459691,PL @@ -69085,7 +69656,9 @@ 2988464624,2988464627,ES 2988464628,2988464787,FR 2988464788,2988464791,ES -2988464792,2988465215,FR +2988464792,2988465191,FR +2988465192,2988465195,PL +2988465196,2988465215,FR 2988465216,2988465219,ES 2988465220,2988465551,FR 2988465552,2988465563,ES @@ -69125,7 +69698,9 @@ 2988480064,2988480095,ES 2988480096,2988480207,FR 2988480208,2988480223,ES -2988480224,2988480927,FR +2988480224,2988480799,FR +2988480800,2988480803,GB +2988480804,2988480927,FR 2988480928,2988480959,ES 2988480960,2988481059,FR 2988481060,2988481063,FI @@ -69170,7 +69745,9 @@ 2988483376,2988483379,GB 2988483380,2988483595,FR 2988483596,2988483599,FI -2988483600,2988484047,FR +2988483600,2988483967,FR +2988483968,2988483983,GB +2988483984,2988484047,FR 2988484048,2988484051,ES 2988484052,2988484127,FR 2988484128,2988484131,PT @@ -69299,9 +69876,13 @@ 2988500520,2988500523,ES 2988500524,2988500855,FR 2988500856,2988500859,ES -2988500860,2988501683,FR +2988500860,2988500939,FR +2988500940,2988500943,ES +2988500944,2988501683,FR 2988501684,2988501687,GB -2988501688,2988502051,FR +2988501688,2988502031,FR +2988502032,2988502035,IE +2988502036,2988502051,FR 2988502052,2988502055,PL 2988502056,2988502263,FR 2988502264,2988502267,ES @@ -69402,7 +69983,9 @@ 2988510248,2988510251,FI 2988510252,2988510311,FR 2988510312,2988510319,GB -2988510320,2988511747,FR +2988510320,2988511023,FR +2988511024,2988511027,GB +2988511028,2988511747,FR 2988511748,2988511751,GB 2988511752,2988511955,FR 2988511956,2988511959,ES @@ -69505,7 +70088,9 @@ 2988527188,2988527191,ES 2988527192,2988527487,FR 2988527488,2988527503,GB -2988527504,2988527591,FR +2988527504,2988527547,FR +2988527548,2988527551,IE +2988527552,2988527591,FR 2988527592,2988527595,IE 2988527596,2988527723,FR 2988527724,2988527727,ES @@ -69547,7 +70132,9 @@ 2988530400,2988530403,ES 2988530404,2988530423,FR 2988530424,2988530431,ES -2988530432,2988531023,FR +2988530432,2988530703,FR +2988530704,2988530719,PT +2988530720,2988531023,FR 2988531024,2988531027,ES 2988531028,2988531179,FR 2988531180,2988531183,GB @@ -69597,7 +70184,9 @@ 2988542272,2988542335,ES 2988542336,2988542339,FR 2988542340,2988542340,PT -2988542341,2988543179,FR +2988542341,2988542519,FR +2988542520,2988542523,GB +2988542524,2988543179,FR 2988543180,2988543183,ES 2988543184,2988543199,FR 2988543200,2988543203,GB @@ -69791,7 +70380,9 @@ 2988557540,2988557543,ES 2988557544,2988557631,FR 2988557632,2988557635,GB -2988557636,2988558731,FR +2988557636,2988558203,FR +2988558204,2988558207,DE +2988558208,2988558731,FR 2988558732,2988558735,PT 2988558736,2988558803,FR 2988558804,2988558807,ES @@ -69829,7 +70420,9 @@ 2988561684,2988561687,ES 2988561688,2988561763,FR 2988561764,2988561767,IT -2988561768,2988562495,FR +2988561768,2988561939,FR +2988561940,2988561943,FI +2988561944,2988562495,FR 2988562496,2988562527,FI 2988562528,2988562595,FR 2988562596,2988562599,GB @@ -71183,7 +71776,8 @@ 3025603104,3025603215,HK 3025603216,3025603231,CN 3025603232,3025603247,HK -3025603248,3025603327,IN +3025603248,3025603251,CN +3025603252,3025603327,IN 3025603328,3025603335,GU 3025603336,3025603583,IN 3025603584,3025603839,SG @@ -71264,8 +71858,8 @@ 3025625916,3025625919,IN 3025625920,3025625927,KR 3025625928,3025625935,IN -3025625936,3025625983,SG -3025625984,3025626111,IN +3025625936,3025626015,SG +3025626016,3025626111,IN 3025626112,3025626623,SG 3025626624,3025629439,IN 3025629440,3025629567,HK @@ -71327,7 +71921,9 @@ 3025639840,3025639871,HK 3025639872,3025639887,CN 3025639888,3025639903,HK -3025639904,3025639967,IN +3025639904,3025639943,IN +3025639944,3025639951,JP +3025639952,3025639967,IN 3025639968,3025639999,SG 3025640000,3025640191,IN 3025640192,3025640447,JP @@ -72218,9 +72814,7 @@ 3056772096,3056773119,JP 3056773120,3056774143,WS 3056774144,3056775167,JP -3056775168,3056778751,NO -3056778752,3056779007,AU -3056779008,3056779263,NO +3056775168,3056779263,NO 3056779264,3056791551,JP 3056791552,3056795647,ID 3056795648,3056861183,CN @@ -72805,8 +73399,7 @@ 3104010240,3104011263,PL 3104011264,3104012287,ES 3104012288,3104012799,BH -3104012800,3104013055,SA -3104013056,3104013311,BH +3104012800,3104013311,SA 3104013312,3104014335,IR 3104014336,3104015359,FR 3104015360,3104016383,SE @@ -73279,7 +73872,9 @@ 3104497664,3104498687,CH 3104498688,3104499119,NL 3104499120,3104499127,IT -3104499128,3104500735,NL +3104499128,3104499503,NL +3104499504,3104499511,IT +3104499512,3104500735,NL 3104500736,3104501759,CZ 3104501760,3104502783,LY 3104502784,3104503807,DE @@ -73610,8 +74205,7 @@ 3104835584,3104836607,RU 3104836608,3104837631,BA 3104837632,3104838655,DK -3104838656,3104839423,NL -3104839424,3104839679,GB +3104838656,3104839679,NL 3104839680,3104840703,IQ 3104840704,3104841727,UA 3104841728,3104843775,PL @@ -73997,7 +74591,6 @@ 3105224704,3105225727,IT 3105225728,3105226751,AM 3105226752,3105227775,RO -3105227776,3105228799,NL 3105228800,3105229823,PL 3105229824,3105230847,NL 3105230848,3105231871,UA @@ -74361,6 +74954,7 @@ 3105588224,3105589247,GB 3105589248,3105590271,ES 3105590272,3105591295,NL +3105591296,3105592319,GB 3105592320,3105593343,RU 3105593344,3105595391,DE 3105595392,3105596415,RU @@ -74694,7 +75288,9 @@ 3105932288,3105933311,SE 3105933312,3105933351,GB 3105933352,3105933359,IT -3105933360,3105933863,GB +3105933360,3105933847,GB +3105933848,3105933855,IT +3105933856,3105933863,GB 3105933864,3105933871,IT 3105933872,3105934215,GB 3105934216,3105934223,IT @@ -75073,7 +75669,7 @@ 3106280448,3106281471,FR 3106281472,3106282495,DK 3106282496,3106283519,LB -3106284544,3106285567,GB +3106283520,3106285567,GB 3106285568,3106286591,DE 3106286592,3106287615,GB 3106287616,3106289663,DE @@ -75248,6 +75844,7 @@ 3106449408,3106450431,AT 3106450432,3106451455,DE 3106451456,3106452479,AZ +3106452480,3106453503,NL 3106453504,3106454527,SE 3106454528,3106455551,ME 3106455552,3106456575,PS @@ -75260,10 +75857,7 @@ 3106462720,3106463743,IT 3106463744,3106464767,IR 3106464768,3106465791,PL -3106465792,3106466047,FR 3106466048,3106466303,NL -3106466304,3106466559,DE -3106466560,3106466815,RO 3106466816,3106467839,EE 3106467840,3106468863,IR 3106468864,3106470911,DE @@ -75349,6 +75943,7 @@ 3106532352,3106533375,BE 3106533376,3106534399,NO 3106534400,3106535423,ES +3106535424,3106536447,UA 3106536448,3106537471,IT 3106537472,3106538495,GB 3106538496,3106539519,SK @@ -75884,8 +76479,7 @@ 3107079168,3107080191,TR 3107080192,3107082239,FR 3107082240,3107083263,RU -3107083264,3107083267,LU -3107083268,3107084287,BE +3107083264,3107084287,LU 3107084288,3107085311,FI 3107085312,3107086335,NL 3107086336,3107087359,EE @@ -76028,9 +76622,7 @@ 3107220480,3107221503,GB 3107221504,3107222527,IT 3107222528,3107223551,IQ -3107223552,3107224063,AT -3107224064,3107224319,DE -3107224320,3107224575,AT +3107223552,3107224575,AT 3107224576,3107225599,FR 3107225600,3107226623,AZ 3107226624,3107227647,RU @@ -76094,7 +76686,6 @@ 3107291136,3107292159,NL 3107292160,3107293183,PL 3107293184,3107294207,FR -3107294208,3107295231,DE 3107295232,3107296255,PL 3107296256,3107297279,IT 3107297280,3107298303,PL @@ -76641,6 +77232,7 @@ 3107842048,3107843071,FI 3107843072,3107844095,SE 3107844096,3107845119,CY +3107845120,3107846143,RU 3107847168,3107848191,RU 3107848192,3107849215,IT 3107849216,3107850239,BE @@ -76793,8 +77385,7 @@ 3108001792,3108002815,GB 3108002816,3108003839,RO 3108003840,3108004863,DE -3108004864,3108005375,RU -3108005376,3108005887,GB +3108004864,3108005887,GB 3108005888,3108006911,LT 3108006912,3108007935,NL 3108007936,3108008959,DE @@ -76924,6 +77515,7 @@ 3108136960,3108137215,NL 3108137216,3108137471,LU 3108137472,3108137983,NL +3108137984,3108139007,RO 3108139008,3108141055,GB 3108141056,3108142079,PL 3108142080,3108143103,TR @@ -77359,7 +77951,8 @@ 3108592640,3108593663,NL 3108593664,3108594687,ES 3108594688,3108597759,CZ -3108597760,3108598271,IR +3108597760,3108598015,NL +3108598016,3108598271,IR 3108598272,3108598527,GB 3108598528,3108598783,IR 3108598784,3108600831,CH @@ -77454,7 +78047,8 @@ 3108711424,3108712447,RU 3108712448,3108713471,BG 3108713472,3108714495,RO -3108714496,3108715519,RS +3108714496,3108714751,XK +3108714752,3108715519,RS 3108715520,3108716543,GB 3108716544,3108717567,RU 3108717568,3108718591,FR @@ -77506,7 +78100,10 @@ 3108764672,3108765695,NL 3108765696,3108766719,FR 3108766720,3108767743,PT -3108767744,3108768767,CZ +3108767744,3108767999,CZ +3108768000,3108768255,SE +3108768256,3108768511,NL +3108768512,3108768767,CZ 3108768768,3108769791,UA 3108769792,3108770815,NL 3108770816,3108772863,FR @@ -77680,7 +78277,7 @@ 3108938752,3108940799,GB 3108940800,3108941823,SE 3108941824,3108942847,DE -3108942848,3108943871,FR +3108942848,3108943871,BE 3108943872,3108944895,DE 3108944896,3108945919,CH 3108945920,3108946943,GB @@ -77821,9 +78418,7 @@ 3109082112,3109083135,PL 3109083136,3109084159,SE 3109084160,3109085183,NL -3109085184,3109085439,AL -3109085440,3109085695,BG -3109085696,3109086207,AL +3109085184,3109086207,AL 3109086208,3109087231,RU 3109087232,3109088255,NL 3109088256,3109089279,LV @@ -77953,7 +78548,8 @@ 3109187584,3109188607,IT 3109188608,3109189631,SA 3109189632,3109190655,AT -3109190656,3109191679,NL +3109190656,3109190911,SE +3109190912,3109191679,NL 3109191680,3109192703,CH 3109192704,3109193727,IT 3109193728,3109194751,IR @@ -78036,7 +78632,8 @@ 3109280768,3109281791,IL 3109281792,3109282815,HU 3109282816,3109283839,DE -3109283840,3109284863,IE +3109283840,3109284095,PL +3109284096,3109284863,IE 3109284864,3109285887,FR 3109285888,3109286911,RU 3109286912,3109287935,TR @@ -78145,6 +78742,7 @@ 3109393408,3109394431,SI 3109394432,3109395455,AL 3109395456,3109396479,SE +3109396480,3109397503,RU 3109397504,3109398527,CZ 3109398528,3109399551,CH 3109399552,3109400575,BE @@ -78242,7 +78840,9 @@ 3109492736,3109493759,TR 3109493760,3109494783,IT 3109494784,3109495807,GB -3109495808,3109498879,AD +3109495808,3109497335,AD +3109497336,3109497336,ES +3109497337,3109498879,AD 3109498880,3109499903,RU 3109499904,3109500927,NO 3109500928,3109502975,GB @@ -78266,7 +78866,6 @@ 3109521408,3109522431,PL 3109522432,3109523455,CZ 3109523456,3109524479,PL -3109524480,3109525503,GB 3109525504,3109527551,NL 3109527552,3109528575,IL 3109528576,3109529599,SE @@ -78375,7 +78974,6 @@ 3109639168,3109640191,LB 3109640192,3109641215,IQ 3109641216,3109642239,NO -3109642240,3109643263,US 3109643264,3109643391,DE 3109643520,3109643775,RU 3109643776,3109644031,UA @@ -78410,10 +79008,10 @@ 3109673216,3109673439,NL 3109673451,3109673451,NO 3109673456,3109673471,NL -3109673472,3109673695,SG +3109673472,3109673695,GB 3109673704,3109673704,IN -3109673728,3109673951,HK -3109673968,3109673983,HK +3109673728,3109673951,AU +3109673968,3109673983,AU 3109673984,3109675007,FR 3109675008,3109677055,DE 3109677056,3109678079,BE @@ -79226,7 +79824,7 @@ 3110458368,3110459391,IT 3110459392,3110459903,IL 3110459904,3110460159,US -3110460160,3110460415,IL +3110460160,3110460415,IT 3110460416,3110461439,CZ 3110461440,3110462463,GB 3110462464,3110463487,IR @@ -79256,6 +79854,7 @@ 3110489088,3110490111,CZ 3110490112,3110491135,FR 3110491136,3110492159,GB +3110492160,3110493183,RO 3110493184,3110494207,DE 3110494208,3110495231,CZ 3110495232,3110496255,SE @@ -79283,7 +79882,9 @@ 3110518784,3110521855,GB 3110521856,3110523903,ES 3110523904,3110524927,SE -3110524928,3110525951,US +3110524928,3110525439,US +3110525440,3110525695,NL +3110525696,3110525951,DE 3110525952,3110526975,GB 3110526976,3110527999,DE 3110528000,3110529023,AT @@ -79421,14 +80022,14 @@ 3110663168,3110664191,LB 3110664192,3110665215,RU 3110665216,3110666239,LB -3110666240,3110667263,DK 3110667264,3110668287,RO 3110668288,3110669311,PL 3110669312,3110671359,ES 3110671360,3110672383,AT 3110672384,3110673407,ES 3110673408,3110674431,FR -3110674432,3110676479,RO +3110674432,3110675455,GB +3110675456,3110676479,RO 3110676480,3110677503,DE 3110677504,3110679551,RU 3110679552,3110680575,BE @@ -79462,6 +80063,7 @@ 3110709248,3110710271,RU 3110710272,3110711295,CY 3110711296,3110712319,IL +3110712320,3110713343,DK 3110713344,3110714367,IR 3110714368,3110715391,RO 3110715392,3110716415,NL @@ -79523,6 +80125,7 @@ 3110771712,3110772735,KZ 3110772736,3110773759,AT 3110773760,3110774783,DE +3110774784,3110775807,PL 3110775808,3110776831,RU 3110776832,3110777855,GB 3110777856,3110778879,SE @@ -79607,7 +80210,6 @@ 3110872064,3110873087,MD 3110873088,3110874111,IE 3110874112,3110875135,GB -3110875136,3110876159,PL 3110876160,3110878207,GB 3110878208,3110879231,CZ 3110879232,3110880255,LV @@ -79785,12 +80387,13 @@ 3111072768,3111074815,FR 3111074816,3111075839,DE 3111075840,3111076863,IR +3111076864,3111077887,DE 3111077888,3111078911,NL 3111078912,3111079935,IT 3111079936,3111080959,NL 3111080960,3111081983,RU 3111081984,3111083007,HU -3111083008,3111084031,UA +3111083008,3111084031,GB 3111084032,3111085055,CZ 3111085056,3111086079,RU 3111086080,3111087103,KZ @@ -80001,7 +80604,7 @@ 3111290880,3111291903,UA 3111291904,3111292927,NL 3111292928,3111293951,SI -3111293952,3111294975,GB +3111293952,3111294975,CY 3111294976,3111295999,US 3111296000,3111297023,NL 3111297024,3111298047,IE @@ -80215,6 +80818,7 @@ 3111507968,3111508991,IT 3111508992,3111510015,FI 3111510016,3111511039,LB +3111511040,3111512063,GR 3111512064,3111513087,RU 3111513088,3111514111,GB 3111514112,3111515135,UA @@ -80342,7 +80946,7 @@ 3111648768,3111649023,NL 3111649024,3111650559,GB 3111650560,3111650815,NL -3111650816,3111651071,SE +3111650816,3111651071,TR 3111651072,3111651327,GB 3111651328,3111652351,RO 3111652352,3111652863,GB @@ -80520,7 +81124,7 @@ 3111829504,3111830527,NL 3111830528,3111831551,NO 3111831552,3111832575,TR -3111832576,3111835647,GB +3111832576,3111836671,GB 3111836672,3111837695,RO 3111837696,3111838719,IT 3111838720,3111839743,AL @@ -80647,6 +81251,7 @@ 3111980032,3111981055,IL 3111981056,3111982079,RU 3111982080,3111983103,IR +3111983104,3111984127,UA 3111984128,3111985151,FI 3111985152,3111986175,TR 3111986176,3111987199,RU @@ -80790,7 +81395,7 @@ 3112097792,3112098815,TR 3112098816,3112099839,CH 3112099840,3112100863,GB -3112100864,3112102911,FR +3112100864,3112101887,FR 3112102912,3112103935,GB 3112103936,3112104959,DE 3112104960,3112105983,FR @@ -80960,7 +81565,6 @@ 3112276992,3112278015,LV 3112278016,3112279039,FI 3112279040,3112280063,NO -3112280064,3112281087,GB 3112281088,3112282111,FR 3112282112,3112283135,IR 3112283136,3112284159,AT @@ -81080,7 +81684,7 @@ 3112414208,3112415231,RU 3112415232,3112416255,AE 3112416256,3112417279,RU -3112417280,3112418303,ES +3112417280,3112419327,ES 3112419328,3112420351,FR 3112420352,3112421375,DE 3112421376,3112423423,GB @@ -81279,8 +81883,7 @@ 3112635264,3112635391,DE 3112635392,3112636415,BE 3112636416,3112637439,AT -3112637440,3112637951,CZ -3112637952,3112638463,SK +3112637440,3112638463,CZ 3112638464,3112639487,DE 3112639488,3112640511,IR 3112640512,3112641535,DE @@ -81579,9 +82182,7 @@ 3112946688,3112947711,DE 3112947712,3112948735,AT 3112948736,3112949759,RU -3112949760,3112950271,CZ -3112950272,3112950527,SK -3112950528,3112950783,CZ +3112949760,3112950783,CZ 3112950784,3112951807,JO 3112951808,3112952831,SK 3112952832,3112953855,IL @@ -81666,8 +82267,8 @@ 3113028608,3113029631,AE 3113029632,3113030655,ES 3113030656,3113031679,CH -3113031680,3113032191,RO -3113032192,3113032703,NL +3113031680,3113032447,RO +3113032448,3113032703,NL 3113032704,3113033727,SE 3113033728,3113034751,TR 3113034752,3113035775,IR @@ -81751,7 +82352,7 @@ 3113111552,3113112575,NO 3113112576,3113113599,GB 3113113600,3113114623,IT -3113114624,3113116671,IR +3113114624,3113115647,IR 3113116672,3113117695,NL 3113117696,3113118719,KW 3113118720,3113120767,DE @@ -82120,7 +82721,9 @@ 3113468928,3113469951,TR 3113469952,3113470975,ME 3113470976,3113471999,FR -3113472000,3113474047,GB +3113472000,3113473023,GB +3113473024,3113473279,FR +3113473280,3113474047,GB 3113474048,3113475071,DE 3113475072,3113479167,FR 3113479168,3113480191,SE @@ -82467,7 +83070,8 @@ 3113759744,3113760767,FR 3113760768,3113761791,BE 3113761792,3113762815,ES -3113762816,3113763839,SK +3113762816,3113763327,SK +3113763328,3113763839,US 3113763840,3113764863,VA 3113764864,3113765887,IE 3113766912,3113767935,RU @@ -82483,7 +83087,8 @@ 3113777152,3113778175,PL 3113778176,3113779199,TR 3113779200,3113780223,GB -3113780224,3113781247,RU +3113780224,3113780479,KZ +3113780480,3113781247,RU 3113781248,3113782271,BY 3113782272,3113783295,IT 3113783296,3113784319,TR @@ -82730,8 +83335,7 @@ 3114038272,3114039295,GB 3114039296,3114040319,CZ 3114040320,3114041343,DE -3114041344,3114041855,HU -3114041856,3114042367,SK +3114041344,3114042367,SK 3114042368,3114043391,IT 3114043392,3114045439,GB 3114045440,3114046463,AT @@ -82801,8 +83405,7 @@ 3114112000,3114113023,GB 3114113024,3114114047,ES 3114114048,3114115071,DE -3114115072,3114115839,SE -3114115840,3114116095,CA +3114115072,3114116095,SE 3114116096,3114117119,PL 3114117120,3114118143,SE 3114118144,3114119167,PL @@ -82874,7 +83477,8 @@ 3114173440,3114173679,DE 3114173680,3114173695,GB 3114173696,3114174463,DE -3114174464,3114175487,NL +3114174464,3114175231,NL +3114175232,3114175487,HU 3114175488,3114176511,IT 3114176512,3114177535,NL 3114177536,3114177775,DE @@ -82994,9 +83598,7 @@ 3114285056,3114286079,NL 3114286080,3114288127,UA 3114288128,3114289151,IS -3114289152,3114290175,BG -3114290176,3114291199,MD -3114291200,3114292223,BG +3114289152,3114292223,BG 3114292224,3114293247,DE 3114293248,3114294271,UA 3114294272,3114295295,RO @@ -83092,7 +83694,8 @@ 3114382336,3114383359,RU 3114383360,3114384383,ES 3114384384,3114385407,GB -3114385408,3114386431,IT +3114385408,3114386175,IT +3114386176,3114386431,DE 3114386432,3114387455,NL 3114387456,3114388479,US 3114388480,3114389503,HU @@ -83108,8 +83711,7 @@ 3114398720,3114399743,AT 3114399744,3114400767,GB 3114400768,3114401023,SK -3114401024,3114401279,CZ -3114401280,3114401791,SK +3114401024,3114401791,CZ 3114401792,3114402815,HU 3114402816,3114403839,CZ 3114403840,3114404863,NL @@ -83180,7 +83782,9 @@ 3114458112,3114459135,RO 3114459136,3114460159,GB 3114460160,3114461183,DK -3114461184,3114462207,NL +3114461184,3114461695,NL +3114461696,3114461951,RU +3114461952,3114462207,NL 3114462208,3114463231,GR 3114463232,3114464255,US 3114464256,3114465279,BE @@ -83321,8 +83925,7 @@ 3114600448,3114603519,DE 3114603520,3114604543,TR 3114604544,3114605567,BG -3114605568,3114606335,IR -3114606336,3114606591,GB +3114605568,3114606591,IR 3114606592,3114607615,FR 3114607616,3114608639,SK 3114608640,3114609663,IR @@ -83441,7 +84044,8 @@ 3114724352,3114725119,NL 3114725120,3114725375,US 3114725376,3114726399,RU -3114726400,3114727423,SE +3114726400,3114726407,NO +3114726408,3114727423,SE 3114727424,3114728447,BE 3114728448,3114729471,GB 3114729472,3114730495,RO @@ -83494,7 +84098,7 @@ 3114781696,3114782719,NL 3114782720,3114783743,CZ 3114783744,3114784767,PL -3114784768,3114785791,EE +3114784768,3114785791,RU 3114785792,3114786815,FR 3114786816,3114787839,RU 3114787840,3114788863,GB @@ -83761,7 +84365,9 @@ 3115067392,3115068415,DE 3115068416,3115069439,HU 3115069440,3115070463,NL -3115070464,3115072511,DE +3115070464,3115071487,DE +3115071488,3115071743,NL +3115071744,3115072511,DE 3115072512,3115073535,ES 3115073536,3115074559,DE 3115074560,3115075583,IR @@ -83788,7 +84394,8 @@ 3115095040,3115096063,DE 3115096064,3115097087,FR 3115097088,3115098111,LT -3115098112,3115100159,NL +3115098112,3115099647,NL +3115099648,3115100159,US 3115100160,3115101183,ES 3115101184,3115102207,GB 3115102208,3115103231,ES @@ -83910,7 +84517,8 @@ 3115225088,3115226111,UA 3115226112,3115227135,DE 3115227136,3115228159,PL -3115228160,3115229183,IL +3115228160,3115228671,AT +3115228672,3115229183,IL 3115229184,3115230207,EE 3115230208,3115231231,RU 3115231232,3115232255,CZ @@ -83978,7 +84586,7 @@ 3115292672,3115293695,GB 3115293696,3115294719,RU 3115294720,3115295743,GB -3115295744,3115296767,NL +3115295744,3115296767,PE 3115296768,3115297791,IE 3115297792,3115298815,RU 3115298816,3115299839,FI @@ -83989,7 +84597,8 @@ 3115303936,3115305983,NL 3115305984,3115306495,TR 3115306496,3115307007,BE -3115307008,3115308031,DE +3115307008,3115307519,DE +3115307520,3115308031,CA 3115308032,3115309055,IT 3115309056,3115310079,BE 3115310080,3115311103,CZ @@ -84064,10 +84673,7 @@ 3115385856,3115387903,SK 3115387904,3115388927,MK 3115388928,3115389951,AT -3115389952,3115390463,GB -3115390464,3115390719,RO -3115390720,3115390975,NL -3115390976,3115391999,GB +3115389952,3115391999,GB 3115392000,3115393023,AL 3115393024,3115395071,IT 3115395072,3115396095,ES @@ -84079,7 +84685,9 @@ 3115401216,3115402239,GB 3115402240,3115403263,NL 3115403264,3115404287,ES -3115404288,3115406335,GB +3115404288,3115405567,GB +3115405568,3115405823,DE +3115405824,3115406335,GB 3115406336,3115407359,DE 3115407360,3115408383,CY 3115408384,3115409407,MD @@ -84230,7 +84838,9 @@ 3115563008,3115564031,ES 3115564032,3115565055,RU 3115565056,3115566079,FR -3115566080,3115567103,RU +3115566080,3115566335,RU +3115566336,3115566591,CY +3115566592,3115567103,RU 3115567104,3115569151,NL 3115569152,3115570175,GB 3115570176,3115571199,UA @@ -84240,9 +84850,7 @@ 3115574272,3115575295,GB 3115575296,3115576319,ES 3115576320,3115577343,FI -3115577344,3115577567,IL -3115577568,3115577583,US -3115577584,3115577855,IL +3115577344,3115577855,IL 3115577856,3115578367,NL 3115578368,3115579391,GB 3115579392,3115580415,US @@ -84250,13 +84858,17 @@ 3115581440,3115582463,CZ 3115582464,3115583487,GB 3115583488,3115584511,NL -3115584512,3115585535,CZ +3115584512,3115584767,AT +3115584768,3115585023,US +3115585024,3115585535,CZ 3115585536,3115586559,RU 3115586560,3115587583,CH 3115587584,3115588607,DE 3115588608,3115589631,TR 3115589632,3115590655,GB -3115590656,3115591423,GR +3115590656,3115591167,GR +3115591168,3115591183,DE +3115591184,3115591423,GR 3115591424,3115591679,NL 3115591680,3115592703,CH 3115592704,3115593727,BE @@ -84269,6 +84881,236 @@ 3115599872,3115600895,HU 3115600896,3115601919,BE 3115601920,3115602943,JO +3115602944,3115603967,AE +3115603968,3115604991,HU +3115604992,3115606015,FR +3115606016,3115607039,NL +3115607040,3115608063,MD +3115608064,3115609087,NL +3115609088,3115610111,RU +3115610112,3115611135,PL +3115611136,3115612159,GB +3115612160,3115613183,IT +3115613184,3115614207,LT +3115614208,3115615231,IR +3115615232,3115616255,FR +3115616256,3115618303,SK +3115618304,3115619327,ES +3115619328,3115621375,NL +3115621376,3115622399,GB +3115622400,3115623423,RU +3115623424,3115624447,DE +3115624448,3115624703,GB +3115624704,3115625471,IM +3115625472,3115626495,NL +3115626496,3115627519,RU +3115627520,3115628543,IT +3115628544,3115629567,GB +3115629568,3115630591,RU +3115630592,3115631615,GB +3115631616,3115632639,NL +3115632640,3115633663,RU +3115633664,3115635711,PL +3115635712,3115636735,RU +3115636736,3115637759,GB +3115637760,3115638783,US +3115638784,3115639807,DE +3115639808,3115640831,RU +3115640832,3115641855,NO +3115641856,3115642879,RU +3115642880,3115643903,IE +3115643904,3115644927,FR +3115644928,3115645951,RU +3115645952,3115647999,SE +3115648000,3115649023,FR +3115649024,3115650047,NL +3115650048,3115651071,DE +3115651072,3115652095,UA +3115652096,3115653119,DK +3115653120,3115654143,DE +3115654144,3115655167,GR +3115655168,3115656191,ES +3115656192,3115657215,UA +3115657216,3115658239,MD +3115658240,3115659263,SE +3115659264,3115660287,MD +3115660288,3115661311,IQ +3115661312,3115662335,CZ +3115662336,3115663359,NO +3115663360,3115664383,SA +3115664384,3115665407,RS +3115665408,3115666431,NL +3115666432,3115667455,FR +3115667456,3115668479,NO +3115668480,3115669503,NL +3115669504,3115670527,SE +3115670528,3115671551,IT +3115671552,3115672575,SE +3115672576,3115673599,RO +3115673600,3115674623,DE +3115674624,3115675647,SY +3115675648,3115676671,DE +3115676672,3115677695,GB +3115677696,3115678719,DE +3115678720,3115679743,GB +3115679744,3115681791,NL +3115681792,3115682815,IT +3115682816,3115683839,NL +3115683840,3115684863,GB +3115684864,3115685887,BG +3115685888,3115687935,FR +3115687936,3115689983,UA +3115689984,3115691007,DE +3115691008,3115692031,IE +3115692032,3115693055,CZ +3115693056,3115694079,IR +3115694080,3115695103,CZ +3115695104,3115697151,DE +3115697152,3115698175,GB +3115698176,3115699199,RS +3115699200,3115700223,CH +3115700224,3115701247,TR +3115701248,3115702271,NL +3115702272,3115703295,SE +3115703296,3115704319,GR +3115704320,3115705343,DE +3115705344,3115706367,MD +3115706368,3115707391,NL +3115707392,3115708415,ES +3115708416,3115709439,RO +3115709440,3115710463,RU +3115710464,3115711487,GE +3115711488,3115714559,BG +3115714560,3115715583,GB +3115715584,3115717631,RU +3115717632,3115718655,UA +3115718656,3115719679,CH +3115719680,3115720703,GB +3115720704,3115722751,DE +3115722752,3115723775,FR +3115723776,3115724799,DE +3115724800,3115725311,GB +3115725312,3115725567,DE +3115725568,3115725823,CH +3115725824,3115726847,GB +3115726848,3115727871,NL +3115727872,3115728127,GB +3115728128,3115728383,US +3115728384,3115728639,GB +3115728640,3115728895,NL +3115728896,3115729919,FR +3115729920,3115730943,GB +3115730944,3115731967,IE +3115731968,3115732991,MD +3115732992,3115734015,DE +3115734016,3115735039,SE +3115735040,3115736063,GB +3115736064,3115737087,LV +3115737088,3115738111,PL +3115738112,3115739135,UA +3115739136,3115740159,NL +3115740160,3115741183,RU +3115741184,3115742207,LB +3115742208,3115743231,IT +3115743232,3115744255,AM +3115744256,3115745279,GB +3115745280,3115746303,RU +3115746304,3115747327,BE +3115747328,3115748351,JO +3115748352,3115749375,IT +3115749376,3115750399,GB +3115750400,3115751423,GE +3115751424,3115752447,ES +3115752448,3115753471,GB +3115753472,3115754495,RS +3115754496,3115755519,RU +3115755520,3115756543,FR +3115756544,3115757567,IT +3115757568,3115758591,AT +3115758592,3115759615,ES +3115759616,3115760639,DE +3115760640,3115761663,TR +3115761664,3115762687,MD +3115762688,3115763711,IT +3115763712,3115764735,GB +3115764736,3115765759,DK +3115765760,3115766783,IT +3115766784,3115767807,HU +3115767808,3115768831,KZ +3115768832,3115769855,IR +3115769856,3115770879,PL +3115770880,3115771903,GB +3115771904,3115772927,DE +3115772928,3115773951,TR +3115773952,3115774975,GB +3115776000,3115777023,IR +3115777024,3115779071,FR +3115779072,3115780095,IT +3115780096,3115781119,CZ +3115781120,3115782143,RU +3115782144,3115783167,ES +3115783168,3115784191,GB +3115784192,3115785215,DE +3115785216,3115786239,NL +3115786240,3115787263,MD +3115787264,3115788287,PL +3115788288,3115789311,DK +3115789312,3115790335,UA +3115790336,3115791359,RU +3115791360,3115792383,DE +3115792384,3115793407,SE +3115793408,3115795455,FR +3115795456,3115796479,IT +3115796480,3115797503,CZ +3115797504,3115798527,RU +3115798528,3115799551,MD +3115799552,3115801599,DE +3115801600,3115802623,LB +3115802624,3115802879,NL +3115802880,3115803135,RO +3115803136,3115803647,NL +3115803648,3115804671,GB +3115804672,3115804927,CH +3115804928,3115805183,IT +3115805184,3115805247,ES +3115805248,3115805695,GB +3115805696,3115806719,UA +3115806720,3115807743,NL +3115807744,3115808767,BE +3115808768,3115809791,BY +3115809792,3115810815,DE +3115810816,3115811839,IR +3115811840,3115812863,IL +3115812864,3115813887,MD +3115813888,3115814911,FR +3115814912,3115815935,SE +3115815936,3115816959,RS +3115816960,3115817983,SE +3115817984,3115819007,DE +3115819008,3115820031,RU +3115820032,3115822079,TR +3115822080,3115823103,RU +3115823104,3115825151,DE +3115825152,3115826175,GR +3115826176,3115828223,CH +3115828224,3115829247,RU +3115829248,3115830271,NL +3115830272,3115831295,DE +3115831296,3115832319,FR +3115832320,3115833343,GB +3115833344,3115834367,FR +3115834368,3115835391,ES +3115835392,3115836415,PL +3115836416,3115837439,FR +3115837440,3115838463,SK +3115838464,3115839487,PL +3115839488,3115840511,UZ +3115840512,3115841535,IE +3115841536,3115842559,MK +3115842560,3115843583,FR +3115843584,3115844607,ES +3115844608,3115845631,FR +3115845632,3115846655,PL 3117416448,3117417471,FR 3120562176,3120594943,CO 3120594944,3120599039,AR @@ -84535,11 +85377,33 @@ 3136986112,3140614143,BR 3140614144,3140616191,CR 3140616192,3145727999,BR -3145728000,3149135871,MX +3145728000,3147731455,MX +3147731456,3147731711,US +3147731712,3147734527,MX +3147734528,3147734783,US +3147734784,3147735039,MX +3147735040,3147735807,US +3147735808,3147739135,MX +3147739136,3147740159,US +3147740160,3147745279,MX +3147745280,3147746303,US +3147746304,3147747839,MX +3147747840,3147748351,US +3147748352,3147750399,MX +3147750400,3147751423,US +3147751424,3147751935,MX +3147751936,3147752447,US +3147752448,3147753471,MX +3147753472,3147753727,US +3147753728,3147756543,MX +3147756544,3147757055,US +3147757056,3149135871,MX 3149135872,3149398015,BR 3149398016,3149881343,MX 3149881344,3149889535,BR -3149889536,3154051071,MX +3149889536,3151514623,MX +3151514624,3151515647,US +3151515648,3154051071,MX 3154051072,3154116607,BR 3154116608,3154124799,RU 3154124800,3154126847,PL @@ -84586,9 +85450,12 @@ 3156803584,3156869119,TR 3156869120,3156901887,LU 3156901888,3156906239,NL -3156906240,3156910079,LU +3156906240,3156907007,LU +3156907008,3156908031,RU +3156908032,3156910079,LU 3156910080,3156912127,NL -3156912128,3156916223,LU +3156912128,3156914175,LU +3156914176,3156916223,RU 3156916224,3156917247,GB 3156917248,3156920319,LU 3156920320,3156921343,SG @@ -84939,9 +85806,7 @@ 3161948160,3161964543,RO 3161964544,3161980927,ES 3161980928,3161989119,SK -3161989120,3161989375,NL -3161989376,3161989631,TR -3161989632,3161990143,NL +3161989120,3161990143,NL 3161990144,3161991167,TR 3161991168,3161993215,NL 3161993216,3161997311,RU @@ -84992,7 +85857,8 @@ 3162324992,3162327039,IE 3162327040,3162329087,CH 3162329088,3162331135,IE -3162331136,3162332927,GB +3162331136,3162332671,GB +3162332672,3162332927,NL 3162332928,3162333183,DE 3162333184,3162341375,IT 3162341376,3162349567,PL @@ -85022,8 +85888,7 @@ 3162570752,3162603519,HR 3162603520,3162636287,GE 3162636288,3162669055,FR -3162669056,3162673151,EE -3162673152,3162676223,RU +3162669056,3162676223,RU 3162676224,3162677247,KZ 3162677248,3162679039,RU 3162679040,3162679295,KZ @@ -85034,8 +85899,8 @@ 3162682368,3162682879,MD 3162682880,3162683135,GB 3162683136,3162683391,ES -3162683392,3162693631,EE -3162693632,3162701567,RU +3162683392,3162685439,EE +3162685440,3162701567,RU 3162701568,3162701823,UZ 3162701824,3162734591,MD 3162734592,3162767359,RU @@ -85171,7 +86036,9 @@ 3164953024,3164953087,IE 3164953088,3164953583,FR 3164953584,3164953599,ES -3164953600,3164954507,FR +3164953600,3164954471,FR +3164954472,3164954479,IE +3164954480,3164954507,FR 3164954508,3164954511,ES 3164954512,3164958895,FR 3164958896,3164958911,PT @@ -85271,9 +86138,7 @@ 3164974336,3164974437,GB 3164974438,3164974438,IT 3164974439,3164974463,GB -3164974464,3164974527,FR -3164974528,3164974559,ES -3164974560,3164975199,FR +3164974464,3164975199,FR 3164975200,3164975215,ES 3164975216,3164975311,FR 3164975312,3164975327,ES @@ -85283,16 +86148,21 @@ 3164976144,3164976159,BE 3164976160,3164976231,FR 3164976232,3164976239,ES -3164976240,3164976815,FR -3164976816,3164976831,ES -3164976832,3164978079,FR +3164976240,3164977223,FR +3164977224,3164977231,PT +3164977232,3164977255,FR +3164977256,3164977263,PT +3164977264,3164977271,FI +3164977272,3164978079,FR 3164978080,3164978111,PT 3164978112,3164978623,FR 3164978624,3164978655,ES 3164978656,3164979151,FR 3164979152,3164979155,ES 3164979156,3164995583,FR -3164995584,3165032447,NL +3164995584,3165030399,NL +3165030400,3165031423,GB +3165031424,3165032447,NL 3165032448,3165036543,GB 3165036544,3165038591,DE 3165038592,3165040639,GB @@ -85816,11 +86686,31 @@ 3170828288,3170861055,RU 3170861056,3170893823,RS 3170893824,3179282431,BR -3179282432,3184116735,MX +3179282432,3182062591,MX +3182062592,3182063615,US +3182063616,3182215167,MX +3182215168,3182215423,US +3182215424,3182481407,MX +3182481408,3182482431,US +3182482432,3182482943,MX +3182482944,3182483455,US +3182483456,3182484479,MX +3182484480,3182485503,US +3182485504,3183853567,MX +3183853568,3183861759,US +3183861760,3183863807,MX +3183863808,3183864831,US +3183864832,3183865343,MX +3183865344,3183867903,US +3183867904,3184116735,MX 3184116736,3184123903,BR 3184123904,3184125951,MX 3184125952,3184127999,BR -3184128000,3187671039,MX +3184128000,3187414015,MX +3187414016,3187414527,US +3187414528,3187417087,MX +3187417088,3187421183,US +3187421184,3187671039,MX 3187671040,3187687423,CO 3187687424,3187695615,DO 3187695616,3187703807,AR @@ -87069,7 +87959,9 @@ 3210795008,3210796031,IL 3210796032,3210798847,US 3210798848,3210799103,ES -3210799104,3210802943,US +3210799104,3210802431,US +3210802432,3210802687,ES +3210802688,3210802943,US 3210802944,3210803039,CL 3210803040,3210803055,AU 3210803056,3210803071,CL @@ -87218,9 +88110,13 @@ 3211092992,3211093007,SK 3211093008,3211093503,DE 3211093504,3211093519,HR -3211093520,3211094015,DE +3211093520,3211093791,DE +3211093792,3211093807,IN +3211093808,3211094015,DE 3211094016,3211094031,CZ -3211094032,3211094143,DE +3211094032,3211094079,DE +3211094080,3211094095,GB +3211094096,3211094143,DE 3211094144,3211094271,US 3211094272,3211094527,DE 3211094528,3211094543,HR @@ -87627,7 +88523,9 @@ 3222868992,3222872319,US 3222872320,3222872575,CA 3222872576,3222874623,US -3222874880,3222876159,US +3222874880,3222875647,US +3222875648,3222875903,SG +3222875904,3222876159,US 3222876416,3222890751,US 3222890752,3222891007,CA 3222891008,3222936575,US @@ -87878,8 +88776,7 @@ 3223634944,3223635455,GB 3223635456,3223637247,SE 3223637248,3223637503,GB -3223637504,3223638015,SE -3223638016,3223638271,NL +3223637504,3223638271,SE 3223638272,3223638527,GB 3223638528,3223640831,SE 3223640832,3223641087,GB @@ -89132,8 +90029,8 @@ 3227545088,3227547647,ZA 3227547648,3227551743,MU 3227551744,3227552255,MF -3227552256,3227552767,ZA -3227552768,3227553791,MU +3227552256,3227552511,ZA +3227552512,3227553791,MU 3227553792,3227554047,ZA 3227554304,3227554559,ZA 3227554560,3227554815,MU @@ -89162,37 +90059,12 @@ 3227581696,3227582207,ZA 3227582208,3227638271,US 3227638272,3227638527,CA -3227638528,3227648255,US -3227648256,3227649023,FI -3227649024,3227649791,US -3227649792,3227650559,FI -3227650560,3227650815,US -3227650816,3227651071,FI -3227651072,3227653375,US -3227653376,3227654143,FI -3227654144,3227655935,US -3227655936,3227656703,FI -3227656704,3227656959,US -3227656960,3227657215,FI -3227657216,3227657471,US -3227657472,3227657983,FI -3227657984,3227658495,US -3227658496,3227659263,FI -3227659264,3227659775,US +3227638528,3227647999,US +3227648000,3227659775,FI 3227659776,3227660031,JP -3227660032,3227660287,FI -3227660288,3227660543,US +3227660032,3227660543,FI 3227660544,3227660799,EE -3227660800,3227661823,US -3227661824,3227662335,FI -3227662336,3227663615,US -3227663616,3227664127,FI -3227664128,3227664383,US -3227664384,3227672575,FI -3227672576,3227673087,US -3227673088,3227674111,FI -3227674112,3227674623,US -3227674624,3227678719,FI +3227660800,3227678719,FI 3227678720,3227680767,LU 3227680768,3227713535,FI 3227713536,3227720131,CA @@ -89366,7 +90238,9 @@ 3227775696,3227775707,BZ 3227775708,3227775731,CA 3227775732,3227775743,BZ -3227775744,3227775935,CA +3227775744,3227775856,CA +3227775857,3227775857,ES +3227775858,3227775935,CA 3227775936,3227775939,US 3227775940,3227775959,CA 3227775960,3227775963,US @@ -89534,8 +90408,7 @@ 3227931136,3227931391,US 3227931392,3227931647,AU 3227931648,3227931903,PE -3227931904,3227932159,US -3227932672,3227932927,US +3227931904,3227932927,US 3227932928,3227933183,DE 3227933184,3227933695,US 3227933696,3227933951,NZ @@ -90057,7 +90930,7 @@ 3229885440,3229886719,US 3229886720,3229886975,AU 3229886976,3229889791,US -3229889792,3229890047,PT +3229889792,3229890047,NL 3229890048,3229890303,US 3229890304,3229890559,PT 3229890560,3229891583,US @@ -91277,8 +92150,7 @@ 3233457408,3233457631,RO 3233457632,3233457647,US 3233457648,3233457663,RO -3233457664,3233458687,US -3233458688,3233458943,HU +3233457664,3233458943,US 3233458944,3233458959,BG 3233458960,3233458975,US 3233458976,3233459007,BG @@ -91761,7 +92633,8 @@ 3234822656,3234826751,US 3234826752,3234827007,CA 3234827008,3234827519,US -3234827520,3234828031,NL +3234827520,3234827775,GB +3234827776,3234828031,LU 3234828032,3234828287,NZ 3234828288,3234828799,US 3234828800,3234829055,CL @@ -92157,9 +93030,7 @@ 3237050112,3237050159,GB 3237050160,3237050175,US 3237050176,3237050303,GB -3237050304,3237051135,US -3237051136,3237051391,CA -3237051392,3237051903,US +3237050304,3237051903,US 3237051904,3237052159,TR 3237052160,3237052287,CA 3237052288,3237125295,US @@ -92208,7 +93079,7 @@ 3237328640,3237328895,CA 3237328896,3237329151,US 3237329152,3237329407,NZ -3237329664,3237330943,US +3237329408,3237330943,US 3237330944,3237331199,AU 3237331200,3237331967,US 3237331968,3237332223,AU @@ -92581,7 +93452,7 @@ 3237867776,3237868031,GB 3237868032,3237868159,HK 3237868160,3237868287,AU -3237868288,3237868543,DK +3237868288,3237868543,US 3237868544,3237868799,GB 3237868800,3237869311,US 3237869312,3237869439,KR @@ -94432,7 +95303,8 @@ 3244142592,3244143615,DE 3244143616,3244144639,FR 3244144640,3244146687,UA -3244146688,3244147711,RU +3244146688,3244146943,GB +3244146944,3244147711,RU 3244147712,3244149247,GB 3244149248,3244149503,US 3244149504,3244149759,GB @@ -94732,7 +95604,6 @@ 3244898048,3244898303,DE 3244898304,3244898559,IR 3244898560,3244898815,GI -3244898816,3244899071,RO 3244899072,3244899327,RU 3244899328,3244899583,BG 3244899584,3244899839,GB @@ -95450,9 +96321,7 @@ 3246825984,3246826239,US 3246826240,3246828066,CH 3246828068,3246915583,CH -3246915584,3246979608,PT -3246979609,3246979609,US -3246979610,3246979783,PT +3246915584,3246979783,PT 3246979784,3246979784,US 3246979785,3247046655,PT 3247046656,3247046911,AT @@ -95804,7 +96673,9 @@ 3248557056,3248558079,UA 3248558080,3248560127,NO 3248560896,3248561151,IN -3248561664,3248575487,NO +3248561664,3248562080,NO +3248562081,3248562081,DK +3248562082,3248575487,NO 3248575488,3248576511,CZ 3248576512,3248599039,NO 3248599040,3248603135,SE @@ -96362,7 +97233,7 @@ 3250413568,3250414079,UA 3250414080,3250414591,RO 3250414592,3250415103,SE -3250415104,3250415359,NL +3250415104,3250415359,GB 3250415360,3250415615,PL 3250415616,3250416127,FR 3250416128,3250417663,DE @@ -96579,7 +97450,7 @@ 3251156736,3251156991,UA 3251156992,3251157247,FR 3251157248,3251157503,BE -3251157504,3251158015,PL +3251157760,3251158015,PL 3251158016,3251158271,TR 3251158272,3251158527,RU 3251158528,3251158783,UA @@ -96854,8 +97725,8 @@ 3252196352,3252197119,LT 3252197120,3252197375,SE 3252197376,3252207615,HR -3252207616,3252219903,LT -3252219904,3252221183,SE +3252207616,3252220927,LT +3252220928,3252221183,SE 3252221184,3252222463,LT 3252222464,3252223487,SE 3252223488,3252223999,LT @@ -96864,8 +97735,7 @@ 3252232577,3252256767,SE 3252256768,3252273151,EE 3252273152,3252286463,HR -3252286464,3252287487,SE -3252287488,3252289535,LT +3252286464,3252289535,LT 3252289536,3252289791,BG 3252289792,3252291583,GR 3252291584,3252292607,DE @@ -97271,8 +98141,7 @@ 3253624832,3253625855,UA 3253625856,3253626879,IT 3253626880,3253627903,DE -3253627904,3253628671,RU -3253628672,3253628927,UA +3253627904,3253628927,UA 3253628928,3253629951,GR 3253629952,3253630975,UA 3253632000,3253633023,DE @@ -97625,15 +98494,43 @@ 3254266368,3254266623,RE 3254266624,3254277119,FR 3254277120,3254278143,YT -3254278144,3254488431,FR +3254278144,3254485879,FR +3254485880,3254485887,CI +3254485888,3254486527,FR +3254486528,3254486543,CH +3254486544,3254487039,FR +3254487040,3254487199,KM +3254487200,3254487263,FR +3254487264,3254487295,KM +3254487296,3254487419,CF +3254487420,3254487559,FR +3254487560,3254487803,CI +3254487804,3254488431,FR 3254488432,3254488447,MG -3254488448,3254489407,FR +3254488448,3254489087,FR +3254489088,3254489343,DZ +3254489344,3254489365,FR +3254489366,3254489367,MR +3254489368,3254489369,FR +3254489370,3254489370,MR +3254489371,3254489373,FR +3254489374,3254489375,MR +3254489376,3254489407,FR 3254489408,3254489439,MR -3254489440,3254489447,FR -3254489448,3254489455,MR -3254489456,3254489487,FR -3254489488,3254489503,MR -3254489504,3254491903,FR +3254489440,3254489443,FR +3254489444,3254489455,MR +3254489456,3254489463,FR +3254489464,3254489519,MR +3254489520,3254489535,FR +3254489536,3254489567,MR +3254489568,3254489599,FR +3254489600,3254489855,MR +3254489856,3254490111,TD +3254490112,3254490367,FR +3254490368,3254490623,CF +3254490624,3254491135,FR +3254491136,3254491391,DZ +3254491392,3254491903,FR 3254491904,3254492031,CM 3254492032,3254493183,FR 3254493184,3254493253,GP @@ -98091,7 +98988,7 @@ 3255374848,3255375359,CY 3255375360,3255375871,RO 3255375872,3255376383,PL -3255376384,3255376895,UA +3255376384,3255376895,RU 3255376896,3255377407,GB 3255377408,3255377919,KZ 3255377920,3255378431,GB @@ -98791,7 +99688,6 @@ 3258081280,3258081535,NL 3258081536,3258081791,BE 3258081792,3258082047,UA -3258082048,3258082303,NL 3258082304,3258082559,CZ 3258082560,3258082815,HU 3258082816,3258083071,NL @@ -99275,8 +100171,8 @@ 3260553984,3260554239,GB 3260554240,3260555263,CH 3260555264,3260563455,HU -3260563456,3260571647,GB -3260571648,3260575743,BE +3260563456,3260573695,GB +3260573696,3260575743,BE 3260575744,3260579839,GB 3260579840,3260580351,PL 3260580352,3260580863,HU @@ -100543,8 +101439,7 @@ 3262478857,3262478857,LI 3262478858,3262478862,DE 3262478863,3262478863,AT -3262478864,3262478864,NL -3262478865,3262478865,DE +3262478864,3262478865,DE 3262478866,3262478866,CH 3262478867,3262478867,GB 3262478868,3262478868,IT @@ -100596,8 +101491,8 @@ 3262478956,3262478956,DE 3262478957,3262478957,PT 3262478958,3262478958,SE -3262478959,3262478959,DE -3262478960,3262478961,NL +3262478959,3262478960,DE +3262478961,3262478961,NL 3262478962,3262478966,DE 3262478967,3262478967,NL 3262478968,3262478968,ES @@ -100622,7 +101517,7 @@ 3262478994,3262478997,DE 3262478998,3262478998,GB 3262478999,3262478999,AT -3262479000,3262479000,CH +3262479000,3262479000,DE 3262479001,3262479001,AT 3262479002,3262479002,DE 3262479003,3262479003,FR @@ -102104,8 +102999,8 @@ 3265607936,3265608191,CZ 3265608448,3265608703,SE 3265608704,3265608959,GB -3265608960,3265609215,RU -3265609216,3265609727,UA +3265608960,3265609471,RU +3265609472,3265609727,UA 3265609728,3265617919,NL 3265617920,3265626111,SI 3265626112,3265634303,JO @@ -102335,7 +103230,9 @@ 3267100672,3267166207,FI 3267166208,3267231743,GB 3267231744,3267297279,RU -3267297280,3267362815,CH +3267297280,3267357132,CH +3267357133,3267357133,US +3267357134,3267362815,CH 3267362816,3267368480,DK 3267368482,3267428351,DK 3267428352,3267493887,GB @@ -102799,7 +103696,7 @@ 3270973952,3270974463,FR 3270974464,3270974975,IT 3270974976,3270975487,NL -3270975488,3270975999,RU +3270975744,3270975999,RU 3270976000,3270976255,FR 3270976256,3270976511,UA 3270976512,3270976767,HU @@ -103005,7 +103902,7 @@ 3271744512,3271745023,AT 3271745024,3271745535,PL 3271745536,3271746047,GB -3271746048,3271746559,RU +3271746048,3271746559,RO 3271746560,3271747071,US 3271747072,3271747583,KZ 3271747584,3271748095,RU @@ -103044,7 +103941,8 @@ 3271812096,3271813119,ES 3271813120,3271814143,PL 3271814144,3271815167,UA -3271815168,3271817215,RU +3271815168,3271816191,RU +3271816192,3271817215,UA 3271817216,3271818239,DE 3271818240,3271819263,RU 3271819264,3271884799,DE @@ -103332,7 +104230,6 @@ 3272421888,3272422143,RU 3272422144,3272422399,GB 3272422400,3272422911,CH -3272422912,3272423423,SE 3272423424,3272423935,BE 3272423936,3272424447,FR 3272424448,3272424703,GB @@ -104798,7 +105695,9 @@ 3276014464,3276014479,FR 3276014480,3276014951,GB 3276014952,3276014959,ES -3276014960,3276018383,GB +3276014960,3276015055,GB +3276015056,3276015063,FR +3276015064,3276018383,GB 3276018384,3276018399,FR 3276018400,3276019711,GB 3276019712,3276020735,FR @@ -104917,7 +105816,9 @@ 3276234368,3276275711,DE 3276275712,3276283903,SK 3276283904,3276292095,GB -3276292096,3276300287,BE +3276292096,3276292479,BE +3276292480,3276292607,CH +3276292608,3276300287,BE 3276300288,3276304383,DE 3276304384,3276304639,BG 3276304640,3276305407,GB @@ -105442,9 +106343,7 @@ 3276889088,3276889215,IT 3276889216,3276890175,GB 3276890176,3276890191,US -3276890192,3276892159,GB -3276892160,3276893183,IT -3276893184,3276893695,GB +3276890192,3276893695,GB 3276893696,3276893951,IT 3276893952,3276897727,GB 3276897728,3276897791,BE @@ -105504,7 +106403,9 @@ 3276926208,3276931071,GB 3276931072,3276939263,KZ 3276939264,3276955647,DE -3276955648,3276963839,GB +3276955648,3276958719,GB +3276958720,3276959743,IL +3276959744,3276963839,GB 3276963840,3276964351,IL 3276964352,3276964863,RO 3276965376,3276966399,RU @@ -105512,7 +106413,7 @@ 3276966912,3276968959,RU 3276968960,3276969471,RO 3276969472,3276969983,UA -3276969984,3276970495,NL +3276969984,3276970495,DE 3276970496,3276971519,RU 3276971520,3276972031,DE 3276972032,3276980223,PL @@ -105526,7 +106427,7 @@ 3277160448,3277176831,NL 3277176832,3277177087,SI 3277177088,3277177343,GB -3277177600,3277178111,PL +3277177856,3277178111,PL 3277178368,3277178623,UA 3277178624,3277178879,PL 3277178880,3277179135,ES @@ -106627,12 +107528,11 @@ 3278942729,3278942730,BE 3278942731,3278942731,DE 3278942732,3278942732,ES -3278942733,3278942733,LU +3278942733,3278942733,DE 3278942734,3278942734,GB 3278942735,3278942735,DE 3278942736,3278942736,IT -3278942737,3278942737,GB -3278942738,3278942739,DE +3278942737,3278942739,DE 3278942740,3278942740,NL 3278942741,3278942741,GB 3278942742,3278942742,DE @@ -106655,9 +107555,7 @@ 3278942767,3278942767,FR 3278942768,3278942768,NO 3278942769,3278942769,GB -3278942770,3278942771,DE -3278942772,3278942772,BE -3278942773,3278942773,DE +3278942770,3278942773,DE 3278942774,3278942774,CH 3278942775,3278942775,FR 3278942776,3278942776,DE @@ -106666,8 +107564,7 @@ 3278942780,3278942784,DE 3278942785,3278942785,GR 3278942786,3278942786,SI -3278942787,3278942787,IT -3278942788,3278942789,DE +3278942787,3278942789,DE 3278942790,3278942790,ES 3278942791,3278942791,IT 3278942792,3278942792,US @@ -106693,8 +107590,7 @@ 3278942818,3278942818,DK 3278942819,3278942819,DE 3278942820,3278942820,IT -3278942821,3278942821,NL -3278942822,3278942824,DE +3278942821,3278942824,DE 3278942825,3278942825,NL 3278942826,3278942826,RU 3278942827,3278942827,FR @@ -106715,9 +107611,7 @@ 3278942852,3278942852,DE 3278942853,3278942853,ES 3278942854,3278942854,GB -3278942855,3278942855,DE -3278942856,3278942856,NO -3278942857,3278942857,DE +3278942855,3278942857,DE 3278942858,3278942858,IT 3278942859,3278942860,DE 3278942861,3278942861,FR @@ -106725,16 +107619,14 @@ 3278942864,3278942864,ES 3278942865,3278942865,GB 3278942866,3278942867,NL -3278942868,3278942868,DE -3278942869,3278942869,IT +3278942868,3278942869,DE 3278942870,3278942870,CH 3278942871,3278942871,IS -3278942872,3278942872,ES +3278942872,3278942872,DE 3278942873,3278942873,IT 3278942874,3278942875,DE 3278942876,3278942876,PL -3278942877,3278942877,DE -3278942878,3278942878,NL +3278942877,3278942878,DE 3278942879,3278942879,DK 3278942880,3278942881,DE 3278942882,3278942882,CH @@ -106755,9 +107647,7 @@ 3278942911,3278942911,IT 3278942912,3278942913,DE 3278942914,3278942914,CH -3278942915,3278942915,DE -3278942916,3278942916,CH -3278942917,3278942922,DE +3278942915,3278942922,DE 3278942923,3278942923,NL 3278942924,3278942924,DE 3278942925,3278942925,GB @@ -107195,8 +108085,7 @@ 3278943558,3278943558,AT 3278943559,3278943560,DE 3278943561,3278943561,FR -3278943562,3278943564,DE -3278943565,3278943565,GB +3278943562,3278943565,DE 3278943566,3278943566,BE 3278943567,3278943567,AE 3278943568,3278943568,NL @@ -107216,9 +108105,7 @@ 3278943584,3278943585,DE 3278943586,3278943586,NL 3278943587,3278943587,ES -3278943588,3278943588,DE -3278943589,3278943589,IT -3278943590,3278943590,DE +3278943588,3278943590,DE 3278943591,3278943591,NL 3278943592,3278943592,DE 3278943593,3278943593,PL @@ -107400,9 +108287,7 @@ 3278943832,3278943832,BE 3278943833,3278943833,DE 3278943834,3278943835,GB -3278943836,3278943836,DE -3278943837,3278943837,ES -3278943838,3278943838,DE +3278943836,3278943838,DE 3278943839,3278943839,IT 3278943840,3278943845,DE 3278943846,3278943846,GB @@ -107428,8 +108313,7 @@ 3278943872,3278943873,DE 3278943874,3278943874,CH 3278943875,3278943875,IL -3278943876,3278943881,DE -3278943882,3278943882,PL +3278943876,3278943882,DE 3278943883,3278943883,CH 3278943884,3278943884,DE 3278943885,3278943885,IT @@ -107464,8 +108348,7 @@ 3278943921,3278943923,DE 3278943924,3278943924,IT 3278943925,3278943926,ES -3278943927,3278943928,DE -3278943929,3278943929,PT +3278943927,3278943929,DE 3278943930,3278943930,IT 3278943931,3278943932,DE 3278943933,3278943933,ES @@ -107523,8 +108406,8 @@ 3278944016,3278944020,DE 3278944021,3278944021,IT 3278944022,3278944022,FR -3278944023,3278944023,AT -3278944024,3278944025,CH +3278944023,3278944024,DE +3278944025,3278944025,CH 3278944026,3278944026,DE 3278944027,3278944027,FR 3278944028,3278944028,DE @@ -107571,7 +108454,7 @@ 3278944081,3278944081,GB 3278944082,3278944082,IT 3278944083,3278944084,ES -3278944085,3278944085,PT +3278944085,3278944085,DE 3278944086,3278944086,NL 3278944087,3278944087,DE 3278944088,3278944088,IT @@ -107581,8 +108464,7 @@ 3278944092,3278944092,GR 3278944093,3278944094,DE 3278944095,3278944095,AT -3278944096,3278944096,GB -3278944097,3278944097,DE +3278944096,3278944097,DE 3278944098,3278944098,SE 3278944099,3278944099,GB 3278944100,3278944102,DE @@ -107618,8 +108500,7 @@ 3278944140,3278944140,PT 3278944141,3278944141,FR 3278944142,3278944142,GB -3278944143,3278944143,AT -3278944144,3278944144,DE +3278944143,3278944144,DE 3278944145,3278944145,SE 3278944146,3278944147,DE 3278944148,3278944148,ES @@ -107644,7 +108525,7 @@ 3278944178,3278944179,DE 3278944180,3278944180,GB 3278944181,3278944181,IT -3278944182,3278944182,FR +3278944182,3278944182,DE 3278944183,3278944184,ES 3278944185,3278944185,NL 3278944186,3278944192,DE @@ -107672,8 +108553,7 @@ 3278944218,3278944219,DE 3278944220,3278944220,GB 3278944221,3278944221,GR -3278944222,3278944222,IT -3278944223,3278944224,DE +3278944222,3278944224,DE 3278944225,3278944225,NL 3278944226,3278944226,RU 3278944227,3278944227,IT @@ -107693,7 +108573,7 @@ 3278944246,3278944246,NL 3278944247,3278944247,ES 3278944248,3278944248,NL -3278944249,3278944249,ES +3278944249,3278944249,DE 3278944250,3278944250,IT 3278944251,3278944251,AT 3278944252,3278944252,IT @@ -108808,7 +109688,8 @@ 3282501632,3282534399,GR 3282534400,3282538495,GB 3282538496,3282542591,PL -3282542592,3282550783,GB +3282542592,3282546687,US +3282546688,3282550783,GB 3282550784,3282554879,FR 3282554880,3282558975,DE 3282558976,3282563071,FR @@ -109825,8 +110706,7 @@ 3286658048,3286658303,DE 3286658304,3286658559,RU 3286658560,3286658815,NL -3286658816,3286659071,RU -3286659072,3286659327,UA +3286658816,3286659327,RU 3286659328,3286659583,PL 3286659584,3286659839,DE 3286659840,3286660095,UA @@ -110115,7 +110995,6 @@ 3287461376,3287461631,CH 3287461632,3287461887,AT 3287461888,3287462143,PL -3287462400,3287462655,BE 3287462656,3287462911,UA 3287462912,3287463167,FR 3287463168,3287463423,IT @@ -110153,7 +111032,7 @@ 3287554048,3287554559,RU 3287554560,3287555071,PL 3287555072,3287555583,GB -3287555584,3287556095,FR +3287555584,3287556095,US 3287556096,3287563007,TR 3287563008,3287563263,US 3287563264,3287564287,TR @@ -110996,13 +111875,29 @@ 3291555840,3291556095,GN 3291611136,3291611647,ZA 3291611648,3291611903,MU +3291611904,3291612159,ZA +3291612160,3291613183,NG 3291676672,3291742207,ZA 3291742208,3291742463,US 3291742464,3291742591,GB 3291742592,3291742719,IE 3291742720,3291750399,US 3291750400,3291750655,GB -3291750656,3291817471,US +3291750656,3291757311,US +3291757312,3291757567,GB +3291757568,3291758079,US +3291758080,3291758335,GB +3291758336,3291762175,US +3291762176,3291762431,GB +3291762432,3291763199,US +3291763200,3291763455,GB +3291763456,3291763711,US +3291763712,3291763967,GB +3291763968,3291813375,US +3291813376,3291813631,GB +3291813632,3291815423,US +3291815424,3291815679,GB +3291815680,3291817471,US 3291817472,3291817983,NL 3291817984,3291819263,US 3291819264,3291819775,NL @@ -111010,11 +111905,37 @@ 3291821056,3291821567,NL 3291821568,3291823103,US 3291823104,3291823359,DE -3291823360,3291906047,US +3291823360,3291824127,US +3291824128,3291824383,GB +3291824384,3291826175,US +3291826176,3291826431,CA +3291826432,3291827199,US +3291827200,3291827455,CA +3291827456,3291828223,US +3291828224,3291828479,GB +3291828480,3291878143,US +3291878144,3291878399,CA +3291878400,3291880703,US +3291880704,3291880959,CA +3291880960,3291883775,US +3291883776,3291884031,CA +3291884032,3291884543,US +3291884544,3291884799,CA +3291884800,3291886335,US +3291886336,3291886591,CA +3291886592,3291887359,US +3291887360,3291887615,FR +3291887616,3291888895,US +3291888896,3291889151,FR +3291889152,3291893759,US +3291893760,3291894015,CA +3291894016,3291906047,US 3291906048,3291907071,LK 3291907072,3291939063,US 3291939064,3291939064,GB -3291939065,3291971583,US +3291939065,3291943423,US +3291943424,3291943679,FR +3291943680,3291971583,US 3291971584,3291972607,JP 3291972608,3292004351,US 3292004352,3292004607,SC @@ -111855,7 +112776,34 @@ 3304529920,3304535295,US 3304535296,3304536063,SC 3304536064,3304538111,CA -3304538112,3304587263,SC +3304538112,3304539135,SC +3304539136,3304548351,US +3304548352,3304549375,SC +3304549376,3304562687,US +3304562688,3304563711,GB +3304563712,3304564735,NL +3304564736,3304565759,CH +3304565760,3304566783,ES +3304566784,3304567807,PT +3304567808,3304568831,PL +3304568832,3304569855,NO +3304569856,3304570879,NZ +3304570880,3304571903,LU +3304571904,3304572927,HU +3304572928,3304573951,HK +3304573952,3304574975,AU +3304574976,3304575999,AT +3304576000,3304577023,BE +3304577024,3304578047,LV +3304578048,3304579071,CZ +3304579072,3304580095,DK +3304580096,3304581119,DE +3304581120,3304582143,FR +3304582144,3304583167,AT +3304583168,3304584191,IN +3304584192,3304585215,RU +3304585216,3304586239,US +3304586240,3304587263,BR 3304587264,3304669183,ZA 3304669184,3304685567,TZ 3304685568,3304701951,ZA @@ -112796,9 +113744,7 @@ 3323660544,3323661311,US 3323661312,3323662335,CA 3323662336,3323674623,US -3323674624,3323677967,CA -3323677968,3323677983,IN -3323677984,3323678031,CA +3323674624,3323678031,CA 3323678032,3323678047,US 3323678048,3323678055,CA 3323678056,3323678059,MX @@ -112859,7 +113805,9 @@ 3323682656,3323682687,IE 3323682688,3323682751,CA 3323682752,3323682767,US -3323682768,3323682839,CA +3323682768,3323682771,CA +3323682772,3323682775,RO +3323682776,3323682839,CA 3323682840,3323682843,BD 3323682844,3323682947,CA 3323682948,3323682951,US @@ -112996,7 +113944,8 @@ 3323686440,3323686447,BR 3323686448,3323686599,CA 3323686600,3323686607,BR -3323686608,3323686631,CA +3323686608,3323686623,CA +3323686624,3323686631,NL 3323686632,3323686639,BR 3323686640,3323686655,US 3323686656,3323686683,CA @@ -113237,10 +114186,13 @@ 3324526592,3324579839,US 3324582912,3324583935,CA 3324583936,3324587775,CL -3324587776,3324633087,US +3324587776,3324601087,US +3324601088,3324601343,GB +3324601344,3324604671,US +3324604672,3324604927,GB +3324604928,3324633087,US 3324633088,3324634111,PE -3324634112,3324635135,AR -3324635136,3324635647,US +3324634112,3324635647,AR 3324635648,3324635903,HK 3324635904,3324636159,US 3324636160,3324637183,NZ @@ -113741,7 +114693,7 @@ 3324943168,3324943215,US 3324943216,3324943231,GB 3324943232,3324963535,US -3324963536,3324963543,GB +3324963536,3324963543,CA 3324963544,3324963567,US 3324963568,3324963575,GB 3324963576,3324963579,US @@ -113783,8 +114735,7 @@ 3325171712,3325190143,US 3325190144,3325191687,CA 3325191688,3325191695,US -3325191696,3325198363,CA -3325198364,3325198367,US +3325191696,3325198367,CA 3325198368,3325198375,MY 3325198376,3325198379,CA 3325198380,3325198383,US @@ -113926,8 +114877,8 @@ 3325201288,3325201367,CA 3325201368,3325201375,MY 3325201376,3325201391,CA -3325201392,3325201407,US -3325201408,3325201427,CA +3325201392,3325201415,US +3325201416,3325201427,CA 3325201428,3325201431,US 3325201432,3325201531,CA 3325201532,3325201535,US @@ -113977,7 +114928,9 @@ 3325205504,3325206428,CA 3325206429,3325206429,US 3325206430,3325206623,CA -3325206624,3325206627,RO +3325206624,3325206625,RO +3325206626,3325206626,CA +3325206627,3325206627,RO 3325206628,3325206639,CA 3325206640,3325206671,US 3325206672,3325206679,BR @@ -113997,7 +114950,9 @@ 3325206880,3325206911,BA 3325206912,3325206915,CA 3325206916,3325206919,US -3325206920,3325207055,CA +3325206920,3325206935,CA +3325206936,3325206943,HR +3325206944,3325207055,CA 3325207056,3325207059,GB 3325207060,3325207071,CA 3325207072,3325207103,MX @@ -114402,7 +115357,9 @@ 3325217248,3325217279,BA 3325217280,3325217307,CA 3325217308,3325217311,HK -3325217312,3325217651,CA +3325217312,3325217471,CA +3325217472,3325217503,IE +3325217504,3325217651,CA 3325217652,3325217655,AE 3325217656,3325217695,CA 3325217696,3325217699,US @@ -114435,23 +115392,19 @@ 3325218252,3325218255,PL 3325218256,3325218447,CA 3325218448,3325218455,AR -3325218456,3325218463,CA -3325218464,3325218479,ES +3325218456,3325218479,CA 3325218480,3325218483,BR 3325218484,3325218487,CA 3325218488,3325218491,US 3325218492,3325218519,CA 3325218520,3325218523,US -3325218524,3325218531,CA -3325218532,3325218535,US -3325218536,3325218559,CA +3325218524,3325218559,CA 3325218560,3325218567,US 3325218568,3325218583,CA 3325218584,3325218591,IN 3325218592,3325218615,CA 3325218616,3325218623,BR -3325218624,3325218655,CA -3325218656,3325218663,TR +3325218624,3325218663,CA 3325218664,3325218667,US 3325218668,3325218671,CA 3325218672,3325218687,IT @@ -114462,9 +115415,7 @@ 3325219084,3325219087,BZ 3325219088,3325219091,CA 3325219092,3325219095,VE -3325219096,3325219247,CA -3325219248,3325219263,US -3325219264,3325219407,CA +3325219096,3325219407,CA 3325219408,3325219411,FR 3325219412,3325219415,CA 3325219416,3325219419,US @@ -114916,7 +115867,9 @@ 3325230104,3325230111,US 3325230112,3325230123,CA 3325230124,3325230127,CL -3325230128,3325230167,CA +3325230128,3325230135,CA +3325230136,3325230143,FR +3325230144,3325230167,CA 3325230168,3325230171,PK 3325230172,3325230175,US 3325230176,3325230319,CA @@ -115457,9 +116410,7 @@ 3331647232,3331647487,CA 3331647488,3331649279,US 3331649280,3331649535,CA -3331649536,3331818495,US -3331818496,3331818751,MX -3331818752,3331840111,US +3331649536,3331840111,US 3331840112,3331840115,CA 3331840116,3331853823,US 3331854080,3331868161,US @@ -115954,9 +116905,7 @@ 3337963968,3337964031,IN 3337964032,3337964671,US 3337964672,3337964735,IN -3337964736,3337965055,US -3337965056,3337965311,HK -3337965312,3337969663,US +3337964736,3337969663,US 3337969664,3337973759,PR 3337973760,3337977855,CA 3337977856,3337980671,US @@ -116540,7 +117489,9 @@ 3340926816,3340926823,GB 3340926824,3340926959,US 3340926960,3340926967,IL -3340926968,3341082623,US +3340926968,3341057023,US +3341057024,3341058047,CA +3341058048,3341082623,US 3341082624,3341084671,CA 3341084672,3341180927,US 3341180928,3341182975,CA @@ -119578,7 +120529,9 @@ 3357606912,3357607167,AR 3357607168,3357613055,MX 3357613056,3357613311,AR -3357613312,3357618943,MX +3357613312,3357616895,MX +3357616896,3357617151,US +3357617152,3357618943,MX 3357618944,3357619199,SV 3357619200,3357623039,MX 3357623040,3357623295,AR @@ -119947,7 +120900,15 @@ 3360403456,3360405503,BR 3360405504,3360407551,HN 3360407552,3360423935,PA -3360423936,3360534527,MX +3360423936,3360514047,MX +3360514048,3360516351,US +3360516352,3360516607,MX +3360516608,3360516863,US +3360516864,3360517119,MX +3360517120,3360517631,US +3360517632,3360518143,MX +3360518144,3360520191,US +3360520192,3360534527,MX 3360534528,3360536575,BR 3360536576,3360537599,CL 3360537600,3360538623,EC @@ -120448,7 +121409,13 @@ 3382704128,3382706175,BR 3382706176,3382853631,MX 3382853632,3382870015,BR -3382870016,3383701503,MX +3382870016,3382985727,MX +3382985728,3382985983,US +3382985984,3383033855,MX +3383033856,3383038975,US +3383038976,3383039487,MX +3383039488,3383042047,US +3383042048,3383701503,MX 3383701504,3383705599,BR 3383705600,3383754751,MX 3383754752,3384147967,AR @@ -120760,7 +121727,9 @@ 3389366272,3389374463,AU 3389374464,3389378559,MN 3389378560,3389381631,CN -3389381632,3389382655,JP +3389381632,3389382143,JP +3389382144,3389382399,AQ +3389382400,3389382655,JP 3389382656,3389390847,TW 3389390848,3389391359,HK 3389391360,3389391615,VN @@ -121954,7 +122923,6 @@ 3392926720,3392927231,IN 3392927232,3392927743,AU 3392927744,3392927999,IN -3392928000,3392928255,HK 3392928256,3392928767,TW 3392928768,3392929279,VN 3392929280,3392929535,PK @@ -122151,7 +123119,9 @@ 3393620992,3393621247,JP 3393621248,3393622015,AU 3393622016,3393626111,PK -3393626112,3393630207,HK +3393626112,3393629523,HK +3393629524,3393629525,MO +3393629526,3393630207,HK 3393630208,3393634303,JP 3393634304,3393638399,CN 3393638400,3393650687,JP @@ -122852,9 +123822,7 @@ 3397738496,3397742591,MY 3397742592,3397746687,JP 3397746688,3397763071,TH -3397763072,3397767679,SG -3397767680,3397768191,PH -3397768192,3397771263,SG +3397763072,3397771263,SG 3397771264,3397779455,TW 3397779456,3397781503,ID 3397781504,3397783551,BD @@ -123228,9 +124196,7 @@ 3399995392,3399999487,KR 3399999488,3400000475,JP 3400000476,3400000479,US -3400000480,3400002303,JP -3400002304,3400002367,HK -3400002368,3400003583,JP +3400000480,3400003583,JP 3400003584,3400005631,AU 3400005632,3400006143,JP 3400006400,3400007679,JP @@ -123383,9 +124349,7 @@ 3400648816,3400648831,HK 3400648832,3400649943,JP 3400649944,3400649951,HK -3400649952,3400650143,JP -3400650144,3400650159,HK -3400650160,3400650409,JP +3400649952,3400650409,JP 3400650410,3400650410,AU 3400650411,3400650751,JP 3400650752,3400654847,AU @@ -125225,7 +126189,9 @@ 3411058688,3411062783,AU 3411062784,3411064831,HK 3411064832,3411065087,BD -3411065088,3411085311,HK +3411065088,3411065855,HK +3411065856,3411066879,BD +3411066880,3411085311,HK 3411085312,3411086335,KR 3411086336,3411087359,JP 3411087360,3411091455,CN @@ -126691,7 +127657,9 @@ 3423311872,3423313151,VI 3423313152,3423313407,US 3423313408,3423313919,VI -3423313920,3423366479,US +3423313920,3423329567,US +3423329568,3423329599,IL +3423329600,3423366479,US 3423366480,3423366495,IT 3423366496,3423371263,US 3423371264,3423375359,ZA @@ -126712,7 +127680,11 @@ 3423533056,3423535103,AI 3423535104,3423543295,US 3423543296,3423545343,CA -3423545344,3423571967,US +3423545344,3423552767,US +3423552768,3423553023,GB +3423553024,3423553279,US +3423553280,3423553535,GB +3423553536,3423571967,US 3423571968,3423574015,PR 3423574016,3423579135,US 3423579136,3423580159,CA @@ -127491,7 +128463,9 @@ 3438542848,3438608383,CA 3438608384,3438610125,US 3438610126,3438610126,DE -3438610127,3438610408,US +3438610127,3438610325,US +3438610326,3438610326,GB +3438610327,3438610408,US 3438610409,3438610410,GB 3438610411,3438611455,US 3438611456,3438611711,GB @@ -127673,9 +128647,7 @@ 3450093056,3450093311,CH 3450093312,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 @@ -127789,7 +128761,9 @@ 3452174336,3452436479,US 3452436480,3452502015,CA 3452502016,3452506111,HK -3452506112,3452658431,US +3452506112,3452516095,US +3452516096,3452516351,PL +3452516352,3452658431,US 3452658432,3452658687,HK 3452658688,3452678143,US 3452678400,3452715007,US @@ -128769,19 +129743,15 @@ 3464175360,3464180735,CA 3464180736,3464200703,US 3464200704,3464200959,AU -3464200960,3464201215,NZ -3464201216,3464201471,JP -3464201472,3464201727,GR -3464201728,3464201983,EG -3464201984,3464202495,CA -3464202496,3464202751,FR -3464202752,3464203007,IT +3464200960,3464202239,US +3464202240,3464202495,CA +3464202496,3464203007,US 3464203008,3464203263,SE 3464203264,3464203519,DE 3464203520,3464204799,US 3464204800,3464205311,NL 3464205312,3464205567,SE -3464205568,3464205823,VE +3464205568,3464205823,US 3464205824,3464205951,AF 3464205952,3464206079,UZ 3464206080,3464206207,TJ @@ -128824,9 +129794,23 @@ 3464426752,3464429311,US 3464429312,3464429567,CA 3464429568,3464548351,US -3464548352,3464548607,AG -3464548608,3464548863,LC -3464548864,3464549119,KN +3464548352,3464548671,AG +3464548672,3464548679,LC +3464548680,3464548687,AG +3464548688,3464548695,LC +3464548696,3464548703,AG +3464548704,3464548711,LC +3464548712,3464548751,AG +3464548752,3464548767,LC +3464548768,3464548783,AG +3464548784,3464548787,LC +3464548788,3464548807,AG +3464548808,3464548815,LC +3464548816,3464548831,AG +3464548832,3464548839,LC +3464548840,3464548847,AG +3464548848,3464548855,LC +3464548856,3464549119,AG 3464549120,3464549375,VG 3464549376,3464549439,AG 3464549440,3464549503,MS @@ -129209,7 +130193,8 @@ 3469989888,3469990399,CA 3469990400,3470131199,US 3470131200,3470135295,AG -3470135296,3470137343,LC +3470135296,3470136319,LC +3470136320,3470137343,AG 3470137344,3470139391,VG 3470139392,3470153727,US 3470153728,3470153983,IN @@ -129727,8 +130712,8 @@ 3482779648,3482910719,US 3482910720,3482927103,CA 3482927104,3483025407,US -3483025408,3483029503,DE -3483029504,3483435007,US +3483025408,3483033599,DE +3483033600,3483435007,US 3483435008,3483533311,CA 3483533312,3483631615,US 3483631616,3483697151,CA @@ -130128,7 +131113,9 @@ 3487862016,3487875071,BM 3487875072,3487891455,US 3487891456,3487907839,CA -3487907840,3487969791,US +3487907840,3487913471,US +3487913472,3487913983,CA +3487913984,3487969791,US 3487969792,3487970047,KW 3487970048,3488014335,US 3488014336,3488022527,CA @@ -130455,7 +131442,9 @@ 3494655744,3494655759,GB 3494655760,3494660095,US 3494660096,3494661119,CA -3494661120,3494668287,US +3494661120,3494664191,US +3494664192,3494665215,CA +3494665216,3494668287,US 3494668288,3494670335,CA 3494670336,3494712319,US 3494712320,3494712575,CA @@ -131075,17 +132064,7 @@ 3509166080,3509215231,US 3509215232,3509223423,CA 3509223424,3509239807,US -3509239808,3509242879,NL -3509242880,3509243135,US -3509243136,3509244159,NL -3509244160,3509244415,US -3509244416,3509245231,NL -3509245232,3509245239,US -3509245240,3509245279,NL -3509245280,3509245295,US -3509245296,3509249279,NL -3509249280,3509249535,US -3509249536,3509256191,NL +3509239808,3509256191,NL 3509256192,3509305599,US 3509305600,3509305615,GB 3509305616,3509346303,US @@ -131202,9 +132181,7 @@ 3509583616,3509583871,CA 3509583872,3509731327,US 3509731328,3509739519,CA -3509739520,3509827583,US -3509827584,3509827591,SG -3509827592,3509828095,US +3509739520,3509828095,US 3509828096,3509828159,CA 3509828160,3509846015,US 3509846016,3509977087,CA @@ -131694,9 +132671,7 @@ 3518062592,3518066687,CA 3518066688,3518075647,US 3518075648,3518075903,AU -3518075904,3518076079,US -3518076080,3518076087,AU -3518076088,3518076671,US +3518075904,3518076671,US 3518076672,3518076927,PA 3518076928,3518374719,US 3518374720,3518374783,IN @@ -132145,7 +133120,9 @@ 3524827552,3524827615,JP 3524827616,3524828127,SG 3524828128,3524828159,JP -3524828160,3524828927,SG +3524828160,3524828415,SG +3524828416,3524828671,JP +3524828672,3524828927,SG 3524828928,3524829183,JP 3524829184,3524829439,SG 3524829440,3524829695,JP @@ -132237,14 +133214,15 @@ 3527004160,3527008255,ID 3527008256,3527016447,KR 3527016448,3527249919,TW -3527249920,3527254015,CN +3527249920,3527250943,CN +3527250944,3527251455,TW +3527251456,3527254015,CN 3527254016,3527933951,TW 3527933952,3528392703,CN 3528392704,3528396799,JP 3528396800,3528400895,AU 3528400896,3528404991,JP 3528404992,3528407039,NZ -3528407040,3528409087,AU 3528409088,3528425471,CN 3528441856,3528445951,JP 3528445952,3528450047,ID @@ -132411,7 +133389,7 @@ 3556990976,3556999167,UA 3556999168,3557007359,RU 3557007360,3557015551,IT -3557015552,3557023743,DE +3557015552,3557023743,LV 3557023744,3557031935,BE 3557031936,3557040127,IT 3557040128,3557048319,NO @@ -132468,7 +133446,7 @@ 3557339164,3557339164,BE 3557343232,3557351423,DE 3557351424,3557356543,RU -3557356544,3557357311,UA +3557356544,3557357311,NL 3557357312,3557359615,RU 3557359616,3557359991,JE 3557359992,3557359999,GB @@ -132633,8 +133611,8 @@ 3558260736,3558268927,UA 3558268928,3558275839,GI 3558275840,3558276095,HK -3558276096,3558276351,GI -3558276352,3558276863,GB +3558276096,3558276607,GI +3558276608,3558276863,GB 3558276864,3558277119,GI 3558277120,3558285951,GB 3558285952,3558286079,DE @@ -133639,13 +134617,11 @@ 3560943076,3560943079,ES 3560943080,3560943110,DE 3560943111,3560943111,ES -3560943112,3560943113,DE -3560943114,3560943115,ES +3560943112,3560943114,DE +3560943115,3560943115,ES 3560943116,3560943116,DK 3560943117,3560943117,IL -3560943118,3560943118,DE -3560943119,3560943119,IT -3560943120,3560943121,DE +3560943118,3560943121,DE 3560943122,3560943122,ES 3560943123,3560943125,DE 3560943126,3560943126,FR @@ -133663,7 +134639,7 @@ 3560943143,3560943145,HU 3560943146,3560943149,DE 3560943150,3560943150,ES -3560943151,3560943151,IT +3560943151,3560943151,DE 3560943152,3560943152,HU 3560943153,3560943154,DE 3560943155,3560943155,FR @@ -133684,7 +134660,7 @@ 3560943173,3560943173,BE 3560943174,3560943176,DE 3560943177,3560943177,CH -3560943178,3560943178,IT +3560943178,3560943178,DE 3560943179,3560943179,PL 3560943180,3560943180,GB 3560943181,3560943181,DE @@ -133742,15 +134718,15 @@ 3560943255,3560943255,GB 3560943256,3560943256,DE 3560943257,3560943257,ES -3560943258,3560943258,FR -3560943259,3560943259,DE +3560943258,3560943259,DE 3560943260,3560943260,ES 3560943261,3560943261,IE 3560943262,3560943262,DE 3560943263,3560943263,IT 3560943264,3560943264,CZ 3560943265,3560943267,DE -3560943268,3560943269,IT +3560943268,3560943268,IT +3560943269,3560943269,DE 3560943270,3560943270,GB 3560943271,3560943271,IT 3560943272,3560943272,ES @@ -133766,11 +134742,8 @@ 3560943284,3560943286,DE 3560943287,3560943287,NL 3560943288,3560943290,FR -3560943291,3560943292,IT -3560943293,3560943293,DE -3560943294,3560943294,IT -3560943295,3560943295,DE -3560943296,3560943296,RU +3560943291,3560943291,IT +3560943292,3560943296,DE 3560943297,3560943297,ES 3560943298,3560943298,FR 3560943299,3560943299,GB @@ -133779,18 +134752,16 @@ 3560943302,3560943302,ES 3560943303,3560943303,IT 3560943304,3560943304,FR -3560943305,3560943309,DE -3560943310,3560943311,IT +3560943305,3560943310,DE +3560943311,3560943311,IT 3560943312,3560943312,PL 3560943313,3560943313,DE 3560943314,3560943314,ES 3560943315,3560943315,IT -3560943316,3560943316,GB +3560943316,3560943316,DE 3560943317,3560943317,IT 3560943318,3560943318,CH -3560943319,3560943320,DE -3560943321,3560943321,GB -3560943322,3560943322,DE +3560943319,3560943322,DE 3560943323,3560943323,NL 3560943324,3560943324,DE 3560943325,3560943325,CH @@ -133806,7 +134777,7 @@ 3560943342,3560943342,ES 3560943343,3560943343,FR 3560943344,3560943344,NL -3560943345,3560943345,CH +3560943345,3560943345,DE 3560943346,3560943346,IT 3560943347,3560943347,ES 3560943348,3560943348,FR @@ -133820,19 +134791,18 @@ 3560943358,3560943358,BE 3560943359,3560943361,DE 3560943362,3560943362,GB -3560943363,3560943365,DE -3560943366,3560943367,IT +3560943363,3560943366,DE +3560943367,3560943367,IT 3560943368,3560943368,DE 3560943369,3560943369,GR -3560943370,3560943370,DE -3560943371,3560943371,AT +3560943370,3560943371,DE 3560943372,3560943372,FR 3560943373,3560943375,DE 3560943376,3560943376,ES 3560943377,3560943377,GB 3560943378,3560943378,DE -3560943379,3560943380,ES -3560943381,3560943383,DE +3560943379,3560943379,ES +3560943380,3560943383,DE 3560943384,3560943384,FR 3560943385,3560943385,ES 3560943386,3560943386,CH @@ -133843,7 +134813,7 @@ 3560943395,3560943395,NL 3560943396,3560943397,DE 3560943398,3560943398,BE -3560943399,3560943399,CH +3560943399,3560943399,DE 3560943400,3560943400,IT 3560943401,3560943401,DE 3560943402,3560943402,NL @@ -133872,9 +134842,7 @@ 3560943427,3560943427,FR 3560943428,3560943428,NO 3560943429,3560943430,NL -3560943431,3560943433,DE -3560943434,3560943434,SE -3560943435,3560943435,DE +3560943431,3560943435,DE 3560943436,3560943436,FR 3560943437,3560943437,ES 3560943438,3560943438,FR @@ -133883,8 +134851,7 @@ 3560943441,3560943441,DE 3560943442,3560943442,ES 3560943443,3560943443,BE -3560943444,3560943444,CH -3560943445,3560943446,DE +3560943444,3560943446,DE 3560943447,3560943447,GB 3560943448,3560943450,DE 3560943451,3560943451,PL @@ -133907,7 +134874,7 @@ 3560943472,3560943472,BE 3560943473,3560943473,AT 3560943474,3560943474,CH -3560943475,3560943475,ES +3560943475,3560943475,DE 3560943476,3560943476,BE 3560943477,3560943477,DE 3560943478,3560943478,IT @@ -133924,25 +134891,19 @@ 3560943493,3560943493,FR 3560943494,3560943494,GB 3560943495,3560943495,IT -3560943496,3560943500,DE -3560943501,3560943501,ES -3560943502,3560943510,DE +3560943496,3560943510,DE 3560943511,3560943511,IT 3560943512,3560943512,DE 3560943513,3560943513,LU 3560943514,3560943515,ES -3560943516,3560943517,DE -3560943518,3560943518,LU -3560943519,3560943519,DE +3560943516,3560943519,DE 3560943520,3560943520,DK 3560943521,3560943521,DE 3560943522,3560943522,GB 3560943523,3560943524,DE 3560943525,3560943525,NL 3560943526,3560943526,IT -3560943527,3560943527,DE -3560943528,3560943528,FR -3560943529,3560943529,DE +3560943527,3560943529,DE 3560943530,3560943530,CH 3560943531,3560943532,DE 3560943533,3560943533,HU @@ -133963,8 +134924,7 @@ 3560943549,3560943549,DE 3560943550,3560943550,HU 3560943551,3560943551,FR -3560943552,3560943552,IT -3560943553,3560943553,DE +3560943552,3560943553,DE 3560943554,3560943554,IS 3560943555,3560943555,FR 3560943556,3560943556,DE @@ -133973,9 +134933,7 @@ 3560943559,3560943559,GB 3560943560,3560943562,IT 3560943563,3560943563,HU -3560943564,3560943564,DE -3560943565,3560943565,GB -3560943566,3560943566,DE +3560943564,3560943566,DE 3560943567,3560943567,FR 3560943568,3560943568,GB 3560943569,3560943570,FR @@ -133995,8 +134953,7 @@ 3560943586,3560943586,ES 3560943587,3560943587,DE 3560943588,3560943588,IT -3560943589,3560943589,NL -3560943590,3560943590,DE +3560943589,3560943590,DE 3560943591,3560943591,AT 3560943592,3560943592,SK 3560943593,3560943593,PL @@ -134004,7 +134961,8 @@ 3560943595,3560943596,ES 3560943597,3560943599,DE 3560943600,3560943600,AT -3560943601,3560943602,IT +3560943601,3560943601,DE +3560943602,3560943602,IT 3560943603,3560943603,DE 3560943604,3560943604,ES 3560943605,3560943605,GB @@ -134027,24 +134985,21 @@ 3560943629,3560943629,IT 3560943630,3560943630,DE 3560943631,3560943631,HU -3560943632,3560943632,CH +3560943632,3560943632,DE 3560943633,3560943633,ES 3560943634,3560943634,FR -3560943635,3560943635,ES -3560943636,3560943636,DE +3560943635,3560943636,DE 3560943637,3560943637,PL 3560943638,3560943638,DE 3560943639,3560943639,ES 3560943640,3560943640,FR -3560943641,3560943641,DE -3560943642,3560943643,IT +3560943641,3560943642,DE +3560943643,3560943643,IT 3560943644,3560943644,DE 3560943645,3560943645,GB 3560943646,3560943646,DE 3560943647,3560943647,ES -3560943648,3560943648,DE -3560943649,3560943649,NL -3560943650,3560943651,DE +3560943648,3560943651,DE 3560943652,3560943652,AT 3560943653,3560943653,DE 3560943654,3560943654,IT @@ -134076,8 +135031,7 @@ 3560943687,3560943687,PT 3560943688,3560943688,DE 3560943689,3560943689,PT -3560943690,3560943690,IT -3560943691,3560943691,DE +3560943690,3560943691,DE 3560943692,3560943692,SE 3560943693,3560943693,DE 3560943694,3560943694,FR @@ -134109,12 +135063,9 @@ 3560943729,3560943729,DE 3560943730,3560943730,NL 3560943731,3560943731,IT -3560943732,3560943732,DE -3560943733,3560943733,NO -3560943734,3560943736,DE +3560943732,3560943736,DE 3560943737,3560943737,GR -3560943738,3560943738,PT -3560943739,3560943740,DE +3560943738,3560943740,DE 3560943741,3560943741,FR 3560943742,3560943742,DE 3560943743,3560943743,PL @@ -134149,9 +135100,7 @@ 3560943781,3560943781,ES 3560943782,3560943782,DE 3560943783,3560943783,BE -3560943784,3560943786,DE -3560943787,3560943787,ES -3560943788,3560943788,DE +3560943784,3560943788,DE 3560943789,3560943789,IT 3560943790,3560943790,DE 3560943791,3560943791,IT @@ -134159,12 +135108,10 @@ 3560943794,3560943794,FR 3560943795,3560943795,DE 3560943796,3560943796,IT -3560943797,3560943797,DE -3560943798,3560943798,DK -3560943799,3560943800,DE +3560943797,3560943800,DE 3560943801,3560943801,FR 3560943802,3560943802,IT -3560943803,3560943803,HU +3560943803,3560943803,DE 3560943804,3560943804,ES 3560943805,3560943805,DE 3560943806,3560943806,ES @@ -134172,9 +135119,7 @@ 3560943811,3560943811,ES 3560943812,3560943812,IT 3560943813,3560943813,CH -3560943814,3560943814,DE -3560943815,3560943815,IT -3560943816,3560943816,DE +3560943814,3560943816,DE 3560943817,3560943817,FR 3560943818,3560943818,PT 3560943819,3560943819,DE @@ -134186,19 +135131,18 @@ 3560943828,3560943828,ES 3560943829,3560943829,NL 3560943830,3560943830,DE -3560943831,3560943833,FR +3560943831,3560943831,FR +3560943832,3560943832,DE +3560943833,3560943833,FR 3560943834,3560943836,DE 3560943837,3560943837,CH -3560943838,3560943838,DE -3560943839,3560943839,NO -3560943840,3560943840,DE +3560943838,3560943840,DE 3560943841,3560943841,GB 3560943842,3560943842,DE 3560943843,3560943843,GB 3560943844,3560943844,BE 3560943845,3560943845,CZ -3560943846,3560943846,LU -3560943847,3560943847,CZ +3560943846,3560943847,DE 3560943848,3560943848,FR 3560943849,3560943849,DE 3560943850,3560943850,NL @@ -134208,8 +135152,7 @@ 3560943860,3560943860,GB 3560943861,3560943865,DE 3560943866,3560943866,BE -3560943867,3560943867,ES -3560943868,3560943868,DE +3560943867,3560943868,DE 3560943869,3560943869,LU 3560943870,3560943871,DE 3560943872,3560943875,BR @@ -134882,7 +135825,8 @@ 3561316352,3561324543,RU 3561324544,3561325567,IT 3561325568,3561326591,CH -3561326592,3561332735,IT +3561326592,3561328639,IT +3561328640,3561332735,US 3561332736,3561340927,AT 3561340928,3561357311,GB 3561357312,3561365503,DK @@ -135063,7 +136007,7 @@ 3562414080,3562422271,DE 3562422272,3562430463,IR 3562430464,3562431231,UA -3562431232,3562431487,BZ +3562431232,3562431487,RU 3562431488,3562438655,UA 3562438656,3562463231,DE 3562463232,3562471423,UA @@ -136221,13 +137165,13 @@ 3572346880,3572348927,DK 3572348928,3572350975,RS 3572350976,3572355071,SE -3572355072,3572356095,DK +3572355072,3572356095,CH 3572356096,3572357119,GB 3572357120,3572358143,NL 3572358144,3572360191,GB 3572360192,3572361215,ES 3572361216,3572362239,LT -3572362240,3572363263,DK +3572362240,3572363263,ES 3572363264,3572364287,RS 3572364288,3572365311,DE 3572365312,3572366335,DK @@ -136382,13 +137326,17 @@ 3575648224,3575648255,PT 3575648256,3575652991,FR 3575652992,3575653119,GB -3575653120,3575653759,FR +3575653120,3575653711,FR +3575653712,3575653727,ES +3575653728,3575653759,FR 3575653760,3575653887,ES 3575653888,3575655039,FR 3575655040,3575655103,ES 3575655104,3575655615,FR 3575655616,3575655623,IE -3575655624,3575656287,FR +3575655624,3575655863,FR +3575655864,3575655867,ES +3575655868,3575656287,FR 3575656288,3575656319,PT 3575656320,3575657087,FR 3575657088,3575657215,ES @@ -136402,7 +137350,8 @@ 3575659168,3575659183,FI 3575659184,3575659863,FR 3575659864,3575659867,GB -3575659868,3575660159,FR +3575659868,3575660155,FR +3575660156,3575660159,GB 3575660160,3575660223,ES 3575660224,3575660351,FR 3575660352,3575660415,PT @@ -136899,13 +137848,11 @@ 3580039168,3580039199,NL 3580039200,3580039231,AT 3580039232,3580100607,ES -3580100608,3580102143,LV -3580102144,3580103167,SE -3580103168,3580108799,LV +3580100608,3580108799,LV 3580108800,3580112895,SE 3580112896,3580116991,LV -3580116992,3580131327,SE -3580131328,3580134399,LV +3580116992,3580129279,SE +3580129280,3580134399,LV 3580134400,3580135423,SE 3580135424,3580135935,EE 3580135936,3580136447,SE @@ -136931,7 +137878,9 @@ 3580215296,3580217343,EE 3580217344,3580219391,SE 3580219392,3580221951,LV -3580221952,3580231935,SE +3580221952,3580223487,SE +3580223488,3580231679,LV +3580231680,3580231935,SE 3580231936,3580232191,LV 3580232192,3580232447,SE 3580232448,3580233215,LT @@ -136946,10 +137895,8 @@ 3580244992,3580246015,LT 3580246016,3580248063,LV 3580248064,3580254207,EE -3580254208,3580255231,LV -3580255232,3580258303,SE -3580258304,3580258559,LV -3580258560,3580260351,SE +3580254208,3580259327,LV +3580259328,3580260351,SE 3580260352,3580265471,AT 3580265472,3580265727,SE 3580265728,3580268543,EE @@ -137090,7 +138037,9 @@ 3582287872,3582296063,DE 3582296064,3582304255,GB 3582304256,3582312447,UA -3582312448,3582313855,JE +3582312448,3582313551,JE +3582313552,3582313559,GB +3582313560,3582313855,JE 3582313856,3582313871,GB 3582313872,3582320639,JE 3582320640,3582328831,CH @@ -137160,9 +138109,7 @@ 3582861312,3582869503,RU 3582869504,3582877695,NO 3582877696,3582885887,AT -3582885888,3582892031,TR -3582892032,3582892543,US -3582892544,3582894079,TR +3582885888,3582894079,TR 3582894080,3582902271,CH 3582902272,3582910463,RU 3582910464,3582916607,SI @@ -137690,9 +138637,7 @@ 3586544268,3586544271,DK 3586544272,3586544383,DE 3586544384,3586544511,DK -3586544512,3586547711,DE -3586547712,3586547967,NL -3586547968,3586555903,DE +3586544512,3586555903,DE 3586555904,3586572287,IT 3586572288,3586585215,RS 3586585216,3586585223,XK @@ -138011,9 +138956,13 @@ 3589341184,3589373951,PL 3589373952,3589390335,DE 3589390336,3589423103,RU -3589423104,3589430591,GB +3589423104,3589425011,GB +3589425012,3589425015,PT +3589425016,3589430591,GB 3589430592,3589430655,ES -3589430656,3589433343,GB +3589430656,3589431311,GB +3589431312,3589431327,PT +3589431328,3589433343,GB 3589433344,3589435391,IE 3589435392,3589435759,GB 3589435760,3589435763,ES @@ -138103,7 +139052,14 @@ 3590009264,3590009279,DE 3590009280,3590012927,GB 3590012928,3590029311,BE -3590029312,3590045695,FR +3590029312,3590032159,FR +3590032160,3590032175,ES +3590032176,3590032191,GB +3590032192,3590032271,FR +3590032272,3590032295,PT +3590032296,3590032319,FR +3590032320,3590032351,ES +3590032352,3590045695,FR 3590045696,3590062079,RU 3590062080,3590078463,DE 3590078464,3590094847,RU @@ -138772,7 +139728,9 @@ 3634053120,3634061311,CL 3634061312,3634094079,US 3634094080,3634098175,SE -3634098176,3634286079,US +3634098176,3634257919,US +3634257920,3634262015,SE +3634262016,3634286079,US 3634286080,3634286335,CA 3634286336,3634288895,US 3634288896,3634289151,CA @@ -138807,9 +139765,13 @@ 3635142656,3635146751,CA 3635146752,3635159039,US 3635159040,3635163135,CA -3635163136,3635171071,US +3635163136,3635167743,US +3635167744,3635167999,GB +3635168000,3635171071,US 3635171072,3635171327,CA -3635171328,3635314687,US +3635171328,3635187967,US +3635187968,3635188223,CN +3635188224,3635314687,US 3635314688,3635322879,CA 3635322880,3635466239,US 3635466240,3635470335,CA @@ -138965,9 +139927,7 @@ 3636822016,3636854783,CA 3636854784,3636887551,US 3636887552,3636895743,CA -3636895744,3636909055,US -3636909056,3636909311,CA -3636909312,3636914175,US +3636895744,3636914175,US 3636914176,3636914431,CA 3636914432,3636918527,US 3636918528,3636918783,CA @@ -139112,7 +140072,6 @@ 3639692288,3639704573,US 3639704574,3639704574,GB 3639704575,3639730175,US -3639730176,3639734271,CA 3639734272,3639736575,US 3639736576,3639736831,HK 3639736832,3639737343,US @@ -139381,8 +140340,10 @@ 3642036224,3642040319,HU 3642040320,3642048511,BY 3642048512,3642048767,IL -3642048768,3642049023,DE -3642049024,3642056703,GB +3642048768,3642049535,GB +3642049536,3642049791,SE +3642049792,3642050047,FI +3642050048,3642056703,GB 3642056704,3642060799,RU 3642060800,3642064895,KE 3642064896,3642068991,IT @@ -139527,12 +140488,10 @@ 3642535936,3642540031,IS 3642540032,3642544127,SE 3642544128,3642552319,RU -3642552320,3642553935,UA -3642553936,3642553936,RU +3642552320,3642553855,UA +3642553856,3642553936,RU 3642553937,3642553937,US -3642553938,3642553951,RU -3642553952,3642554111,UA -3642554112,3642554367,RU +3642553938,3642554367,RU 3642554368,3642554623,LT 3642554624,3642554720,UA 3642554721,3642554721,LV @@ -139897,7 +140856,8 @@ 3645763627,3645763627,AT 3645763628,3645763629,DE 3645763630,3645763631,NL -3645763632,3645763633,GB +3645763632,3645763632,GB +3645763633,3645763633,DE 3645763634,3645763634,NL 3645763635,3645763635,DE 3645763636,3645763636,AT @@ -139918,23 +140878,16 @@ 3645763655,3645763660,DE 3645763661,3645763662,FR 3645763663,3645763663,HU -3645763664,3645763665,DE -3645763666,3645763666,NL -3645763667,3645763670,DE +3645763664,3645763670,DE 3645763671,3645763671,FR 3645763672,3645763672,DE 3645763673,3645763673,BE 3645763674,3645763676,DE 3645763677,3645763678,HU 3645763679,3645763679,IT -3645763680,3645763680,DE -3645763681,3645763681,CH -3645763682,3645763682,DE -3645763683,3645763683,NO +3645763680,3645763683,DE 3645763684,3645763684,CH -3645763685,3645763685,NL -3645763686,3645763686,DE -3645763687,3645763687,ES +3645763685,3645763687,DE 3645763688,3645763690,NL 3645763691,3645763691,CH 3645763692,3645763692,DE @@ -139966,7 +140919,8 @@ 3645763724,3645763726,IT 3645763727,3645763727,NL 3645763728,3645763728,GR -3645763729,3645763730,IT +3645763729,3645763729,DE +3645763730,3645763730,IT 3645763731,3645763732,DE 3645763733,3645763733,FR 3645763734,3645763734,DE @@ -139975,16 +140929,16 @@ 3645763737,3645763737,DE 3645763738,3645763738,CH 3645763739,3645763740,ES -3645763741,3645763742,DE -3645763743,3645763743,IT -3645763744,3645763746,DE -3645763747,3645763752,NL -3645763753,3645763753,ES +3645763741,3645763746,DE +3645763747,3645763750,NL +3645763751,3645763751,DE +3645763752,3645763752,NL +3645763753,3645763753,DE 3645763754,3645763755,NL -3645763756,3645763756,DE -3645763757,3645763757,BE +3645763756,3645763757,DE 3645763758,3645763758,FR -3645763759,3645763760,NL +3645763759,3645763759,DE +3645763760,3645763760,NL 3645763761,3645763761,SE 3645763762,3645763762,ES 3645763763,3645763763,DE @@ -139995,14 +140949,11 @@ 3645763769,3645763769,FR 3645763770,3645763770,NL 3645763771,3645763771,GB -3645763772,3645763772,CH -3645763773,3645763773,DE +3645763772,3645763773,DE 3645763774,3645763774,NL 3645763775,3645763775,DE 3645763776,3645763776,NL -3645763777,3645763781,DE -3645763782,3645763782,NL -3645763783,3645763783,DE +3645763777,3645763783,DE 3645763784,3645763784,NL 3645763785,3645763785,DE 3645763786,3645763786,CH @@ -140142,8 +141093,7 @@ 3645763974,3645763974,GB 3645763975,3645763975,AT 3645763976,3645763976,IT -3645763977,3645763977,DE -3645763978,3645763978,NL +3645763977,3645763978,DE 3645763979,3645763979,IT 3645763980,3645763981,DE 3645763982,3645763982,IT @@ -140158,21 +141108,20 @@ 3645763995,3645763995,ES 3645763996,3645764000,DE 3645764001,3645764001,IT -3645764002,3645764008,DE -3645764009,3645764010,FR +3645764002,3645764009,DE +3645764010,3645764010,FR 3645764011,3645764012,DE 3645764013,3645764013,HU 3645764014,3645764015,GB 3645764016,3645764016,IT 3645764017,3645764017,GB -3645764018,3645764018,DE -3645764019,3645764019,NL +3645764018,3645764019,DE 3645764020,3645764020,IT 3645764021,3645764021,DE 3645764022,3645764022,ES 3645764023,3645764023,FR -3645764024,3645764026,ES -3645764027,3645764028,DE +3645764024,3645764025,ES +3645764026,3645764028,DE 3645764029,3645764029,ES 3645764030,3645764030,DE 3645764031,3645764031,NL @@ -140188,8 +141137,7 @@ 3645764043,3645764043,DE 3645764044,3645764044,ES 3645764045,3645764045,AE -3645764046,3645764046,ES -3645764047,3645764048,DE +3645764046,3645764048,DE 3645764049,3645764049,ES 3645764050,3645764051,DE 3645764052,3645764052,FR @@ -140981,7 +141929,9 @@ 3649372160,3649437695,IT 3649437696,3649470463,GB 3649470464,3649471487,SG -3649471488,3649472511,HK +3649471488,3649471999,HK +3649472000,3649472007,GB +3649472008,3649472511,HK 3649472512,3649512191,GB 3649512192,3649512447,FR 3649512448,3649568767,GB @@ -141359,9 +142309,7 @@ 3652096000,3652100095,BG 3652100096,3652108287,RU 3652108288,3652116479,FR -3652116480,3652119807,TM -3652119808,3652120063,RU -3652120064,3652120575,TM +3652116480,3652120575,TM 3652120576,3652124671,GB 3652124672,3652128767,UA 3652128768,3652136959,RU diff --git a/src/config/geoip6 b/src/config/geoip6 index 1f1430e4c6..6c1168418c 100644 --- a/src/config/geoip6 +++ b/src/config/geoip6 @@ -1,4 +1,4 @@ -# Last updated based on December 7 2016 Maxmind GeoLite2 Country +# Last updated based on January 4 2017 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 @@ -274,7 +274,9 @@ 2001:470:7147:8000::,2001:470:7147:ffff:ffff:ffff:ffff:ffff,RU 2001:470:7148::,2001:470:7170:ffff:ffff:ffff:ffff:ffff,US 2001:470:7171::,2001:470:7171:ffff:ffff:ffff:ffff:ffff,DE -2001:470:7172::,2001:470:7286:ffff:ffff:ffff:ffff:ffff,US +2001:470:7172::,2001:470:7271:ffff:ffff:ffff:ffff:ffff,US +2001:470:7272::,2001:470:7272:ffff:ffff:ffff:ffff:ffff,DE +2001:470:7273::,2001:470:7286:ffff:ffff:ffff:ffff:ffff,US 2001:470:7287::,2001:470:7287:ffff:ffff:ffff:ffff:ffff,PL 2001:470:7288::,2001:470:7309:ffff:ffff:ffff:ffff:ffff,US 2001:470:730a::,2001:470:730a:7fff:ffff:ffff:ffff:ffff,DE @@ -619,7 +621,6 @@ 2001:678:e4::,2001:678:e4:ffff:ffff:ffff:ffff:ffff,SE 2001:678:e8::,2001:678:e8:ffff:ffff:ffff:ffff:ffff,CZ 2001:678:ec::,2001:678:ec:ffff:ffff:ffff:ffff:ffff,RU -2001:678:f0::,2001:678:f0:ffff:ffff:ffff:ffff:ffff,SE 2001:678:f4::,2001:678:f4:ffff:ffff:ffff:ffff:ffff,RU 2001:678:f8::,2001:678:f8:ffff:ffff:ffff:ffff:ffff,DE 2001:678:fc::,2001:678:fc:ffff:ffff:ffff:ffff:ffff,LT @@ -745,6 +746,30 @@ 2001:678:2e0::,2001:678:2e0:ffff:ffff:ffff:ffff:ffff,DE 2001:678:2e4::,2001:678:2e4:ffff:ffff:ffff:ffff:ffff,NL 2001:678:2e8::,2001:678:2e8:ffff:ffff:ffff:ffff:ffff,RU +2001:678:2ec::,2001:678:2ec:ffff:ffff:ffff:ffff:ffff,RU +2001:678:2f0::,2001:678:2f0:ffff:ffff:ffff:ffff:ffff,RU +2001:678:2f4::,2001:678:2f4:ffff:ffff:ffff:ffff:ffff,IL +2001:678:2f8::,2001:678:2f8:ffff:ffff:ffff:ffff:ffff,DE +2001:678:2fc::,2001:678:2fc:ffff:ffff:ffff:ffff:ffff,GB +2001:678:300::,2001:678:303:ffff:ffff:ffff:ffff:ffff,DE +2001:678:310::,2001:678:310:ffff:ffff:ffff:ffff:ffff,CH +2001:678:314::,2001:678:314:ffff:ffff:ffff:ffff:ffff,RO +2001:678:318::,2001:678:318:ffff:ffff:ffff:ffff:ffff,UA +2001:678:31c::,2001:678:31c:ffff:ffff:ffff:ffff:ffff,UA +2001:678:320::,2001:678:320:ffff:ffff:ffff:ffff:ffff,CZ +2001:678:324::,2001:678:324:ffff:ffff:ffff:ffff:ffff,LV +2001:678:328::,2001:678:328:ffff:ffff:ffff:ffff:ffff,CH +2001:678:32c::,2001:678:32c:ffff:ffff:ffff:ffff:ffff,GB +2001:678:330::,2001:678:330:ffff:ffff:ffff:ffff:ffff,SE +2001:678:334::,2001:678:334:ffff:ffff:ffff:ffff:ffff,UA +2001:678:338::,2001:678:338:ffff:ffff:ffff:ffff:ffff,DE +2001:678:33c::,2001:678:33c:ffff:ffff:ffff:ffff:ffff,DK +2001:678:340::,2001:678:340:ffff:ffff:ffff:ffff:ffff,DE +2001:678:344::,2001:678:344:ffff:ffff:ffff:ffff:ffff,RU +2001:678:348::,2001:678:348:ffff:ffff:ffff:ffff:ffff,NL +2001:678:34c::,2001:678:34c:ffff:ffff:ffff:ffff:ffff,US +2001:678:350::,2001:678:350:ffff:ffff:ffff:ffff:ffff,RU +2001:678:354::,2001:678:354:ffff:ffff:ffff:ffff:ffff,RU 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 @@ -1041,7 +1066,6 @@ 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 @@ -1413,6 +1437,7 @@ 2001:67c:130c::,2001:67c:130c:ffff:ffff:ffff:ffff:ffff,SE 2001:67c:1310::,2001:67c:1310:ffff:ffff:ffff:ffff:ffff,GB 2001:67c:1314::,2001:67c:1314:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:1318::,2001:67c:1318:ffff:ffff:ffff:ffff:ffff,PL 2001:67c:131c::,2001:67c:131c:ffff:ffff:ffff:ffff:ffff,RU 2001:67c:1320::,2001:67c:1320:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:1324::,2001:67c:1324:ffff:ffff:ffff:ffff:ffff,UA @@ -1743,6 +1768,7 @@ 2001:67c:196c::,2001:67c:196c:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:1970::,2001:67c:1970:ffff:ffff:ffff:ffff:ffff,RU 2001:67c:1974::,2001:67c:1974:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:1978::,2001:67c:1978:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:197c::,2001:67c:197c:ffff:ffff:ffff:ffff:ffff,NO 2001:67c:1980::,2001:67c:1980:ffff:ffff:ffff:ffff:ffff,FR 2001:67c:1984::,2001:67c:1984:ffff:ffff:ffff:ffff:ffff,BG @@ -1804,7 +1830,6 @@ 2001:67c:1b7c::,2001:67c:1b7c:ffff:ffff:ffff:ffff:ffff,RU 2001:67c:1b80::,2001:67c:1b80:ffff:ffff:ffff:ffff:ffff,RU 2001:67c:1b84::,2001:67c:1b84:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1b88::,2001:67c:1b88:ffff:ffff:ffff:ffff:ffff,CZ 2001:67c:1b8c::,2001:67c:1b8c:ffff:ffff:ffff:ffff:ffff,PL 2001:67c:1b90::,2001:67c:1b90:ffff:ffff:ffff:ffff:ffff,PL 2001:67c:1b94::,2001:67c:1b94:ffff:ffff:ffff:ffff:ffff,UA @@ -2383,7 +2408,6 @@ 2001:67c:28f8::,2001:67c:28f8:ffff:ffff:ffff:ffff:ffff,LT 2001:67c:28fc::,2001:67c:28fc:ffff:ffff:ffff:ffff:ffff,NL 2001:67c:2900::,2001:67c:291f:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2980::,2001:67c:2980:ffff:ffff:ffff:ffff:ffff,NL 2001:67c:2984::,2001:67c:2984:ffff:ffff:ffff:ffff:ffff,CH 2001:67c:2988::,2001:67c:2989:ffff:ffff:ffff:ffff:ffff,TR 2001:67c:2990::,2001:67c:2990:ffff:ffff:ffff:ffff:ffff,GB @@ -2525,7 +2549,6 @@ 2001:67c:2bd0::,2001:67c:2bd0:ffff:ffff:ffff:ffff:ffff,SE 2001:67c:2bd4::,2001:67c:2bd4:ffff:ffff:ffff:ffff:ffff,SE 2001:67c:2bd8::,2001:67c:2bd8:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2bdc::,2001:67c:2bdc:ffff:ffff:ffff:ffff:ffff,PL 2001:67c:2be0::,2001:67c:2be0:ffff:ffff:ffff:ffff:ffff,PL 2001:67c:2be4::,2001:67c:2be4:ffff:ffff:ffff:ffff:ffff,PL 2001:67c:2bec::,2001:67c:2bec:ffff:ffff:ffff:ffff:ffff,PL @@ -3013,6 +3036,7 @@ 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:7fc::,2001:7fc:1:ffff:ffff:ffff:ffff:ffff,DE +2001:7fc:3::,2001:7fc:3:ffff:ffff:ffff:ffff:ffff,SE 2001:7fe::,2001:7fe:ffff:ffff:ffff:ffff:ffff:ffff,SE 2001:808::,2001:80f:ffff:ffff:ffff:ffff:ffff:ffff,PL 2001:810::,2001:810:ffff:ffff:ffff:ffff:ffff:ffff,FR @@ -3858,7 +3882,7 @@ 2001:df1:a800::,2001:df1:a800:ffff:ffff:ffff:ffff:ffff,SG 2001:df1:aa00::,2001:df1:aa00:ffff:ffff:ffff:ffff:ffff,ID 2001:df1:ac00::,2001:df1:ac00:ffff:ffff:ffff:ffff:ffff,HK -2001:df1:ae00::,2001:df1:ae00:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:ae00::,2001:df1:ae01:ffff:ffff:ffff:ffff:ffff,AU 2001:df1:b000::,2001:df1:b000:ffff:ffff:ffff:ffff:ffff,TH 2001:df1:b200::,2001:df1:b200:ffff:ffff:ffff:ffff:ffff,HK 2001:df1:b400::,2001:df1:b400:ffff:ffff:ffff:ffff:ffff,AU @@ -4328,7 +4352,6 @@ 2001:df5:7800::,2001:df5:7800:ffff:ffff:ffff:ffff:ffff,CN 2001:df5:7a00::,2001:df5:7a00:ffff:ffff:ffff:ffff:ffff,SG 2001:df5:7c00::,2001:df5:7c00:ffff:ffff:ffff:ffff:ffff,IN -2001:df5:7e00::,2001:df5:7e00:ffff:ffff:ffff:ffff:ffff,BD 2001:df5:8000::,2001:df5:8000:ffff:ffff:ffff:ffff:ffff,SG 2001:df5:8200::,2001:df5:8200:ffff:ffff:ffff:ffff:ffff,AU 2001:df5:8400::,2001:df5:8400:ffff:ffff:ffff:ffff:ffff,SG @@ -4454,6 +4477,7 @@ 2001:df6:8000::,2001:df6:8000:ffff:ffff:ffff:ffff:ffff,JP 2001:df6:8200::,2001:df6:8200:ffff:ffff:ffff:ffff:ffff,AU 2001:df6:8400::,2001:df6:8400:ffff:ffff:ffff:ffff:ffff,AU +2001:df6:8600::,2001:df6:8600:ffff:ffff:ffff:ffff:ffff,NZ 2001:df6:8800::,2001:df6:8800:ffff:ffff:ffff:ffff:ffff,AU 2001:df6:8a00::,2001:df6:8a00:ffff:ffff:ffff:ffff:ffff,ID 2001:df6:8c00::,2001:df6:8c00:ffff:ffff:ffff:ffff:ffff,TH @@ -4465,7 +4489,7 @@ 2001:df6:9800::,2001:df6:9800:ffff:ffff:ffff:ffff:ffff,AU 2001:df6:9a00::,2001:df6:9a00:ffff:ffff:ffff:ffff:ffff,TH 2001:df6:9c00::,2001:df6:9c00:ffff:ffff:ffff:ffff:ffff,TH -2001:df6:9e00::,2001:df6:9e00:ffff:ffff:ffff:ffff:ffff,IN +2001:df6:9e00::,2001:df6:9e01:ffff:ffff:ffff:ffff:ffff,IN 2001:df6:a000::,2001:df6:a000:ffff:ffff:ffff:ffff:ffff,JP 2001:df6:a200::,2001:df6:a200:ffff:ffff:ffff:ffff:ffff,BD 2001:df6:a400::,2001:df6:a400:ffff:ffff:ffff:ffff:ffff,SG @@ -4519,36 +4543,69 @@ 2001:df7:800::,2001:df7:800:ffff:ffff:ffff:ffff:ffff,IN 2001:df7:a00::,2001:df7:a00:ffff:ffff:ffff:ffff:ffff,ID 2001:df7:c00::,2001:df7:c00:ffff:ffff:ffff:ffff:ffff,TW +2001:df7:e00::,2001:df7:e00:ffff:ffff:ffff:ffff:ffff,NZ 2001:df7:1000::,2001:df7:1000:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:1200::,2001:df7:1200:ffff:ffff:ffff:ffff:ffff,AU 2001:df7:1400::,2001:df7:1400:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:1600::,2001:df7:1600:ffff:ffff:ffff:ffff:ffff,HK +2001:df7:1a00::,2001:df7:1a00:ffff:ffff:ffff:ffff:ffff,ID 2001:df7:1c00::,2001:df7:1c00:ffff:ffff:ffff:ffff:ffff,ID +2001:df7:1e00::,2001:df7:1e00:ffff:ffff:ffff:ffff:ffff,AU 2001:df7:2000::,2001:df7:2000:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:2200::,2001:df7:2200:ffff:ffff:ffff:ffff:ffff,TH 2001:df7:2400::,2001:df7:2400:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:2600::,2001:df7:2600:ffff:ffff:ffff:ffff:ffff,HK 2001:df7:2800::,2001:df7:2800:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:2a00::,2001:df7:2a00:ffff:ffff:ffff:ffff:ffff,AU 2001:df7:2c00::,2001:df7:2c00:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:2e00::,2001:df7:2e00:ffff:ffff:ffff:ffff:ffff,IN 2001:df7:3000::,2001:df7:3001:ffff:ffff:ffff:ffff:ffff,NZ +2001:df7:3200::,2001:df7:3200:ffff:ffff:ffff:ffff:ffff,AU 2001:df7:3400::,2001:df7:3400:ffff:ffff:ffff:ffff:ffff,ID +2001:df7:3600::,2001:df7:3600:ffff:ffff:ffff:ffff:ffff,ID 2001:df7:3800::,2001:df7:3800:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:3a00::,2001:df7:3a00:ffff:ffff:ffff:ffff:ffff,BD 2001:df7:3c00::,2001:df7:3c00:ffff:ffff:ffff:ffff:ffff,ID +2001:df7:3e00::,2001:df7:3e00:ffff:ffff:ffff:ffff:ffff,AU 2001:df7:4000::,2001:df7:4000:ffff:ffff:ffff:ffff:ffff,SG +2001:df7:4200::,2001:df7:4200:ffff:ffff:ffff:ffff:ffff,AU 2001:df7:4400::,2001:df7:4400:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:4600::,2001:df7:4600:ffff:ffff:ffff:ffff:ffff,IN 2001:df7:4800::,2001:df7:481f:ffff:ffff:ffff:ffff:ffff,JP +2001:df7:4a00::,2001:df7:4a00:ffff:ffff:ffff:ffff:ffff,IN 2001:df7:4c00::,2001:df7:4c00:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:4e00::,2001:df7:4e00:ffff:ffff:ffff:ffff:ffff,AU 2001:df7:5000::,2001:df7:5000:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:5200::,2001:df7:5200:ffff:ffff:ffff:ffff:ffff,NP 2001:df7:5400::,2001:df7:5400:ffff:ffff:ffff:ffff:ffff,ID +2001:df7:5600::,2001:df7:5600:ffff:ffff:ffff:ffff:ffff,JP +2001:df7:5a00::,2001:df7:5a00:ffff:ffff:ffff:ffff:ffff,ID 2001:df7:5c00::,2001:df7:5c00:ffff:ffff:ffff:ffff:ffff,HK +2001:df7:5e00::,2001:df7:5e00:ffff:ffff:ffff:ffff:ffff,AU 2001:df7:6000::,2001:df7:6000:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:6200::,2001:df7:6200:ffff:ffff:ffff:ffff:ffff,AU 2001:df7:6400::,2001:df7:6400:ffff:ffff:ffff:ffff:ffff,MY +2001:df7:6600::,2001:df7:6600:ffff:ffff:ffff:ffff:ffff,CN 2001:df7:6800::,2001:df7:6800:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:6a00::,2001:df7:6a00:ffff:ffff:ffff:ffff:ffff,AU 2001:df7:6c00::,2001:df7:6c00:ffff:ffff:ffff:ffff:ffff,ID +2001:df7:6e00::,2001:df7:6e00:ffff:ffff:ffff:ffff:ffff,IN 2001:df7:7000::,2001:df7:7000:ffff:ffff:ffff:ffff:ffff,HK +2001:df7:7200::,2001:df7:7200:ffff:ffff:ffff:ffff:ffff,ID 2001:df7:7400::,2001:df7:7400:ffff:ffff:ffff:ffff:ffff,ID +2001:df7:7600::,2001:df7:7600:ffff:ffff:ffff:ffff:ffff,AU 2001:df7:7800::,2001:df7:7800:ffff:ffff:ffff:ffff:ffff,JP +2001:df7:7a00::,2001:df7:7a00:ffff:ffff:ffff:ffff:ffff,ID 2001:df7:7c00::,2001:df7:7c00:ffff:ffff:ffff:ffff:ffff,TH +2001:df7:7e00::,2001:df7:7e00:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:8200::,2001:df7:8200:ffff:ffff:ffff:ffff:ffff,ID 2001:df7:8400::,2001:df7:8401:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:8600::,2001:df7:8600:ffff:ffff:ffff:ffff:ffff,ID 2001:df7:8800::,2001:df7:8800:ffff:ffff:ffff:ffff:ffff,ID +2001:df7:8a00::,2001:df7:8a00:ffff:ffff:ffff:ffff:ffff,IN 2001:df7:8c00::,2001:df7:8c00:ffff:ffff:ffff:ffff:ffff,MM -2001:df7:9400::,2001:df7:9400:ffff:ffff:ffff:ffff:ffff,HK +2001:df7:8e00::,2001:df7:8e00:ffff:ffff:ffff:ffff:ffff,ID +2001:df7:9400::,2001:df7:9400:ffff:ffff:ffff:ffff:ffff,US 2001:df7:9800::,2001:df7:9800:ffff:ffff:ffff:ffff:ffff,NZ 2001:df7:9c00::,2001:df7:9c00:ffff:ffff:ffff:ffff:ffff,AU 2001:df7:a000::,2001:df7:a000:ffff:ffff:ffff:ffff:ffff,AU @@ -5130,7 +5187,9 @@ 2001:41d0:a:7e09::,2001:41d0:a:7e09:ffff:ffff:ffff:ffff,PT 2001:41d0:a:7e0a::,2001:41d0:129:9bff:ffff:ffff:ffff:ffff,FR 2001:41d0:129:9c00::,2001:41d0:129:9cff:ffff:ffff:ffff:ffff,NL -2001:41d0:129:9d00::,2001:41d0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:41d0:129:9d00::,2001:41d0:1000:171a:ffff:ffff:ffff:ffff,FR +2001:41d0:1000:171b::,2001:41d0:1000:171b:ffff:ffff:ffff:ffff,DE +2001:41d0:1000:171c::,2001:41d0:ffff:ffff:ffff:ffff:ffff:ffff,FR 2001:41d8::,2001:41d8:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2001:41e0::,2001:41e0:ffff:ffff:ffff:ffff:ffff:ffff,CH 2001:41e8::,2001:41e8:ffff:ffff:ffff:ffff:ffff:ffff,GB @@ -5334,6 +5393,11 @@ 2001:43f8:c40::,2001:43f8:c40:ffff:ffff:ffff:ffff:ffff,KE 2001:43f8:c50::,2001:43f8:c50:ffff:ffff:ffff:ffff:ffff,EG 2001:43f8:c60::,2001:43f8:c61:ffff:ffff:ffff:ffff:ffff,GN +2001:43f8:c70::,2001:43f8:c70:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:c80::,2001:43f8:c80:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:c90::,2001:43f8:c90:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:ca0::,2001:43f8:ca0:ffff:ffff:ffff:ffff:ffff,CI +2001:43f8:cb0::,2001:43f8:cb0:ffff:ffff:ffff:ffff:ffff,KE 2001:43f8:e00::,2001:43f8:eff:ffff:ffff:ffff:ffff:ffff,MU 2001:4400::,2001:4403:ffff:ffff:ffff:ffff:ffff:ffff,NZ 2001:4408::,2001:4408:ffff:ffff:ffff:ffff:ffff:ffff,IN @@ -5659,7 +5723,6 @@ 2001:4d80::,2001:4d80:ffff:ffff:ffff:ffff:ffff:ffff,RO 2001:4d88::,2001:4d8f:ffff:ffff:ffff:ffff:ffff:ffff,DE 2001:4d98::,2001:4d98:ffff:ffff:ffff:ffff:ffff:ffff,CH -2001:4da0::,2001:4da7:ffff:ffff:ffff:ffff:ffff:ffff,CH 2001:4da8::,2001:4da8:ffff:ffff:ffff:ffff:ffff:ffff,NO 2001:4db0::,2001:4db0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2001:4db8::,2001:4db8:ffff:ffff:ffff:ffff:ffff:ffff,SE @@ -5885,28 +5948,52 @@ 2400:5880::,2400:5880:ffff:ffff:ffff:ffff:ffff:ffff,MY 2400:58c0::,2400:58c0:ffff:ffff:ffff:ffff:ffff:ffff,IN 2400:5900::,2400:5900:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:5940::,2400:5940:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:59c0::,2400:59c0:ffff:ffff:ffff:ffff:ffff:ffff,TH 2400:5a00::,2400:5a00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:5a40::,2400:5a40:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:5a80::,2400:5a80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:5ac0::,2400:5ac0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:5b40::,2400:5b40:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:5b80::,2400:5b80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:5bc0::,2400:5bc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:5c40::,2400:5c40:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:5c80::,2400:5c80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:5cc0::,2400:5cc0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:5d00::,2400:5d00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:5d40::,2400:5d40:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:5d80::,2400:5d80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:5dc0::,2400:5dc0:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:5e00::,2400:5e00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:5e40::,2400:5e40:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:5e80::,2400:5e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:5ec0::,2400:5ec0:ffff:ffff:ffff:ffff:ffff:ffff,ID 2400:5f00::,2400:5f00:ffff:ffff:ffff:ffff:ffff:ffff,PF +2400:5f40::,2400:5f40:ffff:ffff:ffff:ffff:ffff:ffff,MM 2400:5f80::,2400:5f80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:5fc0::,2400:5fc0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:6000::,2400:6000:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:6040::,2400:6040:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:6080::,2400:6080:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:60c0::,2400:60c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:6100::,2400:6100:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:6140::,2400:6140:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:6180::,2400:6180:ff:ffff:ffff:ffff:ffff:ffff,SG 2400:6180:100::,2400:6180:100:7fff:ffff:ffff:ffff:ffff,IN 2400:6180:100:8000::,2400:6180:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:61c0::,2400:61c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:6200::,2400:6200:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:6240::,2400:6240:ffff:ffff:ffff:ffff:ffff:ffff,ID 2400:6280::,2400:6280:ffff:ffff:ffff:ffff:ffff:ffff,TH +2400:62c0::,2400:62c0:ffff:ffff:ffff:ffff:ffff:ffff,MM 2400:6300::,2400:6300:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:6340::,2400:6340:ffff:ffff:ffff:ffff:ffff:ffff,MM 2400:6380::,2400:6380:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:63c0::,2400:63c0:ffff:ffff:ffff:ffff:ffff:ffff,IN 2400:6400::,2400:6400:ffff:ffff:ffff:ffff:ffff:ffff,TO +2400:6440::,2400:6440:ffff:ffff:ffff:ffff:ffff:ffff,MM 2400:6480::,2400:6480:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:64c0::,2400:64c0:ffff:ffff:ffff:ffff:ffff:ffff,ID 2400:6500::,2400:6500::70ff:ffff:ffff:ffff:ffff,SG 2400:6500:0:7100::,2400:6500::71ff:ffff:ffff:ffff:ffff,JP 2400:6500:0:7200::,2400:6500::72ff:ffff:ffff:ffff:ffff,AU @@ -5916,74 +6003,142 @@ 2400:6500:0:7600::,2400:6500:100:70ff:ffff:ffff:ffff:ffff,SG 2400:6500:100:7100::,2400:6500:100:71ff:ffff:ffff:ffff:ffff,CN 2400:6500:100:7200::,2400:6500:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:6540::,2400:6540:ffff:ffff:ffff:ffff:ffff:ffff,VN 2400:6580::,2400:6580:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:65c0::,2400:65c0:ffff:ffff:ffff:ffff:ffff:ffff,IN 2400:6600::,2400:6600:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:6640::,2400:6640:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:6680::,2400:6680:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:66c0::,2400:66c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:6700::,2400:6700:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:6740::,2400:6740:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:6780::,2400:6780:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:67c0::,2400:67c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:6800::,2400:6800:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:6840::,2400:6840:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:6880::,2400:6880:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:68c0::,2400:68c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:6900::,2400:6900:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:6940::,2400:6940:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:6980::,2400:6980:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:69c0::,2400:69c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:6a00::,2400:6a00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:6a40::,2400:6a40:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:6a80::,2400:6a80:ffff:ffff:ffff:ffff:ffff:ffff,PH +2400:6ac0::,2400:6ac0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:6b00::,2400:6b00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:6b40::,2400:6b40:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:6b80::,2400:6b80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:6bc0::,2400:6bc0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:6c00::,2400:6c00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:6c40::,2400:6c40:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:6c80::,2400:6c80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:6cc0::,2400:6cc0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:6d00::,2400:6d00:ffff:ffff:ffff:ffff:ffff:ffff,FJ +2400:6d40::,2400:6d40:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:6d80::,2400:6d80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:6dc0::,2400:6dc0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:6e00::,2400:6e00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:6e40::,2400:6e40:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:6e80::,2400:6e80:ffff:ffff:ffff:ffff:ffff:ffff,MY +2400:6ec0::,2400:6ec0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:6f00::,2400:6f00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:6f40::,2400:6f40:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:6f80::,2400:6f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:6fc0::,2400:6fc0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:7000::,2400:7000:ffff:ffff:ffff:ffff:ffff:ffff,TW +2400:7040::,2400:7040:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:7080::,2400:7080:ffff:ffff:ffff:ffff:ffff:ffff,NP +2400:70c0::,2400:70c0:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:7100::,2400:7100:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:7140::,2400:7140:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:7180::,2400:7180:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:71c0::,2400:71c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:7200::,2400:7200:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:7240::,2400:7240:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:72c0::,2400:72c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:7300::,2400:7300:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:7340::,2400:7340:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:7380::,2400:7380:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:73c0::,2400:73c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:7400::,2400:7400:ffff:ffff:ffff:ffff:ffff:ffff,MY +2400:7440::,2400:7440:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:7480::,2400:7480:ffff:ffff:ffff:ffff:ffff:ffff,MN +2400:74c0::,2400:74c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:7500::,2400:7500:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:7540::,2400:7540:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:75c0::,2400:75c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:7600::,2400:7600:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:7640::,2400:7640:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:7680::,2400:7680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:76c0::,2400:76c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:7700::,2400:7700:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:7740::,2400:7740:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:7780::,2400:7780:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:77c0::,2400:77c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:7800::,2400:7800:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:7840::,2400:7840:ffff:ffff:ffff:ffff:ffff:ffff,SE 2400:7880::,2400:7880:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:78c0::,2400:78c0:ffff:ffff:ffff:ffff:ffff:ffff,ID 2400:7900::,2400:7900:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:7940::,2400:7940:ffff:ffff:ffff:ffff:ffff:ffff,JP 2400:7980::,2400:7980:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:79c0::,2400:79c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:7a00::,2400:7a00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:7a40::,2400:7a40:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:7a80::,2400:7a80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:7ac0::,2400:7ac0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:7b00::,2400:7b00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:7b40::,2400:7b40:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:7b80::,2400:7b83:ffff:ffff:ffff:ffff:ffff:ffff,TH +2400:7bc0::,2400:7bc0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:7c00::,2400:7c00:ffff:ffff:ffff:ffff:ffff:ffff,MY +2400:7c40::,2400:7c40:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:7c80::,2400:7c80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:7cc0::,2400:7cc0:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:7d00::,2400:7d00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:7d40::,2400:7d40:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:7d80::,2400:7d80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:7dc0::,2400:7dc0:ffff:ffff:ffff:ffff:ffff:ffff,ID 2400:7e00::,2400:7e00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:7e40::,2400:7e40:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:7e80::,2400:7e80:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:7ec0::,2400:7ec0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2400:7f00::,2400:7f00:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:7f80::,2400:7f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:7fc0::,2400:7fc0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:8000::,2400:8000:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:8040::,2400:8040:ffff:ffff:ffff:ffff:ffff:ffff,JP 2400:8080::,2400:8080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:80c0::,2400:80c0:ffff:ffff:ffff:ffff:ffff:ffff,IN 2400:8100::,2400:8100:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:8140::,2400:8140:ffff:ffff:ffff:ffff:ffff:ffff,ID 2400:8180::,2400:8180:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:81c0::,2400:81c0:ffff:ffff:ffff:ffff:ffff:ffff,LA 2400:8200::,2400:8200:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:8240::,2400:8240:ffff:ffff:ffff:ffff:ffff:ffff,SG 2400:8280::,2400:8280:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:82c0::,2400:82c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:8300::,2400:8300:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:8340::,2400:8340:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:8380::,2400:8380:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:83c0::,2400:83c0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2400:8400::,2400:8400:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:8440::,2400:8440:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:8480::,2400:8480:ffff:ffff:ffff:ffff:ffff:ffff,MM +2400:84c0::,2400:84c0:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:8500::,2400:8500:24ff:ffff:ffff:ffff:ffff:ffff,JP 2400:8500:2500::,2400:8500:2500:7fff:ffff:ffff:ffff:ffff,US 2400:8500:2500:8000::,2400:8500:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:8540::,2400:8540:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:8580::,2400:8580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:85c0::,2400:85c0:ffff:ffff:ffff:ffff:ffff:ffff,IN 2400:8600::,2400:8600:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:8640::,2400:8640:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:8680::,2400:8680:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:86c0::,2400:86c0:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:8700::,2400:8700:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:8740::,2400:8740:ffff:ffff:ffff:ffff:ffff:ffff,IN 2400:8780::,2400:8780:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:8800::,2400:8800:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:8880::,2400:8880:ffff:ffff:ffff:ffff:ffff:ffff,IN @@ -6262,6 +6417,7 @@ 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 @@ -6353,8 +6509,7 @@ 2401:1e80::,2401:1e80:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:1f00::,2401:1f01:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:1f80::,2401:1f80:ffff:ffff:ffff:ffff:ffff:ffff,SG -2401:2000::,2401:2000:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:2001::,2401:2001:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:2000::,2401:2001:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:2080::,2401:2080:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:2100::,2401:2100:ffff:ffff:ffff:ffff:ffff:ffff,JP 2401:2200::,2401:2200:ffff:ffff:ffff:ffff:ffff:ffff,MY @@ -6596,7 +6751,6 @@ 2401:b100::,2401:b100:ffff:ffff:ffff:ffff:ffff:ffff,IN 2401:b180::,2401:b180:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:b200::,2401:b200:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:b280::,2401:b280:ffff:ffff:ffff:ffff:ffff:ffff,HK 2401:b300::,2401:b300:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:b380::,2401:b380:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:b400::,2401:b400:ffff:ffff:ffff:ffff:ffff:ffff,CN @@ -6647,7 +6801,9 @@ 2401:c900:1201:1cd::,2401:c900:12ff:ffff:ffff:ffff:ffff:ffff,US 2401:c900:1300::,2401:c900:1300:ffff:ffff:ffff:ffff:ffff,SG 2401:c900:1301::,2401:c900:1301:7fff:ffff:ffff:ffff:ffff,AU -2401:c900:1301:8000::,2401:c901:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:c900:1301:8000::,2401:c900:1601:11c:ffff:ffff:ffff:ffff,SG +2401:c900:1601:11d::,2401:c900:1601:11d:ffff:ffff:ffff:ffff,KR +2401:c900:1601:11e::,2401:c901:ffff:ffff:ffff:ffff:ffff:ffff,SG 2401:c980::,2401:c980:ffff:ffff:ffff:ffff:ffff:ffff,NZ 2401:ca00::,2401:ca00:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:ca80::,2401:ca80:ffff:ffff:ffff:ffff:ffff:ffff,CN @@ -6771,10 +6927,12 @@ 2401:fa00:11::,2401:fa00:11:7fff:ffff:ffff:ffff:ffff,AU 2401:fa00:11:8000::,2401:fa00:11:ffff:ffff:ffff:ffff:ffff,IN 2401:fa00:12::,2401:fa00:12:ffff:ffff:ffff:ffff:ffff,NZ -2401:fa00:13::,2401:fa00:13:7fff:ffff:ffff:ffff:ffff,HK -2401:fa00:13:8000::,2401:fa00:17:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:13::,2401:fa00:13:ffff:ffff:ffff:ffff:ffff,HK +2401:fa00:14::,2401:fa00:17:ffff:ffff:ffff:ffff:ffff,IN 2401:fa00:18::,2401:fa00:18:7fff:ffff:ffff:ffff:ffff,PH -2401:fa00:18:8000::,2401:fa00:1e:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:18:8000::,2401:fa00:1b:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:1c::,2401:fa00:1c:ffff:ffff:ffff:ffff:ffff,KR +2401:fa00:1d::,2401:fa00:1e:ffff:ffff:ffff:ffff:ffff,IN 2401:fa00:1f::,2401:fa00:1f:7fff:ffff:ffff:ffff:ffff,JP 2401:fa00:1f:8000::,2401:fa00:23:ffff:ffff:ffff:ffff:ffff,IN 2401:fa00:24::,2401:fa00:24:7fff:ffff:ffff:ffff:ffff,MY @@ -6790,7 +6948,9 @@ 2401:fa00:40::,2401:fa00:40:7fff:ffff:ffff:ffff:ffff,CN 2401:fa00:40:8000::,2401:fa00:40:ffff:ffff:ffff:ffff:ffff,IN 2401:fa00:41::,2401:fa00:41:7fff:ffff:ffff:ffff:ffff,CN -2401:fa00:41:8000::,2401:fa00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:41:8000::,2401:fa00:f7:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:f8::,2401:fa00:f8:ffff:ffff:ffff:ffff:ffff,PH +2401:fa00:f9::,2401:fa00:ffff:ffff:ffff:ffff:ffff:ffff,IN 2401:fa80::,2401:fa80:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:fb00::,2401:fb00:ffff:ffff:ffff:ffff:ffff:ffff,IN 2401:fb80::,2401:fb80:ffff:ffff:ffff:ffff:ffff:ffff,CN @@ -8151,6 +8311,7 @@ 2404:a280::,2404:a280:ffff:ffff:ffff:ffff:ffff:ffff,IN 2404:a300::,2404:a300:ffff:ffff:ffff:ffff:ffff:ffff,TH 2404:a380::,2404:a380:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:a480::,2404:a480:ffff:ffff:ffff:ffff:ffff:ffff,US 2404:a500::,2404:a500:ffff:ffff:ffff:ffff:ffff:ffff,IN 2404:a580::,2404:a580:ffff:ffff:ffff:ffff:ffff:ffff,SG 2404:a600::,2404:a600:ffff:ffff:ffff:ffff:ffff:ffff,JP @@ -8796,7 +8957,6 @@ 2405:d400::,2405:d400:ffff:ffff:ffff:ffff:ffff:ffff,PH 2405:d480::,2405:d480:ffff:ffff:ffff:ffff:ffff:ffff,AU 2405:d580::,2405:d580:ffff:ffff:ffff:ffff:ffff:ffff,JP -2405:d600::,2405:d600:ffff:ffff:ffff:ffff:ffff:ffff,AU 2405:d680::,2405:d680:ffff:ffff:ffff:ffff:ffff:ffff,MY 2405:d700::,2405:d700:ffff:ffff:ffff:ffff:ffff:ffff,CN 2405:d780::,2405:d780:ffff:ffff:ffff:ffff:ffff:ffff,JP @@ -10040,6 +10200,14 @@ 2602:233::,2602:233:ffff:ffff:ffff:ffff:ffff:ffff,US 2602:240::,2602:25f:ffff:ffff:ffff:ffff:ffff:ffff,US 2602:300::,2602:3ff:ffff:ffff:ffff:ffff:ffff:ffff,US +2602:ff14::,2602:ff14:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff15::,2602:ff15:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff16::,2602:ff16:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff17::,2602:ff17:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff18::,2602:ff18:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff19::,2602:ff19:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff1a::,2602:ff1a:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff1b::,2602:ff1b:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ff1c::,2602:ff1c:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ff1d::,2602:ff1d:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ff1e::,2602:ff1e:fff:ffff:ffff:ffff:ffff:ffff,US @@ -10434,15 +10602,26 @@ 2603:6000::,2603:60ff:ffff:ffff:ffff:ffff:ffff:ffff,US 2604::,2604::ffff:ffff:ffff:ffff:ffff:ffff,US 2604:10::,2604:10:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:50::,2604:50:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:90::,2604:90:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:100::,2604:100:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:140::,2604:140:ffff:ffff:ffff:ffff:ffff:ffff,BM 2604:180::,2604:180:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1c0::,2604:1c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:200::,2604:200:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:240::,2604:240:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:280::,2604:280:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2c0::,2604:2c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:300::,2604:300:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:340::,2604:340:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:380::,2604:380:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3c0::,2604:3c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:400::,2604:400:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:440::,2604:440:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:480::,2604:480:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4c0::,2604:4c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:500::,2604:500:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:540::,2604:540:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:580::,2604:580:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:600::,2604:600:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:680::,2604:680:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -12426,20 +12605,35 @@ 2607:e000::,2607:e000:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:e080::,2607:e080:ffff:ffff:ffff:ffff:ffff:ffff,CA 2607:e100::,2607:e100:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:e180::,2607:e180:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:e200::,2607:e200:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:e280::,2607:e280:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:e300::,2607:e300:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:e380::,2607:e380:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:e400::,2607:e400:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:e480::,2607:e480:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:e500::,2607:e500:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:e580::,2607:e580:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:e600::,2607:e600:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:e680::,2607:e680:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:e700::,2607:e700:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:e780::,2607:e780:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:e800::,2607:e800:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:e880::,2607:e880:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:e900::,2607:e900:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:e980::,2607:e980:ffff:ffff:ffff:ffff:ffff:ffff,CA 2607:ea00::,2607:ea00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ea80::,2607:ea80:ffff:ffff:ffff:ffff:ffff:ffff,CA 2607:eb00::,2607:eb00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:eb80::,2607:eb80:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:ec00::,2607:ec00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ec80::,2607:ec80:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:ed00::,2607:ed00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:ed80::,2607:ed80:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:ee00::,2607:ee00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:ee80::,2607:ee80:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:ef00::,2607:ef00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ef80::,2607:ef80:ffff:ffff:ffff:ffff:ffff:ffff,CA 2607:f000::,2607:f000:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:f008::,2607:f008:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:f010::,2607:f010:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -13374,11 +13568,17 @@ 2620:e:c000::,2620:e:c000:ffff:ffff:ffff:ffff:ffff,US 2620:e:e000::,2620:e:e000:ffff:ffff:ffff:ffff:ffff,US 2620:f::,2620:f:f:ffff:ffff:ffff:ffff:ffff,US +2620:f:2000::,2620:f:2000:ffff:ffff:ffff:ffff:ffff,US 2620:f:4000::,2620:f:4000:ffff:ffff:ffff:ffff:ffff,US +2620:f:6000::,2620:f:6000:ffff:ffff:ffff:ffff:ffff,US 2620:f:8000::,2620:f:8000:ffff:ffff:ffff:ffff:ffff,US +2620:f:a000::,2620:f:a000:ffff:ffff:ffff:ffff:ffff,US 2620:f:c000::,2620:f:c000:ffff:ffff:ffff:ffff:ffff,US +2620:f:e000::,2620:f:e000:ffff:ffff:ffff:ffff:ffff,US 2620:10::,2620:10::ffff:ffff:ffff:ffff:ffff,US +2620:10:2000::,2620:10:2000:ffff:ffff:ffff:ffff:ffff,US 2620:10:4000::,2620:10:4000:ffff:ffff:ffff:ffff:ffff,US +2620:10:6000::,2620:10:6000:ffff:ffff:ffff:ffff:ffff,US 2620:10:8000::,2620:10:800f:ffff:ffff:ffff:ffff:ffff,CA 2620:10:c000::,2620:10:c000:ffff:ffff:ffff:ffff:ffff,US 2620:11::,2620:11:ff:ffff:ffff:ffff:ffff:ffff,US @@ -13764,7 +13964,7 @@ 2620:73::,2620:73::ffff:ffff:ffff:ffff:ffff,US 2620:73:8000::,2620:73:8000:ffff:ffff:ffff:ffff:ffff,US 2620:73:c000::,2620:73:c000:ffff:ffff:ffff:ffff:ffff,US -2620:74::,2620:74:1f:ffff:ffff:ffff:ffff:ffff,US +2620:74::,2620:74:ff:ffff:ffff:ffff:ffff:ffff,US 2620:74:40c0::,2620:74:40c0:ffff:ffff:ffff:ffff:ffff,US 2620:74:8080::,2620:74:8080:ffff:ffff:ffff:ffff:ffff,US 2620:74:c040::,2620:74:c040:ffff:ffff:ffff:ffff:ffff,US @@ -15022,6 +15222,16 @@ 2620:12c::,2620:12c:f:ffff:ffff:ffff:ffff:ffff,US 2620:12c:1000::,2620:12c:100f:ffff:ffff:ffff:ffff:ffff,US 2620:12c:2000::,2620:12c:20ff:ffff:ffff:ffff:ffff:ffff,US +2620:12c:3000::,2620:12c:300f:ffff:ffff:ffff:ffff:ffff,US +2620:12c:4000::,2620:12c:400f:ffff:ffff:ffff:ffff:ffff,US +2620:12c:5000::,2620:12c:50ff:ffff:ffff:ffff:ffff:ffff,US +2620:12c:6000::,2620:12c:600f:ffff:ffff:ffff:ffff:ffff,US +2620:12c:7000::,2620:12c:700f:ffff:ffff:ffff:ffff:ffff,US +2620:12c:8000::,2620:12c:80ff:ffff:ffff:ffff:ffff:ffff,US +2620:12c:9000::,2620:12c:900f:ffff:ffff:ffff:ffff:ffff,US +2620:12c:a000::,2620:12c:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:12c:b000::,2620:12c:b0ff:ffff:ffff:ffff:ffff:ffff,US +2620:12c:c000::,2620:12c:c00f:ffff:ffff:ffff:ffff:ffff,US 2620:140::,2620:140:3ff:ffff:ffff:ffff:ffff:ffff,US 2620:141::,2620:141:fff:ffff:ffff:ffff:ffff:ffff,US 2620:143::,2620:143:7ff:ffff:ffff:ffff:ffff:ffff,US @@ -15194,7 +15404,7 @@ 2800:450::,2800:450:ffff:ffff:ffff:ffff:ffff:ffff,CR 2800:460::,2800:460:ffff:ffff:ffff:ffff:ffff:ffff,CL 2800:470::,2800:470:ffff:ffff:ffff:ffff:ffff:ffff,SX -2800:480::,2800:480:ffff:ffff:ffff:ffff:ffff:ffff,CO +2800:480::,2800:487:ffff:ffff:ffff:ffff:ffff:ffff,CO 2800:490::,2800:490:ffff:ffff:ffff:ffff:ffff:ffff,CO 2800:4b0::,2800:4b0:ffff:ffff:ffff:ffff:ffff:ffff,PE 2800:4c0::,2800:4c0:ffff:ffff:ffff:ffff:ffff:ffff,CL @@ -15407,6 +15617,7 @@ 2801:10:9000::,2801:10:9000:ffff:ffff:ffff:ffff:ffff,PY 2801:10:a000::,2801:10:a000:ffff:ffff:ffff:ffff:ffff,AR 2801:10:c000::,2801:10:c000:ffff:ffff:ffff:ffff:ffff,CO +2801:10:d000::,2801:10:d000:ffff:ffff:ffff:ffff:ffff,AR 2801:10:e000::,2801:10:e000:ffff:ffff:ffff:ffff:ffff,AR 2801:11::,2801:11::ffff:ffff:ffff:ffff:ffff,AR 2801:11:1000::,2801:11:1000:ffff:ffff:ffff:ffff:ffff,PY @@ -15450,6 +15661,7 @@ 2801:14:9000::,2801:14:9000:ffff:ffff:ffff:ffff:ffff,CL 2801:14:a000::,2801:14:a001:ffff:ffff:ffff:ffff:ffff,UY 2801:14:c000::,2801:14:c000:ffff:ffff:ffff:ffff:ffff,BO +2801:14:d000::,2801:14:d00f:ffff:ffff:ffff:ffff:ffff,PA 2801:14:e000::,2801:14:e000:ffff:ffff:ffff:ffff:ffff,PY 2801:15::,2801:15::ffff:ffff:ffff:ffff:ffff,EC 2801:15:1000::,2801:15:1000:ffff:ffff:ffff:ffff:ffff,SV @@ -15477,6 +15689,7 @@ 2801:17:1000::,2801:17:1000:ffff:ffff:ffff:ffff:ffff,HN 2801:17:2000::,2801:17:2000:ffff:ffff:ffff:ffff:ffff,PY 2801:17:4000::,2801:17:4000:ffff:ffff:ffff:ffff:ffff,CO +2801:17:5000::,2801:17:5000:ffff:ffff:ffff:ffff:ffff,HT 2801:17:6000::,2801:17:6000:ffff:ffff:ffff:ffff:ffff,AR 2801:17:8000::,2801:17:8000:ffff:ffff:ffff:ffff:ffff,CR 2801:17:9000::,2801:17:9000:ffff:ffff:ffff:ffff:ffff,PA @@ -15561,6 +15774,7 @@ 2801:1f:1000::,2801:1f:1000:ffff:ffff:ffff:ffff:ffff,HN 2801:1f:2000::,2801:1f:2000:ffff:ffff:ffff:ffff:ffff,CR 2801:1f:4000::,2801:1f:4000:ffff:ffff:ffff:ffff:ffff,CR +2801:1f:5000::,2801:1f:5000:ffff:ffff:ffff:ffff:ffff,CO 2801:1f:6000::,2801:1f:6000:ffff:ffff:ffff:ffff:ffff,AR 2801:1f:8000::,2801:1f:8000:ffff:ffff:ffff:ffff:ffff,AR 2801:1f:9000::,2801:1f:9000:ffff:ffff:ffff:ffff:ffff,AR @@ -15885,6 +16099,13 @@ 2801:80:1ad0::,2801:80:1ad1:ffff:ffff:ffff:ffff:ffff,BR 2801:80:1ae0::,2801:80:1ae0:ffff:ffff:ffff:ffff:ffff,BR 2801:80:1af0::,2801:80:1af0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1b00::,2801:80:1b00:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1b10::,2801:80:1b10:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1b20::,2801:80:1b20:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1b30::,2801:80:1b30:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1b40::,2801:80:1b40:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1b50::,2801:80:1b50:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1b60::,2801:80:1b60: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 @@ -15947,6 +16168,7 @@ 2801:130::,2801:130:fff:ffff:ffff:ffff:ffff:ffff,CO 2801:138::,2801:138:ff:ffff:ffff:ffff:ffff:ffff,PA 2801:140::,2801:140:ffff:ffff:ffff:ffff:ffff:ffff,AR +2801:144::,2801:144:3f:ffff:ffff:ffff:ffff:ffff,CO 2801:148::,2801:148:ff:ffff:ffff:ffff:ffff:ffff,AR 2801:150::,2801:150:ffff:ffff:ffff:ffff:ffff:ffff,PE 2801:158::,2801:158:fff:ffff:ffff:ffff:ffff:ffff,PA @@ -15982,6 +16204,7 @@ 2802:3:a000::,2802:3:ffff:ffff:ffff:ffff:ffff:ffff,CO 2802:8000::,2802:80ff:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803::,2803::ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:40::,2803:40:ffff:ffff:ffff:ffff:ffff:ffff,PE 2803:80::,2803:80::ffff:ffff:ffff:ffff,BR 2803:80:0:1::,2803:80:fff:ffff:ffff:ffff:ffff:ffff,CL 2803:80:1000::,2803:80:1fff:ffff:ffff:ffff:ffff:ffff,BR @@ -15994,6 +16217,7 @@ 2803:200::,2803:200:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:240::,2803:240:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:280::,2803:280:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:2c0::,2803:2c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:300::,2803:300:ffff:ffff:ffff:ffff:ffff:ffff,DO 2803:340::,2803:340:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:380::,2803:380:ffff:ffff:ffff:ffff:ffff:ffff,CL @@ -16050,6 +16274,7 @@ 2803:1200::,2803:1200:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:1240::,2803:1240:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:1280::,2803:1280:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:12c0::,2803:12c0:ffff:ffff:ffff:ffff:ffff:ffff,DO 2803:1300::,2803:1300:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:1340::,2803:1340:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:1380::,2803:1380:ffff:ffff:ffff:ffff:ffff:ffff,HN @@ -16067,7 +16292,6 @@ 2803:1780::,2803:1780:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:1800::,2803:1800:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:1840::,2803:1840:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:1880::,2803:1880:ffff:ffff:ffff:ffff:ffff:ffff,PE 2803:18c0::,2803:18c0:ffff:ffff:ffff:ffff:ffff:ffff,SX 2803:1900::,2803:1900:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:1940::,2803:1940:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -16094,12 +16318,12 @@ 2803:2040::,2803:2040:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:2080::,2803:2080:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:20c0::,2803:20c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:2100::,2803:2100:ffff:ffff:ffff:ffff:ffff:ffff,PE 2803:2140::,2803:2140:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:2180::,2803:2180:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:2200::,2803:2200:ffff:ffff:ffff:ffff:ffff:ffff,EC 2803:2240::,2803:2240:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:2280::,2803:2280:ffff:ffff:ffff:ffff:ffff:ffff,BZ +2803:22c0::,2803:22c0:ffff:ffff:ffff:ffff:ffff:ffff,VE 2803:2300::,2803:2300:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:2340::,2803:2340:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:2380::,2803:2380:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -16203,6 +16427,7 @@ 2803:4200::,2803:4200:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:4240::,2803:4240:ffff:ffff:ffff:ffff:ffff:ffff,PY 2803:4280::,2803:4280:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:42c0::,2803:42c0:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:4300::,2803:4300:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:4340::,2803:4340:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:4380::,2803:4380:ffff:ffff:ffff:ffff:ffff:ffff,BO @@ -16304,6 +16529,7 @@ 2803:6200::,2803:6200:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:6240::,2803:6240:ffff:ffff:ffff:ffff:ffff:ffff,VE 2803:6280::,2803:6280:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:62c0::,2803:62c0:ffff:ffff:ffff:ffff:ffff:ffff,EC 2803:6300::,2803:6300:ffff:ffff:ffff:ffff:ffff:ffff,GT 2803:6340::,2803:6340:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:6380::,2803:6380:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -16407,6 +16633,7 @@ 2803:8200::,2803:8200:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:8240::,2803:8240:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:8280::,2803:8280:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:82c0::,2803:82c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:8300::,2803:8300:ffff:ffff:ffff:ffff:ffff:ffff,EC 2803:8340::,2803:8340:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:8380::,2803:8380:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -16509,6 +16736,7 @@ 2803:a200::,2803:a200:ffff:ffff:ffff:ffff:ffff:ffff,SR 2803:a240::,2803:a240:ffff:ffff:ffff:ffff:ffff:ffff,EC 2803:a280::,2803:a280:ffff:ffff:ffff:ffff:ffff:ffff,DO +2803:a2c0::,2803:a2c0:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:a340::,2803:a340:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:a380::,2803:a380:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:a400::,2803:a400:ffff:ffff:ffff:ffff:ffff:ffff,EC @@ -16610,6 +16838,7 @@ 2803:c200::,2803:c200:ffff:ffff:ffff:ffff:ffff:ffff,PE 2803:c240::,2803:c240:ffff:ffff:ffff:ffff:ffff:ffff,BZ 2803:c280::,2803:c280:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:c2c0::,2803:c2c0:ffff:ffff:ffff:ffff:ffff:ffff,EC 2803:c300::,2803:c300:ffff:ffff:ffff:ffff:ffff:ffff,GT 2803:c340::,2803:c340:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:c380::,2803:c380:ffff:ffff:ffff:ffff:ffff:ffff,HN @@ -16715,6 +16944,7 @@ 2803:e200::,2803:e200:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:e240::,2803:e240:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:e280::,2803:e280:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:e2c0::,2803:e2c0:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:e300::,2803:e300:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:e340::,2803:e340:ffff:ffff:ffff:ffff:ffff:ffff,GY 2803:e380::,2803:e380:ffff:ffff:ffff:ffff:ffff:ffff,HN @@ -16798,6 +17028,7 @@ 2803:fc00::,2803:fc00:ffff:ffff:ffff:ffff:ffff:ffff,PY 2803:fc40::,2803:fc40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:fc80::,2803:fc80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:fcc0::,2803:fcc0:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:fd00::,2803:fd00:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:fd40::,2803:fd40:ffff:ffff:ffff:ffff:ffff:ffff,SV 2803:fd80::,2803:fd80:ffff:ffff:ffff:ffff:ffff:ffff,CL @@ -17972,6 +18203,7 @@ 2804:1324::,2804:1324:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:1328::,2804:1328:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:132c::,2804:132c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1330::,2804:1330:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:1334::,2804:1334:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:1338::,2804:1338:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:133c::,2804:133c:ffff:ffff:ffff:ffff:ffff:ffff,BR @@ -18664,7 +18896,6 @@ 2804:1e10::,2804:1e10:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:1e14::,2804:1e14:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:1e18::,2804:1e18:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e1c::,2804:1e1c:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:1e20::,2804:1e20:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:1e24::,2804:1e24:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:1e28::,2804:1e28:ffff:ffff:ffff:ffff:ffff:ffff,BR @@ -20223,6 +20454,62 @@ 2804:3728::,2804:3728:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:372c::,2804:372c:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:3730::,2804:3730:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3734::,2804:3734:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3738::,2804:3738:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:373c::,2804:373c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3740::,2804:3740:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3744::,2804:3744:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3748::,2804:3748:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:374c::,2804:374c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3750::,2804:3750:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3754::,2804:3754:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3758::,2804:3758:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:375c::,2804:375c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3760::,2804:3760:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3764::,2804:3764:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3768::,2804:3768:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:376c::,2804:376c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3770::,2804:3770:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3774::,2804:3774:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3778::,2804:3778:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:377c::,2804:377c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3780::,2804:3780:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3784::,2804:3784:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3788::,2804:3788:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:378c::,2804:378c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3790::,2804:3790:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3794::,2804:3794:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3798::,2804:3798:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:379c::,2804:379c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37a0::,2804:37a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37a4::,2804:37a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37a8::,2804:37a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37ac::,2804:37ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37b0::,2804:37b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37b4::,2804:37b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37b8::,2804:37b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37bc::,2804:37bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37c0::,2804:37c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37c4::,2804:37c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37c8::,2804:37c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37cc::,2804:37cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37d0::,2804:37d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37d4::,2804:37d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37d8::,2804:37d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37dc::,2804:37dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37e0::,2804:37e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37e4::,2804:37e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37e8::,2804:37e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37ec::,2804:37ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37f0::,2804:37f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37f4::,2804:37f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37f8::,2804:37f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37fc::,2804:37fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3800::,2804:3800:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3804::,2804:3804:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3808::,2804:3808:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:380c::,2804:380c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3810::,2804:3810:ffff:ffff:ffff:ffff:ffff:ffff,BR 2806::,2806:f:ffff:ffff:ffff:ffff:ffff:ffff,MX 2806:200::,2806:216::ffff:ffff:ffff:ffff:ffff,MX 2806:217::,2806:220:ffff:ffff:ffff:ffff:ffff:ffff,MX @@ -20233,7 +20520,8 @@ 2806:250::,2806:250:ffff:ffff:ffff:ffff:ffff:ffff,MX 2806:260::,2806:260:ffff:ffff:ffff:ffff:ffff:ffff,MX 2806:270::,2806:270:ffff:ffff:ffff:ffff:ffff:ffff,MX -2806:280::,2806:286:ffff:ffff:ffff:ffff:ffff:ffff,MX +2806:280::,2806:287:ffff:ffff:ffff:ffff:ffff:ffff,MX +2806:289::,2806:289:ffff:ffff:ffff:ffff:ffff:ffff,MX 2806:290::,2806:290:ffff:ffff:ffff:ffff:ffff:ffff,MX 2806:2a0::,2806:2a0:ffff:ffff:ffff:ffff:ffff:ffff,MX 2806:2b0::,2806:2b0:ffff:ffff:ffff:ffff:ffff:ffff,MX @@ -20489,7 +20777,9 @@ 2a00:13b0::,2a00:13b0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a00:13b8::,2a00:13b8:ffff:ffff:ffff:ffff:ffff:ffff,RO 2a00:13c0::,2a00:13c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:13c8::,2a00:13c8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:13c8::,2a00:13c8:2:ffff:ffff:ffff:ffff:ffff,DE +2a00:13c8:3::,2a00:13c8:3:ffff:ffff:ffff:ffff:ffff,CH +2a00:13c8:4::,2a00:13c8:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a00:13d0::,2a00:13d0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a00:13d8::,2a00:13df:ffff:ffff:ffff:ffff:ffff:ffff,SI 2a00:13e0::,2a00:13e0:ffff:ffff:ffff:ffff:ffff:ffff,NO @@ -20520,7 +20810,7 @@ 2a00:1488::,2a00:1488:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a00:1490::,2a00:1490:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a00:1498::,2a00:1498:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:14a0::,2a00:14a0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:14a0::,2a00:14a7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a00:14a8::,2a00:14a8:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a00:14b0::,2a00:14b7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a00:14b8::,2a00:14b8:ffff:ffff:ffff:ffff:ffff:ffff,FI @@ -21111,7 +21401,6 @@ 2a00:5dc0::,2a00:5dc0:ffff:ffff:ffff:ffff:ffff:ffff,RO 2a00:5de0::,2a00:5de0:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a00:5e00::,2a00:5e00:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:5e20::,2a00:5e20:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a00:5e40::,2a00:5e40:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a00:5e60::,2a00:5e60:ffff:ffff:ffff:ffff:ffff:ffff,LB 2a00:5e80::,2a00:5e80:ffff:ffff:ffff:ffff:ffff:ffff,FR @@ -21191,7 +21480,6 @@ 2a00:67e0::,2a00:67e7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a00:6800::,2a00:6800:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a00:6820::,2a00:6820:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:6840::,2a00:6840:ffff:ffff:ffff:ffff:ffff:ffff,SI 2a00:6860::,2a00:6867:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a00:6880::,2a00:6880:ffff:ffff:ffff:ffff:ffff:ffff,LT 2a00:68a0::,2a00:68a0:ffff:ffff:ffff:ffff:ffff:ffff,AE @@ -21327,7 +21615,6 @@ 2a00:7920::,2a00:7920:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a00:7940::,2a00:7940:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a00:7960::,2a00:7960:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:7980::,2a00:7980:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:79a0::,2a00:79a0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:79c0::,2a00:79c0:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a00:79e0::,2a00:79e0::ffff:ffff:ffff:ffff:ffff,CH @@ -21347,7 +21634,9 @@ 2a00:79e0:23::,2a00:79e0:23:ffff:ffff:ffff:ffff:ffff,GB 2a00:79e0:24::,2a00:79e0:26:ffff:ffff:ffff:ffff:ffff,CH 2a00:79e0:27::,2a00:79e0:27:ffff:ffff:ffff:ffff:ffff,NL -2a00:79e0:28::,2a00:79e1:abb:ffff:ffff:ffff:ffff:ffff,CH +2a00:79e0:28::,2a00:79e0:ffe2:4ff:ffff:ffff:ffff:ffff,CH +2a00:79e0:ffe2:500::,2a00:79e0:ffe2:5ff:ffff:ffff:ffff:ffff,IE +2a00:79e0:ffe2:600::,2a00:79e1:abb:ffff:ffff:ffff:ffff:ffff,CH 2a00:79e1:abc::,2a00:79e1:abc:ff:ffff:ffff:ffff:ffff,GB 2a00:79e1:abc:100::,2a00:79e1:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a00:7a00::,2a00:7a00:ffff:ffff:ffff:ffff:ffff:ffff,NO @@ -21408,7 +21697,7 @@ 2a00:8140::,2a00:8140:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a00:8160::,2a00:8160:ffff:ffff:ffff:ffff:ffff:ffff,FI 2a00:8180::,2a00:8180:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:81a0::,2a00:81a0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:81a0::,2a00:81a7:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a00:81c0::,2a00:81c0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a00:81e0::,2a00:81e0:ffff:ffff:ffff:ffff:ffff:ffff,LV 2a00:8200::,2a00:8200:ffff:ffff:ffff:ffff:ffff:ffff,DK @@ -22384,8 +22673,8 @@ 2a00:fd00::,2a00:fd00:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a00:fd20::,2a00:fd20:ffff:ffff:ffff:ffff:ffff:ffff,LB 2a00:fd40::,2a00:fd40:5:ffff:ffff:ffff:ffff:ffff,NL -2a00:fd40:6::,2a00:fd40:6:ffff:ffff:ffff:ffff:ffff,SK -2a00:fd40:7::,2a00:fd40:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:fd40:6::,2a00:fd40:7:ffff:ffff:ffff:ffff:ffff,SK +2a00:fd40:8::,2a00:fd40:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a00:fd60::,2a00:fd60:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a00:fd80::,2a00:fd80:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a00:fda0::,2a00:fda0:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -22595,6 +22884,7 @@ 2a01:3d8::,2a01:3d8:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a01:3e0:402::,2a01:3e0:403:ffff:ffff:ffff:ffff:ffff,FR 2a01:3e0:501::,2a01:3e0:501:ffff:ffff:ffff:ffff:ffff,RU +2a01:3e0:502::,2a01:3e0:502:ffff:ffff:ffff:ffff:ffff,DE 2a01:3e0:801::,2a01:3e0:801:ffff:ffff:ffff:ffff:ffff,FR 2a01:3e0:d01::,2a01:3e0:d02:ffff:ffff:ffff:ffff:ffff,GB 2a01:3e0:1101::,2a01:3e0:1101:ffff:ffff:ffff:ffff:ffff,NL @@ -23392,7 +23682,6 @@ 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 @@ -24311,7 +24600,7 @@ 2a02:1628::,2a02:1628:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:1630::,2a02:1630:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a02:1638::,2a02:1638:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:1648::,2a02:1648:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:1648::,2a02:164f:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a02:1650::,2a02:1650:ffff:ffff:ffff:ffff:ffff:ffff,SA 2a02:1658::,2a02:1658:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a02:1660::,2a02:1660:ffff:ffff:ffff:ffff:ffff:ffff,NO @@ -24344,7 +24633,7 @@ 2a02:1740::,2a02:1740:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a02:1748::,2a02:1748:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a02:1750::,2a02:1750:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:1758::,2a02:1758:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:1758::,2a02:175f:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a02:1760::,2a02:1760:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a02:1770::,2a02:1770:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a02:1778::,2a02:1778:ffff:ffff:ffff:ffff:ffff:ffff,PL @@ -24737,7 +25026,6 @@ 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 @@ -24820,7 +25108,14 @@ 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:4780::,2a02:4780::ffff:ffff:ffff:ffff:ffff,LT +2a02:4780:1::,2a02:4780:1:ffff:ffff:ffff:ffff:ffff,US +2a02:4780:2::,2a02:4780:2:ffff:ffff:ffff:ffff:ffff,GB +2a02:4780:3::,2a02:4780:bac:ffff:ffff:ffff:ffff:ffff,LT +2a02:4780:bad::,2a02:4780:bad:ffff:ffff:ffff:ffff:ffff,US +2a02:4780:bae::,2a02:4780:deac:ffff:ffff:ffff:ffff:ffff,LT +2a02:4780:dead::,2a02:4780:dead:ffff:ffff:ffff:ffff:ffff,US +2a02:4780:deae::,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:47e7:ffff:ffff:ffff:ffff:ffff:ffff,BE @@ -25676,7 +25971,6 @@ 2a03:ae0::,2a03:ae0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:b00::,2a03:b00:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a03:b40::,2a03:b40:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:b60::,2a03:b60:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:b80::,2a03:b80:ffff:ffff:ffff:ffff:ffff:ffff,FI 2a03:ba0::,2a03:ba7:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a03:bc0::,2a03:bc7:ffff:ffff:ffff:ffff:ffff:ffff,GB @@ -26077,7 +26371,7 @@ 2a03:3b60::,2a03:3b60:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a03:3b80::,2a03:3b80:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a03:3ba0::,2a03:3ba0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:3bc0::,2a03:3bc0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:3bc0::,2a03:3bc0:ffff:ffff:ffff:ffff:ffff:ffff,MT 2a03:3be0::,2a03:3be0:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a03:3c00::,2a03:3c00:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:3c20::,2a03:3c20:ffff:ffff:ffff:ffff:ffff:ffff,FR @@ -26124,7 +26418,6 @@ 2a03:41c0::,2a03:41c0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:41e0::,2a03:41e0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:4200::,2a03:4200:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:4220::,2a03:4220:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a03:4240::,2a03:4240:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:4260::,2a03:4260:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a03:4280::,2a03:4280:ffff:ffff:ffff:ffff:ffff:ffff,HR @@ -26376,7 +26669,6 @@ 2a03:5f20::,2a03:5f20:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:5f60::,2a03:5f60:ffff:ffff:ffff:ffff:ffff:ffff,HU 2a03:5f80::,2a03:5f80:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:5fa0::,2a03:5fa0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:5fc0::,2a03:5fc0:ffff:ffff:ffff:ffff:ffff:ffff,FI 2a03:5fe0::,2a03:5fe0:ffff:ffff:ffff:ffff:ffff:ffff,RS 2a03:6000::,2a03:6007:ffff:ffff:ffff:ffff:ffff:ffff,NL @@ -26445,7 +26737,7 @@ 2a03:67c0::,2a03:67c0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:67e0::,2a03:67e0:ffff:ffff:ffff:ffff:ffff:ffff,LT 2a03:6800::,2a03:6800:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:6820::,2a03:6820:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:6820::,2a03:6820:ffff:ffff:ffff:ffff:ffff:ffff,LV 2a03:6840::,2a03:6840:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a03:6860::,2a03:6860:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a03:6880::,2a03:6880:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -27154,7 +27446,7 @@ 2a03:c140::,2a03:c140:ffff:ffff:ffff:ffff:ffff:ffff,AE 2a03:c180::,2a03:c180:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a03:c1c0::,2a03:c1c0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:c200::,2a03:c200:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:c200::,2a03:c207:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:c240::,2a03:c240:ffff:ffff:ffff:ffff:ffff:ffff,GE 2a03:c280::,2a03:c280:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a03:c2c0::,2a03:c2c0:ffff:ffff:ffff:ffff:ffff:ffff,FR @@ -27424,7 +27716,7 @@ 2a04:540::,2a04:547:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a04:580::,2a04:587:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a04:5c0::,2a04:5c3:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:5e0::,2a04:5e3:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:5e0::,2a04:5e7:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a04:600::,2a04:607:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a04:640::,2a04:647:ffff:ffff:ffff:ffff:ffff:ffff,VA 2a04:680::,2a04:687:ffff:ffff:ffff:ffff:ffff:ffff,FI @@ -28267,7 +28559,6 @@ 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 @@ -28310,7 +28601,6 @@ 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 @@ -28861,7 +29151,6 @@ 2a05:6600::,2a05:6607:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a05:6640::,2a05:6647:ffff:ffff:ffff:ffff:ffff:ffff,VA 2a05:6680::,2a05:6687:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:66c0::,2a05:66c7:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a05:6700::,2a05:6707:ffff:ffff:ffff:ffff:ffff:ffff,RO 2a05:6740::,2a05:6747:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a05:6780::,2a05:6787:ffff:ffff:ffff:ffff:ffff:ffff,RU @@ -29229,7 +29518,6 @@ 2a05:c340::,2a05:c347:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a05:c380::,2a05:c387:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a05:c3c0::,2a05:c3c7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a05:c400::,2a05:c407:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a05:c440::,2a05:c447:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a05:c480::,2a05:c487:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a05:c4c0::,2a05:c4c7:ffff:ffff:ffff:ffff:ffff:ffff,NL @@ -29313,7 +29601,6 @@ 2a05:d640::,2a05:d647:ffff:ffff:ffff:ffff:ffff:ffff,IQ 2a05:d680::,2a05:d687:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a05:d6c0::,2a05:d6c7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a05:d700::,2a05:d707:ffff:ffff:ffff:ffff:ffff:ffff,US 2a05:d740::,2a05:d747:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a05:d780::,2a05:d787:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a05:d7c0::,2a05:d7c7:ffff:ffff:ffff:ffff:ffff:ffff,SA @@ -29702,7 +29989,6 @@ 2a06:3380::,2a06:3387:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a06:33c0::,2a06:33c7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a06:3400::,2a06:3407:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:3440::,2a06:3447:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a06:3480::,2a06:3487:ffff:ffff:ffff:ffff:ffff:ffff,LB 2a06:34c0::,2a06:34c7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a06:3500::,2a06:3507:ffff:ffff:ffff:ffff:ffff:ffff,BE @@ -29785,7 +30071,6 @@ 2a06:4740::,2a06:4747:ffff:ffff:ffff:ffff:ffff:ffff,RO 2a06:47c0::,2a06:47c7:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a06:4840::,2a06:4847:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a06:4880::,2a06:4887:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a06:48c0::,2a06:48c7:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a06:4900::,2a06:4907:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a06:4940::,2a06:4947:ffff:ffff:ffff:ffff:ffff:ffff,LU @@ -30314,7 +30599,6 @@ 2a06:c480::,2a06:c487:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a06:c4c0::,2a06:c4c7:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a06:c500::,2a06:c507:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a06:c540::,2a06:c547:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a06:c580::,2a06:c587:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a06:c5c0::,2a06:c5c7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a06:c600::,2a06:c607:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -30376,7 +30660,6 @@ 2a06:d400::,2a06:d407:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a06:d440::,2a06:d447:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a06:d480::,2a06:d487:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a06:d4c0::,2a06:d4c7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a06:d500::,2a06:d507:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a06:d540::,2a06:d547:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a06:d580::,2a06:d587:ffff:ffff:ffff:ffff:ffff:ffff,CH @@ -31653,7 +31936,7 @@ 2a0a:8605::,2a0a:8605::ffff:ffff:ffff:ffff:ffff,US 2a0a:8605:1::,2a0a:8605:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:8606::,2a0a:8606:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:8607::,2a0a:8607:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:8607::,2a0a:8607:ffff:ffff:ffff:ffff:ffff:ffff,US 2a0a:8680::,2a0a:8687:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:8700::,2a0a:8707:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:8780::,2a0a:8787:ffff:ffff:ffff:ffff:ffff:ffff,ES @@ -31669,7 +31952,9 @@ 2a0a:8c80::,2a0a:8c87:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:8d00::,2a0a:8d07:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:8d80::,2a0a:8d87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:8e00::,2a0a:8e07:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:8e00::,2a0a:8e01:1236:ffff:ffff:ffff:ffff:ffff,US +2a0a:8e01:1237::,2a0a:8e01:1237:ffff:ffff:ffff:ffff:ffff,CA +2a0a:8e01:1238::,2a0a:8e07:ffff:ffff:ffff:ffff:ffff:ffff,US 2a0a:8e80::,2a0a:8e87:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:8f00::,2a0a:8f00:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:8f80::,2a0a:8f87:ffff:ffff:ffff:ffff:ffff:ffff,RU @@ -31677,7 +31962,9 @@ 2a0a:9080::,2a0a:9087:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:9100::,2a0a:9107:ffff:ffff:ffff:ffff:ffff:ffff,LB 2a0a:9180::,2a0a:9180:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:9200::,2a0a:9207:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:9200::,2a0a:9204:ab6c:ffff:ffff:ffff:ffff:ffff,US +2a0a:9204:ab6d::,2a0a:9204:ab6d:ffff:ffff:ffff:ffff:ffff,CA +2a0a:9204:ab6e::,2a0a:9207:ffff:ffff:ffff:ffff:ffff:ffff,US 2a0a:9280::,2a0a:9287:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:9300::,2a0a:9307:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:9380::,2a0a:9387:ffff:ffff:ffff:ffff:ffff:ffff,ES @@ -31685,7 +31972,9 @@ 2a0a:9480::,2a0a:9480:ffff:ffff:ffff:ffff:ffff:ffff,IL 2a0a:9500::,2a0a:9507:ffff:ffff:ffff:ffff:ffff:ffff,FI 2a0a:9580::,2a0a:9587:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:9600::,2a0a:9607:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:9600::,2a0a:9603:49cd:ffff:ffff:ffff:ffff:ffff,US +2a0a:9603:49ce::,2a0a:9603:49ce:ffff:ffff:ffff:ffff:ffff,CA +2a0a:9603:49cf::,2a0a:9607:ffff:ffff:ffff:ffff:ffff:ffff,US 2a0a:9680::,2a0a:9687:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0a:9700::,2a0a:9700:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:9780::,2a0a:9787:ffff:ffff:ffff:ffff:ffff:ffff,NL @@ -31693,7 +31982,9 @@ 2a0a:9880::,2a0a:9887:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:9900::,2a0a:9907:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:9980::,2a0a:9987:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:9a00::,2a0a:9a07:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:9a00::,2a0a:9a02:b3d1:ffff:ffff:ffff:ffff:ffff,US +2a0a:9a02:b3d2::,2a0a:9a02:b3d2:ffff:ffff:ffff:ffff:ffff,CA +2a0a:9a02:b3d3::,2a0a:9a07:ffff:ffff:ffff:ffff:ffff:ffff,US 2a0a:9a80::,2a0a:9a80:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:9b00::,2a0a:9b07:ffff:ffff:ffff:ffff:ffff:ffff,US 2a0a:9b80::,2a0a:9b80:ffff:ffff:ffff:ffff:ffff:ffff,NO @@ -31702,138 +31993,271 @@ 2a0a:9d00::,2a0a:9d00:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:9d80::,2a0a:9d87:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:9e00::,2a0a:9e07:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:9e80::,2a0a:9e87:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:9f00::,2a0a:9f07:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:9f80::,2a0a:9f87:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:a000::,2a0a:a000:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:a080::,2a0a:a087:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a0a:a100::,2a0a:a100:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:a180::,2a0a:a180:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:a200::,2a0a:a207:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:a280::,2a0a:a280:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:a300::,2a0a:a307:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0a:a380::,2a0a:a387:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:a400::,2a0a:a407:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:a480::,2a0a:a487:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a0a:a500::,2a0a:a507:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:a580::,2a0a:a587:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:a600::,2a0a:a607:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:a680::,2a0a:a687:ffff:ffff:ffff:ffff:ffff:ffff,SK 2a0a:a700::,2a0a:a707:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:a780::,2a0a:a787:ffff:ffff:ffff:ffff:ffff:ffff,SK 2a0a:a800::,2a0a:a807:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:a880::,2a0a:a887:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:a900::,2a0a:a900:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:a980::,2a0a:a987:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:aa00::,2a0a:aa03:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a0a:aa80::,2a0a:aa87:ffff:ffff:ffff:ffff:ffff:ffff,IM 2a0a:ab00::,2a0a:ab07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:ab80::,2a0a:ab80:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:ac00::,2a0a:ac07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:ac80::,2a0a:ac87:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:ad00::,2a0a:ad07:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:ad80::,2a0a:ad87:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:ae00::,2a0a:ae07:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:ae80::,2a0a:ae87:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:af00::,2a0a:af07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:af80::,2a0a:af87:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:b000::,2a0a:b000:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:b080::,2a0a:b087:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:b100::,2a0a:b107:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:b180::,2a0a:b187:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a0a:b200::,2a0a:b207:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:b280::,2a0a:b287:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a0a:b300::,2a0a:b307:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:b380::,2a0a:b387:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:b400::,2a0a:b407:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:b480::,2a0a:b487:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:b500::,2a0a:b507:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:b580::,2a0a:b587:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:b600::,2a0a:b607:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:b680::,2a0a:b687:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0a:b700::,2a0a:b707:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a0a:b780::,2a0a:b787:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0a:b800::,2a0a:b807:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:b880::,2a0a:b887:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:b900::,2a0a:b907:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:b980::,2a0a:b980:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:ba00::,2a0a:ba07:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:ba80::,2a0a:ba87:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:bb00::,2a0a:bb07:ffff:ffff:ffff:ffff:ffff:ffff,LI +2a0a:bb80::,2a0a:bb87:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:bc00::,2a0a:bc07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:bc80::,2a0a:bc87:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a0a:bd00::,2a0a:bd00:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0a:bd80::,2a0a:bd80:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a0a:be00::,2a0a:be07:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:be80::,2a0a:be87:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a0a:bf00::,2a0a:bf07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:bf80::,2a0a:bf87:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a0a:c000::,2a0a:c007:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:c080::,2a0a:c087:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0a:c100::,2a0a:c107:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:c180::,2a0a:c187:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:c200::,2a0a:c207:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:c280::,2a0a:c287:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0a:c300::,2a0a:c307:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:c380::,2a0a:c387:ffff:ffff:ffff:ffff:ffff:ffff,US 2a0a:c400::,2a0a:c407:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:c480::,2a0a:c487:ffff:ffff:ffff:ffff:ffff:ffff,SA 2a0a:c500::,2a0a:c507:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:c580::,2a0a:c587:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:c600::,2a0a:c607:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:c680::,2a0a:c687:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:c700::,2a0a:c707:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:c780::,2a0a:c787:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:c800::,2a0a:c807:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0a:c880::,2a0a:c880:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0a:c900::,2a0a:c907:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:c980::,2a0a:c987:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:ca00::,2a0a:ca00:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0a:ca80::,2a0a:ca87:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a0a:cb00::,2a0a:cb07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:cb80::,2a0a:cb80:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:cc00::,2a0a:cc07:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:cc80::,2a0a:cc87:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a0a:cd00::,2a0a:cd00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:cd80::,2a0a:cd87:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a0a:ce00::,2a0a:ce07:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:ce80::,2a0a:ce87:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a0a:cf00::,2a0a:cf07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:cf80::,2a0a:cf87:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a0a:d000::,2a0a:d007:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:d080::,2a0a:d087:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0a:d100::,2a0a:d107:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:d180::,2a0a:d187:ffff:ffff:ffff:ffff:ffff:ffff,GR 2a0a:d200::,2a0a:d207:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:d280::,2a0a:d287:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0a:d300::,2a0a:d307:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:d380::,2a0a:d387:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0a:d400::,2a0a:d407:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:d480::,2a0a:d487:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:d500::,2a0a:d507:ffff:ffff:ffff:ffff:ffff:ffff,FO +2a0a:d580::,2a0a:d587:ffff:ffff:ffff:ffff:ffff:ffff,MD 2a0a:d600::,2a0a:d607:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:d680::,2a0a:d687:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:d700::,2a0a:d707:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:d780::,2a0a:d787:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:d800::,2a0a:d807:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:d880::,2a0a:d887:ffff:ffff:ffff:ffff:ffff:ffff,BG 2a0a:d900::,2a0a:d900:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:d980::,2a0a:d987:ffff:ffff:ffff:ffff:ffff:ffff,BG 2a0a:da00::,2a0a:da00:ffff:ffff:ffff:ffff:ffff:ffff,KW +2a0a:da80::,2a0a:da87:ffff:ffff:ffff:ffff:ffff:ffff,BG 2a0a:db00::,2a0a:db00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:db80::,2a0a:db87:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:dc00::,2a0a:dc07:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:dc80::,2a0a:dc87:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:dd00::,2a0a:dd07:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0a:dd80::,2a0a:dd87:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a0a:de00::,2a0a:de00:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:de80::,2a0a:de80:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:df00::,2a0a:df07:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a0a:df80::,2a0a:df87:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0a:e000::,2a0a:e007:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:e080::,2a0a:e087:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a0a:e100::,2a0a:e107:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0a:e180::,2a0a:e187:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:e200::,2a0a:e207:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:e280::,2a0a:e287:ffff:ffff:ffff:ffff:ffff:ffff,GE 2a0a:e300::,2a0a:e303:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a0a:e380::,2a0a:e387:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:e400::,2a0a:e407:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0a:e480::,2a0a:e487:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:e500::,2a0a:e500:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:e580::,2a0a:e587:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:e600::,2a0a:e600:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:e680::,2a0a:e687:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:e700::,2a0a:e700:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0a:e780::,2a0a:e787:ffff:ffff:ffff:ffff:ffff:ffff,IE 2a0a:e800::,2a0a:e800:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:e880::,2a0a:e887:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:e900::,2a0a:e907:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:e980::,2a0a:e987:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0a:ea00::,2a0a:ea00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:ea80::,2a0a:ea87:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a0a:eb00::,2a0a:eb07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:eb80::,2a0a:eb80:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:ec00::,2a0a:ec07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:ec80::,2a0a:ec87:ffff:ffff:ffff:ffff:ffff:ffff,LB 2a0a:ed00::,2a0a:ed07:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:ed80::,2a0a:ed87:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:ee00::,2a0a:ee07:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0a:ee80::,2a0a:ee87:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:ef00::,2a0a:ef07:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0a:ef80::,2a0a:ef87:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:f000::,2a0a:f000:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:f080::,2a0a:f087:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:f100::,2a0a:f100:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a0a:f180::,2a0a:f187:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:f200::,2a0a:f207:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:f280::,2a0a:f287:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:f300::,2a0a:f307:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:f380::,2a0a:f387:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:f400::,2a0a:f407:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:f480::,2a0a:f487:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:f500::,2a0a:f500:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0a:f580::,2a0a:f587:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a0a:f600::,2a0a:f607:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:f680::,2a0a:f687:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a0a:f700::,2a0a:f707:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:f780::,2a0a:f787:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a0a:f800::,2a0a:f807:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0a:f880::,2a0a:f887:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a0a:f900::,2a0a:f907:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a0a:f980::,2a0a:f987:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:fa00::,2a0a:fa07:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:fa80::,2a0a:fa87:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a0a:fb00::,2a0a:fb00:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:fb80::,2a0a:fb87:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a0a:fc00::,2a0a:fc07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:fc80::,2a0a:fc80:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:fd00::,2a0a:fd00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:fd80::,2a0a:fd87:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:fe00::,2a0a:fe03:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:fe80::,2a0a:fe87:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:ff00::,2a0a:ff00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:ff80::,2a0a:ff80:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0b::,2a0b:7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:80::,2a0b:87:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0b:100::,2a0b:107:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:180::,2a0b:187:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0b:200::,2a0b:207:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0b:300::,2a0b:307:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:280::,2a0b:287:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0b:300::,2a0b:307:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0b:380::,2a0b:387:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a0b:400::,2a0b:407:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:480::,2a0b:487:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a0b:500::,2a0b:507:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:580::,2a0b:580:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0b:600::,2a0b:600:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0b:680::,2a0b:687:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0b:700::,2a0b:707:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a0b:780::,2a0b:787:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0b:800::,2a0b:807:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0b:880::,2a0b:880:ffff:ffff:ffff:ffff:ffff:ffff,LU 2a0b:900::,2a0b:900:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0b:980::,2a0b:980:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0b:a00::,2a0b:a07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:a80::,2a0b:a87:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a0b:b00::,2a0b:b07:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0b:b80::,2a0b:b87:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0b:c00::,2a0b:c00:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a0b:c80::,2a0b:c87:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0b:d00::,2a0b:d07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:d80::,2a0b:d87:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0b:e00::,2a0b:e07:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0b:e80::,2a0b:e87:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a0b:f00::,2a0b:f07:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0b:f80::,2a0b:f87:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a0b:1000::,2a0b:1007:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0b:1080::,2a0b:1087:ffff:ffff:ffff:ffff:ffff:ffff,IL 2a0b:1100::,2a0b:1107:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a0b:1180::,2a0b:1187:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0b:1200::,2a0b:1207:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:1280::,2a0b:1287:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0b:1300::,2a0b:1307:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:1380::,2a0b:1387:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0b:1400::,2a0b:1407:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:1480::,2a0b:1480:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0b:1500::,2a0b:1507:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0b:1580::,2a0b:1587:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0b:1600::,2a0b:1607:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0b:1680::,2a0b:1680:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a0b:1700::,2a0b:1707:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:1780::,2a0b:1787:ffff:ffff:ffff:ffff:ffff:ffff,RO 2a0b:1800::,2a0b:1807:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:1880::,2a0b:1887:ffff:ffff:ffff:ffff:ffff:ffff,IQ 2a0b:1900::,2a0b:1907:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0b:1980::,2a0b:1987:ffff:ffff:ffff:ffff:ffff:ffff,GR 2a0b:1a00::,2a0b:1a07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:1b00::,2a0b:1b00:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:1a80::,2a0b:1a87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:1b00::,2a0b:1b07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:1b80::,2a0b:1b87:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0b:1c00::,2a0b:1c07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:1c80::,2a0b:1c87:ffff:ffff:ffff:ffff:ffff:ffff,UZ 2a0b:1d00::,2a0b:1d07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:1d80::,2a0b:1d80:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0b:1e00::,2a0b:1e07:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a0b:1e80::,2a0b:1e87:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0b:1f00::,2a0b:1f07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:1f80::,2a0b:1f87:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0b:2000::,2a0b:2007:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:2080::,2a0b:2087:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0b:2100::,2a0b:2107:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:2180::,2a0b:2180:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a0b:2200::,2a0b:2207:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0b:2280::,2a0b:2287:ffff:ffff:ffff:ffff:ffff:ffff,IE 2a0b:2300::,2a0b:2300:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0b:2400::,2a0b:2400:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0b:2500::,2a0b:2507:ffff:ffff:ffff:ffff:ffff:ffff,PL @@ -31876,7 +32300,7 @@ 2a0b:4a00::,2a0b:4a07:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a0b:4b00::,2a0b:4b07:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0b:4c00::,2a0b:4c07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:4d00::,2a0b:4d00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:4d00::,2a0b:4d07:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0b:4e00::,2a0b:4e07:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0b:4f00::,2a0b:4f07:ffff:ffff:ffff:ffff:ffff:ffff,IE 2a0b:5000::,2a0b:5007:ffff:ffff:ffff:ffff:ffff:ffff,RO @@ -32114,6 +32538,9 @@ 2c0f:f3a8::,2c0f:f3a8:ffff:ffff:ffff:ffff:ffff:ffff,NG 2c0f:f3b0::,2c0f:f3b0:ffff:ffff:ffff:ffff:ffff:ffff,CI 2c0f:f3b8::,2c0f:f3b8:ffff:ffff:ffff:ffff:ffff:ffff,NG +2c0f:f3c0::,2c0f:f3c0:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f3c8::,2c0f:f3c8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f3d0::,2c0f:f3d0:ffff:ffff:ffff:ffff:ffff:ffff,MZ 2c0f:f400::,2c0f:f400:ffff:ffff:ffff:ffff:ffff:ffff,ZA 2c0f:f408::,2c0f:f408:ffff:ffff:ffff:ffff:ffff:ffff,KE 2c0f:f410::,2c0f:f410:ffff:ffff:ffff:ffff:ffff:ffff,NG @@ -32221,7 +32648,7 @@ 2c0f:f748::,2c0f:f748:ffff:ffff:ffff:ffff:ffff:ffff,MU 2c0f:f750::,2c0f:f750:ffff:ffff:ffff:ffff:ffff:ffff,UG 2c0f:f758::,2c0f:f758:ffff:ffff:ffff:ffff:ffff:ffff,ZW -2c0f:f760::,2c0f:f760:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f760::,2c0f:f760:ffff:ffff:ffff:ffff:ffff:ffff,ZM 2c0f:f768::,2c0f:f768:ffff:ffff:ffff:ffff:ffff:ffff,NG 2c0f:f770::,2c0f:f770:ffff:ffff:ffff:ffff:ffff:ffff,BJ 2c0f:f778::,2c0f:f778:ffff:ffff:ffff:ffff:ffff:ffff,NA diff --git a/src/config/torrc.sample.in b/src/config/torrc.sample.in index 5328206da9..37777443ac 100644 --- a/src/config/torrc.sample.in +++ b/src/config/torrc.sample.in @@ -95,7 +95,12 @@ ## If you have multiple network interfaces, you can specify one for ## outgoing traffic to use. -# OutboundBindAddress 10.0.0.5 +## OutboundBindAddressExit will be used for all exit traffic, while +## OutboundBindAddressOR will be used for all other connections. +## If you do not wish to differentiate, use OutboundBindAddress to +## specify the same address for both in a single line. +#OutboundBindAddressExit 10.0.0.4 +#OutboundBindAddressOR 10.0.0.5 ## A handle for your relay, so people don't have to refer to it by key. ## Nicknames must be between 1 and 19 characters inclusive, and must diff --git a/src/or/bridges.c b/src/or/bridges.c index 7d1acdfeaa..8b37f412ea 100644 --- a/src/or/bridges.c +++ b/src/or/bridges.c @@ -761,29 +761,13 @@ learned_bridge_descriptor(routerinfo_t *ri, int from_cache) fmt_and_decorate_addr(&bridge->addr), (int) bridge->port); } - if (get_options()->UseDeprecatedGuardAlgorithm) { -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM - add_bridge_as_entry_guard(get_guard_selection_info(), node); -#else - tor_assert_nonfatal_unreached(); -#endif - } else { - entry_guard_learned_bridge_identity(&bridge->addrport_configured, - (const uint8_t*)ri->cache_info.identity_digest); - } + entry_guard_learned_bridge_identity(&bridge->addrport_configured, + (const uint8_t*)ri->cache_info.identity_digest); log_notice(LD_DIR, "new bridge descriptor '%s' (%s): %s", ri->nickname, from_cache ? "cached" : "fresh", router_describe(ri)); /* set entry->made_contact so if it goes down we don't drop it from * our entry node list */ - if (get_options()->UseDeprecatedGuardAlgorithm) { -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM - entry_guard_register_connect_status(ri->cache_info.identity_digest, - 1, 0, now); -#else - tor_assert_nonfatal_unreached(); -#endif - } if (first) { routerlist_retry_directory_downloads(now); } diff --git a/src/or/channel.c b/src/or/channel.c index 2951a1d665..45f1602ab2 100644 --- a/src/or/channel.c +++ b/src/or/channel.c @@ -2318,121 +2318,120 @@ channel_flush_some_cells_from_outgoing_queue(channel_t *chan, free_q = 0; handed_off = 0; - if (1) { - /* Figure out how big it is for statistical purposes */ - cell_size = channel_get_cell_queue_entry_size(chan, q); - /* - * Okay, we have a good queue entry, try to give it to the lower - * layer. - */ - switch (q->type) { - case CELL_QUEUE_FIXED: - if (q->u.fixed.cell) { - if (chan->write_cell(chan, - q->u.fixed.cell)) { - ++flushed; - channel_timestamp_xmit(chan); - ++(chan->n_cells_xmitted); - chan->n_bytes_xmitted += cell_size; - free_q = 1; - handed_off = 1; - } - /* Else couldn't write it; leave it on the queue */ - } else { - /* This shouldn't happen */ - log_info(LD_CHANNEL, - "Saw broken cell queue entry of type CELL_QUEUE_FIXED " - "with no cell on channel %p " - "(global ID " U64_FORMAT ").", - chan, U64_PRINTF_ARG(chan->global_identifier)); - /* Throw it away */ - free_q = 1; - handed_off = 0; - } - break; - case CELL_QUEUE_PACKED: - if (q->u.packed.packed_cell) { - if (chan->write_packed_cell(chan, - q->u.packed.packed_cell)) { - ++flushed; - channel_timestamp_xmit(chan); - ++(chan->n_cells_xmitted); - chan->n_bytes_xmitted += cell_size; - free_q = 1; - handed_off = 1; - } - /* Else couldn't write it; leave it on the queue */ - } else { - /* This shouldn't happen */ - log_info(LD_CHANNEL, - "Saw broken cell queue entry of type CELL_QUEUE_PACKED " - "with no cell on channel %p " - "(global ID " U64_FORMAT ").", - chan, U64_PRINTF_ARG(chan->global_identifier)); - /* Throw it away */ - free_q = 1; - handed_off = 0; - } - break; - case CELL_QUEUE_VAR: - if (q->u.var.var_cell) { - if (chan->write_var_cell(chan, - q->u.var.var_cell)) { - ++flushed; - channel_timestamp_xmit(chan); - ++(chan->n_cells_xmitted); - chan->n_bytes_xmitted += cell_size; - free_q = 1; - handed_off = 1; - } - /* Else couldn't write it; leave it on the queue */ - } else { - /* This shouldn't happen */ - log_info(LD_CHANNEL, - "Saw broken cell queue entry of type CELL_QUEUE_VAR " - "with no cell on channel %p " - "(global ID " U64_FORMAT ").", - chan, U64_PRINTF_ARG(chan->global_identifier)); - /* Throw it away */ - free_q = 1; - handed_off = 0; - } - break; - default: - /* Unknown type, log and free it */ - log_info(LD_CHANNEL, - "Saw an unknown cell queue entry type %d on channel %p " - "(global ID " U64_FORMAT "; ignoring it." - " Someone should fix this.", - q->type, chan, U64_PRINTF_ARG(chan->global_identifier)); + /* Figure out how big it is for statistical purposes */ + cell_size = channel_get_cell_queue_entry_size(chan, q); + /* + * Okay, we have a good queue entry, try to give it to the lower + * layer. + */ + switch (q->type) { + case CELL_QUEUE_FIXED: + if (q->u.fixed.cell) { + if (chan->write_cell(chan, + q->u.fixed.cell)) { + ++flushed; + channel_timestamp_xmit(chan); + ++(chan->n_cells_xmitted); + chan->n_bytes_xmitted += cell_size; + free_q = 1; + handed_off = 1; + } + /* Else couldn't write it; leave it on the queue */ + } else { + /* This shouldn't happen */ + log_info(LD_CHANNEL, + "Saw broken cell queue entry of type CELL_QUEUE_FIXED " + "with no cell on channel %p " + "(global ID " U64_FORMAT ").", + chan, U64_PRINTF_ARG(chan->global_identifier)); + /* Throw it away */ + free_q = 1; + handed_off = 0; + } + break; + case CELL_QUEUE_PACKED: + if (q->u.packed.packed_cell) { + if (chan->write_packed_cell(chan, + q->u.packed.packed_cell)) { + ++flushed; + channel_timestamp_xmit(chan); + ++(chan->n_cells_xmitted); + chan->n_bytes_xmitted += cell_size; + free_q = 1; + handed_off = 1; + } + /* Else couldn't write it; leave it on the queue */ + } else { + /* This shouldn't happen */ + log_info(LD_CHANNEL, + "Saw broken cell queue entry of type CELL_QUEUE_PACKED " + "with no cell on channel %p " + "(global ID " U64_FORMAT ").", + chan, U64_PRINTF_ARG(chan->global_identifier)); + /* Throw it away */ + free_q = 1; + handed_off = 0; + } + break; + case CELL_QUEUE_VAR: + if (q->u.var.var_cell) { + if (chan->write_var_cell(chan, + q->u.var.var_cell)) { + ++flushed; + channel_timestamp_xmit(chan); + ++(chan->n_cells_xmitted); + chan->n_bytes_xmitted += cell_size; free_q = 1; - handed_off = 0; + handed_off = 1; + } + /* Else couldn't write it; leave it on the queue */ + } else { + /* This shouldn't happen */ + log_info(LD_CHANNEL, + "Saw broken cell queue entry of type CELL_QUEUE_VAR " + "with no cell on channel %p " + "(global ID " U64_FORMAT ").", + chan, U64_PRINTF_ARG(chan->global_identifier)); + /* Throw it away */ + free_q = 1; + handed_off = 0; } + break; + default: + /* Unknown type, log and free it */ + log_info(LD_CHANNEL, + "Saw an unknown cell queue entry type %d on channel %p " + "(global ID " U64_FORMAT "; ignoring it." + " Someone should fix this.", + q->type, chan, U64_PRINTF_ARG(chan->global_identifier)); + free_q = 1; + handed_off = 0; + } + /* + * if free_q is set, we used it and should remove the queue entry; + * we have to do the free down here so TOR_SIMPLEQ_REMOVE_HEAD isn't + * accessing freed memory + */ + if (free_q) { + TOR_SIMPLEQ_REMOVE_HEAD(&chan->outgoing_queue, next); /* - * if free_q is set, we used it and should remove the queue entry; - * we have to do the free down here so TOR_SIMPLEQ_REMOVE_HEAD isn't - * accessing freed memory + * ...and we handed a cell off to the lower layer, so we should + * update the counters. */ - if (free_q) { - TOR_SIMPLEQ_REMOVE_HEAD(&chan->outgoing_queue, next); - /* - * ...and we handed a cell off to the lower layer, so we should - * update the counters. - */ - ++n_channel_cells_passed_to_lower_layer; - --n_channel_cells_in_queues; - n_channel_bytes_passed_to_lower_layer += cell_size; - n_channel_bytes_in_queues -= cell_size; - channel_assert_counter_consistency(); - /* Update the channel's queue size too */ - chan->bytes_in_queue -= cell_size; - /* Finally, free q */ - cell_queue_entry_free(q, handed_off); - q = NULL; - } + ++n_channel_cells_passed_to_lower_layer; + --n_channel_cells_in_queues; + n_channel_bytes_passed_to_lower_layer += cell_size; + n_channel_bytes_in_queues -= cell_size; + channel_assert_counter_consistency(); + /* Update the channel's queue size too */ + chan->bytes_in_queue -= cell_size; + /* Finally, free q */ + cell_queue_entry_free(q, handed_off); + q = NULL; + } else { /* No cell removed from list, so we can't go on any further */ - else break; + break; } } } @@ -2578,19 +2577,6 @@ channel_do_open_actions(channel_t *chan) if (started_here) { circuit_build_times_network_is_live(get_circuit_build_times_mutable()); rep_hist_note_connect_succeeded(chan->identity_digest, now); -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM - // XXXX prop271 this call is no longer useful with the new algorithm. - if (entry_guard_register_connect_status( - chan->identity_digest, 1, 0, now) < 0) { - /* Close any circuits pending on this channel. We leave it in state - * 'open' though, because it didn't actually *fail* -- we just - * chose not to use it. */ - log_debug(LD_OR, - "New entry guard was reachable, but closing this " - "connection so we can retry the earlier entry guards."); - close_origin_circuits = 1; - } -#endif router_set_status(chan->identity_digest, 1); } else { /* only report it to the geoip module if it's not a known router */ diff --git a/src/or/circpathbias.c b/src/or/circpathbias.c index d86d70f1ff..cdcb6deae4 100644 --- a/src/or/circpathbias.c +++ b/src/or/circpathbias.c @@ -1279,10 +1279,6 @@ pathbias_measure_use_rate(entry_guard_t *guard) tor_lround(pb->timeouts), tor_lround(get_circuit_build_close_time_ms()/1000)); pb->path_bias_disabled = 1; -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM - // XXXX - entry_guard_mark_bad(guard); -#endif return; } } else if (!pb->path_bias_use_extreme) { @@ -1388,10 +1384,6 @@ pathbias_measure_close_rate(entry_guard_t *guard) tor_lround(pb->timeouts), tor_lround(get_circuit_build_close_time_ms()/1000)); pb->path_bias_disabled = 1; -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM - // XXXX - entry_guard_mark_bad(guard); -#endif return; } } else if (!pb->path_bias_extreme) { diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c index 55929c1666..f11c865ad0 100644 --- a/src/or/circuitbuild.c +++ b/src/or/circuitbuild.c @@ -967,10 +967,7 @@ circuit_send_next_onion_skin(origin_circuit_t *circ) if (!hop) { /* done building the circuit. whew. */ guard_usable_t r; - if (get_options()->UseDeprecatedGuardAlgorithm) { - // The circuit is usable; we already marked the guard as okay. - r = GUARD_USABLE_NOW; - } else if (! circ->guard_state) { + if (! circ->guard_state) { if (circuit_get_cpath_len(circ) != 1 && circ->base_.purpose != CIRCUIT_PURPOSE_TESTING && get_options()->UseEntryGuards) { @@ -1017,7 +1014,7 @@ circuit_send_next_onion_skin(origin_circuit_t *circ) "Assuming clock jump. Purpose %d (%s)", timediff, circ->base_.purpose, circuit_purpose_to_string(circ->base_.purpose)); - } else if (!circuit_build_times_disabled()) { + } else if (!circuit_build_times_disabled(get_options())) { /* Only count circuit times if the network is live */ if (circuit_build_times_network_check_live( get_circuit_build_times())) { @@ -2308,26 +2305,6 @@ choose_good_entry_server(uint8_t purpose, cpath_build_state_t *state, * family. */ nodelist_add_node_and_family(excluded, node); } -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM - /* and exclude current entry guards and their families, - * unless we're in a test network, and excluding guards - * would exclude all nodes (i.e. we're in an incredibly small tor network, - * or we're using TestingAuthVoteGuard *). - * This is an incomplete fix, but is no worse than the previous behaviour, - * and only applies to minimal, testing tor networks - * (so it's no less secure) */ - if (options->UseEntryGuards - && (!options->TestingTorNetwork || - smartlist_len(nodelist_get_list()) > smartlist_len(get_entry_guards()) - )) { - SMARTLIST_FOREACH(get_entry_guards(), const entry_guard_t *, entry, - { - if ((node = entry_guard_find_node(entry))) { - nodelist_add_node_and_family(excluded, node); - } - }); - } -#endif if (state) { if (state->need_uptime) diff --git a/src/or/circuitlist.c b/src/or/circuitlist.c index 5943e516ff..54a7db9dbf 100644 --- a/src/or/circuitlist.c +++ b/src/or/circuitlist.c @@ -509,6 +509,39 @@ circuit_count_pending_on_channel(channel_t *chan) return cnt; } +/** Remove <b>origin_circ</b> from the global list of origin circuits. + * Called when we are freeing a circuit. + */ +static void +circuit_remove_from_origin_circuit_list(origin_circuit_t *origin_circ) +{ + int origin_idx = origin_circ->global_origin_circuit_list_idx; + if (origin_idx < 0) + return; + origin_circuit_t *c2; + tor_assert(origin_idx <= smartlist_len(global_origin_circuit_list)); + c2 = smartlist_get(global_origin_circuit_list, origin_idx); + tor_assert(origin_circ == c2); + smartlist_del(global_origin_circuit_list, origin_idx); + if (origin_idx < smartlist_len(global_origin_circuit_list)) { + origin_circuit_t *replacement = + smartlist_get(global_origin_circuit_list, origin_idx); + replacement->global_origin_circuit_list_idx = origin_idx; + } + origin_circ->global_origin_circuit_list_idx = -1; +} + +/** Add <b>origin_circ</b> to the global list of origin circuits. Called + * when creating the circuit. */ +static void +circuit_add_to_origin_circuit_list(origin_circuit_t *origin_circ) +{ + tor_assert(origin_circ->global_origin_circuit_list_idx == -1); + smartlist_t *lst = circuit_get_global_origin_circuit_list(); + smartlist_add(lst, origin_circ); + origin_circ->global_origin_circuit_list_idx = smartlist_len(lst) - 1; +} + /** Detach from the global circuit list, and deallocate, all * circuits that have been marked for close. */ @@ -533,15 +566,7 @@ circuit_close_all_marked(void) /* Remove it from the origin circuit list, if appropriate. */ if (CIRCUIT_IS_ORIGIN(circ)) { - origin_circuit_t *origin_circ = TO_ORIGIN_CIRCUIT(circ); - int origin_idx = origin_circ->global_origin_circuit_list_idx; - smartlist_del(global_origin_circuit_list, origin_idx); - if (origin_idx < smartlist_len(global_origin_circuit_list)) { - origin_circuit_t *replacement = - smartlist_get(global_origin_circuit_list, origin_idx); - replacement->global_origin_circuit_list_idx = origin_idx; - } - origin_circ->global_origin_circuit_list_idx = -1; + circuit_remove_from_origin_circuit_list(TO_ORIGIN_CIRCUIT(circ)); } circuit_about_to_free(circ); @@ -566,7 +591,7 @@ circuit_get_global_origin_circuit_list(void) { if (NULL == global_origin_circuit_list) global_origin_circuit_list = smartlist_new(); - return global_circuitlist; + return global_origin_circuit_list; } /** Function to make circ-\>state human-readable */ @@ -811,11 +836,8 @@ origin_circuit_new(void) init_circuit_base(TO_CIRCUIT(circ)); /* Add to origin-list. */ - if (!global_origin_circuit_list) - global_origin_circuit_list = smartlist_new(); - smartlist_add(global_origin_circuit_list, circ); - circ->global_origin_circuit_list_idx = - smartlist_len(global_origin_circuit_list) - 1; + circ->global_origin_circuit_list_idx = -1; + circuit_add_to_origin_circuit_list(circ); circuit_build_times_update_last_circ(get_circuit_build_times_mutable()); @@ -875,16 +897,7 @@ circuit_free(circuit_t *circ) memlen = sizeof(origin_circuit_t); tor_assert(circ->magic == ORIGIN_CIRCUIT_MAGIC); - if (ocirc->global_origin_circuit_list_idx != -1) { - int idx = ocirc->global_origin_circuit_list_idx; - origin_circuit_t *c2 = smartlist_get(global_origin_circuit_list, idx); - tor_assert(c2 == ocirc); - smartlist_del(global_origin_circuit_list, idx); - if (idx < smartlist_len(global_origin_circuit_list)) { - c2 = smartlist_get(global_origin_circuit_list, idx); - c2->global_origin_circuit_list_idx = idx; - } - } + circuit_remove_from_origin_circuit_list(ocirc); if (ocirc->build_state) { extend_info_free(ocirc->build_state->chosen_exit); @@ -1440,6 +1453,41 @@ circuit_get_ready_rend_circ_by_rend_data(const rend_data_t *rend_data) return NULL; } +/** Return the first service introduction circuit originating from the global + * circuit list after <b>start</b> or at the start of the list if <b>start</b> + * is NULL. Return NULL if no circuit is found. + * + * A service introduction point circuit has a purpose of either + * CIRCUIT_PURPOSE_S_ESTABLISH_INTRO or CIRCUIT_PURPOSE_S_INTRO. This does not + * return a circuit marked for close and its state must be open. */ +origin_circuit_t * +circuit_get_next_service_intro_circ(origin_circuit_t *start) +{ + int idx = 0; + smartlist_t *lst = circuit_get_global_list(); + + if (start) { + idx = TO_CIRCUIT(start)->global_circuitlist_idx + 1; + } + + for ( ; idx < smartlist_len(lst); ++idx) { + circuit_t *circ = smartlist_get(lst, idx); + + /* Ignore a marked for close circuit or purpose not matching a service + * intro point or if the state is not open. */ + if (circ->marked_for_close || circ->state != CIRCUIT_STATE_OPEN || + (circ->purpose != CIRCUIT_PURPOSE_S_ESTABLISH_INTRO && + circ->purpose != CIRCUIT_PURPOSE_S_INTRO)) { + continue; + } + /* The purposes we are looking for are only for origin circuits so the + * following is valid. */ + return TO_ORIGIN_CIRCUIT(circ); + } + /* Not found. */ + return NULL; +} + /** Return the first circuit originating here in global_circuitlist after * <b>start</b> whose purpose is <b>purpose</b>, and where <b>digest</b> (if * set) matches the private key digest of the rend data associated with the @@ -1810,6 +1858,9 @@ circuit_about_to_free(circuit_t *circ) if (circuits_pending_chans) smartlist_remove(circuits_pending_chans, circ); } + if (circuits_pending_other_guards) { + smartlist_remove(circuits_pending_other_guards, circ); + } if (CIRCUIT_IS_ORIGIN(circ)) { control_event_circuit_status(TO_ORIGIN_CIRCUIT(circ), (circ->state == CIRCUIT_STATE_OPEN || diff --git a/src/or/circuitlist.h b/src/or/circuitlist.h index d83801a7a8..6abee37dc4 100644 --- a/src/or/circuitlist.h +++ b/src/or/circuitlist.h @@ -47,6 +47,7 @@ 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 uint8_t *digest, uint8_t purpose); +origin_circuit_t *circuit_get_next_service_intro_circ(origin_circuit_t *start); origin_circuit_t *circuit_find_to_cannibalize(uint8_t purpose, extend_info_t *info, int flags); void circuit_mark_all_unused_circs(void); diff --git a/src/or/circuitstats.c b/src/or/circuitstats.c index 6cb99e4175..48cb89dc37 100644 --- a/src/or/circuitstats.c +++ b/src/or/circuitstats.c @@ -105,12 +105,11 @@ get_circuit_build_timeout_ms(void) * 6. If we are configured in Single Onion mode */ int -circuit_build_times_disabled(void) +circuit_build_times_disabled(const or_options_t *options) { if (unit_tests) { return 0; } else { - const or_options_t *options = get_options(); int consensus_disabled = networkstatus_get_param(NULL, "cbtdisabled", 0, 0, 1); int config_disabled = !options->LearnCircuitBuildTimeout; @@ -417,7 +416,7 @@ circuit_build_times_new_consensus_params(circuit_build_times_t *cbt, * update if we aren't. */ - if (!circuit_build_times_disabled()) { + if (!circuit_build_times_disabled(get_options())) { num = circuit_build_times_recent_circuit_count(ns); if (num > 0) { @@ -493,14 +492,15 @@ static double circuit_build_times_get_initial_timeout(void) { double timeout; + const or_options_t *options = get_options(); /* * Check if we have LearnCircuitBuildTimeout, and if we don't, * always use CircuitBuildTimeout, no questions asked. */ - if (!unit_tests && get_options()->CircuitBuildTimeout) { - timeout = get_options()->CircuitBuildTimeout*1000; - if (!circuit_build_times_disabled() && + if (!unit_tests && options->CircuitBuildTimeout) { + timeout = options->CircuitBuildTimeout*1000; + if (!circuit_build_times_disabled(options) && timeout < circuit_build_times_min_timeout()) { log_warn(LD_CIRC, "Config CircuitBuildTimeout too low. Setting to %ds", circuit_build_times_min_timeout()/1000); @@ -542,7 +542,7 @@ circuit_build_times_init(circuit_build_times_t *cbt) * Check if we really are using adaptive timeouts, and don't keep * track of this stuff if not. */ - if (!circuit_build_times_disabled()) { + if (!circuit_build_times_disabled(get_options())) { cbt->liveness.num_recent_circs = circuit_build_times_recent_circuit_count(NULL); cbt->liveness.timeouts_after_firsthop = @@ -906,7 +906,7 @@ circuit_build_times_parse_state(circuit_build_times_t *cbt, int err = 0; circuit_build_times_init(cbt); - if (circuit_build_times_disabled()) { + if (circuit_build_times_disabled(get_options())) { return 0; } @@ -1507,7 +1507,7 @@ circuit_build_times_count_close(circuit_build_times_t *cbt, int did_onehop, time_t start_time) { - if (circuit_build_times_disabled()) { + if (circuit_build_times_disabled(get_options())) { cbt->close_ms = cbt->timeout_ms = circuit_build_times_get_initial_timeout(); return 0; @@ -1538,7 +1538,7 @@ void circuit_build_times_count_timeout(circuit_build_times_t *cbt, int did_onehop) { - if (circuit_build_times_disabled()) { + if (circuit_build_times_disabled(get_options())) { cbt->close_ms = cbt->timeout_ms = circuit_build_times_get_initial_timeout(); return; @@ -1612,7 +1612,7 @@ circuit_build_times_set_timeout(circuit_build_times_t *cbt) /* * Just return if we aren't using adaptive timeouts */ - if (circuit_build_times_disabled()) + if (circuit_build_times_disabled(get_options())) return; if (!circuit_build_times_set_timeout_worker(cbt)) diff --git a/src/or/circuitstats.h b/src/or/circuitstats.h index 72b160983f..23910276ae 100644 --- a/src/or/circuitstats.h +++ b/src/or/circuitstats.h @@ -17,7 +17,7 @@ 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_disabled(const or_options_t *options); 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); diff --git a/src/or/circuituse.c b/src/or/circuituse.c index ecd35af9dd..c2b450606b 100644 --- a/src/or/circuituse.c +++ b/src/or/circuituse.c @@ -1140,7 +1140,7 @@ needs_circuits_for_build(int num) { if (router_have_consensus_path() != CONSENSUS_PATH_UNKNOWN) { if (num < CBT_MAX_UNUSED_OPEN_CIRCUITS && - !circuit_build_times_disabled() && + !circuit_build_times_disabled(get_options()) && circuit_build_times_needs_circuits_now(get_circuit_build_times())) { return 1; } @@ -1400,7 +1400,7 @@ circuit_expire_old_circuits_clientside(void) cutoff = now; last_expired_clientside_circuits = now.tv_sec; - if (! circuit_build_times_disabled() && + if (! circuit_build_times_disabled(get_options()) && 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 */ @@ -1732,10 +1732,6 @@ circuit_build_failed(origin_circuit_t *circ) /* New guard API: we failed. */ if (circ->guard_state) entry_guard_failed(&circ->guard_state); -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM - /* Old guard API: we failed. */ - entry_guard_register_connect_status(n_chan_id, 0, 1, time(NULL)); -#endif /* if there are any one-hop streams waiting on this circuit, fail * them now so they can retry elsewhere. */ connection_ap_fail_onehop(n_chan_id, circ->build_state); diff --git a/src/or/config.c b/src/or/config.c index 7f789c49f3..1ea8712379 100644 --- a/src/or/config.c +++ b/src/or/config.c @@ -183,8 +183,17 @@ static config_abbrev_t option_abbrevs_[] = { /** An entry for config_vars: "The option <b>name</b> is obsolete." */ #define OBSOLETE(name) { name, CONFIG_TYPE_OBSOLETE, 0, NULL } -#define VPORT(member,conftype,initvalue) \ - VAR(#member, conftype, member ## _lines, initvalue) +/** + * Macro to declare *Port options. Each one comes in three entries. + * For example, most users should use "SocksPort" to configure the + * socks port, but TorBrowser wants to use __SocksPort so that it + * isn't stored by SAVECONF. The SocksPortLines virtual option is + * used to query both options from the controller. + */ +#define VPORT(member) \ + VAR(#member "Lines", LINELIST_V, member ## _lines, NULL), \ + VAR(#member, LINELIST_S, member ## _lines, NULL), \ + VAR("__" #member, LINELIST_S, member ## _lines, NULL) /** Array of configuration options. Until we disallow nonstandard * abbreviations, order is significant, since the first matching option will @@ -212,7 +221,7 @@ static config_var_t option_vars_[] = { V(AuthDirInvalidCCs, CSV, ""), V(AuthDirFastGuarantee, MEMUNIT, "100 KB"), V(AuthDirGuardBWGuarantee, MEMUNIT, "2 MB"), - V(AuthDirPinKeys, BOOL, "0"), + V(AuthDirPinKeys, BOOL, "1"), V(AuthDirReject, LINELIST, NULL), V(AuthDirRejectCCs, CSV, ""), OBSOLETE("AuthDirRejectUnlisted"), @@ -253,7 +262,7 @@ static config_var_t option_vars_[] = { V(ConstrainedSockSize, MEMUNIT, "8192"), V(ContactInfo, STRING, NULL), V(ControlListenAddress, LINELIST, NULL), - VPORT(ControlPort, LINELIST, NULL), + VPORT(ControlPort), V(ControlPortFileGroupReadable,BOOL, "0"), V(ControlPortWriteToFile, FILENAME, NULL), V(ControlSocket, LINELIST, NULL), @@ -271,7 +280,7 @@ static config_var_t option_vars_[] = { V(TestingAuthDirTimeToLearnReachability, INTERVAL, "30 minutes"), V(DirListenAddress, LINELIST, NULL), V(DirPolicy, LINELIST, NULL), - VPORT(DirPort, LINELIST, NULL), + VPORT(DirPort), V(DirPortFrontPage, FILENAME, NULL), VAR("DirReqStatistics", BOOL, DirReqStatistics_option, "1"), VAR("DirAuthority", LINELIST, DirAuthorities, NULL), @@ -282,7 +291,7 @@ static config_var_t option_vars_[] = { OBSOLETE("DisableIOCP"), OBSOLETE("DisableV2DirectoryInfo_"), OBSOLETE("DynamicDHGroups"), - VPORT(DNSPort, LINELIST, NULL), + VPORT(DNSPort), V(DNSListenAddress, LINELIST, NULL), V(DownloadExtraInfo, BOOL, "0"), V(TestingEnableConnBwEvent, BOOL, "0"), @@ -302,15 +311,12 @@ static config_var_t option_vars_[] = { V(ExitPortStatistics, BOOL, "0"), V(ExtendAllowPrivateAddresses, BOOL, "0"), V(ExitRelay, AUTOBOOL, "auto"), - VPORT(ExtORPort, LINELIST, NULL), + VPORT(ExtORPort), V(ExtORPortCookieAuthFile, STRING, NULL), V(ExtORPortCookieAuthFileGroupReadable, BOOL, "0"), V(ExtraInfoStatistics, BOOL, "1"), V(ExtendByEd25519ID, AUTOBOOL, "auto"), V(FallbackDir, LINELIST, NULL), - /* XXXX prop271 -- this has an ugly name to remind us to remove it. */ - VAR("UseDeprecatedGuardAlgorithm_", BOOL, - UseDeprecatedGuardAlgorithm, "0"), V(UseDefaultFallbackDirs, BOOL, "1"), @@ -393,7 +399,7 @@ static config_var_t option_vars_[] = { V(NewCircuitPeriod, INTERVAL, "30 seconds"), OBSOLETE("NamingAuthoritativeDirectory"), V(NATDListenAddress, LINELIST, NULL), - VPORT(NATDPort, LINELIST, NULL), + VPORT(NATDPort), V(Nickname, STRING, NULL), V(PredictedPortsRelevanceTime, INTERVAL, "1 hour"), V(WarnUnsafeSocks, BOOL, "1"), @@ -403,8 +409,10 @@ static config_var_t option_vars_[] = { V(NumEntryGuards, UINT, "0"), V(OfflineMasterKey, BOOL, "0"), V(ORListenAddress, LINELIST, NULL), - VPORT(ORPort, LINELIST, NULL), + VPORT(ORPort), V(OutboundBindAddress, LINELIST, NULL), + V(OutboundBindAddressOR, LINELIST, NULL), + V(OutboundBindAddressExit, LINELIST, NULL), OBSOLETE("PathBiasDisableRate"), V(PathBiasCircThreshold, INT, "-1"), @@ -475,7 +483,7 @@ static config_var_t option_vars_[] = { V(ShutdownWaitLength, INTERVAL, "30 seconds"), V(SocksListenAddress, LINELIST, NULL), V(SocksPolicy, LINELIST, NULL), - VPORT(SocksPort, LINELIST, NULL), + VPORT(SocksPort), V(SocksTimeout, INTERVAL, "2 minutes"), V(SSLKeyLifetime, INTERVAL, "0"), OBSOLETE("StrictEntryNodes"), @@ -490,7 +498,7 @@ static config_var_t option_vars_[] = { V(TrackHostExits, CSV, NULL), V(TrackHostExitsExpire, INTERVAL, "30 minutes"), V(TransListenAddress, LINELIST, NULL), - VPORT(TransPort, LINELIST, NULL), + VPORT(TransPort), V(TransProxyType, STRING, "default"), OBSOLETE("TunnelDirConns"), V(UpdateBridgesFromAuthority, BOOL, "0"), @@ -1578,7 +1586,6 @@ options_transition_affects_guards(const or_options_t *old, return (old->UseEntryGuards != new->UseEntryGuards || - old->UseDeprecatedGuardAlgorithm != new->UseDeprecatedGuardAlgorithm || old->UseBridges != new->UseBridges || old->UseEntryGuards != new->UseEntryGuards || old->ClientUseIPv4 != new->ClientUseIPv4 || @@ -2097,15 +2104,6 @@ options_act(const or_options_t *old_options) !options->BridgeAuthoritativeDir) rep_hist_desc_stats_term(); - /* Check if we need to parse and add the EntryNodes config option. */ -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM - if (options->EntryNodes && - (!old_options || - !routerset_equal(old_options->EntryNodes,options->EntryNodes) || - !routerset_equal(old_options->ExcludeNodes,options->ExcludeNodes))) - entry_nodes_should_be_added(); -#endif - /* Since our options changed, we might need to regenerate and upload our * server descriptor. */ @@ -3009,13 +3007,6 @@ options_validate(or_options_t *old_options, or_options_t *options, warn_about_relative_paths(options); -#ifndef ENABLE_LEGACY_GUARD_ALGORITHM - if (options->UseDeprecatedGuardAlgorithm) { - log_warn(LD_CONFIG, "DeprecatedGuardAlgorithm not supported."); - return -1; - } -#endif - if (server_mode(options) && (!strcmpstart(uname, "Windows 95") || !strcmpstart(uname, "Windows 98") || @@ -3361,23 +3352,6 @@ options_validate(or_options_t *old_options, or_options_t *options, "of the Internet, so they must not set Reachable*Addresses " "or FascistFirewall or FirewallPorts or ClientUseIPv4 0."); - /* We check if Reachable*Addresses blocks all addresses in - * parse_reachable_addresses(). */ - -#define WARN_PLEASE_USE_IPV6_LOG_MSG \ - "ClientPreferIPv6%sPort 1 is ignored unless tor is using IPv6. " \ - "Please set ClientUseIPv6 1, ClientUseIPv4 0, or configure bridges." - - if (!fascist_firewall_use_ipv6(options) - && options->ClientPreferIPv6ORPort == 1) - log_warn(LD_CONFIG, WARN_PLEASE_USE_IPV6_LOG_MSG, "OR"); - - if (!fascist_firewall_use_ipv6(options) - && options->ClientPreferIPv6DirPort == 1) - log_warn(LD_CONFIG, WARN_PLEASE_USE_IPV6_LOG_MSG, "Dir"); - -#undef WARN_PLEASE_USE_IPV6_LOG_MSG - if (options->UseBridges && server_mode(options)) REJECT("Servers must be able to freely connect to the rest " @@ -3389,6 +3363,11 @@ options_validate(or_options_t *old_options, or_options_t *options, if (options->UseBridges && options->EntryNodes) REJECT("You cannot set both UseBridges and EntryNodes."); + /* If we have UseBridges as 1 and UseEntryGuards as 0, we end up bypassing + * the use of bridges */ + if (options->UseBridges && !options->UseEntryGuards) + REJECT("Setting UseBridges requires also setting UseEntryGuards."); + options->MaxMemInQueues = compute_real_max_mem_in_queues(options->MaxMemInQueues_raw, server_mode(options)); @@ -3557,7 +3536,7 @@ options_validate(or_options_t *old_options, or_options_t *options, int severity = LOG_NOTICE; /* Be a little quieter if we've deliberately disabled * LearnCircuitBuildTimeout. */ - if (circuit_build_times_disabled()) { + if (circuit_build_times_disabled(options)) { severity = LOG_INFO; } log_fn(severity, LD_CONFIG, "You disabled LearnCircuitBuildTimeout, but " @@ -4362,8 +4341,8 @@ compute_real_max_mem_in_queues(const uint64_t val, int log_guess) } /* If we have less than 300 MB suggest disabling dircache */ -#define DIRCACHE_MIN_MB_BANDWIDTH 300 -#define DIRCACHE_MIN_BANDWIDTH (DIRCACHE_MIN_MB_BANDWIDTH*ONE_MEGABYTE) +#define DIRCACHE_MIN_MEM_MB 300 +#define DIRCACHE_MIN_MEM_BYTES (DIRCACHE_MIN_MEM_MB*ONE_MEGABYTE) #define STRINGIFY(val) #val /** Create a warning message for emitting if we are a dircache but may not have @@ -4383,21 +4362,21 @@ have_enough_mem_for_dircache(const or_options_t *options, size_t total_mem, } } if (options->DirCache) { - if (total_mem < DIRCACHE_MIN_BANDWIDTH) { + if (total_mem < DIRCACHE_MIN_MEM_BYTES) { if (options->BridgeRelay) { *msg = tor_strdup("Running a Bridge with less than " - STRINGIFY(DIRCACHE_MIN_MB_BANDWIDTH) " MB of memory is " - "not recommended."); + STRINGIFY(DIRCACHE_MIN_MEM_MB) " MB of memory is not " + "recommended."); } else { *msg = tor_strdup("Being a directory cache (default) with less than " - STRINGIFY(DIRCACHE_MIN_MB_BANDWIDTH) " MB of memory is " - "not recommended and may consume most of the available " + STRINGIFY(DIRCACHE_MIN_MEM_MB) " MB of memory is not " + "recommended and may consume most of the available " "resources, consider disabling this functionality by " "setting the DirCache option to 0."); } } } else { - if (total_mem >= DIRCACHE_MIN_BANDWIDTH) { + if (total_mem >= DIRCACHE_MIN_MEM_BYTES) { *msg = tor_strdup("DirCache is disabled and we are configured as a " "relay. This may disqualify us from becoming a guard in the " "future."); @@ -4522,7 +4501,6 @@ options_transition_allowed(const or_options_t *old, } while (0) SB_NOCHANGE_STR(Address); - SB_NOCHANGE_STR(PidFile); SB_NOCHANGE_STR(ServerDNSResolvConfFile); SB_NOCHANGE_STR(DirPortFrontPage); SB_NOCHANGE_STR(CookieAuthFile); @@ -5313,35 +5291,35 @@ addressmap_register_auto(const char *from, const char *to, int from_wildcard = 0, to_wildcard = 0; *msg = "whoops, forgot the error message"; - if (1) { - if (!strcmp(to, "*") || !strcmp(from, "*")) { - *msg = "can't remap from or to *"; - return -1; - } - /* Detect asterisks in expressions of type: '*.example.com' */ - if (!strncmp(from,"*.",2)) { - from += 2; - from_wildcard = 1; - } - if (!strncmp(to,"*.",2)) { - to += 2; - to_wildcard = 1; - } - if (to_wildcard && !from_wildcard) { - *msg = "can only use wildcard (i.e. '*.') if 'from' address " - "uses wildcard also"; - return -1; - } + if (!strcmp(to, "*") || !strcmp(from, "*")) { + *msg = "can't remap from or to *"; + return -1; + } + /* Detect asterisks in expressions of type: '*.example.com' */ + if (!strncmp(from,"*.",2)) { + from += 2; + from_wildcard = 1; + } + if (!strncmp(to,"*.",2)) { + to += 2; + to_wildcard = 1; + } - if (address_is_invalid_destination(to, 1)) { - *msg = "destination is invalid"; - return -1; - } + if (to_wildcard && !from_wildcard) { + *msg = "can only use wildcard (i.e. '*.') if 'from' address " + "uses wildcard also"; + return -1; + } - addressmap_register(from, tor_strdup(to), expires, addrmap_source, - from_wildcard, to_wildcard); + if (address_is_invalid_destination(to, 1)) { + *msg = "destination is invalid"; + return -1; } + + addressmap_register(from, tor_strdup(to), expires, addrmap_source, + from_wildcard, to_wildcard); + return 0; } @@ -6268,6 +6246,7 @@ port_cfg_new(size_t namelen) tor_assert(namelen <= SIZE_T_CEILING - sizeof(port_cfg_t) - 1); port_cfg_t *cfg = tor_malloc_zero(sizeof(port_cfg_t) + namelen + 1); cfg->entry_cfg.ipv4_traffic = 1; + cfg->entry_cfg.ipv6_traffic = 1; cfg->entry_cfg.dns_request = 1; cfg->entry_cfg.onion_traffic = 1; cfg->entry_cfg.cache_ipv4_answers = 1; @@ -6621,7 +6600,7 @@ parse_port_config(smartlist_t *out, /* This must be kept in sync with port_cfg_new's defaults */ int no_listen = 0, no_advertise = 0, all_addrs = 0, bind_ipv4_only = 0, bind_ipv6_only = 0, - ipv4_traffic = 1, ipv6_traffic = 0, prefer_ipv6 = 0, dns_request = 1, + ipv4_traffic = 1, ipv6_traffic = 1, prefer_ipv6 = 0, dns_request = 1, onion_traffic = 1, cache_ipv4 = 1, use_cached_ipv4 = 0, cache_ipv6 = 0, use_cached_ipv6 = 0, @@ -7859,7 +7838,7 @@ getinfo_helper_config(control_connection_t *conn, 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_S: type = "Dependent"; break; case CONFIG_TYPE_LINELIST_V: type = "Virtual"; break; default: case CONFIG_TYPE_OBSOLETE: @@ -7941,60 +7920,83 @@ getinfo_helper_config(control_connection_t *conn, return 0; } -/** Parse outbound bind address option lines. If <b>validate_only</b> - * is not 0 update OutboundBindAddressIPv4_ and - * OutboundBindAddressIPv6_ in <b>options</b>. On failure, set - * <b>msg</b> (if provided) to a newly allocated string containing a - * description of the problem and return -1. */ +/* Check whether an address has already been set against the options + * depending on address family and destination type. Any exsting + * value will lead to a fail, even if it is the same value. If not + * set and not only validating, copy it into this location too. + * Returns 0 on success or -1 if this address is already set. + */ static int -parse_outbound_addresses(or_options_t *options, int validate_only, char **msg) +verify_and_store_outbound_address(sa_family_t family, tor_addr_t *addr, + outbound_addr_t type, or_options_t *options, int validate_only) { - const config_line_t *lines = options->OutboundBindAddress; - int found_v4 = 0, found_v6 = 0; - + if (type>=OUTBOUND_ADDR_MAX || (family!=AF_INET && family!=AF_INET6)) { + return -1; + } + int fam_index=0; + if (family==AF_INET6) { + fam_index=1; + } + tor_addr_t *dest=&options->OutboundBindAddresses[type][fam_index]; + if (!tor_addr_is_null(dest)) { + return -1; + } if (!validate_only) { - memset(&options->OutboundBindAddressIPv4_, 0, - sizeof(options->OutboundBindAddressIPv4_)); - memset(&options->OutboundBindAddressIPv6_, 0, - sizeof(options->OutboundBindAddressIPv6_)); + tor_addr_copy(dest, addr); } + return 0; +} + +/* Parse a list of address lines for a specific destination type. + * Will store them into the options if not validate_only. If a + * problem occurs, a suitable error message is store in msg. + * Returns 0 on success or -1 if any address is already set. + */ +static int +parse_outbound_address_lines(const config_line_t *lines, outbound_addr_t type, + or_options_t *options, int validate_only, char **msg) +{ + tor_addr_t addr; + sa_family_t family; while (lines) { - tor_addr_t addr, *dst_addr = NULL; - int af = tor_addr_parse(&addr, lines->value); - switch (af) { - case AF_INET: - if (found_v4) { - if (msg) - tor_asprintf(msg, "Multiple IPv4 outbound bind addresses " - "configured: %s", lines->value); - return -1; - } - found_v4 = 1; - dst_addr = &options->OutboundBindAddressIPv4_; - break; - case AF_INET6: - if (found_v6) { - if (msg) - tor_asprintf(msg, "Multiple IPv6 outbound bind addresses " - "configured: %s", lines->value); - return -1; - } - found_v6 = 1; - dst_addr = &options->OutboundBindAddressIPv6_; - break; - default: + family = tor_addr_parse(&addr, lines->value); + if (verify_and_store_outbound_address(family, &addr, type, + options, validate_only)) { if (msg) - tor_asprintf(msg, "Outbound bind address '%s' didn't parse.", - lines->value); + tor_asprintf(msg, "Multiple%s%s outbound bind addresses " + "configured: %s", + family==AF_INET?" IPv4":(family==AF_INET6?" IPv6":""), + type==OUTBOUND_ADDR_OR?" OR": + (type==OUTBOUND_ADDR_EXIT?" exit":""), lines->value); return -1; } - if (!validate_only) - tor_addr_copy(dst_addr, &addr); lines = lines->next; } return 0; } +/** Parse outbound bind address option lines. If <b>validate_only</b> + * is not 0 update OutboundBindAddresses in <b>options</b>. + * Only one address can be set for any of these values. + * On failure, set <b>msg</b> (if provided) to a newly allocated string + * containing a description of the problem and return -1. + */ +static int +parse_outbound_addresses(or_options_t *options, int validate_only, char **msg) +{ + if (!validate_only) { + memset(&options->OutboundBindAddresses, 0, + sizeof(options->OutboundBindAddresses)); + } + parse_outbound_address_lines(options->OutboundBindAddress, + OUTBOUND_ADDR_EXIT_AND_OR, options, validate_only, msg); + parse_outbound_address_lines(options->OutboundBindAddressOR, + OUTBOUND_ADDR_OR, options, validate_only, msg); + parse_outbound_address_lines(options->OutboundBindAddressExit, + OUTBOUND_ADDR_EXIT, options, validate_only, msg); + return 0; +} + /** Load one of the geoip files, <a>family</a> determining which * one. <a>default_fname</a> is used if on Windows and * <a>fname</a> equals "<default>". */ diff --git a/src/or/confparse.c b/src/or/confparse.c index 1706fa85e2..92a66a4b5a 100644 --- a/src/or/confparse.c +++ b/src/or/confparse.c @@ -1159,6 +1159,11 @@ config_dump(const config_format_t *fmt, const void *default_options, config_get_assigned_option(fmt, options, fmt->vars[i].name, 1); for (; line; line = line->next) { + if (!strcmpstart(line->key, "__")) { + /* This check detects "hidden" variables inside LINELIST_V structures. + */ + continue; + } smartlist_add_asprintf(elements, "%s%s %s\n", comment_option ? "# " : "", line->key, line->value); diff --git a/src/or/connection.c b/src/or/connection.c index 5b22594969..188276026f 100644 --- a/src/or/connection.c +++ b/src/or/connection.c @@ -34,7 +34,7 @@ * they become able to read or write register the fact with the event main * loop by calling connection_watch_events(), connection_start_reading(), or * connection_start_writing(). When they no longer want to read or write, - * they call connection_stop_reading() or connection_start_writing(). + * they call connection_stop_reading() or connection_stop_writing(). * * To queue data to be written on a connection, call * connection_write_to_buf(). When data arrives, the @@ -134,6 +134,8 @@ static int connection_read_https_proxy_response(connection_t *conn); static void connection_send_socks5_connect(connection_t *conn); static const char *proxy_type_to_string(int proxy_type); static int get_proxy_type(void); +const tor_addr_t *conn_get_outbound_address(sa_family_t family, + const or_options_t *options, unsigned int conn_type); /** The last addresses that our network interface seemed to have been * binding to. We use this as one way to detect when our IP changes. @@ -1771,7 +1773,7 @@ connection_connect_sockaddr,(connection_t *conn, /* * We've got the socket open; give the OOS handler a chance to check - * against configuured maximum socket number, but tell it no exhaustion + * against configured maximum socket number, but tell it no exhaustion * failure. */ connection_check_oos(get_n_open_sockets(), 0); @@ -1890,6 +1892,55 @@ connection_connect_log_client_use_ip_version(const connection_t *conn) } } +/** Retrieve the outbound address depending on the protocol (IPv4 or IPv6) + * and the connection type (relay, exit, ...) + * Return a socket address or NULL in case nothing is configured. + **/ +const tor_addr_t * +conn_get_outbound_address(sa_family_t family, + const or_options_t *options, unsigned int conn_type) +{ + const tor_addr_t *ext_addr = NULL; + + int fam_index; + switch (family) { + case AF_INET: + fam_index = 0; + break; + case AF_INET6: + fam_index = 1; + break; + default: + return NULL; + } + + // If an exit connection, use the exit address (if present) + if (conn_type == CONN_TYPE_EXIT) { + if (!tor_addr_is_null( + &options->OutboundBindAddresses[OUTBOUND_ADDR_EXIT][fam_index])) { + ext_addr = &options->OutboundBindAddresses[OUTBOUND_ADDR_EXIT] + [fam_index]; + } else if (!tor_addr_is_null( + &options->OutboundBindAddresses[OUTBOUND_ADDR_EXIT_AND_OR] + [fam_index])) { + ext_addr = &options->OutboundBindAddresses[OUTBOUND_ADDR_EXIT_AND_OR] + [fam_index]; + } + } else { // All non-exit connections + if (!tor_addr_is_null( + &options->OutboundBindAddresses[OUTBOUND_ADDR_OR][fam_index])) { + ext_addr = &options->OutboundBindAddresses[OUTBOUND_ADDR_OR] + [fam_index]; + } else if (!tor_addr_is_null( + &options->OutboundBindAddresses[OUTBOUND_ADDR_EXIT_AND_OR] + [fam_index])) { + ext_addr = &options->OutboundBindAddresses[OUTBOUND_ADDR_EXIT_AND_OR] + [fam_index]; + } + } + return ext_addr; +} + /** Take conn, make a nonblocking socket; try to connect to * addr:port (port arrives in *host order*). If fail, return -1 and if * applicable put your best guess about errno into *<b>socket_error</b>. @@ -1911,26 +1962,15 @@ connection_connect(connection_t *conn, const char *address, struct sockaddr *bind_addr = NULL; struct sockaddr *dest_addr; int dest_addr_len, bind_addr_len = 0; - const or_options_t *options = get_options(); - int protocol_family; /* Log if we didn't stick to ClientUseIPv4/6 or ClientPreferIPv6OR/DirPort */ connection_connect_log_client_use_ip_version(conn); - if (tor_addr_family(addr) == AF_INET6) - protocol_family = PF_INET6; - else - protocol_family = PF_INET; - if (!tor_addr_is_loopback(addr)) { const tor_addr_t *ext_addr = NULL; - if (protocol_family == AF_INET && - !tor_addr_is_null(&options->OutboundBindAddressIPv4_)) - ext_addr = &options->OutboundBindAddressIPv4_; - else if (protocol_family == AF_INET6 && - !tor_addr_is_null(&options->OutboundBindAddressIPv6_)) - ext_addr = &options->OutboundBindAddressIPv6_; + ext_addr = conn_get_outbound_address(tor_addr_family(addr), get_options(), + conn->type); if (ext_addr) { memset(&bind_addr_ss, 0, sizeof(bind_addr_ss)); bind_addr_len = tor_addr_to_sockaddr(ext_addr, 0, diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c index 415f9e480b..82d5d3c5a2 100644 --- a/src/or/connection_edge.c +++ b/src/or/connection_edge.c @@ -329,6 +329,33 @@ relay_send_end_cell_from_edge(streamid_t stream_id, circuit_t *circ, payload, 1, cpath_layer); } +/* If the connection <b>conn</b> is attempting to connect to an external + * destination that is an hidden service and the reason is a connection + * refused or timeout, log it so the operator can take appropriate actions. + * The log statement is a rate limited warning. */ +static void +warn_if_hs_unreachable(const edge_connection_t *conn, uint8_t reason) +{ + tor_assert(conn); + + if (conn->base_.type == CONN_TYPE_EXIT && + connection_edge_is_rendezvous_stream(conn) && + (reason == END_STREAM_REASON_CONNECTREFUSED || + reason == END_STREAM_REASON_TIMEOUT)) { +#define WARN_FAILED_HS_CONNECTION 300 + static ratelim_t warn_limit = RATELIM_INIT(WARN_FAILED_HS_CONNECTION); + char *m; + if ((m = rate_limit_log(&warn_limit, approx_time()))) { + log_warn(LD_EDGE, "Onion service connection to %s failed (%s)", + (conn->base_.socket_family == AF_UNIX) ? + safe_str(conn->base_.address) : + safe_str(fmt_addrport(&conn->base_.addr, conn->base_.port)), + stream_end_reason_to_string(reason)); + tor_free(m); + } + } +} + /** Send a relay end cell from stream <b>conn</b> down conn's circuit, and * remember that we've done so. If this is not a client connection, set the * relay end cell's reason for closing as <b>reason</b>. @@ -386,6 +413,9 @@ connection_edge_end(edge_connection_t *conn, uint8_t reason) conn->base_.s); connection_edge_send_command(conn, RELAY_COMMAND_END, payload, payload_len); + /* We'll log warn if the connection was an hidden service and couldn't be + * made because the service wasn't available. */ + warn_if_hs_unreachable(conn, control_reason); } else { log_debug(LD_EDGE,"No circ to send end on conn " "(fd "TOR_SOCKET_T_FORMAT").", @@ -3521,7 +3551,7 @@ connection_exit_connect_dir(edge_connection_t *exitconn) * it is a general stream. */ int -connection_edge_is_rendezvous_stream(edge_connection_t *conn) +connection_edge_is_rendezvous_stream(const edge_connection_t *conn) { tor_assert(conn); if (conn->rend_data) diff --git a/src/or/connection_edge.h b/src/or/connection_edge.h index 5dfc8af901..61b5752aed 100644 --- a/src/or/connection_edge.h +++ b/src/or/connection_edge.h @@ -60,7 +60,7 @@ void connection_ap_handshake_socks_resolved_addr(entry_connection_t *conn, int connection_exit_begin_conn(cell_t *cell, circuit_t *circ); int connection_exit_begin_resolve(cell_t *cell, or_circuit_t *circ); void connection_exit_connect(edge_connection_t *conn); -int connection_edge_is_rendezvous_stream(edge_connection_t *conn); +int connection_edge_is_rendezvous_stream(const edge_connection_t *conn); int connection_ap_can_use_exit(const entry_connection_t *conn, const node_t *exit); void connection_ap_expire_beginning(void); diff --git a/src/or/connection_or.c b/src/or/connection_or.c index b3ae291831..cefe42c4db 100644 --- a/src/or/connection_or.c +++ b/src/or/connection_or.c @@ -718,11 +718,6 @@ connection_or_about_to_close(or_connection_t *or_conn) rep_hist_note_connect_failed(or_conn->identity_digest, now); /* Tell the new guard API about the channel failure */ entry_guard_chan_failed(TLS_CHAN_TO_BASE(or_conn->chan)); -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM - /* Tell the old guard API about the channel failure */ - entry_guard_register_connect_status(or_conn->identity_digest,0, - !options->HTTPSProxy, now); -#endif if (conn->state >= OR_CONN_STATE_TLS_HANDSHAKING) { int reason = tls_error_to_orconn_end_reason(or_conn->tls_error); control_event_or_conn_status(or_conn, OR_CONN_EVENT_FAILED, @@ -1728,11 +1723,6 @@ connection_or_client_learned_peer_id(or_connection_t *conn, /* Tell the new guard API about the channel failure */ entry_guard_chan_failed(TLS_CHAN_TO_BASE(conn->chan)); -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM - /* Tell the old guard API about the channel failure */ - entry_guard_register_connect_status(conn->identity_digest, 0, 1, - time(NULL)); -#endif control_event_or_conn_status(conn, OR_CONN_EVENT_FAILED, END_OR_CONN_REASON_OR_IDENTITY); if (!authdir_mode_tests_reachability(options)) diff --git a/src/or/control.c b/src/or/control.c index 248c780cce..857b7325ae 100644 --- a/src/or/control.c +++ b/src/or/control.c @@ -71,6 +71,7 @@ #include "router.h" #include "routerlist.h" #include "routerparse.h" +#include "shared_random.h" #ifndef _WIN32 #include <pwd.h> @@ -2870,6 +2871,26 @@ getinfo_helper_liveness(control_connection_t *control_conn, return 0; } +/** Implementation helper for GETINFO: answers queries about shared random + * value. */ +static int +getinfo_helper_sr(control_connection_t *control_conn, + const char *question, char **answer, + const char **errmsg) +{ + (void) control_conn; + (void) errmsg; + + if (!strcmp(question, "sr/current")) { + *answer = sr_get_current_for_control(); + } else if (!strcmp(question, "sr/previous")) { + *answer = sr_get_previous_for_control(); + } + /* Else statement here is unrecognized key so do nothing. */ + + return 0; +} + /** Callback function for GETINFO: on a given control connection, try to * answer the question <b>q</b> and store the newly-allocated answer in * *<b>a</b>. If an internal error occurs, return -1 and optionally set @@ -3062,6 +3083,8 @@ static const getinfo_item_t getinfo_items[] = { "Onion services owned by the current control connection."), ITEM("onions/detached", onions, "Onion services detached from the control connection."), + ITEM("sr/current", sr, "Get current shared random value."), + ITEM("sr/previous", sr, "Get previous shared random value."), { NULL, NULL, NULL, 0 } }; @@ -4041,17 +4064,20 @@ handle_control_dropguards(control_connection_t *conn, smartlist_split_string(args, body, " ", SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM + static int have_warned = 0; + if (! have_warned) { + log_warn(LD_CONTROL, "DROPGUARDS is dangerous; make sure you understand " + "the risks before using it. It may be removed in a future " + "version of Tor."); + have_warned = 1; + } + 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); } -#else - // XXXX - connection_printf_to_buf(conn, "512 not supported\r\n"); -#endif SMARTLIST_FOREACH(args, char *, cp, tor_free(cp)); smartlist_free(args); diff --git a/src/or/directory.c b/src/or/directory.c index 012d440250..4c94fe4d19 100644 --- a/src/or/directory.c +++ b/src/or/directory.c @@ -469,7 +469,7 @@ directory_pick_generic_dirserver(dirinfo_type_t type, int pds_flags, log_warn(LD_BUG, "Called when we have UseBridges set."); if (should_use_directory_guards(options)) { - const node_t *node = guards_choose_dirguard(type, guard_state_out); + const node_t *node = guards_choose_dirguard(guard_state_out); if (node) rs = node->rs; } else { @@ -559,8 +559,7 @@ MOCK_IMPL(void, directory_get_from_dirserver, ( * sort of dir fetch we'll be doing, so it won't return a bridge * that can't answer our question. */ - const node_t *node = guards_choose_dirguard(type, - &guard_state); + const node_t *node = guards_choose_dirguard(&guard_state); if (node && node->ri) { /* every bridge has a routerinfo. */ routerinfo_t *ri = node->ri; @@ -1857,15 +1856,15 @@ body_is_plausible(const char *body, size_t len, int purpose) if (purpose == DIR_PURPOSE_FETCH_MICRODESC) { return (!strcmpstart(body,"onion-key")); } - if (1) { - if (!strcmpstart(body,"router") || - !strcmpstart(body,"network-status")) - return 1; - for (i=0;i<32;++i) { - if (!TOR_ISPRINT(body[i]) && !TOR_ISSPACE(body[i])) - return 0; - } + + if (!strcmpstart(body,"router") || + !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; } @@ -1967,6 +1966,21 @@ connection_dir_client_reached_eof(dir_connection_t *conn) escaped(reason), conn->base_.purpose); + if (conn->guard_state) { + /* we count the connection as successful once we can read from it. We do + * not, however, delay use of the circuit here, since it's just for a + * one-hop directory request. */ + /* XXXXprop271 note that this will not do the right thing for other + * waiting circuits that would be triggered by this circuit becoming + * complete/usable. But that's ok, I think. + */ + /* XXXXprop271 should we count this as only a partial success somehow? + */ + entry_guard_succeeded(&conn->guard_state); + circuit_guard_state_free(conn->guard_state); + conn->guard_state = NULL; + } + /* now check if it's got any hints for us about our IP address. */ if (conn->dirconn_direct) { char *guess = http_get_header(headers, X_ADDRESS_HEADER); @@ -2578,21 +2592,6 @@ connection_dir_process_inbuf(dir_connection_t *conn) tor_assert(conn); tor_assert(conn->base_.type == CONN_TYPE_DIR); - if (conn->guard_state) { - /* we count the connection as successful once we can read from it. We do - * not, however, delay use of the circuit here, since it's just for a - * one-hop directory request. */ - /* XXXXprop271 note that this will not do the right thing for other - * waiting circuits that would be triggered by this circuit becoming - * complete/usable. But that's ok, I think. - */ - /* XXXXprop271 should we count this as only a partial success somehow? - */ - entry_guard_succeeded(&conn->guard_state); - circuit_guard_state_free(conn->guard_state); - conn->guard_state = NULL; - } - /* Directory clients write, then read data until they receive EOF; * directory servers read data until they get an HTTP command, then * write their response (when it's finished flushing, they mark for @@ -3030,63 +3029,61 @@ handle_get_current_consensus(dir_connection_t *conn, smartlist_t *dir_fps = smartlist_new(); long lifetime = NETWORKSTATUS_CACHE_LIFETIME; - if (1) { - networkstatus_t *v; - time_t now = time(NULL); - const char *want_fps = NULL; - char *flavor = NULL; - int flav = FLAV_NS; - #define CONSENSUS_URL_PREFIX "/tor/status-vote/current/consensus/" - #define CONSENSUS_FLAVORED_PREFIX "/tor/status-vote/current/consensus-" - /* figure out the flavor if any, and who we wanted to sign the thing */ - if (!strcmpstart(url, CONSENSUS_FLAVORED_PREFIX)) { - const char *f, *cp; - f = url + strlen(CONSENSUS_FLAVORED_PREFIX); - cp = strchr(f, '/'); - if (cp) { - want_fps = cp+1; - flavor = tor_strndup(f, cp-f); - } else { - flavor = tor_strdup(f); - } - flav = networkstatus_parse_flavor_name(flavor); - if (flav < 0) - flav = FLAV_NS; + networkstatus_t *v; + time_t now = time(NULL); + const char *want_fps = NULL; + char *flavor = NULL; + int flav = FLAV_NS; +#define CONSENSUS_URL_PREFIX "/tor/status-vote/current/consensus/" +#define CONSENSUS_FLAVORED_PREFIX "/tor/status-vote/current/consensus-" + /* figure out the flavor if any, and who we wanted to sign the thing */ + if (!strcmpstart(url, CONSENSUS_FLAVORED_PREFIX)) { + const char *f, *cp; + f = url + strlen(CONSENSUS_FLAVORED_PREFIX); + cp = strchr(f, '/'); + if (cp) { + want_fps = cp+1; + flavor = tor_strndup(f, cp-f); } else { - if (!strcmpstart(url, CONSENSUS_URL_PREFIX)) - want_fps = url+strlen(CONSENSUS_URL_PREFIX); + flavor = tor_strdup(f); } + flav = networkstatus_parse_flavor_name(flavor); + if (flav < 0) + flav = FLAV_NS; + } else { + if (!strcmpstart(url, CONSENSUS_URL_PREFIX)) + want_fps = url+strlen(CONSENSUS_URL_PREFIX); + } - v = networkstatus_get_latest_consensus_by_flavor(flav); + v = networkstatus_get_latest_consensus_by_flavor(flav); - if (v && !networkstatus_consensus_reasonably_live(v, now)) { - write_http_status_line(conn, 404, "Consensus is too old"); - warn_consensus_is_too_old(v, flavor, now); - smartlist_free(dir_fps); - geoip_note_ns_response(GEOIP_REJECT_NOT_FOUND); - tor_free(flavor); - goto done; - } + if (v && !networkstatus_consensus_reasonably_live(v, now)) { + write_http_status_line(conn, 404, "Consensus is too old"); + warn_consensus_is_too_old(v, flavor, now); + smartlist_free(dir_fps); + geoip_note_ns_response(GEOIP_REJECT_NOT_FOUND); + tor_free(flavor); + goto done; + } - if (v && want_fps && - !client_likes_consensus(v, want_fps)) { - write_http_status_line(conn, 404, "Consensus not signed by sufficient " - "number of requested authorities"); - smartlist_free(dir_fps); - geoip_note_ns_response(GEOIP_REJECT_NOT_ENOUGH_SIGS); - tor_free(flavor); - goto done; - } + if (v && want_fps && + !client_likes_consensus(v, want_fps)) { + write_http_status_line(conn, 404, "Consensus not signed by sufficient " + "number of requested authorities"); + smartlist_free(dir_fps); + geoip_note_ns_response(GEOIP_REJECT_NOT_ENOUGH_SIGS); + tor_free(flavor); + goto done; + } - { - char *fp = tor_malloc_zero(DIGEST_LEN); - if (flavor) - strlcpy(fp, flavor, DIGEST_LEN); - tor_free(flavor); - smartlist_add(dir_fps, fp); - } - lifetime = (v && v->fresh_until > now) ? v->fresh_until - now : 0; + { + char *fp = tor_malloc_zero(DIGEST_LEN); + if (flavor) + strlcpy(fp, flavor, DIGEST_LEN); + tor_free(flavor); + smartlist_add(dir_fps, fp); } + lifetime = (v && v->fresh_until > now) ? v->fresh_until - now : 0; if (!smartlist_len(dir_fps)) { /* we failed to create/cache cp */ write_http_status_line(conn, 503, "Network status object unavailable"); @@ -3122,21 +3119,19 @@ handle_get_current_consensus(dir_connection_t *conn, goto done; } - if (1) { - tor_addr_t addr; - if (tor_addr_parse(&addr, (TO_CONN(conn))->address) >= 0) { - 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. */ - if (conn->dirreq_id) - geoip_start_dirreq(conn->dirreq_id, dlen, DIRREQ_TUNNELED); - else - geoip_start_dirreq(TO_CONN(conn)->global_identifier, dlen, - DIRREQ_DIRECT); - } + tor_addr_t addr; + if (tor_addr_parse(&addr, (TO_CONN(conn))->address) >= 0) { + 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. */ + if (conn->dirreq_id) + geoip_start_dirreq(conn->dirreq_id, dlen, DIRREQ_TUNNELED); + else + geoip_start_dirreq(TO_CONN(conn)->global_identifier, dlen, + DIRREQ_DIRECT); } write_http_response_header(conn, -1, compressed, @@ -3528,13 +3523,6 @@ handle_get_hs_descriptor_v3(dir_connection_t *conn, const char *pubkey_str = NULL; const char *url = args->url; - /* Don't serve v3 descriptors if next gen onion service is disabled. */ - if (!hs_v3_protocol_is_enabled()) { - /* 404 is used for an unrecognized URL so send back the same. */ - write_http_status_line(conn, 404, "Not found"); - goto done; - } - /* Reject unencrypted dir connections */ if (!connection_dir_is_encrypted(conn)) { write_http_status_line(conn, 404, "Not found"); @@ -3749,13 +3737,6 @@ directory_handle_command_post,(dir_connection_t *conn, const char *headers, * the prop224 be deployed and thus use. */ if (connection_dir_is_encrypted(conn) && !strcmpstart(url, "/tor/hs/")) { const char *msg = "HS descriptor stored successfully."; - /* Don't accept v3 and onward publish request if next gen onion service is - * disabled. */ - if (!hs_v3_protocol_is_enabled()) { - /* 404 is used for an unrecognized URL so send back the same. */ - write_http_status_line(conn, 404, "Not found"); - goto done; - } /* We most probably have a publish request for an HS descriptor. */ int code = handle_post_hs_descriptor(url, body); diff --git a/src/or/dns.c b/src/or/dns.c index 388104f8da..7651501ec3 100644 --- a/src/or/dns.c +++ b/src/or/dns.c @@ -243,29 +243,19 @@ has_dns_init_failed(void) } /** Helper: Given a TTL from a DNS response, determine what TTL to give the - * OP that asked us to resolve it. */ + * OP that asked us to resolve it, and how long to cache that record + * ourselves. */ uint32_t dns_clip_ttl(uint32_t ttl) { - if (ttl < MIN_DNS_TTL) - return MIN_DNS_TTL; - else if (ttl > MAX_DNS_TTL) - return MAX_DNS_TTL; - else - return ttl; -} - -/** Helper: Given a TTL from a DNS response, determine how long to hold it in - * our cache. */ -STATIC uint32_t -dns_get_expiry_ttl(uint32_t ttl) -{ - if (ttl < MIN_DNS_TTL) - return MIN_DNS_TTL; - else if (ttl > MAX_DNS_ENTRY_AGE) - return MAX_DNS_ENTRY_AGE; + /* This logic is a defense against "DefectTor" DNS-based traffic + * confirmation attacks, as in https://nymity.ch/tor-dns/tor-dns.pdf . + * We only give two values: a "low" value and a "high" value. + */ + if (ttl < MIN_DNS_TTL_AT_EXIT) + return MIN_DNS_TTL_AT_EXIT; else - return ttl; + return MAX_DNS_TTL_AT_EXIT; } /** Helper: free storage held by an entry in the DNS cache. */ @@ -336,7 +326,7 @@ cached_resolve_add_answer(cached_resolve_t *resolve, resolve->result_ipv4.err_ipv4 = dns_result; resolve->res_status_ipv4 = RES_STATUS_DONE_ERR; } - + resolve->ttl_ipv4 = ttl; } else if (query_type == DNS_IPv6_AAAA) { if (resolve->res_status_ipv6 != RES_STATUS_INFLIGHT) return; @@ -351,6 +341,7 @@ cached_resolve_add_answer(cached_resolve_t *resolve, resolve->result_ipv6.err_ipv6 = dns_result; resolve->res_status_ipv6 = RES_STATUS_DONE_ERR; } + resolve->ttl_ipv6 = ttl; } } @@ -1317,7 +1308,7 @@ make_pending_resolve_cached(cached_resolve_t *resolve) resolve->ttl_hostname < ttl) ttl = resolve->ttl_hostname; - set_expiry(new_resolve, time(NULL) + dns_get_expiry_ttl(ttl)); + set_expiry(new_resolve, time(NULL) + dns_clip_ttl(ttl)); } assert_cache_ok(); diff --git a/src/or/dns.h b/src/or/dns.h index b14f7dd29c..951a2a3467 100644 --- a/src/or/dns.h +++ b/src/or/dns.h @@ -12,6 +12,18 @@ #ifndef TOR_DNS_H #define TOR_DNS_H +/** Lowest value for DNS ttl that a server will give. */ +#define MIN_DNS_TTL_AT_EXIT (5*60) +/** Highest value for DNS ttl that a server will give. */ +#define MAX_DNS_TTL_AT_EXIT (60*60) + +/** How long do we keep DNS cache entries before purging them (regardless of + * their TTL)? */ +#define MAX_DNS_ENTRY_AGE (3*60*60) +/** How long do we cache/tell clients to cache DNS records when no TTL is + * known? */ +#define DEFAULT_DNS_TTL (30*60) + int dns_init(void); int has_dns_init_failed(void); void dns_free_all(void); @@ -31,8 +43,6 @@ void dump_dns_mem_usage(int severity); #ifdef DNS_PRIVATE #include "dns_structs.h" -STATIC uint32_t dns_get_expiry_ttl(uint32_t ttl); - MOCK_DECL(STATIC int,dns_resolve_impl,(edge_connection_t *exitconn, int is_resolve,or_circuit_t *oncirc, char **hostname_out, int *made_connection_pending_out, cached_resolve_t **resolve_out)); diff --git a/src/or/entrynodes.c b/src/or/entrynodes.c index 82601868ba..63b54f41f0 100644 --- a/src/or/entrynodes.c +++ b/src/or/entrynodes.c @@ -11,11 +11,6 @@ * Entry nodes can be guards (for general use) or bridges (for censorship * circumvention). * - * XXXX prop271 This module is in flux, since I'm currently in the middle of - * implementation proposal 271. The module documentation here will describe - * the new algorithm and data structures; the old ones should get removed as - * proposal 271 is completed. - * * In general, we use entry guards to prevent traffic-sampling attacks: * if we chose every circuit independently, an adversary controlling * some fraction of paths on the network would observe a sample of every @@ -151,13 +146,6 @@ static guard_selection_t *curr_guard_context = NULL; * and those changes need to be flushed to disk. */ static int entry_guards_dirty = 0; -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM -static const node_t *choose_random_entry_impl(guard_selection_t *gs, - cpath_build_state_t *state, - int for_directory, - dirinfo_type_t dirtype, - int *n_options_out); -#endif static void entry_guard_set_filtered_flags(const or_options_t *options, guard_selection_t *gs, entry_guard_t *guard); @@ -206,9 +194,7 @@ guard_selection_infer_type(guard_selection_type_t type, const char *name) { if (type == GS_TYPE_INFER) { - if (!strcmp(name, "legacy")) - type = GS_TYPE_LEGACY; - else if (!strcmp(name, "bridges")) + if (!strcmp(name, "bridges")) type = GS_TYPE_BRIDGE; else if (!strcmp(name, "restricted")) type = GS_TYPE_RESTRICTED; @@ -232,9 +218,6 @@ guard_selection_new(const char *name, gs = tor_malloc_zero(sizeof(*gs)); gs->name = tor_strdup(name); gs->type = type; -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM - gs->chosen_entry_guards = smartlist_new(); -#endif gs->sampled_entry_guards = smartlist_new(); gs->confirmed_entry_guards = smartlist_new(); gs->primary_entry_guards = smartlist_new(); @@ -304,35 +287,6 @@ get_guard_selection_info(void) return curr_guard_context; } -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM -/** Return the list of entry guards for a guard_selection_t, creating it - * if necessary. */ -const smartlist_t * -get_entry_guards_for_guard_selection(guard_selection_t *gs) -{ - tor_assert(gs != NULL); - tor_assert(gs->chosen_entry_guards != NULL); - - return gs->chosen_entry_guards; -} - -/** Return the list of entry guards for the default guard_selection_t, - * creating it if necessary. */ -const smartlist_t * -get_entry_guards(void) -{ - return get_entry_guards_for_guard_selection(get_guard_selection_info()); -} - -/** Helper: mark an entry guard as not usable. */ -void -entry_guard_mark_bad(entry_guard_t *guard) -{ - guard->bad_since = approx_time(); - entry_guards_changed(); -} -#endif - /** Return a statically allocated human-readable description of <b>guard</b> */ const char * @@ -585,10 +539,6 @@ choose_guard_selection(const or_options_t *options, { tor_assert(options); tor_assert(type_out); - if (options->UseDeprecatedGuardAlgorithm) { - *type_out = GS_TYPE_LEGACY; - return "legacy"; - } if (options->UseBridges) { *type_out = GS_TYPE_BRIDGE; @@ -2152,9 +2102,6 @@ entry_guard_pick_for_circuit(guard_selection_t *gs, guard_usable_t entry_guard_succeeded(circuit_guard_state_t **guard_state_p) { - if (get_options()->UseDeprecatedGuardAlgorithm) - return GUARD_USABLE_NOW; - if (BUG(*guard_state_p == NULL)) return GUARD_USABLE_NEVER; @@ -2182,8 +2129,6 @@ entry_guard_succeeded(circuit_guard_state_t **guard_state_p) void entry_guard_cancel(circuit_guard_state_t **guard_state_p) { - if (get_options()->UseDeprecatedGuardAlgorithm) - return; if (BUG(*guard_state_p == NULL)) return; entry_guard_t *guard = entry_guard_handle_get((*guard_state_p)->guard); @@ -2205,9 +2150,6 @@ entry_guard_cancel(circuit_guard_state_t **guard_state_p) void entry_guard_failed(circuit_guard_state_t **guard_state_p) { - if (get_options()->UseDeprecatedGuardAlgorithm) - return; - if (BUG(*guard_state_p == NULL)) return; @@ -2230,8 +2172,6 @@ entry_guard_chan_failed(channel_t *chan) { if (!chan) return; - if (get_options()->UseDeprecatedGuardAlgorithm) - return; smartlist_t *pending = smartlist_new(); circuit_get_all_pending_on_channel(pending, chan); @@ -2837,8 +2777,8 @@ entry_guard_parse_from_state(const char *s) } /** - * Replace the Guards entries in <b>state</b> with a list of all our - * non-legacy sampled guards. + * Replace the Guards entries in <b>state</b> with a list of all our sampled + * guards. */ static void entry_guards_update_guards_in_state(or_state_t *state) @@ -2849,8 +2789,6 @@ entry_guards_update_guards_in_state(or_state_t *state) config_line_t **nextline = &lines; SMARTLIST_FOREACH_BEGIN(guard_contexts, guard_selection_t *, gs) { - if (!strcmp(gs->name, "legacy")) - continue; /* This is encoded differently. */ SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, guard) { if (guard->is_persistent == 0) continue; @@ -2866,9 +2804,9 @@ entry_guards_update_guards_in_state(or_state_t *state) } /** - * Replace our non-legacy sampled guards from the Guards entries in - * <b>state</b>. Return 0 on success, -1 on failure. (If <b>set</b> is - * true, replace nothing -- only check whether replacing would work.) + * Replace our sampled guards from the Guards entries in <b>state</b>. Return 0 + * on success, -1 on failure. (If <b>set</b> is true, replace nothing -- only + * check whether replacing would work.) */ static int entry_guards_load_guards_from_state(or_state_t *state, int set) @@ -2883,8 +2821,6 @@ entry_guards_load_guards_from_state(or_state_t *state, int set) * let's be safe.) */ if (set) { SMARTLIST_FOREACH_BEGIN(guard_contexts, guard_selection_t *, gs) { - if (!strcmp(gs->name, "legacy")) - continue; guard_selection_free(gs); if (curr_guard_context == gs) curr_guard_context = NULL; @@ -2919,299 +2855,12 @@ entry_guards_load_guards_from_state(or_state_t *state, int set) if (set) { SMARTLIST_FOREACH_BEGIN(guard_contexts, guard_selection_t *, gs) { - if (!strcmp(gs->name, "legacy")) - continue; entry_guards_update_all(gs); } SMARTLIST_FOREACH_END(gs); } return n_errors ? -1 : 0; } -/* XXXXX ----------------------------------------------- */ -/* XXXXX prop271 ----- end of new-for-prop271 code ----- */ -/* XXXXX ----------------------------------------------- */ - -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM -/** - * @name Constants for old (pre-prop271) guard selection algorithm. - */ - -/**@{*/ - -/* Default number of entry guards in the case where the NumEntryGuards - * consensus parameter is not set */ -#define DEFAULT_N_GUARDS 1 -/* Minimum and maximum number of entry guards (in case the NumEntryGuards - * consensus parameter is set). */ -#define MIN_N_GUARDS 1 -#define MAX_N_GUARDS 10 -/** Largest amount that we'll backdate chosen_on_date */ -#define CHOSEN_ON_DATE_SLOP (30*86400) -/** How long (in seconds) do we allow an entry guard to be nonfunctional, - * unlisted, excluded, or otherwise nonusable before we give up on it? */ -#define ENTRY_GUARD_REMOVE_AFTER (30*24*60*60) -/**}@*/ - -/** - * @name Networkstatus parameters for old (pre-prop271) guard selection - */ -/**@}*/ -/** Choose how many entry guards or directory guards we'll use. If - * <b>for_directory</b> is true, we return how many directory guards to - * use; else we return how many entry guards to use. */ -STATIC int -decide_num_guards(const or_options_t *options, int for_directory) -{ - if (for_directory) { - int answer; - if (options->NumDirectoryGuards != 0) - return options->NumDirectoryGuards; - answer = networkstatus_get_param(NULL, "NumDirectoryGuards", 0, 0, 10); - if (answer) /* non-zero means use the consensus value */ - return answer; - } - - if (options->NumEntryGuards) - return options->NumEntryGuards; - - /* Use the value from the consensus, or 3 if no guidance. */ - return networkstatus_get_param(NULL, "NumEntryGuards", DEFAULT_N_GUARDS, - MIN_N_GUARDS, MAX_N_GUARDS); -} - -/** Check whether the entry guard <b>e</b> is usable, given the directory - * authorities' opinion about the router (stored in <b>ri</b>) and the user's - * configuration (in <b>options</b>). Set <b>e</b>->bad_since - * accordingly. Return true iff the entry guard's status changes. - * - * If it's not usable, set *<b>reason</b> to a static string explaining why. - */ -static int -entry_guard_set_status(entry_guard_t *e, const node_t *node, - time_t now, const or_options_t *options, - const char **reason) -{ - char buf[HEX_DIGEST_LEN+1]; - int changed = 0; - - *reason = NULL; - - /* Do we want to mark this guard as bad? */ - if (!node) - *reason = "unlisted"; - else if (!node->is_running) - *reason = "down"; - else if (options->UseBridges && (!node->ri || - node->ri->purpose != ROUTER_PURPOSE_BRIDGE)) - *reason = "not a bridge"; - else if (options->UseBridges && !node_is_a_configured_bridge(node)) - *reason = "not a configured bridge"; - else if (!options->UseBridges && !node->is_possible_guard && - !routerset_contains_node(options->EntryNodes,node)) - *reason = "not recommended as a guard"; - else if (routerset_contains_node(options->ExcludeNodes, node)) - *reason = "excluded"; - /* We only care about OR connection connectivity for entry guards. */ - else if (!fascist_firewall_allows_node(node, FIREWALL_OR_CONNECTION, 0)) - *reason = "unreachable by config"; - else if (e->pb.path_bias_disabled) - *reason = "path-biased"; - - if (*reason && ! e->bad_since) { - /* Router is newly bad. */ - base16_encode(buf, sizeof(buf), e->identity, DIGEST_LEN); - log_info(LD_CIRC, "Entry guard %s (%s) is %s: marking as unusable.", - e->nickname, buf, *reason); - - e->bad_since = now; - control_event_guard(e->nickname, e->identity, "BAD"); - changed = 1; - } else if (!*reason && e->bad_since) { - /* There's nothing wrong with the router any more. */ - base16_encode(buf, sizeof(buf), e->identity, DIGEST_LEN); - log_info(LD_CIRC, "Entry guard %s (%s) is no longer unusable: " - "marking as ok.", e->nickname, buf); - - e->bad_since = 0; - control_event_guard(e->nickname, e->identity, "GOOD"); - changed = 1; - } - - if (node) { - int is_dir = node_is_dir(node); - if (options->UseBridges && node_is_a_configured_bridge(node)) - is_dir = 1; - if (e->is_dir_cache != is_dir) { - e->is_dir_cache = is_dir; - changed = 1; - } - } - - return changed; -} - -/** Return true iff enough time has passed since we last tried to connect - * to the unreachable guard <b>e</b> that we're willing to try again. */ -STATIC int -entry_is_time_to_retry(const entry_guard_t *e, time_t now) -{ - struct guard_retry_period_s { - time_t period_duration; - time_t interval_during_period; - }; - - struct guard_retry_period_s periods[] = { - { 6*60*60, 60*60 }, /* For first 6 hrs., retry hourly; */ - { 3*24*60*60, 4*60*60 }, /* Then retry every 4 hrs. until the - 3-day mark; */ - { 7*24*60*60, 18*60*60 }, /* After 3 days, retry every 18 hours until - 1 week mark. */ - { TIME_MAX, 36*60*60 } /* After 1 week, retry every 36 hours. */ - }; - - time_t ith_deadline_for_retry; - time_t unreachable_for; - unsigned i; - - if (e->last_attempted < e->unreachable_since) - return 1; - - unreachable_for = now - e->unreachable_since; - - for (i = 0; i < ARRAY_LENGTH(periods); i++) { - if (unreachable_for <= periods[i].period_duration) { - ith_deadline_for_retry = e->last_attempted + - periods[i].interval_during_period; - - return (now > ith_deadline_for_retry); - } - } - return 0; -} - -/** Return the node corresponding to <b>e</b>, if <b>e</b> is - * working well enough that we are willing to use it as an entry - * right now. (Else return NULL.) In particular, it must be - * - Listed as either up or never yet contacted; - * - Present in the routerlist; - * - Listed as 'stable' or 'fast' by the current dirserver consensus, - * if demanded by <b>need_uptime</b> or <b>need_capacity</b> - * (unless it's a configured EntryNode); - * - Allowed by our current ReachableORAddresses config option; and - * - Currently thought to be reachable by us (unless <b>assume_reachable</b> - * is true). - * - * If the answer is no, set *<b>msg</b> to an explanation of why. - * - * If need_descriptor is true, only return the node if we currently have - * a descriptor (routerinfo or microdesc) for it. - */ -STATIC const node_t * -entry_is_live(const entry_guard_t *e, entry_is_live_flags_t flags, - const char **msg) -{ - const node_t *node; - const or_options_t *options = get_options(); - int need_uptime = (flags & ENTRY_NEED_UPTIME) != 0; - int need_capacity = (flags & ENTRY_NEED_CAPACITY) != 0; - const int assume_reachable = (flags & ENTRY_ASSUME_REACHABLE) != 0; - const int need_descriptor = (flags & ENTRY_NEED_DESCRIPTOR) != 0; - - tor_assert(msg); - - if (e->pb.path_bias_disabled) { - *msg = "path-biased"; - return NULL; - } - if (e->bad_since) { - *msg = "bad"; - return NULL; - } - /* no good if it's unreachable, unless assume_unreachable or can_retry. */ - if (!assume_reachable && !e->can_retry && - e->unreachable_since && !entry_is_time_to_retry(e, time(NULL))) { - *msg = "unreachable"; - return NULL; - } - node = node_get_by_id(e->identity); - if (!node) { - *msg = "no node info"; - return NULL; - } - if (need_descriptor && !node_has_descriptor(node)) { - *msg = "no descriptor"; - return NULL; - } - if (get_options()->UseBridges) { - if (node_get_purpose(node) != ROUTER_PURPOSE_BRIDGE) { - *msg = "not a bridge"; - return NULL; - } - if (!node_is_a_configured_bridge(node)) { - *msg = "not a configured bridge"; - return NULL; - } - } else { /* !get_options()->UseBridges */ - if (node_get_purpose(node) != ROUTER_PURPOSE_GENERAL) { - *msg = "not general-purpose"; - return NULL; - } - } - if (routerset_contains_node(options->EntryNodes, node)) { - /* they asked for it, they get it */ - need_uptime = need_capacity = 0; - } - if (node_is_unreliable(node, need_uptime, need_capacity, 0)) { - *msg = "not fast/stable"; - return NULL; - } - if (!fascist_firewall_allows_node(node, FIREWALL_OR_CONNECTION, 0)) { - *msg = "unreachable by config"; - return NULL; - } - return node; -} - -/** Return the number of entry guards that we think are usable, in the - * context of the given guard_selection_t */ -int -num_live_entry_guards_for_guard_selection(guard_selection_t *gs, - int for_directory) -{ - int n = 0; - const char *msg; - - tor_assert(gs != NULL); - - /* Set the entry node attributes we are interested in. */ - entry_is_live_flags_t entry_flags = ENTRY_NEED_CAPACITY; - if (!for_directory) { - entry_flags |= ENTRY_NEED_DESCRIPTOR; - } - - if (!(gs->chosen_entry_guards)) { - return 0; - } - - SMARTLIST_FOREACH_BEGIN(gs->chosen_entry_guards, entry_guard_t *, entry) { - if (for_directory && !entry->is_dir_cache) - continue; - if (entry_is_live(entry, entry_flags, &msg)) - ++n; - } SMARTLIST_FOREACH_END(entry); - return n; -} - -/** Return the number of entry guards that we think are usable, for the - * default guard selection */ -int -num_live_entry_guards(int for_directory) -{ - return num_live_entry_guards_for_guard_selection( - get_guard_selection_info(), for_directory); -} -#endif - /** If <b>digest</b> matches the identity of any node in the * entry_guards list for the provided guard selection state, return that node. Else return NULL. */ @@ -3225,12 +2874,6 @@ entry_guard_get_by_id_digest_for_guard_selection(guard_selection_t *gs, if (tor_memeq(digest, entry->identity, DIGEST_LEN)) return entry; ); -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM - SMARTLIST_FOREACH(gs->chosen_entry_guards, entry_guard_t *, entry, - if (tor_memeq(digest, entry->identity, DIGEST_LEN)) - return entry; - ); -#endif return NULL; } @@ -3253,234 +2896,6 @@ entry_guard_get_by_id_digest(const char *digest) get_guard_selection_info(), digest); } -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM -/** Dump a description of our list of entry guards in the given guard - * selection context to the log at level <b>severity</b>. */ -static void -log_entry_guards_for_guard_selection(guard_selection_t *gs, int severity) -{ - smartlist_t *elements = smartlist_new(); - char *s; - - /* - * TODO this should probably log more info about prop-271 state too - * when it's implemented. - */ - - tor_assert(gs != NULL); - - SMARTLIST_FOREACH_BEGIN(gs->chosen_entry_guards, entry_guard_t *, e) - { - const char *msg = NULL; - if (entry_is_live(e, ENTRY_NEED_CAPACITY, &msg)) - smartlist_add_asprintf(elements, "%s [%s] (up %s)", - e->nickname, - hex_str(e->identity, DIGEST_LEN), - e->made_contact ? "made-contact" : "never-contacted"); - else - smartlist_add_asprintf(elements, "%s [%s] (%s, %s)", - e->nickname, - hex_str(e->identity, DIGEST_LEN), - msg, - e->made_contact ? "made-contact" : "never-contacted"); - } - SMARTLIST_FOREACH_END(e); - - s = smartlist_join_strings(elements, ",", 0, NULL); - SMARTLIST_FOREACH(elements, char*, cp, tor_free(cp)); - smartlist_free(elements); - log_fn(severity,LD_CIRC,"%s",s); - tor_free(s); -} - -/** Called when one or more guards that we would previously have used for some - * purpose are no longer in use because a higher-priority guard has become - * usable again. */ -static void -control_event_guard_deferred(void) -{ - /* XXXX We don't actually have a good way to figure out _how many_ entries - * are live for some purpose. We need an entry_is_even_slightly_live() - * function for this to work right. NumEntryGuards isn't reliable: if we - * need guards with weird properties, we can have more than that number - * live. - **/ -#if 0 - int n = 0; - const char *msg; - const or_options_t *options = get_options(); - if (!entry_guards) - return; - SMARTLIST_FOREACH(entry_guards, entry_guard_t *, entry, - { - if (entry_is_live(entry, 0, 1, 0, &msg)) { - if (n++ == options->NumEntryGuards) { - control_event_guard(entry->nickname, entry->identity, "DEFERRED"); - return; - } - } - }); -#endif -} - -/** Add a new (preferably stable and fast) router to our chosen_entry_guards - * list for the supplied guard selection. Return a pointer to the router if - * we succeed, or NULL if we can't find any more suitable entries. - * - * If <b>chosen</b> is defined, use that one, and if it's not - * already in our entry_guards list, put it at the *beginning*. - * Else, put the one we pick at the end of the list. */ -STATIC const node_t * -add_an_entry_guard(guard_selection_t *gs, - const node_t *chosen, int reset_status, int prepend, - int for_discovery, int for_directory) -{ - const node_t *node; - entry_guard_t *entry; - - tor_assert(gs != NULL); - tor_assert(gs->chosen_entry_guards != NULL); - - if (chosen) { - node = chosen; - entry = entry_guard_get_by_id_digest_for_guard_selection(gs, - node->identity); - if (entry) { - if (reset_status) { - entry->bad_since = 0; - entry->can_retry = 1; - } - entry->is_dir_cache = node_is_dir(node); - if (get_options()->UseBridges && node_is_a_configured_bridge(node)) - entry->is_dir_cache = 1; - - return NULL; - } - } else if (!for_directory) { - node = choose_good_entry_server(CIRCUIT_PURPOSE_C_GENERAL, NULL, NULL); - if (!node) - return NULL; - } else { - const routerstatus_t *rs; - rs = router_pick_directory_server(MICRODESC_DIRINFO|V3_DIRINFO, - PDS_FOR_GUARD); - if (!rs) - return NULL; - node = node_get_by_id(rs->identity_digest); - if (!node) - return NULL; - } - if (entry_guard_get_by_id_digest_for_guard_selection(gs, node->identity) - != NULL) { - log_info(LD_CIRC, "I was about to add a duplicate entry guard."); - /* This can happen if we choose a guard, then the node goes away, then - * comes back. */ - return NULL; - } - entry = tor_malloc_zero(sizeof(entry_guard_t)); - entry->is_persistent = 1; - log_info(LD_CIRC, "Chose %s as new entry guard.", - 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); - if (get_options()->UseBridges && node_is_a_configured_bridge(node)) - entry->is_dir_cache = 1; - - /* Choose expiry time smudged over the past month. The goal here - * is to a) spread out when Tor clients rotate their guards, so they - * don't all select them on the same day, and b) avoid leaving a - * precise timestamp in the state file about when we first picked - * this guard. For details, see the Jan 2010 or-dev thread. */ - time_t now = time(NULL); - entry->chosen_on_date = crypto_rand_time_range(now - 3600*24*30, now); - entry->chosen_by_version = tor_strdup(VERSION); - - /* Are we picking this guard because all of our current guards are - * down so we need another one (for_discovery is 1), or because we - * decided we need more variety in our guard list (for_discovery is 0)? - * - * Currently we hack this behavior into place by setting "made_contact" - * for guards of the latter variety, so we'll be willing to use any of - * them right off the bat. - */ - if (!for_discovery) - entry->made_contact = 1; - - if (prepend) - smartlist_insert(gs->chosen_entry_guards, 0, entry); - else - smartlist_add(gs->chosen_entry_guards, entry); - entry->in_selection = gs; - - control_event_guard(entry->nickname, entry->identity, "NEW"); - control_event_guard_deferred(); - log_entry_guards_for_guard_selection(gs, LOG_INFO); - - return node; -} - -/** Entry point for bridges.c to add a bridge as guard. - * - * XXXX prop271 refactor, bridge.*/ -void -add_bridge_as_entry_guard(guard_selection_t *gs, - const node_t *chosen) -{ - add_an_entry_guard(gs, chosen, 1, 1, 0, 0); -} - -/** - * Return the minimum lifetime of working entry guard, in seconds, - * as given in the consensus networkstatus. (Plus CHOSEN_ON_DATE_SLOP, - * so that we can do the chosen_on_date randomization while achieving the - * desired minimum lifetime.) - */ -static int32_t -guards_get_lifetime(void) -{ - const or_options_t *options = get_options(); -#define DFLT_GUARD_LIFETIME (86400 * 60) /* Two months. */ -#define MIN_GUARD_LIFETIME (86400 * 30) /* One months. */ -#define MAX_GUARD_LIFETIME (86400 * 1826) /* Five years. */ - - if (options->GuardLifetime >= 1) { - return CLAMP(MIN_GUARD_LIFETIME, - options->GuardLifetime, - MAX_GUARD_LIFETIME) + CHOSEN_ON_DATE_SLOP; - } - - return networkstatus_get_param(NULL, "GuardLifetime", - DFLT_GUARD_LIFETIME, - MIN_GUARD_LIFETIME, - MAX_GUARD_LIFETIME) + CHOSEN_ON_DATE_SLOP; -} - -/** If the use of entry guards is configured, choose more entry guards - * until we have enough in the list. */ -static void -pick_entry_guards(guard_selection_t *gs, - const or_options_t *options, - int for_directory) -{ - int changed = 0; - const int num_needed = decide_num_guards(options, for_directory); - - tor_assert(gs != NULL); - tor_assert(gs->chosen_entry_guards != NULL); - - while (num_live_entry_guards_for_guard_selection(gs, for_directory) - < num_needed) { - if (!add_an_entry_guard(gs, NULL, 0, 0, 0, for_directory)) - break; - changed = 1; - } - - if (changed) - entry_guards_changed_for_guard_selection(gs); -} -#endif - /** Release all storage held by <b>e</b>. */ STATIC void entry_guard_free(entry_guard_t *e) @@ -3488,9 +2903,6 @@ entry_guard_free(entry_guard_t *e) if (!e) return; entry_guard_handles_clear(e); -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM - tor_free(e->chosen_by_version); -#endif tor_free(e->sampled_by_version); tor_free(e->extra_state_fields); tor_free(e->selection_name); @@ -3498,487 +2910,6 @@ entry_guard_free(entry_guard_t *e) tor_free(e); } -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM -/** Remove from a guard selection context any entry guard which was selected - * by an unknown version of Tor, or which was selected by a version of Tor - * that's known to select entry guards badly, or which was selected more 2 - * months ago. */ -/* XXXX The "obsolete guards" and "chosen long ago guards" things should - * probably be different functions. */ -static int -remove_obsolete_entry_guards(guard_selection_t *gs, time_t now) -{ - int changed = 0, i; - int32_t guard_lifetime = guards_get_lifetime(); - - tor_assert(gs != NULL); - if (!(gs->chosen_entry_guards)) goto done; - - for (i = 0; i < smartlist_len(gs->chosen_entry_guards); ++i) { - entry_guard_t *entry = smartlist_get(gs->chosen_entry_guards, i); - const char *ver = entry->chosen_by_version; - const char *msg = NULL; - tor_version_t v; - int version_is_bad = 0, date_is_bad = 0; - if (!ver) { - msg = "does not say what version of Tor it was selected by"; - version_is_bad = 1; - } else if (tor_version_parse(ver, &v)) { - msg = "does not seem to be from any recognized version of Tor"; - version_is_bad = 1; - } - if (!version_is_bad && entry->chosen_on_date + guard_lifetime < now) { - /* It's been too long since the date listed in our state file. */ - msg = "was selected several months ago"; - date_is_bad = 1; - } - - if (version_is_bad || date_is_bad) { /* we need to drop it */ - char dbuf[HEX_DIGEST_LEN+1]; - tor_assert(msg); - base16_encode(dbuf, sizeof(dbuf), entry->identity, DIGEST_LEN); - log_fn(version_is_bad ? LOG_NOTICE : LOG_INFO, LD_CIRC, - "Entry guard '%s' (%s) %s. (Version=%s.) Replacing it.", - entry->nickname, dbuf, msg, ver?escaped(ver):"none"); - control_event_guard(entry->nickname, entry->identity, "DROPPED"); - entry_guard_free(entry); - smartlist_del_keeporder(gs->chosen_entry_guards, i--); - log_entry_guards_for_guard_selection(gs, LOG_INFO); - changed = 1; - } - } - - done: - return changed ? 1 : 0; -} - -/** Remove all entry guards from this guard selection context that have - * been down or unlisted for so long that we don't think they'll come up - * again. Return 1 if we removed any, or 0 if we did nothing. */ -static int -remove_dead_entry_guards(guard_selection_t *gs, time_t now) -{ - char dbuf[HEX_DIGEST_LEN+1]; - char tbuf[ISO_TIME_LEN+1]; - int i; - int changed = 0; - - tor_assert(gs != NULL); - if (!(gs->chosen_entry_guards)) goto done; - - for (i = 0; i < smartlist_len(gs->chosen_entry_guards); ) { - entry_guard_t *entry = smartlist_get(gs->chosen_entry_guards, i); - if (entry->bad_since && - ! entry->pb.path_bias_disabled && - entry->bad_since + ENTRY_GUARD_REMOVE_AFTER < now) { - - base16_encode(dbuf, sizeof(dbuf), entry->identity, DIGEST_LEN); - format_local_iso_time(tbuf, entry->bad_since); - log_info(LD_CIRC, "Entry guard '%s' (%s) has been down or unlisted " - "since %s local time; removing.", - entry->nickname, dbuf, tbuf); - control_event_guard(entry->nickname, entry->identity, "DROPPED"); - entry_guard_free(entry); - smartlist_del_keeporder(gs->chosen_entry_guards, i); - log_entry_guards_for_guard_selection(gs, LOG_INFO); - changed = 1; - } else - ++i; - } - - done: - return changed ? 1 : 0; -} - -/** Remove all currently listed entry guards for a given guard selection - * context */ -void -remove_all_entry_guards_for_guard_selection(guard_selection_t *gs) -{ - char dbuf[HEX_DIGEST_LEN+1]; - - tor_assert(gs != NULL); - - if (gs->chosen_entry_guards) { - while (smartlist_len(gs->chosen_entry_guards)) { - entry_guard_t *entry = smartlist_get(gs->chosen_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(gs->chosen_entry_guards, 0); - } - } - - log_entry_guards_for_guard_selection(gs, LOG_INFO); - entry_guards_changed_for_guard_selection(gs); -} - -/** Remove all currently listed entry guards. So new ones will be chosen. */ -void -remove_all_entry_guards(void) -{ - // XXXX prop271 this function shouldn't exist, in the new order. - remove_all_entry_guards_for_guard_selection(get_guard_selection_info()); -} - -/** A new directory or router-status has arrived; update the down/listed - * status of the entry guards. - * - * An entry is 'down' if the directory lists it as nonrunning. - * An entry is 'unlisted' if the directory doesn't include it. - * - * Don't call this on startup; only on a fresh download. Otherwise we'll - * think that things are unlisted. - */ -void -entry_guards_compute_status_for_guard_selection(guard_selection_t *gs, - const or_options_t *options, - time_t now) -{ - int changed = 0; - digestmap_t *reasons; - - if ((!gs) || !(gs->chosen_entry_guards)) - return; - - if (!get_options()->UseDeprecatedGuardAlgorithm) - return; - - if (options->EntryNodes) /* reshuffle the entry guard list if needed */ - entry_nodes_should_be_added(); - - reasons = digestmap_new(); - SMARTLIST_FOREACH_BEGIN(gs->chosen_entry_guards, entry_guard_t *, entry) - { - const node_t *r = node_get_by_id(entry->identity); - const char *reason = NULL; - if (entry_guard_set_status(entry, r, now, options, &reason)) - changed = 1; - - if (entry->bad_since) - tor_assert(reason); - if (reason) - digestmap_set(reasons, entry->identity, (char*)reason); - } - SMARTLIST_FOREACH_END(entry); - - if (remove_dead_entry_guards(gs, now)) - changed = 1; - if (remove_obsolete_entry_guards(gs, now)) - changed = 1; - - if (changed) { - SMARTLIST_FOREACH_BEGIN(gs->chosen_entry_guards, entry_guard_t *, - entry) { - const char *reason = digestmap_get(reasons, entry->identity); - const char *live_msg = ""; - const node_t *r = entry_is_live(entry, ENTRY_NEED_CAPACITY, &live_msg); - log_info(LD_CIRC, "Summary: Entry %s [%s] is %s, %s%s%s, and %s%s.", - entry->nickname, - hex_str(entry->identity, DIGEST_LEN), - entry->unreachable_since ? "unreachable" : "reachable", - entry->bad_since ? "unusable" : "usable", - reason ? ", ": "", - reason ? reason : "", - r ? "live" : "not live / ", - r ? "" : live_msg); - } SMARTLIST_FOREACH_END(entry); - log_info(LD_CIRC, " (%d/%d entry guards are usable/new)", - num_live_entry_guards_for_guard_selection(gs, 0), - smartlist_len(gs->chosen_entry_guards)); - log_entry_guards_for_guard_selection(gs, LOG_INFO); - entry_guards_changed_for_guard_selection(gs); - } - - digestmap_free(reasons, NULL); -} - -/** A new directory or router-status has arrived; update the down/listed - * status of the entry guards. - * - * An entry is 'down' if the directory lists it as nonrunning. - * An entry is 'unlisted' if the directory doesn't include it. - * - * Don't call this on startup; only on a fresh download. Otherwise we'll - * think that things are unlisted. - */ -void -entry_guards_compute_status(const or_options_t *options, time_t now) -{ - entry_guards_compute_status_for_guard_selection(get_guard_selection_info(), - options, now); -} - -/** Called when a connection to an OR with the identity digest <b>digest</b> - * is established (<b>succeeded</b>==1) or has failed (<b>succeeded</b>==0). - * If the OR is an entry, change that entry's up/down status. - * Return 0 normally, or -1 if we want to tear down the new connection. - * - * If <b>mark_relay_status</b>, also call router_set_status() on this - * relay. - */ -/* XXX We could change succeeded and mark_relay_status into 'int flags'. - * Too many boolean arguments is a recipe for confusion. - */ -int -entry_guard_register_connect_status_for_guard_selection( - guard_selection_t *gs, const char *digest, int succeeded, - int mark_relay_status, time_t now) -{ - int changed = 0; - int refuse_conn = 0; - int first_contact = 0; - entry_guard_t *entry = NULL; - int idx = -1; - char buf[HEX_DIGEST_LEN+1]; - - if (!(gs) || !(gs->chosen_entry_guards)) { - return 0; - } - - if (! get_options()->UseDeprecatedGuardAlgorithm) { - return 0; - } - - SMARTLIST_FOREACH_BEGIN(gs->chosen_entry_guards, entry_guard_t *, e) { - tor_assert(e); - if (tor_memeq(e->identity, digest, DIGEST_LEN)) { - entry = e; - idx = e_sl_idx; - break; - } - } SMARTLIST_FOREACH_END(e); - - if (!entry) - return 0; - - base16_encode(buf, sizeof(buf), entry->identity, DIGEST_LEN); - - if (succeeded) { - if (entry->unreachable_since) { - log_info(LD_CIRC, "Entry guard '%s' (%s) is now reachable again. Good.", - entry->nickname, buf); - entry->can_retry = 0; - entry->unreachable_since = 0; - entry->last_attempted = now; - control_event_guard(entry->nickname, entry->identity, "UP"); - changed = 1; - } - if (!entry->made_contact) { - entry->made_contact = 1; - first_contact = changed = 1; - } - } else { /* ! succeeded */ - if (!entry->made_contact) { - /* We've never connected to this one. */ - log_info(LD_CIRC, - "Connection to never-contacted entry guard '%s' (%s) failed. " - "Removing from the list. %d/%d entry guards usable/new.", - entry->nickname, buf, - num_live_entry_guards_for_guard_selection(gs, 0) - 1, - smartlist_len(gs->chosen_entry_guards)-1); - control_event_guard(entry->nickname, entry->identity, "DROPPED"); - entry_guard_free(entry); - smartlist_del_keeporder(gs->chosen_entry_guards, idx); - log_entry_guards_for_guard_selection(gs, LOG_INFO); - changed = 1; - } else if (!entry->unreachable_since) { - log_info(LD_CIRC, "Unable to connect to entry guard '%s' (%s). " - "Marking as unreachable.", entry->nickname, buf); - entry->unreachable_since = entry->last_attempted = now; - control_event_guard(entry->nickname, entry->identity, "DOWN"); - changed = 1; - entry->can_retry = 0; /* We gave it an early chance; no good. */ - } else { - char tbuf[ISO_TIME_LEN+1]; - format_iso_time(tbuf, entry->unreachable_since); - log_debug(LD_CIRC, "Failed to connect to unreachable entry guard " - "'%s' (%s). It has been unreachable since %s.", - entry->nickname, buf, tbuf); - entry->last_attempted = now; - entry->can_retry = 0; /* We gave it an early chance; no good. */ - } - } - - /* if the caller asked us to, also update the is_running flags for this - * relay */ - if (mark_relay_status) - router_set_status(digest, succeeded); - - if (first_contact) { - /* We've just added a new long-term entry guard. Perhaps the network just - * came back? We should give our earlier entries another try too, - * and close this connection so we don't use it before we've given - * the others a shot. */ - SMARTLIST_FOREACH_BEGIN(gs->chosen_entry_guards, entry_guard_t *, e) { - if (e == entry) - break; - if (e->made_contact) { - const char *msg; - const node_t *r = entry_is_live(e, - ENTRY_NEED_CAPACITY | ENTRY_ASSUME_REACHABLE, - &msg); - if (r && e->unreachable_since) { - refuse_conn = 1; - e->can_retry = 1; - } - } - } SMARTLIST_FOREACH_END(e); - if (refuse_conn) { - log_info(LD_CIRC, - "Connected to new entry guard '%s' (%s). Marking earlier " - "entry guards up. %d/%d entry guards usable/new.", - entry->nickname, buf, - num_live_entry_guards_for_guard_selection(gs, 0), - smartlist_len(gs->chosen_entry_guards)); - log_entry_guards_for_guard_selection(gs, LOG_INFO); - changed = 1; - } - } - - if (changed) - entry_guards_changed_for_guard_selection(gs); - return refuse_conn ? -1 : 0; -} - -/** Called when a connection to an OR with the identity digest <b>digest</b> - * is established (<b>succeeded</b>==1) or has failed (<b>succeeded</b>==0). - * If the OR is an entry, change that entry's up/down status in the default - * guard selection context. - * Return 0 normally, or -1 if we want to tear down the new connection. - * - * If <b>mark_relay_status</b>, also call router_set_status() on this - * relay. - */ -int -entry_guard_register_connect_status(const char *digest, int succeeded, - int mark_relay_status, time_t now) -{ - return entry_guard_register_connect_status_for_guard_selection( - get_guard_selection_info(), digest, succeeded, mark_relay_status, now); -} - -/** Called when the value of EntryNodes changes in our configuration. */ -void -entry_nodes_should_be_added_for_guard_selection(guard_selection_t *gs) -{ - tor_assert(gs != NULL); - - log_info(LD_CIRC, "EntryNodes config option set. Putting configured " - "relays at the front of the entry guard list."); - gs->should_add_entry_nodes = 1; -} - -/** Called when the value of EntryNodes changes in our configuration. */ -void -entry_nodes_should_be_added(void) -{ - entry_nodes_should_be_added_for_guard_selection( - get_guard_selection_info()); -} - -/** Adjust the entry guards list so that it only contains entries from - * EntryNodes, adding new entries from EntryNodes to the list as needed. */ -STATIC void -entry_guards_set_from_config(guard_selection_t *gs, - const or_options_t *options) -{ - smartlist_t *entry_nodes, *worse_entry_nodes, *entry_fps; - smartlist_t *old_entry_guards_on_list, *old_entry_guards_not_on_list; - const int numentryguards = decide_num_guards(options, 0); - - tor_assert(gs != NULL); - tor_assert(gs->chosen_entry_guards != NULL); - - gs->should_add_entry_nodes = 0; - - if (!options->EntryNodes) { - /* It's possible that a controller set EntryNodes, thus making - * should_add_entry_nodes set, then cleared it again, all before the - * call to choose_random_entry() that triggered us. If so, just return. - */ - return; - } - - { - char *string = routerset_to_string(options->EntryNodes); - log_info(LD_CIRC,"Adding configured EntryNodes '%s'.", string); - tor_free(string); - } - - entry_nodes = smartlist_new(); - worse_entry_nodes = smartlist_new(); - entry_fps = smartlist_new(); - old_entry_guards_on_list = smartlist_new(); - old_entry_guards_not_on_list = smartlist_new(); - - /* Split entry guards into those on the list and those not. */ - - routerset_get_all_nodes(entry_nodes, options->EntryNodes, - options->ExcludeNodes, 0); - SMARTLIST_FOREACH(entry_nodes, const node_t *,node, - smartlist_add(entry_fps, (void*)node->identity)); - - SMARTLIST_FOREACH(gs->chosen_entry_guards, entry_guard_t *, e, { - if (smartlist_contains_digest(entry_fps, e->identity)) - smartlist_add(old_entry_guards_on_list, e); - else - smartlist_add(old_entry_guards_not_on_list, e); - }); - - /* Remove all currently configured guard nodes, excluded nodes, unreachable - * nodes, or non-Guard nodes from entry_nodes. */ - SMARTLIST_FOREACH_BEGIN(entry_nodes, const node_t *, node) { - if (entry_guard_get_by_id_digest_for_guard_selection(gs, - node->identity)) { - SMARTLIST_DEL_CURRENT(entry_nodes, node); - continue; - } else if (routerset_contains_node(options->ExcludeNodes, node)) { - SMARTLIST_DEL_CURRENT(entry_nodes, node); - continue; - } else if (!fascist_firewall_allows_node(node, FIREWALL_OR_CONNECTION, - 0)) { - SMARTLIST_DEL_CURRENT(entry_nodes, node); - continue; - } else if (! node->is_possible_guard) { - smartlist_add(worse_entry_nodes, (node_t*)node); - SMARTLIST_DEL_CURRENT(entry_nodes, node); - } - } SMARTLIST_FOREACH_END(node); - - /* Now build the new entry_guards list. */ - smartlist_clear(gs->chosen_entry_guards); - /* First, the previously configured guards that are in EntryNodes. */ - smartlist_add_all(gs->chosen_entry_guards, old_entry_guards_on_list); - /* Next, scramble the rest of EntryNodes, putting the guards first. */ - smartlist_shuffle(entry_nodes); - smartlist_shuffle(worse_entry_nodes); - smartlist_add_all(entry_nodes, worse_entry_nodes); - - /* Next, the rest of EntryNodes */ - SMARTLIST_FOREACH_BEGIN(entry_nodes, const node_t *, node) { - add_an_entry_guard(gs, node, 0, 0, 1, 0); - if (smartlist_len(gs->chosen_entry_guards) > numentryguards * 10) - break; - } SMARTLIST_FOREACH_END(node); - log_notice(LD_GENERAL, "%d entries in guards", - smartlist_len(gs->chosen_entry_guards)); - /* Finally, free the remaining previously configured guards that are not in - * EntryNodes. */ - SMARTLIST_FOREACH(old_entry_guards_not_on_list, entry_guard_t *, e, - entry_guard_free(e)); - - smartlist_free(entry_nodes); - smartlist_free(worse_entry_nodes); - smartlist_free(entry_fps); - smartlist_free(old_entry_guards_on_list); - smartlist_free(old_entry_guards_not_on_list); - entry_guards_changed_for_guard_selection(gs); -} -#endif - /** Return 0 if we're fine adding arbitrary routers out of the * directory to our entry guard list, or return 1 if we have a * list already and we must stick to it. @@ -3994,35 +2925,6 @@ entry_list_is_constrained(const or_options_t *options) return 0; } -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM -/** Pick a live (up and listed) entry guard from entry_guards. If - * <b>state</b> is non-NULL, this is for a specific circuit -- - * make sure not to pick this circuit's exit or any node in the - * exit's family. If <b>state</b> is NULL, we're looking for a random - * guard (likely a bridge). If <b>dirinfo</b> is not NO_DIRINFO (zero), - * then only select from nodes that know how to answer directory questions - * of that type. */ -const node_t * -choose_random_entry(cpath_build_state_t *state) -{ - tor_assert(get_options()->UseDeprecatedGuardAlgorithm); - - return choose_random_entry_impl(get_guard_selection_info(), - state, 0, NO_DIRINFO, NULL); -} - -/** Pick a live (up and listed) directory guard from entry_guards for - * downloading information of type <b>type</b>. */ -const node_t * -choose_random_dirguard(dirinfo_type_t type) -{ - tor_assert(get_options()->UseDeprecatedGuardAlgorithm); - - return choose_random_entry_impl(get_guard_selection_info(), - NULL, 1, type, NULL); -} -#endif - /** Return the number of bridges that have descriptors that are marked with * purpose 'bridge' and are running. */ @@ -4031,249 +2933,24 @@ num_bridges_usable(void) { int n_options = 0; - if (get_options()->UseDeprecatedGuardAlgorithm) { -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM - tor_assert(get_options()->UseBridges); - (void) choose_random_entry_impl(get_guard_selection_info(), - NULL, 0, 0, &n_options); -#else - tor_assert_nonfatal_unreached(); -#endif - } else { - /* XXXX prop271 Is this quite right? */ - tor_assert(get_options()->UseBridges); - guard_selection_t *gs = get_guard_selection_info(); - tor_assert(gs->type == GS_TYPE_BRIDGE); + /* XXXX prop271 Is this quite right? */ + tor_assert(get_options()->UseBridges); + guard_selection_t *gs = get_guard_selection_info(); + tor_assert(gs->type == GS_TYPE_BRIDGE); - SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, guard) { - if (guard->is_reachable == GUARD_REACHABLE_NO) - continue; - if (tor_digest_is_zero(guard->identity)) - continue; - const node_t *node = node_get_by_id(guard->identity); - if (node && node->ri) - ++n_options; - } SMARTLIST_FOREACH_END(guard); - } + SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, guard) { + if (guard->is_reachable == GUARD_REACHABLE_NO) + continue; + if (tor_digest_is_zero(guard->identity)) + continue; + const node_t *node = node_get_by_id(guard->identity); + if (node && node->ri) + ++n_options; + } SMARTLIST_FOREACH_END(guard); return n_options; } -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM -/** Filter <b>all_entry_guards</b> for usable entry guards and put them - * in <b>live_entry_guards</b>. We filter based on whether the node is - * currently alive, and on whether it satisfies the restrictions - * imposed by the other arguments of this function. - * - * We don't place more guards than NumEntryGuards in <b>live_entry_guards</b>. - * - * If <b>chosen_exit</b> is set, it contains the exit node of this - * circuit. Make sure to not use it or its family as an entry guard. - * - * If <b>need_uptime</b> is set, we are looking for a stable entry guard. - * if <b>need_capacity</b> is set, we are looking for a fast entry guard. - * - * The rest of the arguments are the same as in choose_random_entry_impl(). - * - * Return 1 if we should choose a guard right away. Return 0 if we - * should try to add more nodes to our list before deciding on a - * guard. - */ -STATIC int -populate_live_entry_guards(smartlist_t *live_entry_guards, - const smartlist_t *all_entry_guards, - const node_t *chosen_exit, - dirinfo_type_t dirinfo_type, - int for_directory, - int need_uptime, int need_capacity) -{ - const or_options_t *options = get_options(); - const node_t *node = NULL; - const int num_needed = decide_num_guards(options, for_directory); - smartlist_t *exit_family = smartlist_new(); - int retval = 0; - entry_is_live_flags_t entry_flags = 0; - - (void) dirinfo_type; - - { /* Set the flags we want our entry node to have */ - if (need_uptime) { - entry_flags |= ENTRY_NEED_UPTIME; - } - if (need_capacity) { - entry_flags |= ENTRY_NEED_CAPACITY; - } - if (!for_directory) { - entry_flags |= ENTRY_NEED_DESCRIPTOR; - } - } - - tor_assert(all_entry_guards); - - if (chosen_exit) { - nodelist_add_node_and_family(exit_family, chosen_exit); - } - - SMARTLIST_FOREACH_BEGIN(all_entry_guards, const entry_guard_t *, entry) { - const char *msg; - node = entry_is_live(entry, entry_flags, &msg); - if (!node) - continue; /* down, no point */ - if (for_directory) { - if (!entry->is_dir_cache) - continue; /* We need a directory and didn't get one. */ - } - if (node == chosen_exit) - continue; /* don't pick the same node for entry and exit */ - if (smartlist_contains(exit_family, node)) - continue; /* avoid relays that are family members of our exit */ - smartlist_add(live_entry_guards, (void*)node); - if (!entry->made_contact) { - /* Always start with the first not-yet-contacted entry - * guard. Otherwise we might add several new ones, pick - * the second new one, and now we've expanded our entry - * guard list without needing to. */ - retval = 1; - goto done; - } - if (smartlist_len(live_entry_guards) >= num_needed) { - retval = 1; - goto done; /* We picked enough entry guards. Done! */ - } - } SMARTLIST_FOREACH_END(entry); - - done: - smartlist_free(exit_family); - - return retval; -} - -/** Pick a node to be used as the entry guard of a circuit, relative to - * a supplied guard selection context. - * - * If <b>state</b> is set, it contains the information we know about - * the upcoming circuit. - * - * If <b>for_directory</b> is set, we are looking for a directory guard. - * - * <b>dirinfo_type</b> contains the kind of directory information we - * are looking for in our node, or NO_DIRINFO (zero) if we are not - * looking for any particular directory information (when set to - * NO_DIRINFO, the <b>dirinfo_type</b> filter is ignored). - * - * If <b>n_options_out</b> is set, we set it to the number of - * candidate guard nodes we had before picking a specific guard node. - * - * On success, return the node that should be used as the entry guard - * of the circuit. Return NULL if no such node could be found. - * - * Helper for choose_random{entry,dirguard}. -*/ -static const node_t * -choose_random_entry_impl(guard_selection_t *gs, - cpath_build_state_t *state, int for_directory, - dirinfo_type_t dirinfo_type, int *n_options_out) -{ - const or_options_t *options = get_options(); - smartlist_t *live_entry_guards = smartlist_new(); - const node_t *chosen_exit = - state?build_state_get_exit_node(state) : NULL; - const node_t *node = NULL; - int need_uptime = state ? state->need_uptime : 0; - int need_capacity = state ? state->need_capacity : 0; - int preferred_min = 0; - const int num_needed = decide_num_guards(options, for_directory); - int retval = 0; - - tor_assert(gs != NULL); - tor_assert(gs->chosen_entry_guards != NULL); - - if (n_options_out) - *n_options_out = 0; - - if (gs->should_add_entry_nodes) - entry_guards_set_from_config(gs, options); - - if (!entry_list_is_constrained(options) && - smartlist_len(gs->chosen_entry_guards) < num_needed) - pick_entry_guards(gs, options, for_directory); - - retry: - smartlist_clear(live_entry_guards); - - /* Populate the list of live entry guards so that we pick one of - them. */ - retval = populate_live_entry_guards(live_entry_guards, - gs->chosen_entry_guards, - chosen_exit, - dirinfo_type, - for_directory, - need_uptime, need_capacity); - - if (retval == 1) { /* We should choose a guard right now. */ - goto choose_and_finish; - } - - if (entry_list_is_constrained(options)) { - /* If we prefer the entry nodes we've got, and we have at least - * one choice, that's great. Use it. */ - preferred_min = 1; - } else { - /* Try to have at least 2 choices available. This way we don't - * get stuck with a single live-but-crummy entry and just keep - * using it. - * (We might get 2 live-but-crummy entry guards, but so be it.) */ - preferred_min = 2; - } - - if (smartlist_len(live_entry_guards) < preferred_min) { - if (!entry_list_is_constrained(options)) { - /* still no? try adding a new entry then */ - /* XXX if guard doesn't imply fast and stable, then we need - * to tell add_an_entry_guard below what we want, or it might - * be a long time til we get it. -RD */ - node = add_an_entry_guard(gs, NULL, 0, 0, 1, for_directory); - if (node) { - entry_guards_changed_for_guard_selection(gs); - /* XXX we start over here in case the new node we added shares - * a family with our exit node. There's a chance that we'll just - * load up on entry guards here, if the network we're using is - * one big family. Perhaps we should teach add_an_entry_guard() - * to understand nodes-to-avoid-if-possible? -RD */ - goto retry; - } - } - if (!node && need_uptime) { - need_uptime = 0; /* try without that requirement */ - goto retry; - } - if (!node && need_capacity) { - /* still no? last attempt, try without requiring capacity */ - need_capacity = 0; - goto retry; - } - - /* live_entry_guards may be empty below. Oh well, we tried. */ - } - - choose_and_finish: - if (entry_list_is_constrained(options)) { - /* We need to weight by bandwidth, because our bridges or entryguards - * were not already selected proportional to their bandwidth. */ - node = node_sl_choose_by_bandwidth(live_entry_guards, WEIGHT_FOR_GUARD); - } else { - /* We choose uniformly at random here, because choose_good_entry_server() - * already weights its choices by bandwidth, so we don't want to - * *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); - return node; -} -#endif - /** Check the pathbias use success count of <b>node</b> and disable it if it * goes over our thresholds. */ static void @@ -4320,262 +2997,6 @@ pathbias_check_close_success_count(entry_guard_t *node) } } -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM -/** Parse <b>state</b> and learn about the entry guards it describes. - * If <b>set</b> is true, and there are no errors, replace the guard - * list in the provided guard selection context with what we find. - * On success, return 0. On failure, alloc into *<b>msg</b> a string - * describing the error, and return -1. - */ -int -entry_guards_parse_state_for_guard_selection( - guard_selection_t *gs, - or_state_t *state, int set, char **msg) -{ - entry_guard_t *node = NULL; - smartlist_t *new_entry_guards = smartlist_new(); - config_line_t *line; - time_t now = time(NULL); - const char *state_version = state->TorVersion; - digestmap_t *added_by = digestmap_new(); - - tor_assert(gs != NULL); - - *msg = NULL; - for (line = state->EntryGuards; line; line = line->next) { - if (!strcasecmp(line->key, "EntryGuard")) { - smartlist_t *args = smartlist_new(); - node = tor_malloc_zero(sizeof(entry_guard_t)); - /* all entry guards on disk have been contacted */ - node->made_contact = 1; - node->is_persistent = 1; - smartlist_add(new_entry_guards, node); - smartlist_split_string(args, line->value, " ", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - if (smartlist_len(args)<2) { - *msg = tor_strdup("Unable to parse entry nodes: " - "Too few arguments to EntryGuard"); - } else if (!is_legal_nickname(smartlist_get(args,0))) { - *msg = tor_strdup("Unable to parse entry nodes: " - "Bad nickname for EntryGuard"); - } else { - strlcpy(node->nickname, smartlist_get(args,0), MAX_NICKNAME_LEN+1); - if (base16_decode(node->identity, DIGEST_LEN, smartlist_get(args,1), - strlen(smartlist_get(args,1))) != DIGEST_LEN) { - *msg = tor_strdup("Unable to parse entry nodes: " - "Bad hex digest for EntryGuard"); - } - } - if (smartlist_len(args) >= 3) { - const char *is_cache = smartlist_get(args, 2); - if (!strcasecmp(is_cache, "DirCache")) { - node->is_dir_cache = 1; - } else if (!strcasecmp(is_cache, "NoDirCache")) { - node->is_dir_cache = 0; - } else { - log_warn(LD_CONFIG, "Bogus third argument to EntryGuard line: %s", - escaped(is_cache)); - } - } - SMARTLIST_FOREACH(args, char*, cp, tor_free(cp)); - smartlist_free(args); - if (*msg) - break; - } else if (!strcasecmp(line->key, "EntryGuardDownSince") || - !strcasecmp(line->key, "EntryGuardUnlistedSince")) { - time_t when; - time_t last_try = 0; - if (!node) { - *msg = tor_strdup("Unable to parse entry nodes: " - "EntryGuardDownSince/UnlistedSince without EntryGuard"); - break; - } - if (parse_iso_time_(line->value, &when, 0, 0)<0) { - *msg = tor_strdup("Unable to parse entry nodes: " - "Bad time in EntryGuardDownSince/UnlistedSince"); - break; - } - if (when > now) { - /* It's a bad idea to believe info in the future: you can wind - * up with timeouts that aren't allowed to happen for years. */ - continue; - } - if (strlen(line->value) >= ISO_TIME_LEN+ISO_TIME_LEN+1) { - /* ignore failure */ - (void) parse_iso_time(line->value+ISO_TIME_LEN+1, &last_try); - } - if (!strcasecmp(line->key, "EntryGuardDownSince")) { - node->unreachable_since = when; - node->last_attempted = last_try; - } else { - node->bad_since = when; - } - } else if (!strcasecmp(line->key, "EntryGuardAddedBy")) { - char d[DIGEST_LEN]; - /* format is digest version date */ - if (strlen(line->value) < HEX_DIGEST_LEN+1+1+1+ISO_TIME_LEN) { - log_warn(LD_BUG, "EntryGuardAddedBy line is not long enough."); - continue; - } - if (base16_decode(d, sizeof(d), - line->value, HEX_DIGEST_LEN) != sizeof(d) || - line->value[HEX_DIGEST_LEN] != ' ') { - log_warn(LD_BUG, "EntryGuardAddedBy line %s does not begin with " - "hex digest", escaped(line->value)); - continue; - } - digestmap_set(added_by, d, tor_strdup(line->value+HEX_DIGEST_LEN+1)); - } else if (!strcasecmp(line->key, "EntryGuardPathUseBias")) { - double use_cnt, success_cnt; - - if (!node) { - *msg = tor_strdup("Unable to parse entry nodes: " - "EntryGuardPathUseBias without EntryGuard"); - break; - } - - if (tor_sscanf(line->value, "%lf %lf", - &use_cnt, &success_cnt) != 2) { - log_info(LD_GENERAL, "Malformed path use bias line for node %s", - node->nickname); - continue; - } - - if (use_cnt < success_cnt) { - int severity = LOG_INFO; - /* If this state file was written by a Tor that would have - * already fixed it, then the overcounting bug is still there.. */ - if (tor_version_as_new_as(state_version, "0.2.4.13-alpha")) { - severity = LOG_NOTICE; - } - log_fn(severity, LD_BUG, - "State file contains unexpectedly high usage success " - "counts %lf/%lf for Guard %s ($%s)", - success_cnt, use_cnt, - node->nickname, hex_str(node->identity, DIGEST_LEN)); - success_cnt = use_cnt; - } - - node->pb.use_attempts = use_cnt; - node->pb.use_successes = success_cnt; - - log_info(LD_GENERAL, "Read %f/%f path use bias for node %s", - node->pb.use_successes, node->pb.use_attempts, node->nickname); - - pathbias_check_use_success_count(node); - - } else if (!strcasecmp(line->key, "EntryGuardPathBias")) { - double hop_cnt, success_cnt, timeouts, collapsed, successful_closed, - unusable; - - if (!node) { - *msg = tor_strdup("Unable to parse entry nodes: " - "EntryGuardPathBias without EntryGuard"); - break; - } - - /* First try 3 params, then 2. */ - /* In the long run: circuit_success ~= successful_circuit_close + - * collapsed_circuits + - * unusable_circuits */ - if (tor_sscanf(line->value, "%lf %lf %lf %lf %lf %lf", - &hop_cnt, &success_cnt, &successful_closed, - &collapsed, &unusable, &timeouts) != 6) { - int old_success, old_hops; - if (tor_sscanf(line->value, "%u %u", &old_success, &old_hops) != 2) { - continue; - } - log_info(LD_GENERAL, "Reading old-style EntryGuardPathBias %s", - escaped(line->value)); - - success_cnt = old_success; - successful_closed = old_success; - hop_cnt = old_hops; - timeouts = 0; - collapsed = 0; - unusable = 0; - } - - if (hop_cnt < success_cnt) { - int severity = LOG_INFO; - /* If this state file was written by a Tor that would have - * already fixed it, then the overcounting bug is still there.. */ - if (tor_version_as_new_as(state_version, "0.2.4.13-alpha")) { - severity = LOG_NOTICE; - } - log_fn(severity, LD_BUG, - "State file contains unexpectedly high success counts " - "%lf/%lf for Guard %s ($%s)", - success_cnt, hop_cnt, - node->nickname, hex_str(node->identity, DIGEST_LEN)); - success_cnt = hop_cnt; - } - - node->pb.circ_attempts = hop_cnt; - node->pb.circ_successes = success_cnt; - - node->pb.successful_circuits_closed = successful_closed; - node->pb.timeouts = timeouts; - node->pb.collapsed_circuits = collapsed; - node->pb.unusable_circuits = unusable; - - log_info(LD_GENERAL, "Read %f/%f path bias for node %s", - node->pb.circ_successes, node->pb.circ_attempts, - node->nickname); - - pathbias_check_close_success_count(node); - } else { - log_warn(LD_BUG, "Unexpected key %s", line->key); - } - } - - SMARTLIST_FOREACH_BEGIN(new_entry_guards, entry_guard_t *, e) { - char *sp; - char *val = digestmap_get(added_by, e->identity); - if (val && (sp = strchr(val, ' '))) { - time_t when; - *sp++ = '\0'; - if (parse_iso_time(sp, &when)<0) { - log_warn(LD_BUG, "Can't read time %s in EntryGuardAddedBy", sp); - } else { - e->chosen_by_version = tor_strdup(val); - e->chosen_on_date = when; - } - } else { - if (state_version) { - e->chosen_on_date = crypto_rand_time_range(now - 3600*24*30, now); - e->chosen_by_version = tor_strdup(state_version); - } - } - if (e->pb.path_bias_disabled && !e->bad_since) - e->bad_since = time(NULL); - } - SMARTLIST_FOREACH_END(e); - - if (*msg || !set) { - SMARTLIST_FOREACH(new_entry_guards, entry_guard_t *, e, - entry_guard_free(e)); - smartlist_free(new_entry_guards); - } else { /* !err && set */ - if (gs->chosen_entry_guards) { - SMARTLIST_FOREACH(gs->chosen_entry_guards, entry_guard_t *, e, - entry_guard_free(e)); - smartlist_free(gs->chosen_entry_guards); - } - gs->chosen_entry_guards = new_entry_guards; - SMARTLIST_FOREACH(new_entry_guards, entry_guard_t *, e, - e->in_selection = gs); - - /* XXX hand new_entry_guards to this func, and move it up a - * few lines, so we don't have to re-dirty it */ - if (remove_obsolete_entry_guards(gs, now)) - entry_guards_dirty = 1; - } - digestmap_free(added_by, tor_free_); - return *msg ? -1 : 0; -} -#endif - /** Parse <b>state</b> and learn about the entry guards it describes. * If <b>set</b> is true, and there are no errors, replace the guard * list in the default guard selection context with what we find. @@ -4586,20 +3007,10 @@ int entry_guards_parse_state(or_state_t *state, int set, char **msg) { entry_guards_dirty = 0; - int r1 = entry_guards_load_guards_from_state(state, set); - -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM - int r2 = entry_guards_parse_state_for_guard_selection( - get_guard_selection_by_name("legacy", GS_TYPE_LEGACY, 1), - state, set, msg); -#else - int r2 = 0; -#endif - entry_guards_dirty = 0; - if (r1 < 0 || r2 < 0) { + if (r1 < 0) { if (msg && *msg == NULL) { *msg = tor_strdup("parsing error"); //xxxx prop271 should we try harder? } @@ -4659,93 +3070,68 @@ entry_guards_update_state(or_state_t *state) { entry_guards_dirty = 0; - // Handles all non-legacy guard info. + // Handles all guard info. entry_guards_update_guards_in_state(state); entry_guards_dirty = 0; -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM - config_line_t **next, *line; - - guard_selection_t *gs; - gs = get_guard_selection_by_name("legacy", GS_TYPE_LEGACY, 0); - if (!gs) - return; // nothign to save. - tor_assert(gs->chosen_entry_guards != NULL); - - config_free_lines(state->EntryGuards); - next = &state->EntryGuards; - *next = NULL; - SMARTLIST_FOREACH_BEGIN(gs->chosen_entry_guards, entry_guard_t *, e) { - char dbuf[HEX_DIGEST_LEN+1]; - if (!e->made_contact) - continue; /* don't write this one to disk */ - *next = line = tor_malloc_zero(sizeof(config_line_t)); - line->key = tor_strdup("EntryGuard"); - base16_encode(dbuf, sizeof(dbuf), e->identity, DIGEST_LEN); - tor_asprintf(&line->value, "%s %s %sDirCache", e->nickname, dbuf, - e->is_dir_cache ? "" : "No"); - next = &(line->next); - if (e->unreachable_since) { - *next = line = tor_malloc_zero(sizeof(config_line_t)); - line->key = tor_strdup("EntryGuardDownSince"); - line->value = tor_malloc(ISO_TIME_LEN+1+ISO_TIME_LEN+1); - format_iso_time(line->value, e->unreachable_since); - if (e->last_attempted) { - line->value[ISO_TIME_LEN] = ' '; - format_iso_time(line->value+ISO_TIME_LEN+1, e->last_attempted); - } - next = &(line->next); - } - if (e->bad_since) { - *next = line = tor_malloc_zero(sizeof(config_line_t)); - line->key = tor_strdup("EntryGuardUnlistedSince"); - line->value = tor_malloc(ISO_TIME_LEN+1); - format_iso_time(line->value, e->bad_since); - next = &(line->next); - } - if (e->chosen_on_date && e->chosen_by_version && - !strchr(e->chosen_by_version, ' ')) { - char d[HEX_DIGEST_LEN+1]; - char t[ISO_TIME_LEN+1]; - *next = line = tor_malloc_zero(sizeof(config_line_t)); - line->key = tor_strdup("EntryGuardAddedBy"); - base16_encode(d, sizeof(d), e->identity, DIGEST_LEN); - format_iso_time(t, e->chosen_on_date); - tor_asprintf(&line->value, "%s %s %s", - d, e->chosen_by_version, t); - next = &(line->next); - } - if (e->pb.circ_attempts > 0) { - *next = line = tor_malloc_zero(sizeof(config_line_t)); - line->key = tor_strdup("EntryGuardPathBias"); - /* In the long run: circuit_success ~= successful_circuit_close + - * collapsed_circuits + - * unusable_circuits */ - tor_asprintf(&line->value, "%f %f %f %f %f %f", - e->pb.circ_attempts, e->pb.circ_successes, - pathbias_get_close_success_count(e), - e->pb.collapsed_circuits, - e->pb.unusable_circuits, e->pb.timeouts); - next = &(line->next); - } - if (e->pb.use_attempts > 0) { - *next = line = tor_malloc_zero(sizeof(config_line_t)); - line->key = tor_strdup("EntryGuardPathUseBias"); - - tor_asprintf(&line->value, "%f %f", - e->pb.use_attempts, - pathbias_get_use_success_count(e)); - next = &(line->next); - } - - } SMARTLIST_FOREACH_END(e); -#endif if (!get_options()->AvoidDiskWrites) or_state_mark_dirty(get_or_state(), 0); entry_guards_dirty = 0; } +/** + * Format a single entry guard in the format expected by the controller. + * Return a newly allocated string. + */ +STATIC char * +getinfo_helper_format_single_entry_guard(const entry_guard_t *e) +{ + const char *status = NULL; + time_t when = 0; + const node_t *node; + char tbuf[ISO_TIME_LEN+1]; + char nbuf[MAX_VERBOSE_NICKNAME_LEN+1]; + + /* This is going to be a bit tricky, since the status + * codes weren't really intended for prop271 guards. + * + * XXXX use a more appropriate format for exporting this information + */ + if (e->confirmed_idx < 0) { + status = "never-connected"; + } else if (! e->currently_listed) { + when = e->unlisted_since_date; + status = "unusable"; + } else if (! e->is_filtered_guard) { + status = "unusable"; + } else if (e->is_reachable == GUARD_REACHABLE_NO) { + when = e->failing_since; + status = "down"; + } else { + status = "up"; + } + + node = entry_guard_find_node(e); + if (node) { + node_get_verbose_nickname(node, nbuf); + } else { + nbuf[0] = '$'; + base16_encode(nbuf+1, sizeof(nbuf)-1, e->identity, DIGEST_LEN); + /* e->nickname field is not very reliable if we don't know about + * this router any longer; don't include it. */ + } + + char *result = NULL; + if (when) { + format_iso_time(tbuf, when); + tor_asprintf(&result, "%s %s %s\n", nbuf, status, tbuf); + } else { + tor_asprintf(&result, "%s %s\n", nbuf, status); + } + return result; +} + /** If <b>question</b> is the string "entry-guards", then dump * to *<b>answer</b> a newly allocated string describing all of * the nodes in the global entry_guards list. See control-spec.txt @@ -4763,63 +3149,25 @@ getinfo_helper_entry_guards(control_connection_t *conn, guard_selection_t *gs = get_guard_selection_info(); tor_assert(gs != NULL); -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM - tor_assert(gs->chosen_entry_guards != NULL); -#else - // XXXX - (void)question; - (void)answer; -#endif (void) conn; (void) errmsg; -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM if (!strcmp(question,"entry-guards") || !strcmp(question,"helper-nodes")) { + const smartlist_t *guards; + guards = gs->sampled_entry_guards; + smartlist_t *sl = smartlist_new(); - char tbuf[ISO_TIME_LEN+1]; - char nbuf[MAX_VERBOSE_NICKNAME_LEN+1]; - - SMARTLIST_FOREACH_BEGIN(gs->chosen_entry_guards, entry_guard_t *, e) { - const char *status = NULL; - time_t when = 0; - const node_t *node; - - if (!e->made_contact) { - status = "never-connected"; - } else if (e->bad_since) { - when = e->bad_since; - status = "unusable"; - } else if (e->unreachable_since) { - when = e->unreachable_since; - status = "down"; - } else { - status = "up"; - } - - node = node_get_by_id(e->identity); - if (node) { - node_get_verbose_nickname(node, nbuf); - } else { - nbuf[0] = '$'; - base16_encode(nbuf+1, sizeof(nbuf)-1, e->identity, DIGEST_LEN); - /* e->nickname field is not very reliable if we don't know about - * this router any longer; don't include it. */ - } - - if (when) { - format_iso_time(tbuf, when); - smartlist_add_asprintf(sl, "%s %s %s\n", nbuf, status, tbuf); - } else { - smartlist_add_asprintf(sl, "%s %s\n", nbuf, status); - } + + SMARTLIST_FOREACH_BEGIN(guards, const entry_guard_t *, e) { + char *cp = getinfo_helper_format_single_entry_guard(e); + smartlist_add(sl, cp); } SMARTLIST_FOREACH_END(e); *answer = smartlist_join_strings(sl, "", 0, NULL); SMARTLIST_FOREACH(sl, char *, c, tor_free(c)); smartlist_free(sl); } -#endif return 0; } @@ -4858,107 +3206,6 @@ guard_get_guardfraction_bandwidth(guardfraction_bandwidth_t *guardfraction_bw, guardfraction_bw->non_guard_bw = orig_bandwidth - (int) guard_bw; } -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM -/** Returns true iff the node is used as a guard in the specified guard - * context */ -int -is_node_used_as_guard_for_guard_selection(guard_selection_t *gs, - const node_t *node) -{ - int res = 0; - - /* - * We used to have a using_as_guard flag in node_t, but it had to go away - * to allow for multiple guard selection contexts. Instead, search the - * guard list for a matching digest. - */ - - tor_assert(gs != NULL); - tor_assert(node != NULL); - - SMARTLIST_FOREACH_BEGIN(gs->chosen_entry_guards, entry_guard_t *, e) { - if (tor_memeq(e->identity, node->identity, DIGEST_LEN)) { - res = 1; - break; - } - } SMARTLIST_FOREACH_END(e); - - return res; -} - -/** Returns true iff the node is used as a guard in the default guard - * context */ -MOCK_IMPL(int, -is_node_used_as_guard, (const node_t *node)) -{ - return is_node_used_as_guard_for_guard_selection( - get_guard_selection_info(), node); -} - -/** Return 1 if we have at least one descriptor for an entry guard - * (bridge or member of EntryNodes) and all descriptors we know are - * down. Else return 0. If <b>act</b> is 1, then mark the down guards - * up; else just observe and report. */ -static int -entries_retry_helper(const or_options_t *options, int act) -{ - const node_t *node; - int any_known = 0; - int any_running = 0; - int need_bridges = options->UseBridges != 0; - guard_selection_t *gs = get_guard_selection_info(); - - tor_assert(gs != NULL); - tor_assert(gs->chosen_entry_guards != NULL); - - SMARTLIST_FOREACH_BEGIN(gs->chosen_entry_guards, entry_guard_t *, e) { - node = node_get_by_id(e->identity); - if (node && node_has_descriptor(node) && - node_is_bridge(node) == need_bridges && - (!need_bridges || (!e->bad_since && - node_is_a_configured_bridge(node)))) { - any_known = 1; - if (node->is_running) - any_running = 1; /* some entry is both known and running */ - else if (act) { - /* Mark all current connections to this OR as unhealthy, since - * otherwise there could be one that started 30 seconds - * ago, and in 30 seconds it will time out, causing us to mark - * the node down and undermine the retry attempt. We mark even - * the established conns, since if the network just came back - * we'll want to attach circuits to fresh conns. */ - channel_update_bad_for_new_circs(node->identity, 1); - - /* mark this entry node for retry */ - router_set_status(node->identity, 1); - e->can_retry = 1; - e->bad_since = 0; - } - } - } SMARTLIST_FOREACH_END(e); - log_debug(LD_DIR, "%d: any_known %d, any_running %d", - act, any_known, any_running); - return any_known && !any_running; -} - -/** Do we know any descriptors for our bridges / entrynodes, and are - * all the ones we have descriptors for down? */ -int -entries_known_but_down(const or_options_t *options) -{ - tor_assert(entry_list_is_constrained(options)); - return entries_retry_helper(options, 0); -} - -/** Mark all down known bridges / entrynodes up. */ -void -entries_retry_all(const or_options_t *options) -{ - tor_assert(entry_list_is_constrained(options)); - entries_retry_helper(options, 1); -} -#endif - /** Helper: Update the status of all entry guards, in whatever algorithm * is used. Return true if we should stop using all previously generated * circuits, by calling circuit_mark_all_unused_circs() and @@ -4973,16 +3220,8 @@ guards_update_all(void) tor_assert(curr_guard_context); - if (curr_guard_context->type == GS_TYPE_LEGACY) { -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM - entry_guards_compute_status(get_options(), approx_time()); -#else - tor_assert_nonfatal_unreached(); -#endif - } else { - if (entry_guards_update_all(curr_guard_context)) - mark_circuits = 1; - } + if (entry_guards_update_all(curr_guard_context)) + mark_circuits = 1; return mark_circuits; } @@ -4993,66 +3232,75 @@ const node_t * guards_choose_guard(cpath_build_state_t *state, circuit_guard_state_t **guard_state_out) { - if (get_options()->UseDeprecatedGuardAlgorithm) { -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM - return choose_random_entry(state); -#else - tor_assert_nonfatal_unreached(); - return NULL; -#endif - } else { - const node_t *r = NULL; - const uint8_t *exit_id = NULL; - entry_guard_restriction_t *rst = NULL; - // XXXX prop271 spec deviation -- use of restriction here. - if (state && (exit_id = build_state_get_exit_rsa_id(state))) { - /* We're building to a targeted exit node, so that node can't be - * chosen as our guard for this circuit. */ - rst = tor_malloc_zero(sizeof(entry_guard_restriction_t)); - memcpy(rst->exclude_id, exit_id, DIGEST_LEN); - } - if (entry_guard_pick_for_circuit(get_guard_selection_info(), - GUARD_USAGE_TRAFFIC, - rst, - &r, - guard_state_out) < 0) { - tor_assert(r == NULL); - } - return r; + const node_t *r = NULL; + const uint8_t *exit_id = NULL; + entry_guard_restriction_t *rst = NULL; + // XXXX prop271 spec deviation -- use of restriction here. + if (state && (exit_id = build_state_get_exit_rsa_id(state))) { + /* We're building to a targeted exit node, so that node can't be + * chosen as our guard for this circuit. */ + rst = tor_malloc_zero(sizeof(entry_guard_restriction_t)); + memcpy(rst->exclude_id, exit_id, DIGEST_LEN); + } + if (entry_guard_pick_for_circuit(get_guard_selection_info(), + GUARD_USAGE_TRAFFIC, + rst, + &r, + guard_state_out) < 0) { + tor_assert(r == NULL); } + return r; +} + +/** Remove all currently listed entry guards for a given guard selection + * context. This frees and replaces <b>gs</b>, so don't use <b>gs</b> + * after calling this function. */ +void +remove_all_entry_guards_for_guard_selection(guard_selection_t *gs) +{ + // This function shouldn't exist. XXXX + tor_assert(gs != NULL); + char *old_name = tor_strdup(gs->name); + guard_selection_type_t old_type = gs->type; + + SMARTLIST_FOREACH(gs->sampled_entry_guards, entry_guard_t *, entry, { + control_event_guard(entry->nickname, entry->identity, "DROPPED"); + }); + + if (gs == curr_guard_context) { + curr_guard_context = NULL; + } + + smartlist_remove(guard_contexts, gs); + guard_selection_free(gs); + + gs = get_guard_selection_by_name(old_name, old_type, 1); + entry_guards_changed_for_guard_selection(gs); + tor_free(old_name); +} + +/** Remove all currently listed entry guards. So new ones will be chosen. */ +void +remove_all_entry_guards(void) +{ + // XXXX prop271 this function shouldn't exist, in the new order. + // This function shouldn't exist. + remove_all_entry_guards_for_guard_selection(get_guard_selection_info()); } /** Helper: pick a directory guard, with whatever algorithm is used. */ const node_t * -guards_choose_dirguard(dirinfo_type_t info, - circuit_guard_state_t **guard_state_out) +guards_choose_dirguard(circuit_guard_state_t **guard_state_out) { - if (get_options()->UseDeprecatedGuardAlgorithm) { -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM - return choose_random_dirguard(info); -#else - (void)info; - tor_assert_nonfatal_unreached(); - return NULL; -#endif - } else { - /* XXXX prop271 We don't need to look at the dirinfo_type_t here, - * apparently. If you look at the old implementation, and you follow info - * downwards through choose_random_dirguard(), into - * choose_random_entry_impl(), into populate_live_entry_guards()... you - * find out that it isn't even used, and hasn't been since 0.2.7.1-alpha, - * when we realized that every Tor on the network would support - * microdescriptors. -NM */ - const node_t *r = NULL; - if (entry_guard_pick_for_circuit(get_guard_selection_info(), - GUARD_USAGE_DIRGUARD, - NULL, - &r, - guard_state_out) < 0) { - tor_assert(r == NULL); - } - return r; + const node_t *r = NULL; + if (entry_guard_pick_for_circuit(get_guard_selection_info(), + GUARD_USAGE_DIRGUARD, + NULL, + &r, + guard_state_out) < 0) { + tor_assert(r == NULL); } + return r; } /** @@ -5065,15 +3313,6 @@ guards_retry_optimistic(const or_options_t *options) if (! entry_list_is_constrained(options)) return 0; -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM - if (options->UseDeprecatedGuardAlgorithm) { - if (entries_known_but_down(options)) { - entries_retry_all(options); - return 1; - } - } -#endif - // XXXX prop271 -- is this correct? mark_primary_guards_maybe_reachable(get_guard_selection_info()); @@ -5088,15 +3327,6 @@ guard_selection_free(guard_selection_t *gs) tor_free(gs->name); -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM - if (gs->chosen_entry_guards) { - SMARTLIST_FOREACH(gs->chosen_entry_guards, entry_guard_t *, e, - entry_guard_free(e)); - smartlist_free(gs->chosen_entry_guards); - gs->chosen_entry_guards = NULL; - } -#endif - if (gs->sampled_entry_guards) { SMARTLIST_FOREACH(gs->sampled_entry_guards, entry_guard_t *, e, entry_guard_free(e)); diff --git a/src/or/entrynodes.h b/src/or/entrynodes.h index db84d594c2..bd501d001f 100644 --- a/src/or/entrynodes.h +++ b/src/or/entrynodes.h @@ -28,11 +28,6 @@ typedef struct circuit_guard_state_t circuit_guard_state_t; private. */ typedef struct entry_guard_restriction_t entry_guard_restriction_t; -/* - XXXX Prop271 undefine this in order to disable all legacy guard functions. -*/ -// #define ENABLE_LEGACY_GUARD_ALGORITHM - /* Information about a guard's pathbias status. * These fields are used in circpathbias.c to try to detect entry * nodes that are failing circuits at a suspicious frequency. @@ -175,41 +170,11 @@ struct entry_guard_t { * we saw them in the state, even if we don't understand them. */ char *extra_state_fields; - /** Backpointer to the guard selection that this guard belongs to. */ + /** Backpointer to the guard selection that this guard belongs to. + * The entry_guard_t must never outlive its guard_selection. */ guard_selection_t *in_selection; /**@}*/ -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM - /** - * @name legacy guard selection algorithm fields - * - * These are used and maintained by the legacy (pre-prop271) entry guard - * algorithm. Most of them we will remove as prop271 gets implemented. - * The rest we'll migrate over, if they are 100% semantically identical to - * their prop271 equivalents. XXXXprop271 - */ - /**@{*/ - time_t chosen_on_date; /**< Approximately when was this guard added? - * "0" if we don't know. */ - char *chosen_by_version; /**< What tor version added this guard? NULL - * if we don't know. */ - unsigned int made_contact : 1; /**< 0 if we have never connected to this - * router, 1 if we have. */ - unsigned int can_retry : 1; /**< Should we retry connecting to this entry, - * in spite of having it marked as unreachable?*/ - unsigned int is_dir_cache : 1; /**< Is this node a directory cache? */ - time_t bad_since; /**< 0 if this guard is currently usable, or the time at - * which it was observed to become (according to the - * directory or the user configuration) unusable. */ - time_t unreachable_since; /**< 0 if we can connect to this guard, or the - * time at which we first noticed we couldn't - * connect to it. */ - time_t last_attempted; /**< 0 if we can connect to this guard, or the time - * at which we last failed to connect to it. */ - - /**}@*/ -#endif - /** Path bias information for this guard. */ guard_pathbias_t pb; }; @@ -230,8 +195,6 @@ typedef enum guard_selection_type_t { /** Use the normal guard selection algorithm, taking our sample from the * set of filtered nodes. */ GS_TYPE_RESTRICTED, - /** Use the legacy (pre-prop271) guard selection algorithm and fields */ - GS_TYPE_LEGACY, } guard_selection_type_t; /** @@ -305,20 +268,6 @@ struct guard_selection_s { * confirmed_entry_guards receive? */ int next_confirmed_idx; -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM - /** - * A list of our chosen entry guards, as entry_guard_t structures; this - * preserves the pre-Prop271 behavior. - */ - smartlist_t *chosen_entry_guards; - - /** - * When we try to choose an entry guard, should we parse and add - * config's EntryNodes first? This was formerly a global. This - * preserves the pre-Prop271 behavior. - */ - int should_add_entry_nodes; -#endif }; struct entry_guard_handle_t; @@ -366,8 +315,7 @@ struct circuit_guard_state_t { int guards_update_all(void); const node_t *guards_choose_guard(cpath_build_state_t *state, circuit_guard_state_t **guard_state_out); -const node_t *guards_choose_dirguard(dirinfo_type_t info, - circuit_guard_state_t **guard_state_out); +const node_t *guards_choose_dirguard(circuit_guard_state_t **guard_state_out); #if 1 /* XXXX NM I would prefer that all of this stuff be private to @@ -378,11 +326,6 @@ entry_guard_t *entry_guard_get_by_id_digest(const char *digest); void entry_guards_changed_for_guard_selection(guard_selection_t *gs); void entry_guards_changed(void); guard_selection_t * get_guard_selection_info(void); -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM -const smartlist_t *get_entry_guards_for_guard_selection( - guard_selection_t *gs); -const smartlist_t *get_entry_guards(void); -#endif int num_live_entry_guards_for_guard_selection( guard_selection_t *gs, int for_directory); @@ -390,9 +333,6 @@ int num_live_entry_guards(int for_directory); #endif const node_t *entry_guard_find_node(const entry_guard_t *guard); -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM -void entry_guard_mark_bad(entry_guard_t *guard); -#endif const char *entry_guard_get_rsa_id_digest(const entry_guard_t *guard); const char *entry_guard_describe(const entry_guard_t *guard); guard_pathbias_t *entry_guard_get_pathbias_state(entry_guard_t *guard); @@ -432,10 +372,6 @@ void entry_guards_note_internet_connectivity(guard_selection_t *gs); int update_guard_selection_choice(const or_options_t *options); /* Used by bridges.c only. */ -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM -void add_bridge_as_entry_guard(guard_selection_t *gs, - const node_t *chosen); -#endif int num_bridges_usable(void); #ifdef ENTRYNODES_PRIVATE @@ -610,69 +546,17 @@ STATIC unsigned entry_guards_note_guard_success(guard_selection_t *gs, entry_guard_t *guard, unsigned old_state); STATIC int entry_guard_has_higher_priority(entry_guard_t *a, entry_guard_t *b); - -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM -// ---------- XXXX this stuff is pre-prop271. - -STATIC const node_t *add_an_entry_guard(guard_selection_t *gs, - const node_t *chosen, - int reset_status, int prepend, - int for_discovery, int for_directory); -STATIC int populate_live_entry_guards(smartlist_t *live_entry_guards, - const smartlist_t *all_entry_guards, - const node_t *chosen_exit, - dirinfo_type_t dirinfo_type, - int for_directory, - int need_uptime, int need_capacity); -STATIC int decide_num_guards(const or_options_t *options, int for_directory); - -STATIC void entry_guards_set_from_config(guard_selection_t *gs, - const or_options_t *options); - -/** Flags to be passed to entry_is_live() to indicate what kind of - * entry nodes we are looking for. */ -typedef enum { - ENTRY_NEED_UPTIME = 1<<0, - ENTRY_NEED_CAPACITY = 1<<1, - ENTRY_ASSUME_REACHABLE = 1<<2, - ENTRY_NEED_DESCRIPTOR = 1<<3, -} entry_is_live_flags_t; - -STATIC const node_t *entry_is_live(const entry_guard_t *e, - entry_is_live_flags_t flags, - const char **msg); - -STATIC int entry_is_time_to_retry(const entry_guard_t *e, time_t now); +STATIC char *getinfo_helper_format_single_entry_guard(const entry_guard_t *e); #endif -#endif - -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM void remove_all_entry_guards_for_guard_selection(guard_selection_t *gs); void remove_all_entry_guards(void); -#endif struct bridge_info_t; void entry_guard_learned_bridge_identity(const tor_addr_port_t *addrport, const uint8_t *rsa_id_digest); -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM -void entry_guards_compute_status_for_guard_selection( - guard_selection_t *gs, const or_options_t *options, time_t now); -void entry_guards_compute_status(const or_options_t *options, time_t now); -int entry_guard_register_connect_status_for_guard_selection( - guard_selection_t *gs, const char *digest, int succeeded, - int mark_relay_status, time_t now); -int entry_guard_register_connect_status(const char *digest, int succeeded, - int mark_relay_status, time_t now); -void entry_nodes_should_be_added_for_guard_selection(guard_selection_t *gs); -void entry_nodes_should_be_added(void); -#endif int entry_list_is_constrained(const or_options_t *options); -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM -const node_t *choose_random_entry(cpath_build_state_t *state); -const node_t *choose_random_dirguard(dirinfo_type_t t); -#endif int guards_retry_optimistic(const or_options_t *options); int entry_guards_parse_state_for_guard_selection( guard_selection_t *gs, or_state_t *state, int set, char **msg); @@ -681,11 +565,6 @@ void entry_guards_update_state(or_state_t *state); int getinfo_helper_entry_guards(control_connection_t *conn, const char *question, char **answer, const char **errmsg); -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM -int is_node_used_as_guard_for_guard_selection(guard_selection_t *gs, - const node_t *node); -MOCK_DECL(int, is_node_used_as_guard, (const node_t *node)); -#endif int entries_known_but_down(const or_options_t *options); void entries_retry_all(const or_options_t *options); diff --git a/src/or/hs_cache.c b/src/or/hs_cache.c index b7ff979e5b..43cd8c3258 100644 --- a/src/or/hs_cache.c +++ b/src/or/hs_cache.c @@ -15,6 +15,7 @@ #include "config.h" #include "hs_common.h" #include "hs_descriptor.h" +#include "networkstatus.h" #include "rendcache.h" /* Directory descriptor cache. Map indexed by blinded key. */ @@ -86,7 +87,7 @@ cache_dir_desc_new(const char *desc) } /* The blinded pubkey is the indexed key. */ - dir_desc->key = dir_desc->plaintext_data->blinded_kp.pubkey.pubkey; + dir_desc->key = dir_desc->plaintext_data->blinded_pubkey.pubkey; dir_desc->created_ts = time(NULL); return dir_desc; @@ -366,6 +367,18 @@ hs_cache_handle_oom(time_t now, size_t min_remove_bytes) return bytes_removed; } +/** + * Return the maximum size of an HS descriptor we are willing to accept as an + * HSDir. + */ +unsigned int +hs_cache_get_max_descriptor_size(void) +{ + return (unsigned) networkstatus_get_param(NULL, + "HSV3MaxDescriptorSize", + HS_DESC_MAX_LEN, 1, INT32_MAX); +} + /* Initialize the hidden service cache subsystem. */ void hs_cache_init(void) diff --git a/src/or/hs_cache.h b/src/or/hs_cache.h index 01abb8002f..ba95e73338 100644 --- a/src/or/hs_cache.h +++ b/src/or/hs_cache.h @@ -44,6 +44,8 @@ void hs_cache_free_all(void); void hs_cache_clean_as_dir(time_t now); size_t hs_cache_handle_oom(time_t now, size_t min_remove_bytes); +unsigned int hs_cache_get_max_descriptor_size(void); + /* Store and Lookup function. They are version agnostic that is depending on * the requested version of the descriptor, it will be re-routed to the * right function. */ diff --git a/src/or/hs_common.c b/src/or/hs_common.c index 7dd97e7c7c..de96946ab5 100644 --- a/src/or/hs_common.c +++ b/src/or/hs_common.c @@ -268,17 +268,3 @@ rend_data_get_pk_digest(const rend_data_t *rend_data, size_t *len_out) } } -/* Return true iff the Onion Services protocol version 3 is enabled. This only - * considers the consensus parameter. If the parameter is not found, the - * default is that it's enabled. */ -int -hs_v3_protocol_is_enabled(void) -{ - /* This consensus param controls if the the onion services version 3 is - * enabled or not which is the first version of the next generation - * (proposal 224). If this option is set to 0, the tor daemon won't support - * the protocol as either a relay, directory, service or client. By default, - * it's enabled if the parameter is not found. */ - return networkstatus_get_param(NULL, "EnableOnionServicesV3", 1, 0, 1); -} - diff --git a/src/or/hs_common.h b/src/or/hs_common.h index 8158d278df..e0ab510ea4 100644 --- a/src/or/hs_common.h +++ b/src/or/hs_common.h @@ -39,7 +39,5 @@ const char *rend_data_get_desc_id(const rend_data_t *rend_data, const uint8_t *rend_data_get_pk_digest(const rend_data_t *rend_data, size_t *len_out); -int hs_v3_protocol_is_enabled(void); - #endif /* TOR_HS_COMMON_H */ diff --git a/src/or/hs_descriptor.c b/src/or/hs_descriptor.c index 37aa1d745e..f16a2fdc14 100644 --- a/src/or/hs_descriptor.c +++ b/src/or/hs_descriptor.c @@ -15,13 +15,14 @@ #include "ed25519_cert.h" /* Trunnel interface. */ #include "parsecommon.h" #include "rendcache.h" +#include "hs_cache.h" #include "torcert.h" /* tor_cert_encode_ed22519() */ /* Constant string value used for the descriptor format. */ #define str_hs_desc "hs-descriptor" #define str_desc_cert "descriptor-signing-key-cert" #define str_rev_counter "revision-counter" -#define str_encrypted "encrypted" +#define str_superencrypted "superencrypted" #define str_signature "signature" #define str_lifetime "descriptor-lifetime" /* Constant string value for the encrypted part of the descriptor. */ @@ -35,7 +36,7 @@ #define str_intro_point_start "\n" str_intro_point " " /* Constant string value for the construction to encrypt the encrypted data * section. */ -#define str_enc_hsdir_data "hsdir-encrypted-data" +#define str_enc_hsdir_data "hsdir-superencrypted-data" /* Prefix required to compute/verify HS desc signatures */ #define str_desc_sig_prefix "Tor onion service descriptor sig v3" @@ -56,7 +57,7 @@ static token_rule_t hs_desc_v3_token_table[] = { T1(str_lifetime, R3_DESC_LIFETIME, EQ(1), NO_OBJ), T1(str_desc_cert, R3_DESC_SIGNING_CERT, NO_ARGS, NEED_OBJ), T1(str_rev_counter, R3_REVISION_COUNTER, EQ(1), NO_OBJ), - T1(str_encrypted, R3_ENCRYPTED, NO_ARGS, NEED_OBJ), + T1(str_superencrypted, R3_SUPERENCRYPTED, NO_ARGS, NEED_OBJ), T1_END(str_signature, R3_SIGNATURE, EQ(1), NO_OBJ), END_OF_TABLE }; @@ -219,7 +220,7 @@ encode_link_specifiers(const smartlist_t *specs) /* Encode an introduction point encryption key and return a newly allocated * string with it. On failure, return NULL. */ static char * -encode_enc_key(const ed25519_keypair_t *sig_key, +encode_enc_key(const ed25519_public_key_t *sig_key, const hs_desc_intro_point_t *ip) { char *encoded = NULL; @@ -237,8 +238,7 @@ encode_enc_key(const ed25519_keypair_t *sig_key, uint8_t *cert_data = NULL; /* Create cross certification cert. */ - cert_len = tor_make_rsa_ed25519_crosscert(&sig_key->pubkey, - ip->enc_key.legacy, + cert_len = tor_make_rsa_ed25519_crosscert(sig_key, ip->enc_key.legacy, now + HS_DESC_CERT_LIFETIME, &cert_data); if (cert_len < 0) { @@ -282,7 +282,7 @@ encode_enc_key(const ed25519_keypair_t *sig_key, } tor_cert_t *cross_cert = tor_cert_create(&curve_kp, CERT_TYPE_CROSS_HS_IP_KEYS, - &sig_key->pubkey, now, + sig_key, now, HS_DESC_CERT_LIFETIME, CERT_FLAG_INCLUDE_SIGNING_KEY); memwipe(&curve_kp, 0, sizeof(curve_kp)); @@ -318,7 +318,7 @@ encode_enc_key(const ed25519_keypair_t *sig_key, /* Encode an introduction point object and return a newly allocated string * with it. On failure, return NULL. */ static char * -encode_intro_point(const ed25519_keypair_t *sig_key, +encode_intro_point(const ed25519_public_key_t *sig_key, const hs_desc_intro_point_t *ip) { char *encoded_ip = NULL; @@ -377,9 +377,9 @@ build_secret_input(const hs_descriptor_t *desc, uint8_t *dst, size_t dstlen) /* XXX use the destination length as the memcpy length */ /* Copy blinded public key. */ - memcpy(dst, desc->plaintext_data.blinded_kp.pubkey.pubkey, - sizeof(desc->plaintext_data.blinded_kp.pubkey.pubkey)); - offset += sizeof(desc->plaintext_data.blinded_kp.pubkey.pubkey); + memcpy(dst, desc->plaintext_data.blinded_pubkey.pubkey, + sizeof(desc->plaintext_data.blinded_pubkey.pubkey)); + offset += sizeof(desc->plaintext_data.blinded_pubkey.pubkey); /* Copy subcredential. */ memcpy(dst + offset, desc->subcredential, sizeof(desc->subcredential)); offset += sizeof(desc->subcredential); @@ -541,8 +541,9 @@ build_encrypted(const uint8_t *key, const uint8_t *iv, const char *plaintext, tor_assert(plaintext); tor_assert(encrypted_out); - /* This creates a cipher for AES128. It can't fail. */ - cipher = crypto_cipher_new_with_iv((const char *) key, (const char *) iv); + /* This creates a cipher for AES. It can't fail. */ + cipher = crypto_cipher_new_with_iv_and_bits(key, iv, + HS_DESC_ENCRYPTED_BIT_SIZE); /* This can't fail. */ encrypted_len = build_plaintext_padding(plaintext, plaintext_len, &padded_plaintext); @@ -573,7 +574,7 @@ encrypt_descriptor_data(const hs_descriptor_t *desc, const char *plaintext, size_t encrypted_len, final_blob_len, offset = 0; uint8_t *encrypted; uint8_t salt[HS_DESC_ENCRYPTED_SALT_LEN]; - uint8_t secret_key[CIPHER_KEY_LEN], secret_iv[CIPHER_IV_LEN]; + uint8_t secret_key[HS_DESC_ENCRYPTED_KEY_LEN], secret_iv[CIPHER_IV_LEN]; uint8_t mac_key[DIGEST256_LEN], mac[DIGEST256_LEN]; tor_assert(desc); @@ -665,7 +666,7 @@ encode_encrypted_data(const hs_descriptor_t *desc, /* Build the introduction point(s) section. */ SMARTLIST_FOREACH_BEGIN(desc->encrypted_data.intro_points, const hs_desc_intro_point_t *, ip) { - char *encoded_ip = encode_intro_point(&desc->plaintext_data.signing_kp, + char *encoded_ip = encode_intro_point(&desc->plaintext_data.signing_pubkey, ip); if (encoded_ip == NULL) { log_err(LD_BUG, "HS desc intro point is malformed."); @@ -710,7 +711,8 @@ encode_encrypted_data(const hs_descriptor_t *desc, * newly allocated string of the encoded descriptor. On error, -1 is returned * and encoded_out is untouched. */ static int -desc_encode_v3(const hs_descriptor_t *desc, char **encoded_out) +desc_encode_v3(const hs_descriptor_t *desc, + const ed25519_keypair_t *signing_kp, char **encoded_out) { int ret = -1; char *encoded_str = NULL; @@ -718,6 +720,7 @@ desc_encode_v3(const hs_descriptor_t *desc, char **encoded_out) smartlist_t *lines = smartlist_new(); tor_assert(desc); + tor_assert(signing_kp); tor_assert(encoded_out); tor_assert(desc->plaintext_data.version == 3); @@ -732,7 +735,7 @@ desc_encode_v3(const hs_descriptor_t *desc, char **encoded_out) goto err; } if (tor_cert_encode_ed22519(desc->plaintext_data.signing_key_cert, - &encoded_cert) < 0) { + &encoded_cert) < 0) { /* The function will print error logs. */ goto err; } @@ -750,7 +753,7 @@ desc_encode_v3(const hs_descriptor_t *desc, char **encoded_out) desc->plaintext_data.revision_counter); } - /* Build the encrypted data section. */ + /* Build the superencrypted data section. */ { char *enc_b64_blob=NULL; if (encode_encrypted_data(desc, &enc_b64_blob) < 0) { @@ -761,7 +764,7 @@ desc_encode_v3(const hs_descriptor_t *desc, char **encoded_out) "-----BEGIN MESSAGE-----\n" "%s" "-----END MESSAGE-----", - str_encrypted, enc_b64_blob); + str_superencrypted, enc_b64_blob); tor_free(enc_b64_blob); } @@ -775,8 +778,7 @@ desc_encode_v3(const hs_descriptor_t *desc, char **encoded_out) char ed_sig_b64[ED25519_SIG_BASE64_LEN + 1]; if (ed25519_sign_prefixed(&sig, (const uint8_t *) encoded_str, encoded_len, - str_desc_sig_prefix, - &desc->plaintext_data.signing_kp) < 0) { + str_desc_sig_prefix, signing_kp) < 0) { log_warn(LD_BUG, "Can't sign encoded HS descriptor!"); tor_free(encoded_str); goto err; @@ -1058,7 +1060,7 @@ static size_t desc_decrypt_data_v3(const hs_descriptor_t *desc, char **decrypted_out) { uint8_t *decrypted = NULL; - uint8_t secret_key[CIPHER_KEY_LEN], secret_iv[CIPHER_IV_LEN]; + uint8_t secret_key[HS_DESC_ENCRYPTED_KEY_LEN], secret_iv[CIPHER_IV_LEN]; uint8_t mac_key[DIGEST256_LEN], our_mac[DIGEST256_LEN]; const uint8_t *salt, *encrypted, *desc_mac; size_t encrypted_len, result_len = 0; @@ -1118,8 +1120,9 @@ desc_decrypt_data_v3(const hs_descriptor_t *desc, char **decrypted_out) /* Decrypt. Here we are assured that the encrypted length is valid for * decryption. */ crypto_cipher_t *cipher; - cipher = crypto_cipher_new_with_iv((const char *) secret_key, - (const char *) secret_iv); + + cipher = crypto_cipher_new_with_iv_and_bits(secret_key, secret_iv, + HS_DESC_ENCRYPTED_BIT_SIZE); /* Extra byte for the NUL terminated byte. */ decrypted = tor_malloc_zero(encrypted_len + 1); crypto_cipher_decrypt(cipher, (char *) decrypted, @@ -1365,7 +1368,8 @@ decode_intro_points(const hs_descriptor_t *desc, /* Return 1 iff the given base64 encoded signature in b64_sig from the encoded * descriptor in encoded_desc validates the descriptor content. */ STATIC int -desc_sig_is_valid(const char *b64_sig, const ed25519_keypair_t *signing_kp, +desc_sig_is_valid(const char *b64_sig, + const ed25519_public_key_t *signing_pubkey, const char *encoded_desc, size_t encoded_len) { int ret = 0; @@ -1373,7 +1377,7 @@ desc_sig_is_valid(const char *b64_sig, const ed25519_keypair_t *signing_kp, const char *sig_start; tor_assert(b64_sig); - tor_assert(signing_kp); + tor_assert(signing_pubkey); tor_assert(encoded_desc); /* Verifying nothing won't end well :). */ tor_assert(encoded_len > 0); @@ -1408,7 +1412,7 @@ desc_sig_is_valid(const char *b64_sig, const ed25519_keypair_t *signing_kp, (const uint8_t *) encoded_desc, sig_start - encoded_desc, str_desc_sig_prefix, - &signing_kp->pubkey) != 0) { + signing_pubkey) != 0) { log_warn(LD_REND, "Invalid signature on service descriptor"); goto err; } @@ -1474,10 +1478,10 @@ desc_decode_plaintext_v3(smartlist_t *tokens, goto err; } - /* Copy the public keys into signing_kp and blinded_kp */ - memcpy(&desc->signing_kp.pubkey, &desc->signing_key_cert->signed_key, + /* Copy the public keys into signing_pubkey and blinded_pubkey */ + memcpy(&desc->signing_pubkey, &desc->signing_key_cert->signed_key, sizeof(ed25519_public_key_t)); - memcpy(&desc->blinded_kp.pubkey, &desc->signing_key_cert->signing_key, + memcpy(&desc->blinded_pubkey, &desc->signing_key_cert->signing_key, sizeof(ed25519_public_key_t)); /* Extract revision counter value. */ @@ -1491,7 +1495,7 @@ desc_decode_plaintext_v3(smartlist_t *tokens, } /* Extract the encrypted data section. */ - tok = find_by_keyword(tokens, R3_ENCRYPTED); + tok = find_by_keyword(tokens, R3_SUPERENCRYPTED); tor_assert(tok->object_body); if (strcmp(tok->object_type, "MESSAGE") != 0) { log_warn(LD_REND, "Service descriptor encrypted data section is invalid"); @@ -1511,7 +1515,7 @@ desc_decode_plaintext_v3(smartlist_t *tokens, tok = find_by_keyword(tokens, R3_SIGNATURE); tor_assert(tok->n_args == 1); /* First arg here is the actual encoded signature. */ - if (!desc_sig_is_valid(tok->args[0], &desc->signing_kp, + if (!desc_sig_is_valid(tok->args[0], &desc->signing_pubkey, encoded_desc, encoded_len)) { goto err; } @@ -1700,8 +1704,9 @@ hs_desc_decode_plaintext(const char *encoded, tor_assert(encoded); tor_assert(plaintext); + /* Check that descriptor is within size limits. */ encoded_len = strlen(encoded); - if (encoded_len >= HS_DESC_MAX_LEN) { + if (encoded_len >= hs_cache_get_max_descriptor_size()) { log_warn(LD_REND, "Service descriptor is too big (%lu bytes)", (unsigned long) encoded_len); goto err; @@ -1806,41 +1811,46 @@ hs_desc_decode_descriptor(const char *encoded, return ret; } -/* Table of encode function version specific. The function are indexed by the +/* Table of encode function version specific. The functions are indexed by the * version number so v3 callback is at index 3 in the array. */ static int (*encode_handlers[])( const hs_descriptor_t *desc, + const ed25519_keypair_t *signing_kp, char **encoded_out) = { /* v0 */ NULL, /* v1 */ NULL, /* v2 */ NULL, desc_encode_v3, }; -/* Encode the given descriptor desc. On success, encoded_out points to a newly - * allocated NUL terminated string that contains the encoded descriptor as a - * string. +/* Encode the given descriptor desc including signing with the given key pair + * signing_kp. On success, encoded_out points to a newly allocated NUL + * terminated string that contains the encoded descriptor as a string. * * Return 0 on success and encoded_out is a valid pointer. On error, -1 is * returned and encoded_out is set to NULL. */ int -hs_desc_encode_descriptor(const hs_descriptor_t *desc, char **encoded_out) +hs_desc_encode_descriptor(const hs_descriptor_t *desc, + const ed25519_keypair_t *signing_kp, + char **encoded_out) { int ret = -1; + uint32_t version; tor_assert(desc); tor_assert(encoded_out); /* Make sure we support the version of the descriptor format. */ - if (!hs_desc_is_supported_version(desc->plaintext_data.version)) { + version = desc->plaintext_data.version; + if (!hs_desc_is_supported_version(version)) { goto err; } /* Extra precaution. Having no handler for the supported version should * never happened else we forgot to add it but we bumped the version. */ - tor_assert(ARRAY_LENGTH(encode_handlers) >= desc->plaintext_data.version); - tor_assert(encode_handlers[desc->plaintext_data.version]); + tor_assert(ARRAY_LENGTH(encode_handlers) >= version); + tor_assert(encode_handlers[version]); - ret = encode_handlers[desc->plaintext_data.version](desc, encoded_out); + ret = encode_handlers[version](desc, signing_kp, encoded_out); if (ret < 0) { goto err; } diff --git a/src/or/hs_descriptor.h b/src/or/hs_descriptor.h index 083d353860..b520d24471 100644 --- a/src/or/hs_descriptor.h +++ b/src/or/hs_descriptor.h @@ -40,7 +40,7 @@ /* Length of the KDF output value which is the length of the secret key, * the secret IV and MAC key length which is the length of H() output. */ #define HS_DESC_ENCRYPTED_KDF_OUTPUT_LEN \ - CIPHER_KEY_LEN + CIPHER_IV_LEN + DIGEST256_LEN + CIPHER256_KEY_LEN + CIPHER_IV_LEN + DIGEST256_LEN /* We need to pad the plaintext version of the encrypted data section before * encryption and it has to be a multiple of this value. */ #define HS_DESC_PLAINTEXT_PADDING_MULTIPLE 128 @@ -54,12 +54,18 @@ HS_DESC_ENCRYPTED_SALT_LEN + \ HS_DESC_PLAINTEXT_PADDING_MULTIPLE + DIGEST256_LEN /* Maximum length in bytes of a full hidden service descriptor. */ -#define HS_DESC_MAX_LEN 32768 // XXX justify +#define HS_DESC_MAX_LEN 50000 /* 50kb max size */ /* The minimum amount of fields a descriptor should contain. The parsing of * the fields are version specific so the only required field, as a generic * view of a descriptor, is 1 that is the version field. */ #define HS_DESC_PLAINTEXT_MIN_FIELDS 1 +/* Key length for the descriptor symmetric encryption. As specified in the + * protocol, we use AES-256 for the encrypted section of the descriptor. The + * following is the length in bytes and the bit size. */ +#define HS_DESC_ENCRYPTED_KEY_LEN CIPHER256_KEY_LEN +#define HS_DESC_ENCRYPTED_BIT_SIZE (HS_DESC_ENCRYPTED_KEY_LEN * 8) + /* Type of authentication in the descriptor. */ typedef enum { HS_DESC_AUTH_PASSWORD = 1, @@ -148,13 +154,13 @@ typedef struct hs_desc_plaintext_data_t { * replica which is signed by the blinded public key for that replica. */ tor_cert_t *signing_key_cert; - /* Signing keypair which is used to sign the descriptor. Same public key + /* Signing public key which is used to sign the descriptor. Same public key * as in the signing key certificate. */ - ed25519_keypair_t signing_kp; + ed25519_public_key_t signing_pubkey; - /* Blinded keypair used for this descriptor derived from the master + /* Blinded public key used for this descriptor derived from the master * identity key and generated for a specific replica number. */ - ed25519_keypair_t blinded_kp; + ed25519_public_key_t blinded_pubkey; /* Revision counter is incremented at each upload, regardless of whether * the descriptor has changed. This avoids leaking whether the descriptor @@ -201,6 +207,7 @@ void hs_desc_plaintext_data_free(hs_desc_plaintext_data_t *desc); void hs_desc_encrypted_data_free(hs_desc_encrypted_data_t *desc); int hs_desc_encode_descriptor(const hs_descriptor_t *desc, + const ed25519_keypair_t *signing_kp, char **encoded_out); int hs_desc_decode_descriptor(const char *encoded, @@ -232,7 +239,7 @@ STATIC int encrypted_data_length_is_valid(size_t len); STATIC int cert_is_valid(tor_cert_t *cert, uint8_t type, const char *log_obj_type); STATIC int desc_sig_is_valid(const char *b64_sig, - const ed25519_keypair_t *signing_kp, + const ed25519_public_key_t *signing_pubkey, const char *encoded_desc, size_t encoded_len); STATIC void desc_intro_point_free(hs_desc_intro_point_t *ip); #endif /* HS_DESCRIPTOR_PRIVATE */ diff --git a/src/or/hs_intropoint.c b/src/or/hs_intropoint.c index bfc7ec3876..db4ba7982a 100644 --- a/src/or/hs_intropoint.c +++ b/src/or/hs_intropoint.c @@ -9,6 +9,7 @@ #define HS_INTROPOINT_PRIVATE #include "or.h" +#include "config.h" #include "circuitlist.h" #include "circuituse.h" #include "config.h" @@ -16,27 +17,52 @@ #include "rendmid.h" #include "rephist.h" -#include "hs/cell_establish_intro.h" +/* Trunnel */ +#include "ed25519_cert.h" #include "hs/cell_common.h" +#include "hs/cell_establish_intro.h" +#include "hs/cell_introduce1.h" + #include "hs_circuitmap.h" #include "hs_intropoint.h" #include "hs_common.h" -/** Extract the authentication key from an ESTABLISH_INTRO <b>cell</b> and - * place it in <b>auth_key_out</b>. */ +/** Extract the authentication key from an ESTABLISH_INTRO or INTRODUCE1 using + * the given <b>cell_type</b> from <b>cell</b> and place it in + * <b>auth_key_out</b>. */ STATIC void -get_auth_key_from_establish_intro_cell(ed25519_public_key_t *auth_key_out, - const hs_cell_establish_intro_t *cell) +get_auth_key_from_cell(ed25519_public_key_t *auth_key_out, + unsigned int cell_type, const void *cell) { + size_t auth_key_len; + const uint8_t *key_array; + tor_assert(auth_key_out); + tor_assert(cell); - const uint8_t *key_array = - hs_cell_establish_intro_getconstarray_auth_key(cell); + switch (cell_type) { + case RELAY_COMMAND_ESTABLISH_INTRO: + { + const hs_cell_establish_intro_t *c_cell = cell; + key_array = hs_cell_establish_intro_getconstarray_auth_key(c_cell); + auth_key_len = hs_cell_establish_intro_getlen_auth_key(c_cell); + break; + } + case RELAY_COMMAND_INTRODUCE1: + { + const hs_cell_introduce1_t *c_cell = cell; + key_array = hs_cell_introduce1_getconstarray_auth_key(cell); + auth_key_len = hs_cell_introduce1_getlen_auth_key(c_cell); + break; + } + default: + /* Getting here is really bad as it means we got a unknown cell type from + * this file where every call has an hardcoded value. */ + tor_assert(0); /* LCOV_EXCL_LINE */ + } tor_assert(key_array); - tor_assert(hs_cell_establish_intro_getlen_auth_key(cell) == - sizeof(auth_key_out->pubkey)); - - memcpy(auth_key_out->pubkey, key_array, cell->auth_key_len); + tor_assert(auth_key_len == sizeof(auth_key_out->pubkey)); + memcpy(auth_key_out->pubkey, key_array, auth_key_len); } /** We received an ESTABLISH_INTRO <b>cell</b>. Verify its signature and MAC, @@ -70,7 +96,11 @@ verify_establish_intro_cell(const hs_cell_establish_intro_t *cell, ed25519_signature_t sig_struct; const uint8_t *sig_array = hs_cell_establish_intro_getconstarray_sig(cell); - if (hs_cell_establish_intro_getlen_sig(cell) != sizeof(sig_struct.sig)) { + /* Make sure the signature length is of the right size. For EXTRA safety, + * we check both the size of the array and the length which must be the + * same. Safety first!*/ + if (hs_cell_establish_intro_getlen_sig(cell) != sizeof(sig_struct.sig) || + hs_cell_establish_intro_get_sig_len(cell) != sizeof(sig_struct.sig)) { log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, "ESTABLISH_INTRO sig len is invalid"); return -1; @@ -79,11 +109,11 @@ verify_establish_intro_cell(const hs_cell_establish_intro_t *cell, memcpy(sig_struct.sig, sig_array, cell->sig_len); ed25519_public_key_t auth_key; - get_auth_key_from_establish_intro_cell(&auth_key, cell); + get_auth_key_from_cell(&auth_key, RELAY_COMMAND_ESTABLISH_INTRO, cell); const size_t sig_msg_len = cell->end_sig_fields - msg; int sig_mismatch = ed25519_checksig_prefixed(&sig_struct, - (uint8_t*) msg, sig_msg_len, + msg, sig_msg_len, ESTABLISH_INTRO_SIG_PREFIX, &auth_key); if (sig_mismatch) { @@ -154,7 +184,8 @@ handle_verified_establish_intro_cell(or_circuit_t *circ, { /* Get the auth key of this intro point */ ed25519_public_key_t auth_key; - get_auth_key_from_establish_intro_cell(&auth_key, parsed_cell); + get_auth_key_from_cell(&auth_key, RELAY_COMMAND_ESTABLISH_INTRO, + parsed_cell); /* Then notify the hidden service that the intro point is established by sending an INTRO_ESTABLISHED cell */ @@ -188,7 +219,7 @@ handle_establish_intro(or_circuit_t *circ, const uint8_t *request, circ->p_circ_id); /* Check that the circuit is in shape to become an intro point */ - if (!hs_intro_circuit_is_suitable(circ)) { + if (!hs_intro_circuit_is_suitable_for_establish_intro(circ)) { goto err; } @@ -232,26 +263,38 @@ handle_establish_intro(or_circuit_t *circ, const uint8_t *request, return retval; } -/* Return True if circuit is suitable for becoming an intro circuit. */ -int -hs_intro_circuit_is_suitable(const or_circuit_t *circ) +/* Return True if circuit is suitable for being an intro circuit. */ +static int +circuit_is_suitable_intro_point(const or_circuit_t *circ, + const char *log_cell_type_str) { + tor_assert(circ); + tor_assert(log_cell_type_str); + /* Basic circuit state sanity checks. */ if (circ->base_.purpose != CIRCUIT_PURPOSE_OR) { log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Rejecting ESTABLISH_INTRO on non-OR circuit."); + "Rejecting %s on non-OR circuit.", log_cell_type_str); return 0; } if (circ->base_.n_chan) { log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Rejecting ESTABLISH_INTRO on non-edge circuit."); + "Rejecting %s on non-edge circuit.", log_cell_type_str); return 0; } + /* Suitable. */ return 1; } +/* Return True if circuit is suitable for being service-side intro circuit. */ +int +hs_intro_circuit_is_suitable_for_establish_intro(const or_circuit_t *circ) +{ + return circuit_is_suitable_intro_point(circ, "ESTABLISH_INTRO"); +} + /* We just received an ESTABLISH_INTRO cell in <b>circ</b>. Figure out of it's * a legacy or a next gen cell, and pass it to the appropriate handler. */ int @@ -286,3 +329,267 @@ hs_intro_received_establish_intro(or_circuit_t *circ, const uint8_t *request, return -1; } +/* Send an INTRODUCE_ACK cell onto the circuit <b>circ</b> with the status + * value in <b>status</b>. Depending on the status, it can be ACK or a NACK. + * Return 0 on success else a negative value on error which will close the + * circuit. */ +static int +send_introduce_ack_cell(or_circuit_t *circ, hs_intro_ack_status_t status) +{ + int ret = -1; + uint8_t *encoded_cell = NULL; + ssize_t encoded_len, result_len; + hs_cell_introduce_ack_t *cell; + cell_extension_t *ext; + + tor_assert(circ); + + /* Setup the INTRODUCE_ACK cell. We have no extensions so the N_EXTENSIONS + * field is set to 0 by default with a new object. */ + cell = hs_cell_introduce_ack_new(); + ret = hs_cell_introduce_ack_set_status(cell, status); + /* We have no cell extensions in an INTRODUCE_ACK cell. */ + ext = cell_extension_new(); + cell_extension_set_num(ext, 0); + hs_cell_introduce_ack_set_extensions(cell, ext); + /* A wrong status is a very bad code flow error as this value is controlled + * by the code in this file and not an external input. This means we use a + * code that is not known by the trunnel ABI. */ + tor_assert(ret == 0); + /* Encode the payload. We should never fail to get the encoded length. */ + encoded_len = hs_cell_introduce_ack_encoded_len(cell); + tor_assert(encoded_len > 0); + encoded_cell = tor_malloc_zero(encoded_len); + result_len = hs_cell_introduce_ack_encode(encoded_cell, encoded_len, cell); + tor_assert(encoded_len == result_len); + + ret = relay_send_command_from_edge(CONTROL_CELL_ID, TO_CIRCUIT(circ), + RELAY_COMMAND_INTRODUCE_ACK, + (char *) encoded_cell, encoded_len, + NULL); + /* On failure, the above function will close the circuit. */ + hs_cell_introduce_ack_free(cell); + tor_free(encoded_cell); + return ret; +} + +/* Validate a parsed INTRODUCE1 <b>cell</b>. Return 0 if valid or else a + * negative value for an invalid cell that should be NACKed. */ +STATIC int +validate_introduce1_parsed_cell(const hs_cell_introduce1_t *cell) +{ + size_t legacy_key_id_len; + const uint8_t *legacy_key_id; + + tor_assert(cell); + + /* This code path SHOULD NEVER be reached if the cell is a legacy type so + * safety net here. The legacy ID must be zeroes in this case. */ + legacy_key_id_len = hs_cell_introduce1_getlen_legacy_key_id(cell); + legacy_key_id = hs_cell_introduce1_getconstarray_legacy_key_id(cell); + if (BUG(!tor_mem_is_zero((char *) legacy_key_id, legacy_key_id_len))) { + goto invalid; + } + + /* The auth key of an INTRODUCE1 should be of type ed25519 thus leading to a + * known fixed length as well. */ + if (hs_cell_introduce1_get_auth_key_type(cell) != + HS_INTRO_AUTH_KEY_TYPE_ED25519) { + log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, + "Rejecting invalid INTRODUCE1 cell auth key type. " + "Responding with NACK."); + goto invalid; + } + if (hs_cell_introduce1_get_auth_key_len(cell) != ED25519_PUBKEY_LEN || + hs_cell_introduce1_getlen_auth_key(cell) != ED25519_PUBKEY_LEN) { + log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, + "Rejecting invalid INTRODUCE1 cell auth key length. " + "Responding with NACK."); + goto invalid; + } + if (hs_cell_introduce1_getlen_encrypted(cell) == 0) { + log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, + "Rejecting invalid INTRODUCE1 cell encrypted length. " + "Responding with NACK."); + goto invalid; + } + + return 0; + invalid: + return -1; +} + +/* We just received a non legacy INTRODUCE1 cell on <b>client_circ</b> with + * the payload in <b>request</b> of size <b>request_len</b>. Return 0 if + * everything went well, or -1 if an error occured. This function is in charge + * of sending back an INTRODUCE_ACK cell and will close client_circ on error. + */ +STATIC int +handle_introduce1(or_circuit_t *client_circ, const uint8_t *request, + size_t request_len) +{ + int ret = -1; + or_circuit_t *service_circ; + hs_cell_introduce1_t *parsed_cell; + hs_intro_ack_status_t status = HS_INTRO_ACK_STATUS_SUCCESS; + + tor_assert(client_circ); + tor_assert(request); + + /* Parse cell. Note that we can only parse the non encrypted section for + * which we'll use the authentication key to find the service introduction + * circuit and relay the cell on it. */ + ssize_t cell_size = hs_cell_introduce1_parse(&parsed_cell, request, + request_len); + if (cell_size < 0) { + log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, + "Rejecting %s INTRODUCE1 cell. Responding with NACK.", + cell_size == -1 ? "invalid" : "truncated"); + /* Inform client that the INTRODUCE1 has a bad format. */ + status = HS_INTRO_ACK_STATUS_BAD_FORMAT; + goto send_ack; + } + + /* Once parsed validate the cell format. */ + if (validate_introduce1_parsed_cell(parsed_cell) < 0) { + /* Inform client that the INTRODUCE1 has bad format. */ + status = HS_INTRO_ACK_STATUS_BAD_FORMAT; + goto send_ack; + } + + /* Find introduction circuit through our circuit map. */ + { + ed25519_public_key_t auth_key; + get_auth_key_from_cell(&auth_key, RELAY_COMMAND_INTRODUCE1, parsed_cell); + service_circ = hs_circuitmap_get_intro_circ_v3(&auth_key); + if (service_circ == NULL) { + char b64_key[ED25519_BASE64_LEN + 1]; + ed25519_public_to_base64(b64_key, &auth_key); + log_info(LD_REND, "No intro circuit found for INTRODUCE1 cell " + "with auth key %s from circuit %" PRIu32 ". " + "Responding with NACK.", + safe_str(b64_key), client_circ->p_circ_id); + /* Inform the client that we don't know the requested service ID. */ + status = HS_INTRO_ACK_STATUS_UNKNOWN_ID; + goto send_ack; + } + } + + /* Relay the cell to the service on its intro circuit with an INTRODUCE2 + * cell which is the same exact payload. */ + if (relay_send_command_from_edge(CONTROL_CELL_ID, TO_CIRCUIT(service_circ), + RELAY_COMMAND_INTRODUCE2, + (char *) request, request_len, NULL)) { + log_warn(LD_REND, "Unable to send INTRODUCE2 cell to the service."); + /* Inform the client that we can't relay the cell. */ + status = HS_INTRO_ACK_STATUS_CANT_RELAY; + goto send_ack; + } + + /* Success! Send an INTRODUCE_ACK success status onto the client circuit. */ + status = HS_INTRO_ACK_STATUS_SUCCESS; + ret = 0; + + send_ack: + /* Send INTRODUCE_ACK or INTRODUCE_NACK to client */ + if (send_introduce_ack_cell(client_circ, status) < 0) { + log_warn(LD_REND, "Unable to send an INTRODUCE ACK status %d to client.", + status); + /* Circuit has been closed on failure of transmission. */ + goto done; + } + if (status != HS_INTRO_ACK_STATUS_SUCCESS) { + /* We just sent a NACK that is a non success status code so close the + * circuit because it's not useful to keep it open. Remember, a client can + * only send one INTRODUCE1 cell on a circuit. */ + circuit_mark_for_close(TO_CIRCUIT(client_circ), END_CIRC_REASON_INTERNAL); + } + done: + hs_cell_introduce1_free(parsed_cell); + return ret; +} + +/* Identify if the encoded cell we just received is a legacy one or not. The + * <b>request</b> should be at least DIGEST_LEN bytes long. */ +STATIC int +introduce1_cell_is_legacy(const uint8_t *request) +{ + tor_assert(request); + + /* If the first 20 bytes of the cell (DIGEST_LEN) are NOT zeroes, it + * indicates a legacy cell (v2). */ + if (!tor_mem_is_zero((const char *) request, DIGEST_LEN)) { + /* Legacy cell. */ + return 1; + } + /* Not a legacy cell. */ + return 0; +} + +/* Return true iff the circuit <b>circ</b> is suitable for receiving an + * INTRODUCE1 cell. */ +STATIC int +circuit_is_suitable_for_introduce1(const or_circuit_t *circ) +{ + tor_assert(circ); + + /* Is this circuit an intro point circuit? */ + if (!circuit_is_suitable_intro_point(circ, "INTRODUCE1")) { + return 0; + } + + if (circ->already_received_introduce1) { + log_fn(LOG_PROTOCOL_WARN, LD_REND, + "Blocking multiple introductions on the same circuit. " + "Someone might be trying to attack a hidden service through " + "this relay."); + return 0; + } + + return 1; +} + +/* We just received an INTRODUCE1 cell on <b>circ</b>. Figure out which type + * it is and pass it to the appropriate handler. Return 0 on success else a + * negative value and the circuit is closed. */ +int +hs_intro_received_introduce1(or_circuit_t *circ, const uint8_t *request, + size_t request_len) +{ + int ret; + + tor_assert(circ); + tor_assert(request); + + /* A cell that can't hold a DIGEST_LEN is invalid as we need to check if + * it's a legacy cell or not using the first DIGEST_LEN bytes. */ + if (request_len < DIGEST_LEN) { + log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, "Invalid INTRODUCE1 cell length."); + goto err; + } + + /* Make sure we have a circuit that can have an INTRODUCE1 cell on it. */ + if (!circuit_is_suitable_for_introduce1(circ)) { + /* We do not send a NACK because the circuit is not suitable for any kind + * of response or transmission as it's a violation of the protocol. */ + goto err; + } + /* Mark the circuit that we got this cell. None are allowed after this as a + * DoS mitigation since one circuit with one client can hammer a service. */ + circ->already_received_introduce1 = 1; + + /* We are sure here to have at least DIGEST_LEN bytes. */ + if (introduce1_cell_is_legacy(request)) { + /* Handle a legacy cell. */ + ret = rend_mid_introduce_legacy(circ, request, request_len); + } else { + /* Handle a non legacy cell. */ + ret = handle_introduce1(circ, request, request_len); + } + return ret; + + err: + circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_TORPROTOCOL); + return -1; +} + diff --git a/src/or/hs_intropoint.h b/src/or/hs_intropoint.h index 46d8d6f7de..e6024a858f 100644 --- a/src/or/hs_intropoint.h +++ b/src/or/hs_intropoint.h @@ -16,25 +16,44 @@ enum hs_intro_auth_key_type { HS_INTRO_AUTH_KEY_TYPE_ED25519 = 0x02, }; +/* INTRODUCE_ACK status code. */ +typedef enum { + HS_INTRO_ACK_STATUS_SUCCESS = 0x0000, + HS_INTRO_ACK_STATUS_UNKNOWN_ID = 0x0001, + HS_INTRO_ACK_STATUS_BAD_FORMAT = 0x0002, + HS_INTRO_ACK_STATUS_CANT_RELAY = 0x0003, +} hs_intro_ack_status_t; + int hs_intro_received_establish_intro(or_circuit_t *circ, const uint8_t *request, size_t request_len); +int hs_intro_received_introduce1(or_circuit_t *circ, const uint8_t *request, + size_t request_len); MOCK_DECL(int, hs_intro_send_intro_established_cell,(or_circuit_t *circ)); /* also used by rendservice.c */ -int hs_intro_circuit_is_suitable(const or_circuit_t *circ); +int hs_intro_circuit_is_suitable_for_establish_intro(const or_circuit_t *circ); #ifdef HS_INTROPOINT_PRIVATE +#include "hs/cell_establish_intro.h" +#include "hs/cell_introduce1.h" + STATIC int verify_establish_intro_cell(const hs_cell_establish_intro_t *out, const uint8_t *circuit_key_material, size_t circuit_key_material_len); STATIC void -get_auth_key_from_establish_intro_cell(ed25519_public_key_t *auth_key_out, - const hs_cell_establish_intro_t *cell); +get_auth_key_from_cell(ed25519_public_key_t *auth_key_out, + unsigned int cell_type, const void *cell); + +STATIC int introduce1_cell_is_legacy(const uint8_t *request); +STATIC int handle_introduce1(or_circuit_t *client_circ, + const uint8_t *request, size_t request_len); +STATIC int validate_introduce1_parsed_cell(const hs_cell_introduce1_t *cell); +STATIC int circuit_is_suitable_for_introduce1(const or_circuit_t *circ); #endif /* HS_INTROPOINT_PRIVATE */ diff --git a/src/or/hs_service.c b/src/or/hs_service.c index 3b5a3e7853..7b12b63065 100644 --- a/src/or/hs_service.c +++ b/src/or/hs_service.c @@ -152,8 +152,9 @@ generate_establish_intro_cell(const uint8_t *circuit_key_material, tor_assert(encoded_len > ED25519_SIG_LEN); if (ed25519_sign_prefixed(&sig, - (uint8_t*) cell_bytes_tmp, - encoded_len - ED25519_SIG_LEN, + cell_bytes_tmp, + encoded_len - + (ED25519_SIG_LEN + sizeof(cell->sig_len)), ESTABLISH_INTRO_SIG_PREFIX, &key_struct)) { log_warn(LD_BUG, "Unable to gen signature for ESTABLISH_INTRO cell."); diff --git a/src/or/main.c b/src/or/main.c index 0d4da65764..24b209ce8a 100644 --- a/src/or/main.c +++ b/src/or/main.c @@ -486,7 +486,7 @@ connection_check_event(connection_t *conn, struct event *ev) */ bad = ev != NULL; } else { - /* Everytyhing else should have an underlying socket, or a linked + /* Everything else should have an underlying socket, or a linked * connection (which is also tracked with a read_event/write_event pair). */ bad = ev == NULL; @@ -1656,8 +1656,7 @@ static int check_expired_networkstatus_callback(time_t now, const or_options_t *options) { (void)options; - /* 1f. Check whether our networkstatus has expired. - */ + /* Check whether our networkstatus has expired. */ networkstatus_t *ns = networkstatus_get_latest_consensus(); /*XXXX RD: This value needs to be the same as REASONABLY_LIVE_TIME in * networkstatus_get_reasonably_live_consensus(), but that value is way @@ -1769,7 +1768,7 @@ clean_caches_callback(time_t now, const or_options_t *options) /** * Periodic callback: Clean the cache of failed hidden service lookups - * frequently frequently. + * frequently. */ static int rend_cache_failure_clean_callback(time_t now, const or_options_t *options) diff --git a/src/or/nodelist.c b/src/or/nodelist.c index 2bcedbfb0c..804af297ba 100644 --- a/src/or/nodelist.c +++ b/src/or/nodelist.c @@ -1126,6 +1126,9 @@ node_get_prim_orport(const node_t *node, tor_addr_port_t *ap_out) node_assert_ok(node); tor_assert(ap_out); + /* Check ri first, because rewrite_node_address_for_bridge() updates + * node->ri with the configured bridge address. */ + RETURN_IPV4_AP(node->ri, or_port, ap_out); RETURN_IPV4_AP(node->rs, or_port, ap_out); /* Microdescriptors only have an IPv6 address */ @@ -1156,9 +1159,11 @@ node_get_pref_ipv6_orport(const node_t *node, tor_addr_port_t *ap_out) node_assert_ok(node); tor_assert(ap_out); - /* Prefer routerstatus over microdesc for consistency with the - * fascist_firewall_* functions. Also check if the address or port are valid, - * and try another alternative if they are not. */ + /* Check ri first, because rewrite_node_address_for_bridge() updates + * node->ri with the configured bridge address. + * Prefer rs over md for consistency with the fascist_firewall_* functions. + * Check if the address or port are valid, and try another alternative + * if they are not. */ if (node->ri && tor_addr_port_is_valid(&node->ri->ipv6_addr, node->ri->ipv6_orport, 0)) { @@ -1218,6 +1223,9 @@ node_get_prim_dirport(const node_t *node, tor_addr_port_t *ap_out) node_assert_ok(node); tor_assert(ap_out); + /* Check ri first, because rewrite_node_address_for_bridge() updates + * node->ri with the configured bridge address. */ + RETURN_IPV4_AP(node->ri, dir_port, ap_out); RETURN_IPV4_AP(node->rs, dir_port, ap_out); /* Microdescriptors only have an IPv6 address */ @@ -1250,8 +1258,11 @@ node_get_pref_ipv6_dirport(const node_t *node, tor_addr_port_t *ap_out) node_assert_ok(node); tor_assert(ap_out); - /* Check if the address or port are valid, and try another alternative if - * they are not. Note that microdescriptors have no dir_port. */ + /* Check ri first, because rewrite_node_address_for_bridge() updates + * node->ri with the configured bridge address. + * Prefer rs over md for consistency with the fascist_firewall_* functions. + * Check if the address or port are valid, and try another alternative + * if they are not. */ /* Assume IPv4 and IPv6 dirports are the same */ if (node->ri && tor_addr_port_is_valid(&node->ri->ipv6_addr, diff --git a/src/or/or.h b/src/or/or.h index 00031a8929..18fff78942 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -147,18 +147,6 @@ /** Maximum size of a single extrainfo document, as above. */ #define MAX_EXTRAINFO_UPLOAD_SIZE 50000 -/** How long do we keep DNS cache entries before purging them (regardless of - * their TTL)? */ -#define MAX_DNS_ENTRY_AGE (30*60) -/** How long do we cache/tell clients to cache DNS records when no TTL is - * known? */ -#define DEFAULT_DNS_TTL (30*60) -/** How long can a TTL be before we stop believing it? */ -#define MAX_DNS_TTL (3*60*60) -/** How small can a TTL be before we stop believing it? Provides rudimentary - * pinning. */ -#define MIN_DNS_TTL 60 - /** How often do we rotate onion keys? */ #define MIN_ONION_KEY_LIFETIME (7*24*60*60) /** How often do we rotate TLS contexts? */ @@ -1760,7 +1748,7 @@ typedef struct dir_connection_t { /** Which 'resource' did we ask the directory for? This is typically the part * of the URL string that defines, relative to the directory conn purpose, * what thing we want. For example, in router descriptor downloads by - * descriptor digest, it contains "d/", then one ore more +-separated + * descriptor digest, it contains "d/", then one or more +-separated * fingerprints. **/ char *requested_resource; @@ -3039,11 +3027,11 @@ typedef struct circuit_t { /** For what reason (See END_CIRC_REASON...) is this circuit being closed? * This field is set in circuit_mark_for_close and used later in * circuit_about_to_free. */ - uint16_t marked_for_close_reason; + int marked_for_close_reason; /** As marked_for_close_reason, but reflects the underlying reason for * closing this circuit. */ - uint16_t marked_for_close_orig_reason; + int marked_for_close_orig_reason; /** Unique ID for measuring tunneled network status requests. */ uint64_t dirreq_id; @@ -3557,6 +3545,12 @@ typedef struct routerset_t routerset_t; * to pick its own port. */ #define CFG_AUTO_PORT 0xc4005e +/** Enumeration of outbound address configuration types: + * Exit-only, OR-only, or both */ +typedef enum {OUTBOUND_ADDR_EXIT, OUTBOUND_ADDR_OR, + OUTBOUND_ADDR_EXIT_AND_OR, + OUTBOUND_ADDR_MAX} outbound_addr_t; + /** Configuration options for a Tor process. */ typedef struct { uint32_t magic_; @@ -3640,10 +3634,14 @@ typedef struct { config_line_t *ControlListenAddress; /** Local address to bind outbound sockets */ config_line_t *OutboundBindAddress; - /** IPv4 address derived from OutboundBindAddress. */ - tor_addr_t OutboundBindAddressIPv4_; - /** IPv6 address derived from OutboundBindAddress. */ - tor_addr_t OutboundBindAddressIPv6_; + /** Local address to bind outbound relay sockets */ + config_line_t *OutboundBindAddressOR; + /** Local address to bind outbound exit sockets */ + config_line_t *OutboundBindAddressExit; + /** Addresses derived from the various OutboundBindAddress lines. + * [][0] is IPv4, [][1] is IPv6 + */ + tor_addr_t OutboundBindAddresses[OUTBOUND_ADDR_MAX][2]; /** Directory server only: which versions of * Tor should we tell users to run? */ config_line_t *RecommendedVersions; @@ -4586,14 +4584,6 @@ typedef struct { * do we enforce Ed25519 identity match? */ /* NOTE: remove this option someday. */ int AuthDirTestEd25519LinkKeys; - - /** If 1, we use the old (pre-prop271) guard selection algorithm. - * - * XXXX prop271 This option is only here as a stopgap while we're - * XXXX tuning and debugging the new (post-prop271) algorithm. Eventually - * we should remove it entirely. - */ - int UseDeprecatedGuardAlgorithm; } or_options_t; /** Persistent state for an onion router, as saved to disk. */ @@ -5348,10 +5338,6 @@ typedef struct dir_server_t { */ #define PDS_NO_EXISTING_MICRODESC_FETCH (1<<4) -/** This node is to be chosen as a directory guard, so don't choose any - * node that's currently a guard. */ -#define PDS_FOR_GUARD (1<<5) - /** 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/parsecommon.h b/src/or/parsecommon.h index 3019df63eb..15e9f7ae85 100644 --- a/src/or/parsecommon.h +++ b/src/or/parsecommon.h @@ -154,7 +154,7 @@ typedef enum { R3_DESC_LIFETIME, R3_DESC_SIGNING_CERT, R3_REVISION_COUNTER, - R3_ENCRYPTED, + R3_SUPERENCRYPTED, R3_SIGNATURE, R3_CREATE2_FORMATS, R3_AUTHENTICATION_REQUIRED, diff --git a/src/or/policies.c b/src/or/policies.c index f4c0cddbcc..aea1b11829 100644 --- a/src/or/policies.c +++ b/src/or/policies.c @@ -20,6 +20,7 @@ #include "or.h" #include "config.h" #include "dirserv.h" +#include "microdesc.h" #include "networkstatus.h" #include "nodelist.h" #include "policies.h" @@ -297,8 +298,8 @@ parse_reachable_addresses(void) } else if (fascist_firewall_use_ipv6(options) && (policy_is_reject_star(reachable_or_addr_policy, AF_INET6, 0) || policy_is_reject_star(reachable_dir_addr_policy, AF_INET6, 0))) { - log_warn(LD_CONFIG, "You have configured tor to use IPv6 " - "(ClientUseIPv6 1 or UseBridges 1), but " + log_warn(LD_CONFIG, "You have configured tor to use or prefer IPv6 " + "(or UseBridges 1), but " "ReachableAddresses, ReachableORAddresses, or " "ReachableDirAddresses reject all IPv6 addresses. " "Tor will not connect using IPv6."); @@ -316,10 +317,8 @@ firewall_is_fascist_impl(void) const or_options_t *options = get_options(); /* Assume every non-bridge relay has an IPv4 address. * Clients which use bridges may only know the IPv6 address of their - * bridge. */ - return (options->ClientUseIPv4 == 0 - || (!fascist_firewall_use_ipv6(options) - && options->UseBridges == 1)); + * bridge, but they will connect regardless of the ClientUseIPv6 setting. */ + return options->ClientUseIPv4 == 0; } /** Return true iff the firewall options, including ClientUseIPv4 0 and @@ -426,6 +425,9 @@ fascist_firewall_allows_address(const tor_addr_t *addr, } /** Is this client configured to use IPv6? + * Returns true if the client might use IPv6 for some of its connections + * (including dual-stack and IPv6-only clients), and false if it will never + * use IPv6 for any connections. * Use node_ipv6_or/dir_preferred() when checking a specific node and OR/Dir * port: it supports bridge client per-node IPv6 preferences. */ @@ -433,9 +435,11 @@ int fascist_firewall_use_ipv6(const or_options_t *options) { /* Clients use IPv6 if it's set, or they use bridges, or they don't use - * IPv4 */ - return (options->ClientUseIPv6 == 1 || options->UseBridges == 1 - || options->ClientUseIPv4 == 0); + * IPv4, or they prefer it. + * ClientPreferIPv6DirPort is deprecated, but check it anyway. */ + return (options->ClientUseIPv6 == 1 || options->ClientUseIPv4 == 0 || + options->ClientPreferIPv6ORPort == 1 || + options->ClientPreferIPv6DirPort == 1 || options->UseBridges == 1); } /** Do we prefer to connect to IPv6, ignoring ClientPreferIPv6ORPort and @@ -888,6 +892,33 @@ fascist_firewall_choose_address_ipv4h(uint32_t ipv4h_addr, pref_ipv6, ap); } +/* The microdescriptor consensus has no IPv6 addresses in rs: they are in + * the microdescriptors. This means we can't rely on the node's IPv6 address + * until its microdescriptor is available (when using microdescs). + * But for bridges, rewrite_node_address_for_bridge() updates node->ri with + * the configured address, so we can trust bridge addresses. + * (Bridges could gain an IPv6 address if their microdescriptor arrives, but + * this will never be their preferred address: that is in the config.) + * Returns true if the node needs a microdescriptor for its IPv6 address, and + * false if the addresses in the node are already up-to-date. + */ +static int +node_awaiting_ipv6(const or_options_t* options, const node_t *node) +{ + tor_assert(node); + + /* There's no point waiting for an IPv6 address if we'd never use it */ + if (!fascist_firewall_use_ipv6(options)) { + return 0; + } + + /* We are waiting if we_use_microdescriptors_for_circuits() and we have no + * md. Bridges have a ri based on their config. They would never use the + * address from their md, so there's no need to wait for it. */ + return (!node->md && we_use_microdescriptors_for_circuits(options) && + !node->ri); +} + /** Like fascist_firewall_choose_address_base(), but takes <b>rs</b>. * Consults the corresponding node, then falls back to rs if node is NULL. * This should only happen when there's no valid consensus, and rs doesn't @@ -904,15 +935,15 @@ fascist_firewall_choose_address_rs(const routerstatus_t *rs, tor_assert(ap); + const or_options_t *options = get_options(); const node_t *node = node_get_by_id(rs->identity_digest); - if (node) { + if (node && !node_awaiting_ipv6(options, node)) { return fascist_firewall_choose_address_node(node, fw_connection, pref_only, ap); } else { /* There's no node-specific IPv6 preference, so use the generic IPv6 * preference instead. */ - const or_options_t *options = get_options(); int pref_ipv6 = (fw_connection == FIREWALL_OR_CONNECTION ? fascist_firewall_prefer_ipv6_orport(options) : fascist_firewall_prefer_ipv6_dirport(options)); @@ -946,6 +977,18 @@ fascist_firewall_choose_address_node(const node_t *node, node_assert_ok(node); + /* Calling fascist_firewall_choose_address_node() when the node is missing + * IPv6 information breaks IPv6-only clients. + * If the node is a hard-coded fallback directory or authority, call + * fascist_firewall_choose_address_rs() on the fake (hard-coded) routerstatus + * for the node. + * If it is not hard-coded, check that the node has a microdescriptor, full + * descriptor (routerinfo), or is one of our configured bridges before + * calling this function. */ + if (BUG(node_awaiting_ipv6(get_options(), node))) { + return 0; + } + const int pref_ipv6_node = (fw_connection == FIREWALL_OR_CONNECTION ? node_ipv6_or_preferred(node) : node_ipv6_dir_preferred(node)); @@ -1976,10 +2019,10 @@ policies_copy_ipv4h_to_smartlist(smartlist_t *addr_list, uint32_t ipv4h_addr) } } -/** Helper function that adds copies of - * or_options->OutboundBindAddressIPv[4|6]_ to a smartlist as tor_addr_t *, as - * long as or_options is non-NULL, and the addresses are not - * tor_addr_is_null(), by passing them to policies_add_addr_to_smartlist. +/** Helper function that adds copies of or_options->OutboundBindAddresses + * to a smartlist as tor_addr_t *, as long as or_options is non-NULL, and + * the addresses are not tor_addr_is_null(), by passing them to + * policies_add_addr_to_smartlist. * * The caller is responsible for freeing all the tor_addr_t* in the smartlist. */ @@ -1988,10 +2031,14 @@ policies_copy_outbound_addresses_to_smartlist(smartlist_t *addr_list, const or_options_t *or_options) { if (or_options) { - policies_copy_addr_to_smartlist(addr_list, - &or_options->OutboundBindAddressIPv4_); - policies_copy_addr_to_smartlist(addr_list, - &or_options->OutboundBindAddressIPv6_); + for (int i=0;i<OUTBOUND_ADDR_MAX;i++) { + for (int j=0;j<2;j++) { + if (!tor_addr_is_null(&or_options->OutboundBindAddresses[i][j])) { + policies_copy_addr_to_smartlist(addr_list, + &or_options->OutboundBindAddresses[i][j]); + } + } + } } } @@ -2008,10 +2055,10 @@ policies_copy_outbound_addresses_to_smartlist(smartlist_t *addr_list, * - if ipv6_local_address is non-NULL, and not the null tor_addr_t, add it * to the list of configured addresses. * If <b>or_options->ExitPolicyRejectLocalInterfaces</b> is true: - * - if or_options->OutboundBindAddressIPv4_ is not the null tor_addr_t, add - * it to the list of configured addresses. - * - if or_options->OutboundBindAddressIPv6_ is not the null tor_addr_t, add - * it to the list of configured addresses. + * - if or_options->OutboundBindAddresses[][0] (=IPv4) is not the null + * tor_addr_t, add it to the list of configured addresses. + * - if or_options->OutboundBindAddresses[][1] (=IPv6) is not the null + * tor_addr_t, add it to the list of configured addresses. * * If <b>or_options->BridgeRelay</b> is false, append entries of default * Tor exit policy into <b>result</b> smartlist. diff --git a/src/or/relay.c b/src/or/relay.c index 8d48239e47..2e76a8ec36 100644 --- a/src/or/relay.c +++ b/src/or/relay.c @@ -595,11 +595,11 @@ relay_command_to_string(uint8_t command) * If you can't send the cell, mark the circuit for close and return -1. Else * return 0. */ -int -relay_send_command_from_edge_(streamid_t stream_id, circuit_t *circ, - uint8_t relay_command, const char *payload, - size_t payload_len, crypt_path_t *cpath_layer, - const char *filename, int lineno) +MOCK_IMPL(int, +relay_send_command_from_edge_,(streamid_t stream_id, circuit_t *circ, + uint8_t relay_command, const char *payload, + size_t payload_len, crypt_path_t *cpath_layer, + const char *filename, int lineno)) { cell_t cell; relay_header_t rh; diff --git a/src/or/relay.h b/src/or/relay.h index e15551ca51..3acf3ee0e3 100644 --- a/src/or/relay.h +++ b/src/or/relay.h @@ -20,10 +20,13 @@ int circuit_receive_relay_cell(cell_t *cell, circuit_t *circ, void relay_header_pack(uint8_t *dest, const relay_header_t *src); void relay_header_unpack(relay_header_t *dest, const uint8_t *src); -int relay_send_command_from_edge_(streamid_t stream_id, circuit_t *circ, +MOCK_DECL(int, +relay_send_command_from_edge_,(streamid_t stream_id, circuit_t *circ, uint8_t relay_command, const char *payload, size_t payload_len, crypt_path_t *cpath_layer, - const char *filename, int lineno); + const char *filename, int lineno)); +/* Indicates to relay_send_command_from_edge() that it is a control cell. */ +#define CONTROL_CELL_ID 0 #define relay_send_command_from_edge(stream_id, circ, relay_command, payload, \ payload_len, cpath_layer) \ relay_send_command_from_edge_((stream_id), (circ), (relay_command), \ diff --git a/src/or/rendcommon.c b/src/or/rendcommon.c index def51b7986..bc53762fb6 100644 --- a/src/or/rendcommon.c +++ b/src/or/rendcommon.c @@ -771,7 +771,7 @@ rend_process_relay_cell(circuit_t *circ, const crypt_path_t *layer_hint, break; case RELAY_COMMAND_INTRODUCE1: if (or_circ) - r = rend_mid_introduce(or_circ,payload,length); + r = hs_intro_received_introduce1(or_circ,payload,length); break; case RELAY_COMMAND_INTRODUCE2: if (origin_circ) diff --git a/src/or/rendmid.c b/src/or/rendmid.c index 3319a639b9..57c8cfac92 100644 --- a/src/or/rendmid.c +++ b/src/or/rendmid.c @@ -38,7 +38,7 @@ rend_mid_establish_intro_legacy(or_circuit_t *circ, const uint8_t *request, "Received a legacy ESTABLISH_INTRO request on circuit %u", (unsigned) circ->p_circ_id); - if (!hs_intro_circuit_is_suitable(circ)) { + if (!hs_intro_circuit_is_suitable_for_establish_intro(circ)) { reason = END_CIRC_REASON_TORPROTOCOL; goto err; } @@ -133,8 +133,8 @@ rend_mid_establish_intro_legacy(or_circuit_t *circ, const uint8_t *request, * INTRODUCE2 cell. */ int -rend_mid_introduce(or_circuit_t *circ, const uint8_t *request, - size_t request_len) +rend_mid_introduce_legacy(or_circuit_t *circ, const uint8_t *request, + size_t request_len) { or_circuit_t *intro_circ; char serviceid[REND_SERVICE_ID_LEN_BASE32+1]; @@ -143,26 +143,10 @@ rend_mid_introduce(or_circuit_t *circ, const uint8_t *request, log_info(LD_REND, "Received an INTRODUCE1 request on circuit %u", (unsigned)circ->p_circ_id); - if (circ->base_.purpose != CIRCUIT_PURPOSE_OR || circ->base_.n_chan) { - log_warn(LD_PROTOCOL, - "Rejecting INTRODUCE1 on non-OR or non-edge circuit %u.", - (unsigned)circ->p_circ_id); - goto err; - } - - /* We have already done an introduction on this circuit but we just - received a request for another one. We block it since this might - be an attempt to DoS a hidden service (#15515). */ - if (circ->already_received_introduce1) { - log_fn(LOG_PROTOCOL_WARN, LD_REND, - "Blocking multiple introductions on the same circuit. " - "Someone might be trying to attack a hidden service through " - "this relay."); - circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_TORPROTOCOL); - return -1; - } - - circ->already_received_introduce1 = 1; + /* At this point, we know that the circuit is valid for an INTRODUCE1 + * because the validation has been made before calling this function. */ + tor_assert(circ->base_.purpose == CIRCUIT_PURPOSE_OR); + tor_assert(!circ->base_.n_chan); /* We could change this to MAX_HEX_NICKNAME_LEN now that 0.0.9.x is * obsolete; however, there isn't much reason to do so, and we're going diff --git a/src/or/rendmid.h b/src/or/rendmid.h index 374f2b7d66..347d745853 100644 --- a/src/or/rendmid.h +++ b/src/or/rendmid.h @@ -14,8 +14,8 @@ int rend_mid_establish_intro_legacy(or_circuit_t *circ, const uint8_t *request, size_t request_len); -int rend_mid_introduce(or_circuit_t *circ, const uint8_t *request, - size_t request_len); +int rend_mid_introduce_legacy(or_circuit_t *circ, const uint8_t *request, + size_t request_len); int rend_mid_establish_rendezvous(or_circuit_t *circ, const uint8_t *request, size_t request_len); int rend_mid_rendezvous(or_circuit_t *circ, const uint8_t *request, diff --git a/src/or/rendservice.c b/src/or/rendservice.c index 1713a84bbd..00f251588c 100644 --- a/src/or/rendservice.c +++ b/src/or/rendservice.c @@ -542,6 +542,95 @@ rend_service_check_dir_and_add(smartlist_t *service_list, return rend_add_service(s_list, service); } +/* If this is a reload and there were hidden services configured before, + * keep the introduction points that are still needed and close the + * other ones. */ +STATIC void +prune_services_on_reload(smartlist_t *old_service_list, + smartlist_t *new_service_list) +{ + origin_circuit_t *ocirc = NULL; + smartlist_t *surviving_services = NULL; + + tor_assert(old_service_list); + tor_assert(new_service_list); + + /* This contains all _existing_ services that survives the relaod that is + * that haven't been removed from the configuration. The difference between + * this list and the new service list is that the new list can possibly + * contain newly configured service that have no introduction points opened + * yet nor key material loaded or generated. */ + surviving_services = smartlist_new(); + + /* Preserve the existing ephemeral services. + * + * This is the ephemeral service equivalent of the "Copy introduction + * points to new services" block, except there's no copy required since + * the service structure isn't regenerated. + * + * After this is done, all ephemeral services will be: + * * Removed from old_service_list, so the equivalent non-ephemeral code + * will not attempt to preserve them. + * * Added to the new_service_list (that previously only had the + * services listed in the configuration). + * * Added to surviving_services, which is the list of services that + * will NOT have their intro point closed. + */ + SMARTLIST_FOREACH_BEGIN(old_service_list, rend_service_t *, old) { + if (rend_service_is_ephemeral(old)) { + SMARTLIST_DEL_CURRENT(old_service_list, old); + smartlist_add(surviving_services, old); + smartlist_add(new_service_list, old); + } + } SMARTLIST_FOREACH_END(old); + + /* Copy introduction points to new services. This is O(n^2), but it's only + * called on reconfigure, so it's ok performance wise. */ + SMARTLIST_FOREACH_BEGIN(new_service_list, rend_service_t *, new) { + SMARTLIST_FOREACH_BEGIN(old_service_list, rend_service_t *, old) { + /* Skip ephemeral services as we only want to copy introduction points + * from current services to newly configured one that already exists. + * The same directory means it's the same service. */ + if (rend_service_is_ephemeral(new) || rend_service_is_ephemeral(old) || + strcmp(old->directory, new->directory)) { + continue; + } + smartlist_add_all(new->intro_nodes, old->intro_nodes); + smartlist_clear(old->intro_nodes); + smartlist_add_all(new->expiring_nodes, old->expiring_nodes); + smartlist_clear(old->expiring_nodes); + /* This regular service will survive the closing IPs step after. */ + smartlist_add(surviving_services, old); + break; + } SMARTLIST_FOREACH_END(old); + } SMARTLIST_FOREACH_END(new); + + /* For every service introduction circuit we can find, see if we have a + * matching surviving configured service. If not, close the circuit. */ + while ((ocirc = circuit_get_next_service_intro_circ(ocirc))) { + int keep_it = 0; + tor_assert(ocirc->rend_data); + SMARTLIST_FOREACH_BEGIN(surviving_services, const rend_service_t *, s) { + if (rend_circuit_pk_digest_eq(ocirc, (uint8_t *) s->pk_digest)) { + /* Keep this circuit as we have a matching configured service. */ + keep_it = 1; + break; + } + } SMARTLIST_FOREACH_END(s); + if (keep_it) { + continue; + } + log_info(LD_REND, "Closing intro point %s for service %s.", + safe_str_client(extend_info_describe( + ocirc->build_state->chosen_exit)), + safe_str_client(rend_data_get_address(ocirc->rend_data))); + /* Reason is FINISHED because service has been removed and thus the + * circuit is considered old/uneeded. */ + circuit_mark_for_close(TO_CIRCUIT(ocirc), END_CIRC_REASON_FINISHED); + } + smartlist_free(surviving_services); +} + /** Set up rend_service_list, based on the values of HiddenServiceDir and * HiddenServicePort in <b>options</b>. Return 0 on success and -1 on * failure. (If <b>validate_only</b> is set, parse, warn and return as @@ -556,6 +645,7 @@ rend_config_services(const or_options_t *options, int validate_only) smartlist_t *old_service_list = NULL; smartlist_t *temp_service_list = NULL; int ok = 0; + int rv = -1; /* Use a temporary service list, so that we can check the new services' * consistency with each other */ @@ -568,7 +658,8 @@ rend_config_services(const or_options_t *options, int validate_only) * which is registered below the loop */ if (rend_service_check_dir_and_add(temp_service_list, options, service, validate_only) < 0) { - return -1; + service = NULL; + goto free_and_return; } service = tor_malloc_zero(sizeof(rend_service_t)); service->directory = tor_strdup(line->value); @@ -580,8 +671,7 @@ rend_config_services(const or_options_t *options, int validate_only) if (!service) { log_warn(LD_CONFIG, "%s with no preceding HiddenServiceDir directive", line->key); - rend_service_free(service); - return -1; + goto free_and_return; } if (!strcasecmp(line->key, "HiddenServicePort")) { char *err_msg = NULL; @@ -590,8 +680,7 @@ rend_config_services(const or_options_t *options, int validate_only) if (err_msg) log_warn(LD_CONFIG, "%s", err_msg); tor_free(err_msg); - rend_service_free(service); - return -1; + goto free_and_return; } tor_assert(!err_msg); smartlist_add(service->ports, portcfg); @@ -602,8 +691,7 @@ rend_config_services(const or_options_t *options, int validate_only) log_warn(LD_CONFIG, "HiddenServiceAllowUnknownPorts should be 0 or 1, not %s", line->value); - rend_service_free(service); - return -1; + goto free_and_return; } log_info(LD_CONFIG, "HiddenServiceAllowUnknownPorts=%d for %s", @@ -617,8 +705,7 @@ rend_config_services(const or_options_t *options, int validate_only) log_warn(LD_CONFIG, "HiddenServiceDirGroupReadable should be 0 or 1, not %s", line->value); - rend_service_free(service); - return -1; + goto free_and_return; } log_info(LD_CONFIG, "HiddenServiceDirGroupReadable=%d for %s", @@ -631,8 +718,7 @@ rend_config_services(const or_options_t *options, int validate_only) log_warn(LD_CONFIG, "HiddenServiceMaxStreams should be between 0 and %d, not %s", 65535, line->value); - rend_service_free(service); - return -1; + goto free_and_return; } log_info(LD_CONFIG, "HiddenServiceMaxStreams=%d for %s", @@ -646,8 +732,7 @@ rend_config_services(const or_options_t *options, int validate_only) "HiddenServiceMaxStreamsCloseCircuit should be 0 or 1, " "not %s", line->value); - rend_service_free(service); - return -1; + goto free_and_return; } log_info(LD_CONFIG, "HiddenServiceMaxStreamsCloseCircuit=%d for %s", @@ -656,16 +741,13 @@ rend_config_services(const or_options_t *options, int validate_only) } else if (!strcasecmp(line->key, "HiddenServiceNumIntroductionPoints")) { service->n_intro_points_wanted = (unsigned int) tor_parse_long(line->value, 10, - NUM_INTRO_POINTS_DEFAULT, - NUM_INTRO_POINTS_MAX, &ok, NULL); + 0, NUM_INTRO_POINTS_MAX, &ok, NULL); if (!ok) { log_warn(LD_CONFIG, "HiddenServiceNumIntroductionPoints " "should be between %d and %d, not %s", - NUM_INTRO_POINTS_DEFAULT, NUM_INTRO_POINTS_MAX, - line->value); - rend_service_free(service); - return -1; + 0, NUM_INTRO_POINTS_MAX, line->value); + goto free_and_return; } log_info(LD_CONFIG, "HiddenServiceNumIntroductionPoints=%d for %s", service->n_intro_points_wanted, @@ -680,8 +762,7 @@ rend_config_services(const or_options_t *options, int validate_only) if (service->auth_type != REND_NO_AUTH) { log_warn(LD_CONFIG, "Got multiple HiddenServiceAuthorizeClient " "lines for a single service."); - rend_service_free(service); - return -1; + goto free_and_return; } type_names_split = smartlist_new(); smartlist_split_string(type_names_split, line->value, " ", 0, 2); @@ -689,9 +770,7 @@ rend_config_services(const or_options_t *options, int validate_only) log_warn(LD_BUG, "HiddenServiceAuthorizeClient has no value. This " "should have been prevented when parsing the " "configuration."); - smartlist_free(type_names_split); - rend_service_free(service); - return -1; + goto free_and_return; } authname = smartlist_get(type_names_split, 0); if (!strcasecmp(authname, "basic")) { @@ -705,8 +784,7 @@ rend_config_services(const or_options_t *options, int validate_only) (char *) smartlist_get(type_names_split, 0)); SMARTLIST_FOREACH(type_names_split, char *, cp, tor_free(cp)); smartlist_free(type_names_split); - rend_service_free(service); - return -1; + goto free_and_return; } service->clients = smartlist_new(); if (smartlist_len(type_names_split) < 2) { @@ -743,8 +821,7 @@ rend_config_services(const or_options_t *options, int validate_only) client_name, REND_CLIENTNAME_MAX_LEN); SMARTLIST_FOREACH(clients, char *, cp, tor_free(cp)); smartlist_free(clients); - rend_service_free(service); - return -1; + goto free_and_return; } client = tor_malloc_zero(sizeof(rend_authorized_client_t)); client->client_name = tor_strdup(client_name); @@ -766,16 +843,14 @@ rend_config_services(const or_options_t *options, int validate_only) smartlist_len(service->clients), service->auth_type == REND_BASIC_AUTH ? 512 : 16, service->auth_type == REND_BASIC_AUTH ? "basic" : "stealth"); - rend_service_free(service); - return -1; + goto free_and_return; } } else { tor_assert(!strcasecmp(line->key, "HiddenServiceVersion")); if (strcmp(line->value, "2")) { log_warn(LD_CONFIG, "The only supported HiddenServiceVersion is 2."); - rend_service_free(service); - return -1; + goto free_and_return; } } } @@ -784,16 +859,15 @@ rend_config_services(const or_options_t *options, int validate_only) * within the loop. It is ok for this service to be NULL, it is ignored. */ if (rend_service_check_dir_and_add(temp_service_list, options, service, validate_only) < 0) { - return -1; + service = NULL; + goto free_and_return; } + service = NULL; /* Free the newly added services if validating */ if (validate_only) { - SMARTLIST_FOREACH(temp_service_list, rend_service_t *, ptr, - rend_service_free(ptr)); - smartlist_free(temp_service_list); - temp_service_list = NULL; - return 0; + rv = 0; + goto free_and_return; } /* Otherwise, use the newly added services as the new service list @@ -807,88 +881,21 @@ rend_config_services(const or_options_t *options, int validate_only) * keep the introduction points that are still needed and close the * other ones. */ if (old_service_list && !validate_only) { - smartlist_t *surviving_services = smartlist_new(); - - /* Preserve the existing ephemeral services. - * - * This is the ephemeral service equivalent of the "Copy introduction - * points to new services" block, except there's no copy required since - * the service structure isn't regenerated. - * - * After this is done, all ephemeral services will be: - * * Removed from old_service_list, so the equivalent non-ephemeral code - * will not attempt to preserve them. - * * Added to the new rend_service_list (that previously only had the - * services listed in the configuration). - * * Added to surviving_services, which is the list of services that - * will NOT have their intro point closed. - */ - SMARTLIST_FOREACH(old_service_list, rend_service_t *, old, { - if (rend_service_is_ephemeral(old)) { - SMARTLIST_DEL_CURRENT(old_service_list, old); - smartlist_add(surviving_services, old); - smartlist_add(rend_service_list, old); - } - }); - - /* Copy introduction points to new services. */ - /* XXXX This is O(n^2), but it's only called on reconfigure, so it's - * probably ok? */ - SMARTLIST_FOREACH_BEGIN(rend_service_list, rend_service_t *, new) { - SMARTLIST_FOREACH_BEGIN(old_service_list, rend_service_t *, old) { - if (BUG(rend_service_is_ephemeral(new)) || - BUG(rend_service_is_ephemeral(old))) { - continue; - } - if (BUG(!new->directory) || BUG(!old->directory) || - strcmp(old->directory, new->directory)) { - continue; - } - smartlist_add_all(new->intro_nodes, old->intro_nodes); - smartlist_clear(old->intro_nodes); - smartlist_add_all(new->expiring_nodes, old->expiring_nodes); - smartlist_clear(old->expiring_nodes); - smartlist_add(surviving_services, old); - break; - } SMARTLIST_FOREACH_END(old); - } SMARTLIST_FOREACH_END(new); - - /* Close introduction circuits of services we don't serve anymore. */ - /* 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. */ - SMARTLIST_FOREACH_BEGIN(circuit_get_global_list(), circuit_t *, circ) { - if (!circ->marked_for_close && - circ->state == CIRCUIT_STATE_OPEN && - (circ->purpose == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO || - circ->purpose == CIRCUIT_PURPOSE_S_INTRO)) { - origin_circuit_t *oc = TO_ORIGIN_CIRCUIT(circ); - int keep_it = 0; - tor_assert(oc->rend_data); - SMARTLIST_FOREACH(surviving_services, rend_service_t *, ptr, { - if (rend_circuit_pk_digest_eq(oc, (uint8_t *) ptr->pk_digest)) { - keep_it = 1; - break; - } - }); - if (keep_it) - continue; - log_info(LD_REND, "Closing intro point %s for service %s.", - safe_str_client(extend_info_describe( - oc->build_state->chosen_exit)), - rend_data_get_address(oc->rend_data)); - circuit_mark_for_close(circ, END_CIRC_REASON_FINISHED); - /* XXXX Is there another reason we should use here? */ - } - } - SMARTLIST_FOREACH_END(circ); - smartlist_free(surviving_services); - SMARTLIST_FOREACH(old_service_list, rend_service_t *, ptr, - rend_service_free(ptr)); + prune_services_on_reload(old_service_list, rend_service_list); + /* Every remaining service in the old list have been removed from the + * configuration so clean them up safely. */ + SMARTLIST_FOREACH(old_service_list, rend_service_t *, s, + rend_service_free(s)); smartlist_free(old_service_list); } return 0; + free_and_return: + rend_service_free(service); + SMARTLIST_FOREACH(temp_service_list, rend_service_t *, ptr, + rend_service_free(ptr)); + smartlist_free(temp_service_list); + return rv; } /** Add the ephemeral service <b>pk</b>/<b>ports</b> if possible, using diff --git a/src/or/rendservice.h b/src/or/rendservice.h index 4e6b9a2536..3bfac0bece 100644 --- a/src/or/rendservice.h +++ b/src/or/rendservice.h @@ -132,6 +132,9 @@ STATIC int rend_service_poison_new_single_onion_dir( STATIC ssize_t encode_establish_intro_cell_legacy(char *cell_body_out, crypto_pk_t *intro_key, char *rend_circ_nonce); +STATIC void prune_services_on_reload(smartlist_t *old_service_list, + smartlist_t *new_service_list); + #endif int num_rend_services(void); diff --git a/src/or/router.c b/src/or/router.c index 2d8208aa04..e4fa72a283 100644 --- a/src/or/router.c +++ b/src/or/router.c @@ -849,7 +849,12 @@ init_keys(void) if (init_keys_common() < 0) return -1; /* Make sure DataDirectory exists, and is private. */ - if (check_private_dir(options->DataDirectory, CPD_CREATE, options->User)) { + cpd_check_t cpd_opts = CPD_CREATE; + if (options->DataDirectoryGroupReadable) + cpd_opts |= CPD_GROUP_READ; + if (check_private_dir(options->DataDirectory, cpd_opts, options->User)) { + log_err(LD_OR, "Can't create/check datadirectory %s", + options->DataDirectory); return -1; } /* Check the key directory. */ diff --git a/src/or/routerkeys.c b/src/or/routerkeys.c index 6cc75edfa3..6259e3f5a0 100644 --- a/src/or/routerkeys.c +++ b/src/or/routerkeys.c @@ -785,8 +785,11 @@ load_ed_keys(const or_options_t *options, time_t now) if (options->command == CMD_KEYGEN) flags |= INIT_ED_KEY_TRY_ENCRYPTED; - /* Check the key directory */ - if (check_private_dir(options->DataDirectory, CPD_CREATE, options->User)) { + /* Check/Create the key directory */ + cpd_check_t cpd_opts = CPD_CREATE; + if (options->DataDirectoryGroupReadable) + cpd_opts |= CPD_GROUP_READ; + if (check_private_dir(options->DataDirectory, cpd_opts, options->User)) { log_err(LD_OR, "Can't create/check datadirectory %s", options->DataDirectory); goto err; diff --git a/src/or/routerlist.c b/src/or/routerlist.c index 78e7d02ebe..4735271069 100644 --- a/src/or/routerlist.c +++ b/src/or/routerlist.c @@ -949,7 +949,7 @@ authority_certs_fetch_resource_impl(const char *resource, /* If we've just downloaded a consensus from a bridge, re-use that * bridge */ - if (options->UseBridges && node && !get_via_tor) { + if (options->UseBridges && node && node->ri && !get_via_tor) { /* clients always make OR connections to bridges */ tor_addr_port_t or_ap; /* we are willing to use a non-preferred address if we need to */ @@ -1826,43 +1826,24 @@ router_is_already_dir_fetching(const tor_addr_port_t *ap, int serverdesc, return 0; } -/* Check if we already have a directory fetch from ds, for serverdesc - * (including extrainfo) or microdesc documents. - * If so, return 1, if not, return 0. - */ -static int -router_is_already_dir_fetching_ds(const dir_server_t *ds, - int serverdesc, - int microdesc) -{ - tor_addr_port_t ipv4_dir_ap, ipv6_dir_ap; - - /* Assume IPv6 DirPort is the same as IPv4 DirPort */ - tor_addr_from_ipv4h(&ipv4_dir_ap.addr, ds->addr); - ipv4_dir_ap.port = ds->dir_port; - tor_addr_copy(&ipv6_dir_ap.addr, &ds->ipv6_addr); - ipv6_dir_ap.port = ds->dir_port; - - return (router_is_already_dir_fetching(&ipv4_dir_ap, serverdesc, microdesc) - || router_is_already_dir_fetching(&ipv6_dir_ap, serverdesc, microdesc)); -} - -/* Check if we already have a directory fetch from rs, for serverdesc - * (including extrainfo) or microdesc documents. +/* Check if we already have a directory fetch from the ipv4 or ipv6 + * router, for serverdesc (including extrainfo) or microdesc documents. * If so, return 1, if not, return 0. */ static int -router_is_already_dir_fetching_rs(const routerstatus_t *rs, - int serverdesc, - int microdesc) +router_is_already_dir_fetching_(uint32_t ipv4_addr, + const tor_addr_t *ipv6_addr, + uint16_t dir_port, + int serverdesc, + int microdesc) { tor_addr_port_t ipv4_dir_ap, ipv6_dir_ap; /* Assume IPv6 DirPort is the same as IPv4 DirPort */ - tor_addr_from_ipv4h(&ipv4_dir_ap.addr, rs->addr); - ipv4_dir_ap.port = rs->dir_port; - tor_addr_copy(&ipv6_dir_ap.addr, &rs->ipv6_addr); - ipv6_dir_ap.port = rs->dir_port; + tor_addr_from_ipv4h(&ipv4_dir_ap.addr, ipv4_addr); + ipv4_dir_ap.port = dir_port; + tor_addr_copy(&ipv6_dir_ap.addr, ipv6_addr); + ipv6_dir_ap.port = dir_port; return (router_is_already_dir_fetching(&ipv4_dir_ap, serverdesc, microdesc) || router_is_already_dir_fetching(&ipv6_dir_ap, serverdesc, microdesc)); @@ -1954,6 +1935,21 @@ router_picked_poor_directory_log(const routerstatus_t *rs) } \ STMT_END +/* Common code used in the loop within router_pick_directory_server_impl and + * router_pick_trusteddirserver_impl. + * + * Check if the given <b>identity</b> supports extrainfo. If not, skip further + * checks. + */ +#define SKIP_MISSING_TRUSTED_EXTRAINFO(type, identity) \ + STMT_BEGIN \ + int is_trusted_extrainfo = router_digest_is_trusted_dir_type( \ + (identity), EXTRAINFO_DIRINFO); \ + if (((type) & EXTRAINFO_DIRINFO) && \ + !router_supports_extrainfo((identity), is_trusted_extrainfo)) \ + continue; \ + STMT_END + /* When iterating through the routerlist, can OR address/port preference * and reachability checks be skipped? */ @@ -2000,14 +1996,9 @@ router_pick_directory_server_impl(dirinfo_type_t type, int flags, const int fascistfirewall = ! (flags & PDS_IGNORE_FASCISTFIREWALL); const int no_serverdesc_fetching =(flags & PDS_NO_EXISTING_SERVERDESC_FETCH); const int no_microdesc_fetching = (flags & PDS_NO_EXISTING_MICRODESC_FETCH); - const int for_guard = (flags & PDS_FOR_GUARD); int try_excluding = 1, n_excluded = 0, n_busy = 0; int try_ip_pref = 1; -#ifndef ENABLE_LEGACY_GUARD_ALGORITHM - tor_assert_nonfatal(! for_guard); -#endif - if (!consensus) return NULL; @@ -2026,7 +2017,7 @@ router_pick_directory_server_impl(dirinfo_type_t type, int flags, /* Find all the running dirservers we know about. */ SMARTLIST_FOREACH_BEGIN(nodelist_get_list(), const node_t *, node) { - int is_trusted, is_trusted_extrainfo; + int is_trusted; int is_overloaded; const routerstatus_t *status = node->rs; const country_t country = node->country; @@ -2037,22 +2028,9 @@ router_pick_directory_server_impl(dirinfo_type_t type, int flags, continue; if (requireother && router_digest_is_me(node->identity)) continue; - is_trusted = router_digest_is_trusted_dir(node->identity); - is_trusted_extrainfo = router_digest_is_trusted_dir_type( - node->identity, EXTRAINFO_DIRINFO); - if ((type & EXTRAINFO_DIRINFO) && - !router_supports_extrainfo(node->identity, is_trusted_extrainfo)) - continue; -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM - /* Don't make the same node a guard twice */ - if (for_guard && is_node_used_as_guard(node)) { - continue; - } -#endif - /* Ensure that a directory guard is actually a guard node. */ - if (for_guard && !node->is_possible_guard) { - continue; - } + + SKIP_MISSING_TRUSTED_EXTRAINFO(type, node->identity); + if (try_excluding && routerset_contains_routerstatus(options->ExcludeNodes, status, country)) { @@ -2060,14 +2038,17 @@ router_pick_directory_server_impl(dirinfo_type_t type, int flags, continue; } - if (router_is_already_dir_fetching_rs(status, - no_serverdesc_fetching, - no_microdesc_fetching)) { + if (router_is_already_dir_fetching_(status->addr, + &status->ipv6_addr, + status->dir_port, + no_serverdesc_fetching, + no_microdesc_fetching)) { ++n_busy; continue; } is_overloaded = status->last_dir_503_at + DIR_503_TIMEOUT > now; + is_trusted = router_digest_is_trusted_dir(node->identity); /* Clients use IPv6 addresses if the server has one and the client * prefers IPv6. @@ -2199,11 +2180,9 @@ router_pick_trusteddirserver_impl(const smartlist_t *sourcelist, if (!d->is_running) continue; if ((type & d->type) == 0) continue; - int is_trusted_extrainfo = router_digest_is_trusted_dir_type( - d->digest, EXTRAINFO_DIRINFO); - if ((type & EXTRAINFO_DIRINFO) && - !router_supports_extrainfo(d->digest, is_trusted_extrainfo)) - continue; + + SKIP_MISSING_TRUSTED_EXTRAINFO(type, d->digest); + if (requireother && me && router_digest_is_me(d->digest)) continue; if (try_excluding && @@ -2213,8 +2192,11 @@ router_pick_trusteddirserver_impl(const smartlist_t *sourcelist, continue; } - if (router_is_already_dir_fetching_ds(d, no_serverdesc_fetching, - no_microdesc_fetching)) { + if (router_is_already_dir_fetching_(d->addr, + &d->ipv6_addr, + d->dir_port, + no_serverdesc_fetching, + no_microdesc_fetching)) { ++n_busy; continue; } diff --git a/src/or/shared_random.c b/src/or/shared_random.c index 0eb93382ca..f798a51a9f 100644 --- a/src/or/shared_random.c +++ b/src/or/shared_random.c @@ -502,6 +502,20 @@ get_vote_line_from_commit(const sr_commit_t *commit, sr_phase_t phase) return vote_line; } +/* Convert a given srv object to a string for the control port. This doesn't + * fail and the srv object MUST be valid. */ +static char * +srv_to_control_string(const sr_srv_t *srv) +{ + char *srv_str; + char srv_hash_encoded[SR_SRV_VALUE_BASE64_LEN + 1]; + tor_assert(srv); + + sr_srv_encode(srv_hash_encoded, sizeof(srv_hash_encoded), srv); + tor_asprintf(&srv_str, "%s", srv_hash_encoded); + return srv_str; +} + /* Return a heap allocated string that contains the given <b>srv</b> string * representation formatted for a networkstatus document using the * <b>key</b> as the start of the line. This doesn't return NULL. */ @@ -1348,6 +1362,38 @@ sr_save_and_cleanup(void) sr_cleanup(); } +/* Return the current SRV string representation for the control port. Return a + * newly allocated string on success containing the value else "" if not found + * or if we don't have a valid consensus yet. */ +char * +sr_get_current_for_control(void) +{ + char *srv_str; + const networkstatus_t *c = networkstatus_get_latest_consensus(); + if (c && c->sr_info.current_srv) { + srv_str = srv_to_control_string(c->sr_info.current_srv); + } else { + srv_str = tor_strdup(""); + } + return srv_str; +} + +/* Return the previous SRV string representation for the control port. Return + * a newly allocated string on success containing the value else "" if not + * found or if we don't have a valid consensus yet. */ +char * +sr_get_previous_for_control(void) +{ + char *srv_str; + const networkstatus_t *c = networkstatus_get_latest_consensus(); + if (c && c->sr_info.previous_srv) { + srv_str = srv_to_control_string(c->sr_info.previous_srv); + } else { + srv_str = tor_strdup(""); + } + return srv_str; +} + #ifdef TOR_UNIT_TESTS /* Set the global value of number of SRV agreements so the test can play diff --git a/src/or/shared_random.h b/src/or/shared_random.h index 9885934cc7..dbb8effeaa 100644 --- a/src/or/shared_random.h +++ b/src/or/shared_random.h @@ -129,6 +129,10 @@ const char *sr_commit_get_rsa_fpr(const sr_commit_t *commit) void sr_compute_srv(void); sr_commit_t *sr_generate_our_commit(time_t timestamp, const authority_cert_t *my_rsa_cert); + +char *sr_get_current_for_control(void); +char *sr_get_previous_for_control(void); + #ifdef SHARED_RANDOM_PRIVATE /* Encode */ diff --git a/src/or/transports.c b/src/or/transports.c index feeff6e66c..535393b1a1 100644 --- a/src/or/transports.c +++ b/src/or/transports.c @@ -480,7 +480,6 @@ proxy_needs_restart(const managed_proxy_t *mp) * preparations and then flag its state so that it will be relaunched * in the next tick. */ static void - proxy_prepare_for_restart(managed_proxy_t *mp) { transport_t *t_tmp = NULL; diff --git a/src/test/bench.c b/src/test/bench.c index 30984fda70..99bc686f30 100644 --- a/src/test/bench.c +++ b/src/test/bench.c @@ -120,7 +120,7 @@ bench_onion_TAP(void) uint64_t start, end; char os[TAP_ONIONSKIN_CHALLENGE_LEN]; char or[TAP_ONIONSKIN_REPLY_LEN]; - crypto_dh_t *dh_out; + crypto_dh_t *dh_out = NULL; key = crypto_pk_new(); key2 = crypto_pk_new(); @@ -175,6 +175,7 @@ bench_onion_TAP(void) NANOCOUNT(start, end, iters)/1e3); done: + crypto_dh_free(dh_out); crypto_pk_free(key); crypto_pk_free(key2); } diff --git a/src/test/test_bt_cl.c b/src/test/test_bt_cl.c index 95b4f48f11..709d599f52 100644 --- a/src/test/test_bt_cl.c +++ b/src/test/test_bt_cl.c @@ -19,14 +19,12 @@ 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; #ifdef HAVE_CFLAG_WNULL_DEREFERENCE DISABLE_GCC_WARNING(null-dereference) @@ -76,13 +74,6 @@ 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) { @@ -120,8 +111,6 @@ main(int argc, char **argv) configure_backtrace_handler(NULL); - signal(SIGABRT, abort_handler); - printf("%d\n", we_weave(2)); clean_up_backtrace_handler(); diff --git a/src/test/test_cell_formats.c b/src/test/test_cell_formats.c index bbcff38d6d..22c34b6d6c 100644 --- a/src/test/test_cell_formats.c +++ b/src/test/test_cell_formats.c @@ -346,9 +346,9 @@ test_cfmt_connected_cells(void *arg) memset(&cell, 0, sizeof(cell)); tor_addr_parse(&addr, "30.40.50.60"); rh.length = connected_cell_format_payload(cell.payload+RELAY_HEADER_SIZE, - &addr, 128); + &addr, 1024); tt_int_op(rh.length, OP_EQ, 8); - test_memeq_hex(cell.payload+RELAY_HEADER_SIZE, "1e28323c" "00000080"); + test_memeq_hex(cell.payload+RELAY_HEADER_SIZE, "1e28323c" "00000e10"); /* Try parsing it. */ tor_addr_make_unspec(&addr); @@ -356,7 +356,7 @@ test_cfmt_connected_cells(void *arg) tt_int_op(r, OP_EQ, 0); tt_int_op(tor_addr_family(&addr), OP_EQ, AF_INET); tt_str_op(fmt_addr(&addr), OP_EQ, "30.40.50.60"); - tt_int_op(ttl, OP_EQ, 128); + tt_int_op(ttl, OP_EQ, 3600); /* not 1024, since we clipped to 3600 */ /* Try an IPv6 address */ memset(&rh, 0, sizeof(rh)); diff --git a/src/test/test_config.c b/src/test/test_config.c index a540bcc138..3b19cad036 100644 --- a/src/test/test_config.c +++ b/src/test/test_config.c @@ -46,6 +46,8 @@ #include "transports.h" #include "util.h" +#include "test_helpers.h" + static void test_config_addressmap(void *arg) { @@ -4127,6 +4129,7 @@ test_config_parse_port_config__ports__ports_given(void *data) config_free_lines(config_port_invalid); config_port_invalid = NULL; config_port_invalid = mock_config_line("SOCKSPort", "unix:/tmp/foo/bar NoIPv4Traffic " + "NoIPv6Traffic " "NoOnionTraffic"); ret = parse_port_config(NULL, config_port_invalid, NULL, "SOCKS", CONN_TYPE_AP_LISTENER, NULL, 0, @@ -4148,6 +4151,7 @@ test_config_parse_port_config__ports__ports_given(void *data) SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); smartlist_clear(slout); config_port_valid = mock_config_line("DNSPort", "127.0.0.1:80 " + "NoIPv6Traffic " "NoIPv4Traffic NoOnionTraffic"); ret = parse_port_config(slout, config_port_valid, NULL, "DNS", CONN_TYPE_AP_DNS_LISTENER, NULL, 0, @@ -4163,6 +4167,7 @@ test_config_parse_port_config__ports__ports_given(void *data) // Test failure if we have DNS but no ipv4 and no ipv6 config_free_lines(config_port_invalid); config_port_invalid = NULL; config_port_invalid = mock_config_line("SOCKSPort", + "NoIPv6Traffic " "unix:/tmp/foo/bar NoIPv4Traffic"); ret = parse_port_config(NULL, config_port_invalid, NULL, "SOCKS", CONN_TYPE_AP_LISTENER, NULL, 0, @@ -4175,6 +4180,7 @@ test_config_parse_port_config__ports__ports_given(void *data) SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); smartlist_clear(slout); config_port_valid = mock_config_line("SOCKSPort", "unix:/tmp/foo/bar " + "NoIPv6Traffic " "NoDNSRequest NoIPv4Traffic"); ret = parse_port_config(slout, config_port_valid, NULL, "SOCKS", CONN_TYPE_AP_LISTENER, NULL, 0, @@ -4196,6 +4202,7 @@ test_config_parse_port_config__ports__ports_given(void *data) SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); smartlist_clear(slout); config_port_valid = mock_config_line("SOCKSPort", "unix:\"/tmp/foo/ bar\" " + "NoIPv6Traffic " "NoDNSRequest NoIPv4Traffic"); ret = parse_port_config(slout, config_port_valid, NULL, "SOCKS", CONN_TYPE_AP_LISTENER, NULL, 0, @@ -4217,6 +4224,7 @@ test_config_parse_port_config__ports__ports_given(void *data) SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); smartlist_clear(slout); config_port_valid = mock_config_line("SOCKSPort", "unix:\"/tmp/foo/ bar " + "NoIPv6Traffic " "NoDNSRequest NoIPv4Traffic"); ret = parse_port_config(slout, config_port_valid, NULL, "SOCKS", CONN_TYPE_AP_LISTENER, NULL, 0, @@ -4228,6 +4236,7 @@ test_config_parse_port_config__ports__ports_given(void *data) SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); smartlist_clear(slout); config_port_valid = mock_config_line("SOCKSPort", "unix:\"\" " + "NoIPv6Traffic " "NoDNSRequest NoIPv4Traffic"); ret = parse_port_config(slout, config_port_valid, NULL, "SOCKS", CONN_TYPE_AP_LISTENER, NULL, 0, @@ -4602,7 +4611,7 @@ test_config_parse_port_config__ports__ports_given(void *data) tt_int_op(smartlist_len(slout), OP_EQ, 1); port_cfg = (port_cfg_t *)smartlist_get(slout, 0); tt_int_op(port_cfg->entry_cfg.ipv4_traffic, OP_EQ, 1); - tt_int_op(port_cfg->entry_cfg.ipv6_traffic, OP_EQ, 0); + tt_int_op(port_cfg->entry_cfg.ipv6_traffic, OP_EQ, 1); // Test failure for a SessionGroup argument with invalid value config_free_lines(config_port_invalid); config_port_invalid = NULL; @@ -4701,8 +4710,10 @@ test_config_parse_port_config__ports__ports_given(void *data) // Test failure when asked to parse an invalid address followed by auto config_free_lines(config_port_invalid); config_port_invalid = NULL; config_port_invalid = mock_config_line("DNSPort", "invalidstuff!!:auto"); + MOCK(tor_addr_lookup, mock_tor_addr_lookup__fail_on_bad_addrs); ret = parse_port_config(NULL, config_port_invalid, NULL, "DNS", 0, "127.0.0.46", 0, 0); + UNMOCK(tor_addr_lookup); tt_int_op(ret, OP_EQ, -1); // Test success with parsing both an address and a real port diff --git a/src/test/test_controller.c b/src/test/test_controller.c index 4e65d76662..d9c0a1eaac 100644 --- a/src/test/test_controller.c +++ b/src/test/test_controller.c @@ -10,6 +10,7 @@ #include "rendservice.h" #include "routerlist.h" #include "test.h" +#include "test_helpers.h" static void test_add_onion_helper_keyarg(void *arg) @@ -186,8 +187,10 @@ test_rend_service_parse_port_config(void *arg) tor_free(err_msg); /* bogus IP address */ - cfg = rend_service_parse_port_config("100 1.2.3.4.5:9000", + MOCK(tor_addr_lookup, mock_tor_addr_lookup__fail_on_bad_addrs); + cfg = rend_service_parse_port_config("100 foo!!.example.com:9000", " ", &err_msg); + UNMOCK(tor_addr_lookup); tt_assert(!cfg); tt_str_op(err_msg, OP_EQ, "Unparseable address in hidden service port " "configuration."); diff --git a/src/test/test_dns.c b/src/test/test_dns.c index 8346c0a33f..6a8e92cb47 100644 --- a/src/test/test_dns.c +++ b/src/test/test_dns.c @@ -16,30 +16,11 @@ NS(test_main)(void *arg) { (void)arg; - uint32_t ttl_mid = MIN_DNS_TTL / 2 + MAX_DNS_TTL / 2; + uint32_t ttl_mid = MIN_DNS_TTL_AT_EXIT / 2 + MAX_DNS_TTL_AT_EXIT / 2; - tt_int_op(dns_clip_ttl(MIN_DNS_TTL - 1),==,MIN_DNS_TTL); - tt_int_op(dns_clip_ttl(ttl_mid),==,ttl_mid); - tt_int_op(dns_clip_ttl(MAX_DNS_TTL + 1),==,MAX_DNS_TTL); - - done: - return; -} - -#undef NS_SUBMODULE - -#define NS_SUBMODULE expiry_ttl - -static void -NS(test_main)(void *arg) -{ - (void)arg; - - uint32_t ttl_mid = MIN_DNS_TTL / 2 + MAX_DNS_ENTRY_AGE / 2; - - tt_int_op(dns_get_expiry_ttl(MIN_DNS_TTL - 1),==,MIN_DNS_TTL); - tt_int_op(dns_get_expiry_ttl(ttl_mid),==,ttl_mid); - tt_int_op(dns_get_expiry_ttl(MAX_DNS_ENTRY_AGE + 1),==,MAX_DNS_ENTRY_AGE); + tt_int_op(dns_clip_ttl(MIN_DNS_TTL_AT_EXIT - 1),==,MIN_DNS_TTL_AT_EXIT); + tt_int_op(dns_clip_ttl(ttl_mid),==,MAX_DNS_TTL_AT_EXIT); + tt_int_op(dns_clip_ttl(MAX_DNS_TTL_AT_EXIT + 1),==,MAX_DNS_TTL_AT_EXIT); done: return; @@ -749,7 +730,6 @@ NS(test_main)(void *arg) struct testcase_t dns_tests[] = { TEST_CASE(clip_ttl), - TEST_CASE(expiry_ttl), TEST_CASE(resolve), TEST_CASE_ASPECT(resolve_impl, addr_is_ip_no_need_to_resolve), TEST_CASE_ASPECT(resolve_impl, non_exit), diff --git a/src/test/test_entrynodes.c b/src/test/test_entrynodes.c index 32f8b6e0dd..bcb56e3a6b 100644 --- a/src/test/test_entrynodes.c +++ b/src/test/test_entrynodes.c @@ -45,41 +45,6 @@ get_or_state_replacement(void) return dummy_state; } -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM -/* Unittest cleanup function: Cleanup the fake network. */ -static int -fake_network_cleanup(const struct testcase_t *testcase, void *ptr) -{ - (void) testcase; - (void) ptr; - - routerlist_free_all(); - nodelist_free_all(); - entry_guards_free_all(); - or_state_free(dummy_state); - - return 1; /* NOP */ -} - -/* Unittest setup function: Setup a fake network. */ -static void * -fake_network_setup(const struct testcase_t *testcase) -{ - (void) testcase; - - /* Setup fake state */ - dummy_state = tor_malloc_zero(sizeof(or_state_t)); - MOCK(get_or_state, - get_or_state_replacement); - - /* Setup fake routerlist. */ - helper_setup_fake_routerlist(); - - /* Return anything but NULL (it's interpreted as test fail) */ - return dummy_state; -} -#endif - static networkstatus_t *dummy_consensus = NULL; static smartlist_t *big_fake_net_nodes = NULL; @@ -202,697 +167,6 @@ mock_get_options(void) return &mocked_options; } -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM -/** Test choose_random_entry() with none of our routers being guard nodes. */ -static void -test_choose_random_entry_no_guards(void *arg) -{ - const node_t *chosen_entry = NULL; - - (void) arg; - - MOCK(get_options, mock_get_options); - - /* Check that we get a guard if it passes preferred - * address settings */ - memset(&mocked_options, 0, sizeof(mocked_options)); - mocked_options.ClientUseIPv4 = 1; - mocked_options.ClientPreferIPv6ORPort = 0; - mocked_options.UseDeprecatedGuardAlgorithm = 1; - - /* Try to pick an entry even though none of our routers are guards. */ - chosen_entry = choose_random_entry(NULL); - - /* Unintuitively, we actually pick a random node as our entry, - because router_choose_random_node() relaxes its constraints if it - can't find a proper entry guard. */ - tt_assert(chosen_entry); - - /* And with the other IP version active */ - mocked_options.ClientUseIPv6 = 1; - chosen_entry = choose_random_entry(NULL); - tt_assert(chosen_entry); - - /* And with the preference on auto */ - mocked_options.ClientPreferIPv6ORPort = -1; - chosen_entry = choose_random_entry(NULL); - tt_assert(chosen_entry); - - /* Check that we don't get a guard if it doesn't pass mandatory address - * settings */ - memset(&mocked_options, 0, sizeof(mocked_options)); - mocked_options.ClientUseIPv4 = 0; - mocked_options.ClientPreferIPv6ORPort = 0; - mocked_options.UseDeprecatedGuardAlgorithm = 1; - - chosen_entry = choose_random_entry(NULL); - - /* If we don't allow IPv4 at all, we don't get a guard*/ - tt_assert(!chosen_entry); - - /* Check that we get a guard if it passes allowed but not preferred address - * settings */ - memset(&mocked_options, 0, sizeof(mocked_options)); - mocked_options.ClientUseIPv4 = 1; - mocked_options.ClientUseIPv6 = 1; - mocked_options.ClientPreferIPv6ORPort = 1; - mocked_options.UseDeprecatedGuardAlgorithm = 1; - - chosen_entry = choose_random_entry(NULL); - tt_assert(chosen_entry); - - /* Check that we get a guard if it passes preferred address settings when - * they're auto */ - memset(&mocked_options, 0, sizeof(mocked_options)); - mocked_options.ClientUseIPv4 = 1; - mocked_options.ClientPreferIPv6ORPort = -1; - mocked_options.UseDeprecatedGuardAlgorithm = 1; - - chosen_entry = choose_random_entry(NULL); - tt_assert(chosen_entry); - - /* And with IPv6 active */ - mocked_options.ClientUseIPv6 = 1; - - chosen_entry = choose_random_entry(NULL); - tt_assert(chosen_entry); - - done: - memset(&mocked_options, 0, sizeof(mocked_options)); - UNMOCK(get_options); -} - -/** Test choose_random_entry() with only one of our routers being a - guard node. */ -static void -test_choose_random_entry_one_possible_guard(void *arg) -{ - const node_t *chosen_entry = NULL; - node_t *the_guard = NULL; - smartlist_t *our_nodelist = NULL; - - (void) arg; - - MOCK(get_options, mock_get_options); - - /* Set one of the nodes to be a guard. */ - our_nodelist = nodelist_get_list(); - the_guard = smartlist_get(our_nodelist, 4); /* chosen by fair dice roll */ - the_guard->is_possible_guard = 1; - - /* Check that we get the guard if it passes preferred - * address settings */ - memset(&mocked_options, 0, sizeof(mocked_options)); - mocked_options.ClientUseIPv4 = 1; - mocked_options.ClientPreferIPv6ORPort = 0; - mocked_options.UseDeprecatedGuardAlgorithm = 1; - - /* Pick an entry. Make sure we pick the node we marked as guard. */ - chosen_entry = choose_random_entry(NULL); - tt_ptr_op(chosen_entry, OP_EQ, the_guard); - - /* And with the other IP version active */ - mocked_options.ClientUseIPv6 = 1; - chosen_entry = choose_random_entry(NULL); - tt_ptr_op(chosen_entry, OP_EQ, the_guard); - - /* And with the preference on auto */ - mocked_options.ClientPreferIPv6ORPort = -1; - chosen_entry = choose_random_entry(NULL); - tt_ptr_op(chosen_entry, OP_EQ, the_guard); - - /* Check that we don't get a guard if it doesn't pass mandatory address - * settings */ - memset(&mocked_options, 0, sizeof(mocked_options)); - mocked_options.ClientUseIPv4 = 0; - mocked_options.ClientPreferIPv6ORPort = 0; - mocked_options.UseDeprecatedGuardAlgorithm = 1; - - chosen_entry = choose_random_entry(NULL); - - /* If we don't allow IPv4 at all, we don't get a guard*/ - tt_assert(!chosen_entry); - - /* Check that we get a node if it passes allowed but not preferred - * address settings */ - memset(&mocked_options, 0, sizeof(mocked_options)); - mocked_options.ClientUseIPv4 = 1; - mocked_options.ClientUseIPv6 = 1; - mocked_options.ClientPreferIPv6ORPort = 1; - mocked_options.UseDeprecatedGuardAlgorithm = 1; - - chosen_entry = choose_random_entry(NULL); - - /* We disable the guard check and the preferred address check at the same - * time, so we can't be sure we get the guard */ - tt_assert(chosen_entry); - - /* Check that we get a node if it is allowed but not preferred when settings - * are auto */ - memset(&mocked_options, 0, sizeof(mocked_options)); - mocked_options.ClientUseIPv4 = 1; - mocked_options.ClientPreferIPv6ORPort = -1; - mocked_options.UseDeprecatedGuardAlgorithm = 1; - - chosen_entry = choose_random_entry(NULL); - - /* We disable the guard check and the preferred address check at the same - * time, so we can't be sure we get the guard */ - tt_assert(chosen_entry); - - /* and with IPv6 active */ - mocked_options.ClientUseIPv6 = 1; - - chosen_entry = choose_random_entry(NULL); - tt_assert(chosen_entry); - - done: - memset(&mocked_options, 0, sizeof(mocked_options)); - UNMOCK(get_options); -} - -/** Helper to conduct tests for populate_live_entry_guards(). - - This test adds some entry guards to our list, and then tests - populate_live_entry_guards() to mke sure it filters them correctly. - - <b>num_needed</b> is the number of guard nodes we support. It's - configurable to make sure we function properly with 1 or 3 guard - nodes configured. -*/ -static void -populate_live_entry_guards_test_helper(int num_needed) -{ - smartlist_t *our_nodelist = NULL; - smartlist_t *live_entry_guards = smartlist_new(); - guard_selection_t *gs = get_guard_selection_info(); - const smartlist_t *all_entry_guards = - get_entry_guards_for_guard_selection(gs); - or_options_t *options = get_options_mutable(); - int retval; - - /* Set NumEntryGuards to the provided number. */ - options->NumEntryGuards = num_needed; - tt_int_op(num_needed, OP_EQ, decide_num_guards(options, 0)); - - /* The global entry guards smartlist should be empty now. */ - tt_int_op(smartlist_len(all_entry_guards), OP_EQ, 0); - - /* Walk the nodelist and add all nodes as entry guards. */ - our_nodelist = nodelist_get_list(); - tt_int_op(smartlist_len(our_nodelist), OP_EQ, HELPER_NUMBER_OF_DESCRIPTORS); - - SMARTLIST_FOREACH_BEGIN(our_nodelist, const node_t *, node) { - const node_t *node_tmp; - node_tmp = add_an_entry_guard(gs, node, 0, 1, 0, 0); - tt_assert(node_tmp); - } SMARTLIST_FOREACH_END(node); - - /* Make sure the nodes were added as entry guards. */ - tt_int_op(smartlist_len(all_entry_guards), OP_EQ, - HELPER_NUMBER_OF_DESCRIPTORS); - - /* Ensure that all the possible entry guards are enough to satisfy us. */ - tt_int_op(smartlist_len(all_entry_guards), OP_GE, num_needed); - - /* Walk the entry guard list for some sanity checking */ - SMARTLIST_FOREACH_BEGIN(all_entry_guards, const entry_guard_t *, entry) { - /* Since we called add_an_entry_guard() with 'for_discovery' being - False, all guards should have made_contact enabled. */ - tt_int_op(entry->made_contact, OP_EQ, 1); - - } SMARTLIST_FOREACH_END(entry); - - /* First, try to get some fast guards. This should fail. */ - retval = populate_live_entry_guards(live_entry_guards, - all_entry_guards, - NULL, - NO_DIRINFO, /* Don't care about DIRINFO*/ - 0, 0, - 1); /* We want fast guard! */ - tt_int_op(retval, OP_EQ, 0); - tt_int_op(smartlist_len(live_entry_guards), OP_EQ, 0); - - /* Now try to get some stable guards. This should fail too. */ - retval = populate_live_entry_guards(live_entry_guards, - all_entry_guards, - NULL, - NO_DIRINFO, - 0, - 1, /* We want stable guard! */ - 0); - tt_int_op(retval, OP_EQ, 0); - tt_int_op(smartlist_len(live_entry_guards), OP_EQ, 0); - - /* Now try to get any guard we can find. This should succeed. */ - retval = populate_live_entry_guards(live_entry_guards, - all_entry_guards, - NULL, - NO_DIRINFO, - 0, 0, 0); /* No restrictions! */ - - /* Since we had more than enough guards in 'all_entry_guards', we - should have added 'num_needed' of them to live_entry_guards. - 'retval' should be 1 since we now have enough live entry guards - to pick one. */ - tt_int_op(retval, OP_EQ, 1); - tt_int_op(smartlist_len(live_entry_guards), OP_EQ, num_needed); - - done: - smartlist_free(live_entry_guards); -} - -/* Test populate_live_entry_guards() for 1 guard node. */ -static void -test_populate_live_entry_guards_1guard(void *arg) -{ - (void) arg; - - populate_live_entry_guards_test_helper(1); -} - -/* Test populate_live_entry_guards() for 3 guard nodes. */ -static void -test_populate_live_entry_guards_3guards(void *arg) -{ - (void) arg; - - populate_live_entry_guards_test_helper(3); -} - -/** Append some EntryGuard lines to the Tor state at <b>state</b>. - - <b>entry_guard_lines</b> is a smartlist containing 2-tuple - smartlists that carry the key and values of the statefile. - As an example: - entry_guard_lines = - (("EntryGuard", "name 67E72FF33D7D41BF11C569646A0A7B4B188340DF DirCache"), - ("EntryGuardDownSince", "2014-06-07 16:02:46 2014-06-07 16:02:46")) -*/ -static void -state_insert_entry_guard_helper(or_state_t *state, - smartlist_t *entry_guard_lines) -{ - config_line_t **next, *line; - - next = &state->EntryGuards; - *next = NULL; - - /* Loop over all the state lines in the smartlist */ - SMARTLIST_FOREACH_BEGIN(entry_guard_lines, const smartlist_t *,state_lines) { - /* Get key and value for each line */ - const char *state_key = smartlist_get(state_lines, 0); - const char *state_value = smartlist_get(state_lines, 1); - - *next = line = tor_malloc_zero(sizeof(config_line_t)); - line->key = tor_strdup(state_key); - tor_asprintf(&line->value, "%s", state_value); - next = &(line->next); - } SMARTLIST_FOREACH_END(state_lines); -} - -/** Free memory occupied by <b>entry_guard_lines</b>. */ -static void -state_lines_free(smartlist_t *entry_guard_lines) -{ - SMARTLIST_FOREACH_BEGIN(entry_guard_lines, smartlist_t *, state_lines) { - char *state_key = smartlist_get(state_lines, 0); - char *state_value = smartlist_get(state_lines, 1); - - tor_free(state_key); - tor_free(state_value); - smartlist_free(state_lines); - } SMARTLIST_FOREACH_END(state_lines); - - smartlist_free(entry_guard_lines); -} - -/* Tests entry_guards_parse_state(). It creates a fake Tor state with - a saved entry guard and makes sure that Tor can parse it and - creates the right entry node out of it. -*/ -static void -test_entry_guards_parse_state_simple(void *arg) -{ - or_options_t *options = get_options_mutable(); - options->UseDeprecatedGuardAlgorithm = 1; - or_state_t *state = or_state_new(); - const smartlist_t *all_entry_guards = get_entry_guards(); - smartlist_t *entry_state_lines = smartlist_new(); - char *msg = NULL; - int retval; - - /* Details of our fake guard node */ - const char *nickname = "hagbard"; - const char *fpr = "B29D536DD1752D542E1FBB3C9CE4449D51298212"; - const char *tor_version = "0.2.5.3-alpha-dev"; - const char *added_at = get_yesterday_date_str(); - const char *unlisted_since = "2014-06-08 16:16:50"; - - (void) arg; - - /* The global entry guards smartlist should be empty now. */ - tt_int_op(smartlist_len(all_entry_guards), OP_EQ, 0); - - { /* Prepare the state entry */ - - /* Prepare the smartlist to hold the key/value of each line */ - smartlist_t *state_line = smartlist_new(); - smartlist_add_asprintf(state_line, "EntryGuard"); - smartlist_add_asprintf(state_line, "%s %s %s", nickname, fpr, "DirCache"); - smartlist_add(entry_state_lines, state_line); - - state_line = smartlist_new(); - smartlist_add_asprintf(state_line, "EntryGuardAddedBy"); - smartlist_add_asprintf(state_line, "%s %s %s", fpr, tor_version, added_at); - smartlist_add(entry_state_lines, state_line); - - state_line = smartlist_new(); - smartlist_add_asprintf(state_line, "EntryGuardUnlistedSince"); - smartlist_add_asprintf(state_line, "%s", unlisted_since); - smartlist_add(entry_state_lines, state_line); - } - - /* Inject our lines in the state */ - state_insert_entry_guard_helper(state, entry_state_lines); - - /* Parse state */ - retval = entry_guards_parse_state(state, 1, &msg); - tt_int_op(retval, OP_GE, 0); - - /* Test that the guard was registered. - We need to re-get the entry guard list since its pointer was - overwritten in entry_guards_parse_state(). */ - all_entry_guards = get_entry_guards(); - tt_int_op(smartlist_len(all_entry_guards), OP_EQ, 1); - - { /* Test the entry guard structure */ - char hex_digest[1024]; - char str_time[1024]; - - const entry_guard_t *e = smartlist_get(all_entry_guards, 0); - tt_str_op(e->nickname, OP_EQ, nickname); /* Verify nickname */ - - base16_encode(hex_digest, sizeof(hex_digest), - e->identity, DIGEST_LEN); - tt_str_op(hex_digest, OP_EQ, fpr); /* Verify fingerprint */ - - tt_assert(e->is_dir_cache); /* Verify dirness */ - - tt_str_op(e->chosen_by_version, OP_EQ, tor_version); /* Verify version */ - - tt_assert(e->made_contact); /* All saved guards have been contacted */ - - tt_assert(e->bad_since); /* Verify bad_since timestamp */ - format_iso_time(str_time, e->bad_since); - tt_str_op(str_time, OP_EQ, unlisted_since); - - /* The rest should be unset */ - tt_assert(!e->unreachable_since); - tt_assert(!e->can_retry); - tt_assert(!e->pb.path_bias_noticed); - tt_assert(!e->pb.path_bias_warned); - tt_assert(!e->pb.path_bias_extreme); - tt_assert(!e->pb.path_bias_disabled); - tt_assert(!e->pb.path_bias_use_noticed); - tt_assert(!e->pb.path_bias_use_extreme); - tt_assert(!e->last_attempted); - } - - done: - state_lines_free(entry_state_lines); - or_state_free(state); - tor_free(msg); -} - -/** Similar to test_entry_guards_parse_state_simple() but aims to test - the PathBias-related details of the entry guard. */ -static void -test_entry_guards_parse_state_pathbias(void *arg) -{ - or_options_t *options = get_options_mutable(); - options->UseDeprecatedGuardAlgorithm = 1; - or_state_t *state = or_state_new(); - const smartlist_t *all_entry_guards = get_entry_guards(); - char *msg = NULL; - int retval; - smartlist_t *entry_state_lines = smartlist_new(); - - /* Path bias details of the fake guard */ - const double circ_attempts = 9; - const double circ_successes = 8; - const double successful_closed = 4; - const double collapsed = 2; - const double unusable = 0; - const double timeouts = 1; - - (void) arg; - - /* The global entry guards smartlist should be empty now. */ - tt_int_op(smartlist_len(all_entry_guards), OP_EQ, 0); - - { /* Prepare the state entry */ - - /* Prepare the smartlist to hold the key/value of each line */ - smartlist_t *state_line = smartlist_new(); - smartlist_add_asprintf(state_line, "EntryGuard"); - smartlist_add_asprintf(state_line, - "givethanks B29D536DD1752D542E1FBB3C9CE4449D51298212 NoDirCache"); - smartlist_add(entry_state_lines, state_line); - - state_line = smartlist_new(); - smartlist_add_asprintf(state_line, "EntryGuardAddedBy"); - smartlist_add_asprintf(state_line, - "B29D536DD1752D542E1FBB3C9CE4449D51298212 0.2.5.3-alpha-dev " - "%s", get_yesterday_date_str()); - smartlist_add(entry_state_lines, state_line); - - state_line = smartlist_new(); - smartlist_add_asprintf(state_line, "EntryGuardUnlistedSince"); - smartlist_add_asprintf(state_line, "2014-06-08 16:16:50"); - smartlist_add(entry_state_lines, state_line); - - state_line = smartlist_new(); - smartlist_add_asprintf(state_line, "EntryGuardPathBias"); - smartlist_add_asprintf(state_line, "%f %f %f %f %f %f", - circ_attempts, circ_successes, successful_closed, - collapsed, unusable, timeouts); - smartlist_add(entry_state_lines, state_line); - } - - /* Inject our lines in the state */ - state_insert_entry_guard_helper(state, entry_state_lines); - - /* Parse state */ - retval = entry_guards_parse_state(state, 1, &msg); - tt_int_op(retval, OP_GE, 0); - - /* Test that the guard was registered */ - all_entry_guards = get_entry_guards(); - tt_int_op(smartlist_len(all_entry_guards), OP_EQ, 1); - - { /* Test the path bias of this guard */ - const entry_guard_t *e = smartlist_get(all_entry_guards, 0); - - tt_assert(!e->is_dir_cache); - tt_assert(!e->can_retry); - - /* XXX tt_double_op doesn't support equality. Cast to int for now. */ - tt_int_op((int)e->pb.circ_attempts, OP_EQ, (int)circ_attempts); - tt_int_op((int)e->pb.circ_successes, OP_EQ, (int)circ_successes); - tt_int_op((int)e->pb.successful_circuits_closed, OP_EQ, - (int)successful_closed); - tt_int_op((int)e->pb.timeouts, OP_EQ, (int)timeouts); - tt_int_op((int)e->pb.collapsed_circuits, OP_EQ, (int)collapsed); - tt_int_op((int)e->pb.unusable_circuits, OP_EQ, (int)unusable); - } - - done: - or_state_free(state); - state_lines_free(entry_state_lines); - tor_free(msg); -} - -/* Simple test of entry_guards_set_from_config() by specifying a - particular EntryNode and making sure it gets picked. */ -static void -test_entry_guards_set_from_config(void *arg) -{ - or_options_t *options = get_options_mutable(); - options->UseDeprecatedGuardAlgorithm = 1; - guard_selection_t *gs = get_guard_selection_info(); - const smartlist_t *all_entry_guards = - get_entry_guards_for_guard_selection(gs); - const char *entrynodes_str = "test003r"; - const node_t *chosen_entry = NULL; - int retval; - - (void) arg; - - /* Prase EntryNodes as a routerset. */ - options->EntryNodes = routerset_new(); - retval = routerset_parse(options->EntryNodes, - entrynodes_str, - "test_entrynodes"); - tt_int_op(retval, OP_GE, 0); - - /* Read nodes from EntryNodes */ - entry_guards_set_from_config(gs, options); - - /* Test that only one guard was added. */ - tt_int_op(smartlist_len(all_entry_guards), OP_EQ, 1); - - /* Make sure it was the guard we specified. */ - chosen_entry = choose_random_entry(NULL); - tt_str_op(chosen_entry->ri->nickname, OP_EQ, entrynodes_str); - - done: - routerset_free(options->EntryNodes); -} - -static void -test_entry_is_time_to_retry(void *arg) -{ - entry_guard_t *test_guard; - time_t now; - int retval; - (void)arg; - - now = time(NULL); - - test_guard = tor_malloc_zero(sizeof(entry_guard_t)); - - test_guard->last_attempted = now - 10; - test_guard->unreachable_since = now - 1; - - retval = entry_is_time_to_retry(test_guard,now); - tt_int_op(retval,OP_EQ,1); - - test_guard->unreachable_since = now - (6*60*60 - 1); - test_guard->last_attempted = now - (60*60 + 1); - - retval = entry_is_time_to_retry(test_guard,now); - tt_int_op(retval,OP_EQ,1); - - test_guard->last_attempted = now - (60*60 - 1); - - retval = entry_is_time_to_retry(test_guard,now); - tt_int_op(retval,OP_EQ,0); - - test_guard->unreachable_since = now - (6*60*60 + 1); - test_guard->last_attempted = now - (4*60*60 + 1); - - retval = entry_is_time_to_retry(test_guard,now); - tt_int_op(retval,OP_EQ,1); - - test_guard->unreachable_since = now - (3*24*60*60 - 1); - test_guard->last_attempted = now - (4*60*60 + 1); - - retval = entry_is_time_to_retry(test_guard,now); - tt_int_op(retval,OP_EQ,1); - - test_guard->unreachable_since = now - (3*24*60*60 + 1); - test_guard->last_attempted = now - (18*60*60 + 1); - - retval = entry_is_time_to_retry(test_guard,now); - tt_int_op(retval,OP_EQ,1); - - test_guard->unreachable_since = now - (7*24*60*60 - 1); - test_guard->last_attempted = now - (18*60*60 + 1); - - retval = entry_is_time_to_retry(test_guard,now); - tt_int_op(retval,OP_EQ,1); - - test_guard->last_attempted = now - (18*60*60 - 1); - - retval = entry_is_time_to_retry(test_guard,now); - tt_int_op(retval,OP_EQ,0); - - test_guard->unreachable_since = now - (7*24*60*60 + 1); - test_guard->last_attempted = now - (36*60*60 + 1); - - retval = entry_is_time_to_retry(test_guard,now); - tt_int_op(retval,OP_EQ,1); - - test_guard->unreachable_since = now - (7*24*60*60 + 1); - test_guard->last_attempted = now - (36*60*60 + 1); - - retval = entry_is_time_to_retry(test_guard,now); - tt_int_op(retval,OP_EQ,1); - - done: - tor_free(test_guard); -} - -/** XXX Do some tests that entry_is_live() */ -static void -test_entry_is_live(void *arg) -{ - smartlist_t *our_nodelist = NULL; - guard_selection_t *gs = get_guard_selection_info(); - const smartlist_t *all_entry_guards = - get_entry_guards_for_guard_selection(gs); - const node_t *test_node = NULL; - const entry_guard_t *test_entry = NULL; - const char *msg; - int which_node; - - (void) arg; - - /* The global entry guards smartlist should be empty now. */ - tt_int_op(smartlist_len(all_entry_guards), OP_EQ, 0); - - /* Walk the nodelist and add all nodes as entry guards. */ - our_nodelist = nodelist_get_list(); - tt_int_op(smartlist_len(our_nodelist), OP_EQ, HELPER_NUMBER_OF_DESCRIPTORS); - - SMARTLIST_FOREACH_BEGIN(our_nodelist, const node_t *, node) { - const node_t *node_tmp; - node_tmp = add_an_entry_guard(gs, node, 0, 1, 0, 0); - tt_assert(node_tmp); - - tt_int_op(node->is_stable, OP_EQ, 0); - tt_int_op(node->is_fast, OP_EQ, 0); - } SMARTLIST_FOREACH_END(node); - - /* Make sure the nodes were added as entry guards. */ - tt_int_op(smartlist_len(all_entry_guards), OP_EQ, - HELPER_NUMBER_OF_DESCRIPTORS); - - /* Now get a random test entry that we will use for this unit test. */ - which_node = 3; /* (chosen by fair dice roll) */ - test_entry = smartlist_get(all_entry_guards, which_node); - - /* Let's do some entry_is_live() tests! */ - - /* Require the node to be stable, but it's not. Should fail. - Also enable 'assume_reachable' because why not. */ - test_node = entry_is_live(test_entry, - ENTRY_NEED_UPTIME | ENTRY_ASSUME_REACHABLE, - &msg); - tt_assert(!test_node); - - /* Require the node to be fast, but it's not. Should fail. */ - test_node = entry_is_live(test_entry, - ENTRY_NEED_CAPACITY | ENTRY_ASSUME_REACHABLE, - &msg); - tt_assert(!test_node); - - /* Don't impose any restrictions on the node. Should succeed. */ - test_node = entry_is_live(test_entry, 0, &msg); - tt_assert(test_node); - tt_ptr_op(test_node, OP_EQ, node_get_by_id(test_entry->identity)); - - /* Require descriptor for this node. It has one so it should succeed. */ - test_node = entry_is_live(test_entry, ENTRY_NEED_DESCRIPTOR, &msg); - tt_assert(test_node); - tt_ptr_op(test_node, OP_EQ, node_get_by_id(test_entry->identity)); - - done: - ; /* XXX */ -} -#endif - #define TEST_IPV4_ADDR "123.45.67.89" #define TEST_IPV6_ADDR "[1234:5678:90ab:cdef::]" @@ -1473,14 +747,6 @@ test_entry_guard_parse_from_state_broken(void *arg) gs_df = get_guard_selection_by_name("default", GS_TYPE_NORMAL, 0); tt_assert(gs_df != NULL); tt_int_op(smartlist_len(gs_df->sampled_entry_guards), OP_EQ, 1); - guard_selection_t *gs_legacy = - get_guard_selection_by_name("legacy", GS_TYPE_LEGACY, 0); -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM - tt_assert(gs_legacy != NULL); - tt_int_op(smartlist_len(gs_legacy->chosen_entry_guards), OP_EQ, 0); -#else - tt_assert(gs_legacy == NULL); -#endif done: config_free_lines(lines); @@ -1520,17 +786,6 @@ test_entry_guard_get_guard_selection_by_name(void *arg) tt_assert(gs3 != gs1); tt_assert(gs3 == get_guard_selection_info()); - or_options_t *options = get_options_mutable(); - options->UseDeprecatedGuardAlgorithm = 1; - update_guard_selection_choice(options); - guard_selection_t *gs4 = get_guard_selection_info(); - tt_assert(gs4 != gs3); - tt_assert(gs4 == get_guard_selection_by_name("legacy", GS_TYPE_LEGACY, 1)); - - options->UseDeprecatedGuardAlgorithm = 0; - update_guard_selection_choice(options); - tt_assert(gs3 == get_guard_selection_info()); - done: entry_guards_free_all(); } @@ -1555,14 +810,6 @@ test_entry_guard_choose_selection_initial(void *arg) tt_int_op(type, OP_EQ, GS_TYPE_BRIDGE); get_options_mutable()->UseBridges = 0; - /* If we're using legacy guards, we get the legacy selection */ - get_options_mutable()->UseDeprecatedGuardAlgorithm = 1; - name = choose_guard_selection(get_options(), - dummy_consensus, NULL, &type); - tt_str_op(name, OP_EQ, "legacy"); - tt_int_op(type, OP_EQ, GS_TYPE_LEGACY); - get_options_mutable()->UseDeprecatedGuardAlgorithm = 0; - /* If we discard >99% of our guards, though, we should be in the restricted * set. */ tt_assert(get_options_mutable()->EntryNodes == NULL); @@ -2947,6 +2194,35 @@ test_entry_guard_select_and_cancel(void *arg) circuit_guard_state_free(guard); } +static void +test_entry_guard_drop_guards(void *arg) +{ + (void) arg; + int r; + const node_t *node = NULL; + circuit_guard_state_t *guard; + guard_selection_t *gs = get_guard_selection_info(); + + // Pick a guard, to get things set up. + r = entry_guard_pick_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, + &node, &guard); + tt_int_op(r, OP_EQ, 0); + tt_int_op(smartlist_len(gs->sampled_entry_guards), OP_GE, + DFLT_MIN_FILTERED_SAMPLE_SIZE); + tt_ptr_op(gs, OP_EQ, get_guard_selection_info()); + + // Drop all the guards! (This is a bad idea....) + remove_all_entry_guards_for_guard_selection(gs); + gs = get_guard_selection_info(); + tt_int_op(smartlist_len(gs->sampled_entry_guards), OP_EQ, 0); + tt_int_op(smartlist_len(gs->primary_entry_guards), OP_EQ, 0); + tt_int_op(smartlist_len(gs->confirmed_entry_guards), OP_EQ, 0); + + done: + circuit_guard_state_free(guard); + guard_selection_free(gs); +} + /* Unit test setup function: Create a fake network, and set everything up * for testing the upgrade-a-waiting-circuit code. */ typedef struct { @@ -3361,12 +2637,6 @@ test_enty_guard_should_expire_waiting(void *arg) tor_free(fake_state); } -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM -static const struct testcase_setup_t fake_network = { - fake_network_setup, fake_network_cleanup -}; -#endif - static const struct testcase_setup_t big_fake_network = { big_fake_network_setup, big_fake_network_cleanup }; @@ -3383,33 +2653,6 @@ static const struct testcase_setup_t upgrade_circuits = { (void*)(arg) } struct testcase_t entrynodes_tests[] = { -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM - { "entry_is_time_to_retry", test_entry_is_time_to_retry, - TT_FORK, NULL, NULL }, - { "choose_random_entry_no_guards", test_choose_random_entry_no_guards, - TT_FORK, &fake_network, NULL }, - { "choose_random_entry_one_possible_guard", - test_choose_random_entry_one_possible_guard, - TT_FORK, &fake_network, NULL }, - { "populate_live_entry_guards_1guard", - test_populate_live_entry_guards_1guard, - TT_FORK, &fake_network, NULL }, - { "populate_live_entry_guards_3guards", - test_populate_live_entry_guards_3guards, - TT_FORK, &fake_network, NULL }, - { "entry_guards_parse_state_simple", - test_entry_guards_parse_state_simple, - TT_FORK, &fake_network, NULL }, - { "entry_guards_parse_state_pathbias", - test_entry_guards_parse_state_pathbias, - TT_FORK, &fake_network, NULL }, - { "entry_guards_set_from_config", - test_entry_guards_set_from_config, - TT_FORK, &fake_network, NULL }, - { "entry_is_live", - test_entry_is_live, - TT_FORK, &fake_network, NULL }, -#endif { "node_preferred_orport", test_node_preferred_orport, 0, NULL, NULL }, @@ -3453,6 +2696,7 @@ struct testcase_t entrynodes_tests[] = { BFN_TEST(select_for_circuit_highlevel_confirm_other), BFN_TEST(select_for_circuit_highlevel_primary_retry), BFN_TEST(select_and_cancel), + BFN_TEST(drop_guards), UPGRADE_TEST(upgrade_a_circuit, "c1-done c2-done"), UPGRADE_TEST(upgrade_blocked_by_live_primary_guards, "c1-done c2-done"), diff --git a/src/test/test_helpers.c b/src/test/test_helpers.c index 132af39776..5b84366e6d 100644 --- a/src/test/test_helpers.c +++ b/src/test/test_helpers.c @@ -128,3 +128,18 @@ dummy_origin_circuit_new(int n_cells) return TO_CIRCUIT(circ); } +/** Mock-replacement. As tor_addr_lookup, but always fails on any + * address containing a !. This is necessary for running the unit tests + * on networks where DNS hijackers think it's helpful to give answers + * for things like 1.2.3.4.5 or "invalidstuff!!" + */ +int +mock_tor_addr_lookup__fail_on_bad_addrs(const char *name, + uint16_t family, tor_addr_t *out) +{ + if (name && strchr(name, '!')) { + return -1; + } + return tor_addr_lookup__real(name, family, out); +} + diff --git a/src/test/test_helpers.h b/src/test/test_helpers.h index ba93b100d5..c6d4d9c41f 100644 --- a/src/test/test_helpers.h +++ b/src/test/test_helpers.h @@ -17,6 +17,9 @@ void helper_setup_fake_routerlist(void); void connection_write_to_buf_mock(const char *string, size_t len, connection_t *conn, int zlib); +int mock_tor_addr_lookup__fail_on_bad_addrs(const char *name, + uint16_t family, tor_addr_t *out); + extern const char TEST_DESCRIPTORS[]; #endif diff --git a/src/test/test_hs.c b/src/test/test_hs.c index ac9788ceea..fbaabe91d8 100644 --- a/src/test/test_hs.c +++ b/src/test/test_hs.c @@ -787,6 +787,126 @@ test_single_onion_poisoning(void *arg) tor_free(mock_options->DataDirectory); } +static rend_service_t * +helper_create_rend_service(const char *path) +{ + rend_service_t *s = tor_malloc_zero(sizeof(rend_service_t)); + s->ports = smartlist_new(); + s->intro_nodes = smartlist_new(); + s->expiring_nodes = smartlist_new(); + if (path) { + s->directory = tor_strdup(path); + } + return s; +} + +static void +test_prune_services_on_reload(void *arg) +{ + smartlist_t *new = smartlist_new(), *old = smartlist_new(); + /* Non ephemeral service. */ + rend_service_t *s1 = helper_create_rend_service("SomePath"); + /* Create a non ephemeral service with the _same_ path as so we can test the + * transfer of introduction point between the same services on reload. */ + rend_service_t *s2 = helper_create_rend_service(s1->directory); + /* Ephemeral service (directory is NULL). */ + rend_service_t *e1 = helper_create_rend_service(NULL); + rend_service_t *e2 = helper_create_rend_service(NULL); + + (void) arg; + + { + /* Add both services to the old list. */ + smartlist_add(old, s1); + smartlist_add(old, e1); + /* Only put the non ephemeral in the new list. */ + smartlist_add(new, s1); + prune_services_on_reload(old, new); + /* We expect that the ephemeral one is in the new list but removed from + * the old one. */ + tt_int_op(smartlist_len(old), OP_EQ, 1); + tt_assert(smartlist_get(old, 0) == s1); + tt_int_op(smartlist_len(new), OP_EQ, 2); + tt_assert(smartlist_get(new, 0) == s1); + tt_assert(smartlist_get(new, 1) == e1); + /* Cleanup for next test. */ + smartlist_clear(new); + smartlist_clear(old); + } + + { + /* This test will make sure that only the ephemeral service is kept if the + * new list is empty. The old list should contain only the non ephemeral + * one. */ + smartlist_add(old, s1); + smartlist_add(old, e1); + prune_services_on_reload(old, new); + tt_int_op(smartlist_len(old), OP_EQ, 1); + tt_assert(smartlist_get(old, 0) == s1); + tt_int_op(smartlist_len(new), OP_EQ, 1); + tt_assert(smartlist_get(new, 0) == e1); + /* Cleanup for next test. */ + smartlist_clear(new); + smartlist_clear(old); + } + + { + /* This test makes sure that the new list stays the same even from the old + * list being completely different. */ + smartlist_add(new, s1); + smartlist_add(new, e1); + prune_services_on_reload(old, new); + tt_int_op(smartlist_len(old), OP_EQ, 0); + tt_int_op(smartlist_len(new), OP_EQ, 2); + tt_assert(smartlist_get(new, 0) == s1); + tt_assert(smartlist_get(new, 1) == e1); + /* Cleanup for next test. */ + smartlist_clear(new); + } + + { + rend_intro_point_t ip1; + /* This IP should be found in the s2 service after pruning. */ + smartlist_add(s1->intro_nodes, &ip1); + /* Setup our list. */ + smartlist_add(old, s1); + smartlist_add(new, s2); + prune_services_on_reload(old, new); + tt_int_op(smartlist_len(old), OP_EQ, 1); + /* Intro nodes have been moved to the s2 in theory so it must be empty. */ + tt_int_op(smartlist_len(s1->intro_nodes), OP_EQ, 0); + tt_int_op(smartlist_len(new), OP_EQ, 1); + rend_service_t *elem = smartlist_get(new, 0); + tt_assert(elem); + tt_assert(elem == s2); + tt_int_op(smartlist_len(elem->intro_nodes), OP_EQ, 1); + tt_assert(smartlist_get(elem->intro_nodes, 0) == &ip1); + smartlist_clear(s1->intro_nodes); + smartlist_clear(s2->intro_nodes); + /* Cleanup for next test. */ + smartlist_clear(new); + smartlist_clear(old); + } + + { + /* Test two ephemeral services. */ + smartlist_add(old, e1); + smartlist_add(old, e2); + prune_services_on_reload(old, new); + /* Check if they've all been transfered. */ + tt_int_op(smartlist_len(old), OP_EQ, 0); + tt_int_op(smartlist_len(new), OP_EQ, 2); + } + + done: + rend_service_free(s1); + rend_service_free(s2); + rend_service_free(e1); + rend_service_free(e2); + smartlist_free(new); + smartlist_free(old); +} + struct testcase_t hs_tests[] = { { "hs_rend_data", test_hs_rend_data, TT_FORK, NULL, NULL }, @@ -807,6 +927,9 @@ struct testcase_t hs_tests[] = { TT_FORK, &passthrough_setup, (void*)(CREATE_HS_DIR2) }, { "single_onion_poisoning_create_dir_both", test_single_onion_poisoning, TT_FORK, &passthrough_setup, (void*)(CREATE_HS_DIR1 | CREATE_HS_DIR2) }, + { "prune_services_on_reload", test_prune_services_on_reload, TT_FORK, + NULL, NULL }, + END_OF_TESTCASES }; diff --git a/src/test/test_hs_cache.c b/src/test/test_hs_cache.c index e7deec2e22..64391a7c29 100644 --- a/src/test/test_hs_cache.c +++ b/src/test/test_hs_cache.c @@ -66,27 +66,27 @@ helper_build_intro_point(const ed25519_keypair_t *blinded_kp, /* Return a valid hs_descriptor_t object. */ static hs_descriptor_t * helper_build_hs_desc(uint64_t revision_counter, uint32_t lifetime, - ed25519_keypair_t *blinded_kp) + ed25519_public_key_t *signing_pubkey) { int ret; + ed25519_keypair_t blinded_kp; hs_descriptor_t *descp = NULL, *desc = tor_malloc_zero(sizeof(*desc)); desc->plaintext_data.version = HS_DESC_SUPPORTED_FORMAT_VERSION_MAX; - ret = ed25519_keypair_generate(&desc->plaintext_data.signing_kp, 0); + + /* Copy only the public key into the descriptor. */ + memcpy(&desc->plaintext_data.signing_pubkey, signing_pubkey, + sizeof(ed25519_public_key_t)); + + ret = ed25519_keypair_generate(&blinded_kp, 0); tt_int_op(ret, ==, 0); - if (blinded_kp) { - memcpy(&desc->plaintext_data.blinded_kp, blinded_kp, - sizeof(ed25519_keypair_t)); - } else { - ret = ed25519_keypair_generate(&desc->plaintext_data.blinded_kp, 0); - tt_int_op(ret, ==, 0); - } + /* Copy only the public key into the descriptor. */ + memcpy(&desc->plaintext_data.blinded_pubkey, &blinded_kp.pubkey, + sizeof(ed25519_public_key_t)); desc->plaintext_data.signing_key_cert = - tor_cert_create(&desc->plaintext_data.blinded_kp, - CERT_TYPE_SIGNING_HS_DESC, - &desc->plaintext_data.signing_kp.pubkey, time(NULL), - 3600, CERT_FLAG_INCLUDE_SIGNING_KEY); + tor_cert_create(&blinded_kp, CERT_TYPE_SIGNING_HS_DESC, signing_pubkey, + time(NULL), 3600, CERT_FLAG_INCLUDE_SIGNING_KEY); tt_assert(desc->plaintext_data.signing_key_cert); desc->plaintext_data.revision_counter = revision_counter; desc->plaintext_data.lifetime_sec = lifetime; @@ -98,8 +98,7 @@ helper_build_hs_desc(uint64_t revision_counter, uint32_t lifetime, desc->encrypted_data.intro_points = smartlist_new(); /* Add an intro point. */ smartlist_add(desc->encrypted_data.intro_points, - helper_build_intro_point(&desc->plaintext_data.blinded_kp, - "1.2.3.4")); + helper_build_intro_point(&blinded_kp, "1.2.3.4")); descp = desc; done: @@ -109,12 +108,11 @@ helper_build_hs_desc(uint64_t revision_counter, uint32_t lifetime, /* Static variable used to encoded the HSDir query. */ static char query_b64[256]; -/* Build an HSDir query using a ed25519 keypair. */ +/* Build an HSDir query using a ed25519 public key. */ static const char * helper_get_hsdir_query(const hs_descriptor_t *desc) { - ed25519_public_to_base64(query_b64, - &desc->plaintext_data.blinded_kp.pubkey); + ed25519_public_to_base64(query_b64, &desc->plaintext_data.blinded_pubkey); return query_b64; } @@ -132,17 +130,20 @@ test_directory(void *arg) { int ret; size_t oom_size; - char *desc1_str=NULL; + char *desc1_str = NULL; const char *desc_out; - hs_descriptor_t *desc1; + ed25519_keypair_t signing_kp1; + hs_descriptor_t *desc1 = NULL; (void) arg; init_test(); /* Generate a valid descriptor with normal values. */ - desc1 = helper_build_hs_desc(42, 3 * 60 * 60, NULL); + ret = ed25519_keypair_generate(&signing_kp1, 0); + tt_int_op(ret, ==, 0); + desc1 = helper_build_hs_desc(42, 3 * 60 * 60, &signing_kp1.pubkey); tt_assert(desc1); - ret = hs_desc_encode_descriptor(desc1, &desc1_str); + ret = hs_desc_encode_descriptor(desc1, &signing_kp1, &desc1_str); tt_int_op(ret, OP_EQ, 0); /* Very first basic test, should be able to be stored, survive a @@ -170,10 +171,14 @@ test_directory(void *arg) /* Store two descriptors and remove the expiring one only. */ { - hs_descriptor_t *desc_zero_lifetime = helper_build_hs_desc(1, 0, NULL); + ed25519_keypair_t signing_kp_zero; + ret = ed25519_keypair_generate(&signing_kp_zero, 0); + tt_int_op(ret, ==, 0); + hs_descriptor_t *desc_zero_lifetime; + desc_zero_lifetime = helper_build_hs_desc(1, 0, &signing_kp_zero.pubkey); tt_assert(desc_zero_lifetime); char *desc_zero_lifetime_str; - ret = hs_desc_encode_descriptor(desc_zero_lifetime, + ret = hs_desc_encode_descriptor(desc_zero_lifetime, &signing_kp_zero, &desc_zero_lifetime_str); tt_int_op(ret, OP_EQ, 0); @@ -225,7 +230,7 @@ test_directory(void *arg) tt_int_op(ret, OP_EQ, 1); /* Bump revision counter. */ desc1->plaintext_data.revision_counter++; - ret = hs_desc_encode_descriptor(desc1, &new_desc_str); + ret = hs_desc_encode_descriptor(desc1, &signing_kp1, &new_desc_str); tt_int_op(ret, OP_EQ, 0); ret = hs_cache_store_as_dir(new_desc_str); tt_int_op(ret, OP_EQ, 0); @@ -248,15 +253,18 @@ test_clean_as_dir(void *arg) char *desc1_str = NULL; time_t now = time(NULL); hs_descriptor_t *desc1 = NULL; + ed25519_keypair_t signing_kp1; (void) arg; init_test(); /* Generate a valid descriptor with values. */ - desc1 = helper_build_hs_desc(42, 3 * 60 * 60, NULL); + ret = ed25519_keypair_generate(&signing_kp1, 0); + tt_int_op(ret, ==, 0); + desc1 = helper_build_hs_desc(42, 3 * 60 * 60, &signing_kp1.pubkey); tt_assert(desc1); - ret = hs_desc_encode_descriptor(desc1, &desc1_str); + ret = hs_desc_encode_descriptor(desc1, &signing_kp1, &desc1_str); tt_int_op(ret, OP_EQ, 0); ret = hs_cache_store_as_dir(desc1_str); tt_int_op(ret, OP_EQ, 0); @@ -343,7 +351,7 @@ static void test_upload_and_download_hs_desc(void *arg) { int retval; - hs_descriptor_t *published_desc; + hs_descriptor_t *published_desc = NULL; char *published_desc_str = NULL; char *received_desc_str = NULL; @@ -355,9 +363,13 @@ test_upload_and_download_hs_desc(void *arg) /* Generate a valid descriptor with normal values. */ { - published_desc = helper_build_hs_desc(42, 3 * 60 * 60, NULL); + ed25519_keypair_t signing_kp; + retval = ed25519_keypair_generate(&signing_kp, 0); + tt_int_op(retval, ==, 0); + published_desc = helper_build_hs_desc(42, 3 * 60 * 60, &signing_kp.pubkey); tt_assert(published_desc); - retval = hs_desc_encode_descriptor(published_desc, &published_desc_str); + retval = hs_desc_encode_descriptor(published_desc, &signing_kp, + &published_desc_str); tt_int_op(retval, OP_EQ, 0); } @@ -370,7 +382,7 @@ test_upload_and_download_hs_desc(void *arg) /* Simulate a fetch of the previously published descriptor */ { const ed25519_public_key_t *blinded_key; - blinded_key = &published_desc->plaintext_data.blinded_kp.pubkey; + blinded_key = &published_desc->plaintext_data.blinded_pubkey; received_desc_str = helper_fetch_desc_from_hsdir(blinded_key); } @@ -391,7 +403,9 @@ test_hsdir_revision_counter_check(void *arg) { int retval; - hs_descriptor_t *published_desc; + ed25519_keypair_t signing_kp; + + hs_descriptor_t *published_desc = NULL; char *published_desc_str = NULL; char *received_desc_str = NULL; @@ -404,9 +418,13 @@ test_hsdir_revision_counter_check(void *arg) /* Generate a valid descriptor with normal values. */ { - published_desc = helper_build_hs_desc(1312, 3 * 60 * 60, NULL); + retval = ed25519_keypair_generate(&signing_kp, 0); + tt_int_op(retval, ==, 0); + published_desc = helper_build_hs_desc(1312, 3 * 60 * 60, + &signing_kp.pubkey); tt_assert(published_desc); - retval = hs_desc_encode_descriptor(published_desc, &published_desc_str); + retval = hs_desc_encode_descriptor(published_desc, &signing_kp, + &published_desc_str); tt_int_op(retval, OP_EQ, 0); } @@ -426,7 +444,7 @@ test_hsdir_revision_counter_check(void *arg) { const ed25519_public_key_t *blinded_key; - blinded_key = &published_desc->plaintext_data.blinded_kp.pubkey; + blinded_key = &published_desc->plaintext_data.blinded_pubkey; received_desc_str = helper_fetch_desc_from_hsdir(blinded_key); retval = hs_desc_decode_descriptor(received_desc_str,NULL, &received_desc); @@ -445,7 +463,8 @@ test_hsdir_revision_counter_check(void *arg) { published_desc->plaintext_data.revision_counter = 1313; tor_free(published_desc_str); - retval = hs_desc_encode_descriptor(published_desc, &published_desc_str); + retval = hs_desc_encode_descriptor(published_desc, &signing_kp, + &published_desc_str); tt_int_op(retval, OP_EQ, 0); retval = handle_post_hs_descriptor("/tor/hs/3/publish",published_desc_str); @@ -457,7 +476,7 @@ test_hsdir_revision_counter_check(void *arg) { const ed25519_public_key_t *blinded_key; - blinded_key = &published_desc->plaintext_data.blinded_kp.pubkey; + blinded_key = &published_desc->plaintext_data.blinded_pubkey; received_desc_str = helper_fetch_desc_from_hsdir(blinded_key); retval = hs_desc_decode_descriptor(received_desc_str,NULL, &received_desc); diff --git a/src/test/test_hs_descriptor.c b/src/test/test_hs_descriptor.c index 3f588dfcaf..02a71aa473 100644 --- a/src/test/test_hs_descriptor.c +++ b/src/test/test_hs_descriptor.c @@ -77,24 +77,28 @@ helper_build_intro_point(const ed25519_keypair_t *blinded_kp, time_t now, /* Return a valid hs_descriptor_t object. If no_ip is set, no introduction * points are added. */ static hs_descriptor_t * -helper_build_hs_desc(unsigned int no_ip) +helper_build_hs_desc(unsigned int no_ip, ed25519_public_key_t *signing_pubkey) { int ret; time_t now = time(NULL); + ed25519_keypair_t blinded_kp; hs_descriptor_t *descp = NULL, *desc = tor_malloc_zero(sizeof(*desc)); desc->plaintext_data.version = HS_DESC_SUPPORTED_FORMAT_VERSION_MAX; - ret = ed25519_keypair_generate(&desc->plaintext_data.signing_kp, 0); - tt_int_op(ret, ==, 0); - ret = ed25519_keypair_generate(&desc->plaintext_data.blinded_kp, 0); + + /* Copy only the public key into the descriptor. */ + memcpy(&desc->plaintext_data.signing_pubkey, signing_pubkey, + sizeof(ed25519_public_key_t)); + + ret = ed25519_keypair_generate(&blinded_kp, 0); tt_int_op(ret, ==, 0); + /* Copy only the public key into the descriptor. */ + memcpy(&desc->plaintext_data.blinded_pubkey, &blinded_kp.pubkey, + sizeof(ed25519_public_key_t)); desc->plaintext_data.signing_key_cert = - tor_cert_create(&desc->plaintext_data.blinded_kp, - CERT_TYPE_SIGNING_HS_DESC, - &desc->plaintext_data.signing_kp.pubkey, now, - 3600, - CERT_FLAG_INCLUDE_SIGNING_KEY); + tor_cert_create(&blinded_kp, CERT_TYPE_SIGNING_HS_DESC, signing_pubkey, + now, 3600, CERT_FLAG_INCLUDE_SIGNING_KEY); tt_assert(desc->plaintext_data.signing_key_cert); desc->plaintext_data.revision_counter = 42; desc->plaintext_data.lifetime_sec = 3 * 60 * 60; @@ -108,17 +112,13 @@ helper_build_hs_desc(unsigned int no_ip) if (!no_ip) { /* Add four intro points. */ smartlist_add(desc->encrypted_data.intro_points, - helper_build_intro_point(&desc->plaintext_data.blinded_kp, now, - "1.2.3.4", 0)); + helper_build_intro_point(&blinded_kp, now, "1.2.3.4", 0)); smartlist_add(desc->encrypted_data.intro_points, - helper_build_intro_point(&desc->plaintext_data.blinded_kp, now, - "[2600::1]", 0)); + helper_build_intro_point(&blinded_kp, now, "[2600::1]", 0)); smartlist_add(desc->encrypted_data.intro_points, - helper_build_intro_point(&desc->plaintext_data.blinded_kp, now, - "3.2.1.4", 1)); + helper_build_intro_point(&blinded_kp, now, "3.2.1.4", 1)); smartlist_add(desc->encrypted_data.intro_points, - helper_build_intro_point(&desc->plaintext_data.blinded_kp, now, - "", 1)); + helper_build_intro_point(&blinded_kp, now, "", 1)); } descp = desc; @@ -138,11 +138,11 @@ helper_compare_hs_desc(const hs_descriptor_t *desc1, desc2->plaintext_data.lifetime_sec); tt_assert(tor_cert_eq(desc1->plaintext_data.signing_key_cert, desc2->plaintext_data.signing_key_cert)); - tt_mem_op(desc1->plaintext_data.signing_kp.pubkey.pubkey, OP_EQ, - desc2->plaintext_data.signing_kp.pubkey.pubkey, + tt_mem_op(desc1->plaintext_data.signing_pubkey.pubkey, OP_EQ, + desc2->plaintext_data.signing_pubkey.pubkey, ED25519_PUBKEY_LEN); - tt_mem_op(desc1->plaintext_data.blinded_kp.pubkey.pubkey, OP_EQ, - desc2->plaintext_data.blinded_kp.pubkey.pubkey, + tt_mem_op(desc1->plaintext_data.blinded_pubkey.pubkey, OP_EQ, + desc2->plaintext_data.blinded_pubkey.pubkey, ED25519_PUBKEY_LEN); tt_u64_op(desc1->plaintext_data.revision_counter, ==, desc2->plaintext_data.revision_counter); @@ -481,11 +481,15 @@ test_encode_descriptor(void *arg) { int ret; char *encoded = NULL; - hs_descriptor_t *desc = helper_build_hs_desc(0); + ed25519_keypair_t signing_kp; + hs_descriptor_t *desc = NULL; (void) arg; - ret = hs_desc_encode_descriptor(desc, &encoded); + ret = ed25519_keypair_generate(&signing_kp, 0); + tt_int_op(ret, ==, 0); + desc = helper_build_hs_desc(0, &signing_kp.pubkey); + ret = hs_desc_encode_descriptor(desc, &signing_kp, &encoded); tt_int_op(ret, ==, 0); tt_assert(encoded); @@ -499,17 +503,22 @@ test_decode_descriptor(void *arg) { int ret; char *encoded = NULL; - hs_descriptor_t *desc = helper_build_hs_desc(0); + ed25519_keypair_t signing_kp; + hs_descriptor_t *desc = NULL; hs_descriptor_t *decoded = NULL; hs_descriptor_t *desc_no_ip = NULL; (void) arg; + ret = ed25519_keypair_generate(&signing_kp, 0); + tt_int_op(ret, ==, 0); + desc = helper_build_hs_desc(0, &signing_kp.pubkey); + /* Give some bad stuff to the decoding function. */ ret = hs_desc_decode_descriptor("hladfjlkjadf", NULL, &decoded); tt_int_op(ret, OP_EQ, -1); - ret = hs_desc_encode_descriptor(desc, &encoded); + ret = hs_desc_encode_descriptor(desc, &signing_kp, &encoded); tt_int_op(ret, ==, 0); tt_assert(encoded); @@ -521,10 +530,13 @@ test_decode_descriptor(void *arg) /* Decode a descriptor with _no_ introduction points. */ { - desc_no_ip = helper_build_hs_desc(1); + ed25519_keypair_t signing_kp_no_ip; + ret = ed25519_keypair_generate(&signing_kp_no_ip, 0); + tt_int_op(ret, ==, 0); + desc_no_ip = helper_build_hs_desc(1, &signing_kp_no_ip.pubkey); tt_assert(desc_no_ip); tor_free(encoded); - ret = hs_desc_encode_descriptor(desc_no_ip, &encoded); + ret = hs_desc_encode_descriptor(desc_no_ip, &signing_kp_no_ip, &encoded); tt_int_op(ret, ==, 0); tt_assert(encoded); hs_descriptor_free(decoded); @@ -599,6 +611,7 @@ test_decode_intro_point(void *arg) char *encoded_ip = NULL; size_t len_out; hs_desc_intro_point_t *ip = NULL; + ed25519_keypair_t signing_kp; hs_descriptor_t *desc = NULL; (void) arg; @@ -647,7 +660,9 @@ test_decode_intro_point(void *arg) /* Start by testing the "decode all intro points" function. */ { char *line; - desc = helper_build_hs_desc(0); + ret = ed25519_keypair_generate(&signing_kp, 0); + tt_int_op(ret, ==, 0); + desc = helper_build_hs_desc(0, &signing_kp.pubkey); tt_assert(desc); /* Only try to decode an incomplete introduction point section. */ tor_asprintf(&line, "\n%s", intro_point); @@ -674,7 +689,10 @@ test_decode_intro_point(void *arg) /* Try to decode a junk string. */ { hs_descriptor_free(desc); - desc = helper_build_hs_desc(0); + desc = NULL; + ret = ed25519_keypair_generate(&signing_kp, 0); + tt_int_op(ret, ==, 0); + desc = helper_build_hs_desc(0, &signing_kp.pubkey); const char *junk = "this is not a descriptor"; ip = decode_introduction_point(desc, junk); tt_assert(!ip); @@ -977,10 +995,10 @@ test_desc_signature(void *arg) tt_int_op(ret, ==, 0); /* Build the descriptor that should be valid. */ tor_asprintf(&desc, "%ssignature %s\n", data, sig_b64); - ret = desc_sig_is_valid(sig_b64, &kp, desc, strlen(desc)); + ret = desc_sig_is_valid(sig_b64, &kp.pubkey, desc, strlen(desc)); tt_int_op(ret, ==, 1); /* Junk signature. */ - ret = desc_sig_is_valid("JUNK", &kp, desc, strlen(desc)); + ret = desc_sig_is_valid("JUNK", &kp.pubkey, desc, strlen(desc)); tt_int_op(ret, ==, 0); done: diff --git a/src/test/test_hs_intropoint.c b/src/test/test_hs_intropoint.c index 608988ba9a..770fff42d2 100644 --- a/src/test/test_hs_intropoint.c +++ b/src/test/test_hs_intropoint.c @@ -12,19 +12,26 @@ #define CIRCUITLIST_PRIVATE #include "test.h" +#include "log_test_helpers.h" #include "crypto.h" +#include "log_test_helpers.h" #include "or.h" #include "ht.h" +/* Trunnel. */ #include "hs/cell_establish_intro.h" +#include "hs/cell_introduce1.h" +#include "hs/cell_common.h" #include "hs_service.h" +#include "hs_common.h" #include "hs_circuitmap.h" #include "hs_intropoint.h" #include "circuitlist.h" #include "circuituse.h" #include "rendservice.h" +#include "relay.h" /* Mock function to avoid networking in unittests */ static int @@ -34,6 +41,81 @@ mock_send_intro_established_cell(or_circuit_t *circ) return 0; } +static int +mock_relay_send_command_from_edge(streamid_t stream_id, circuit_t *circ, + uint8_t relay_command, const char *payload, + size_t payload_len, + crypt_path_t *cpath_layer, + const char *filename, int lineno) +{ + (void) stream_id; + (void) circ; + (void) relay_command; + (void) payload; + (void) payload_len; + (void) cpath_layer; + (void) filename; + (void) lineno; + return 0; +} + +static or_circuit_t * +helper_create_intro_circuit(void) +{ + or_circuit_t *circ = or_circuit_new(0, NULL); + tt_assert(circ); + circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_OR); + done: + return circ; +} + +static hs_cell_introduce1_t * +helper_create_introduce1_cell(void) +{ + hs_cell_introduce1_t *cell = NULL; + ed25519_keypair_t auth_key_kp; + + /* Generate the auth_key of the cell. */ + if (ed25519_keypair_generate(&auth_key_kp, 0) < 0) { + goto err; + } + + cell = hs_cell_introduce1_new(); + tt_assert(cell); + + /* Set the auth key. */ + { + size_t auth_key_len = sizeof(auth_key_kp.pubkey); + hs_cell_introduce1_set_auth_key_type(cell, + HS_INTRO_AUTH_KEY_TYPE_ED25519); + hs_cell_introduce1_set_auth_key_len(cell, auth_key_len); + hs_cell_introduce1_setlen_auth_key(cell, auth_key_len); + uint8_t *auth_key_ptr = hs_cell_introduce1_getarray_auth_key(cell); + memcpy(auth_key_ptr, auth_key_kp.pubkey.pubkey, auth_key_len); + } + + /* Set the cell extentions to none. */ + { + cell_extension_t *ext = cell_extension_new(); + cell_extension_set_num(ext, 0); + hs_cell_introduce1_set_extensions(cell, ext); + } + + /* Set the encrypted section to some data. */ + { + size_t enc_len = 128; + hs_cell_introduce1_setlen_encrypted(cell, enc_len); + uint8_t *enc_ptr = hs_cell_introduce1_getarray_encrypted(cell); + memset(enc_ptr, 'a', enc_len); + } + + return cell; + err: + done: + hs_cell_introduce1_free(cell); + return NULL; +} + /* Try sending an ESTABLISH_INTRO cell on a circuit that is already an intro * point. Should fail. */ static void @@ -143,6 +225,163 @@ test_establish_intro_wrong_keytype2(void *arg) circuit_free(TO_CIRCUIT(intro_circ)); } +/* Send a legit ESTABLISH_INTRO cell but with a wrong MAC. Should fail. */ +static void +test_establish_intro_wrong_mac(void *arg) +{ + int retval; + hs_cell_establish_intro_t *establish_intro_cell = NULL; + or_circuit_t *intro_circ = or_circuit_new(0,NULL);; + uint8_t cell_body[RELAY_PAYLOAD_SIZE]; + ssize_t cell_len = 0; + uint8_t circuit_key_material[DIGEST_LEN] = {0}; + + (void)arg; + + /* Get the auth key of the intro point */ + crypto_rand((char *) circuit_key_material, sizeof(circuit_key_material)); + helper_prepare_circ_for_intro(intro_circ, circuit_key_material); + + /* Create outgoing ESTABLISH_INTRO cell and extract its payload so that we + attempt to parse it. */ + establish_intro_cell = generate_establish_intro_cell(circuit_key_material, + sizeof(circuit_key_material)); + tt_assert(establish_intro_cell); + /* Mangle one byte of the MAC. */ + uint8_t *handshake_ptr = + hs_cell_establish_intro_getarray_handshake_mac(establish_intro_cell); + handshake_ptr[TRUNNEL_SHA3_256_LEN - 1]++; + /* We need to resign the payload with that change. */ + { + ed25519_signature_t sig; + ed25519_keypair_t key_struct; + /* New keypair for the signature since we don't have access to the private + * key material generated earlier when creating the cell. */ + retval = ed25519_keypair_generate(&key_struct, 0); + tt_int_op(retval, OP_EQ, 0); + uint8_t *auth_key_ptr = + hs_cell_establish_intro_getarray_auth_key(establish_intro_cell); + memcpy(auth_key_ptr, key_struct.pubkey.pubkey, ED25519_PUBKEY_LEN); + /* Encode payload so we can sign it. */ + cell_len = get_establish_intro_payload(cell_body, sizeof(cell_body), + establish_intro_cell); + tt_int_op(cell_len, >, 0); + + retval = ed25519_sign_prefixed(&sig, cell_body, + cell_len - + (ED25519_SIG_LEN + + sizeof(establish_intro_cell->sig_len)), + ESTABLISH_INTRO_SIG_PREFIX, &key_struct); + tt_int_op(retval, OP_EQ, 0); + /* And write the signature to the cell */ + uint8_t *sig_ptr = + hs_cell_establish_intro_getarray_sig(establish_intro_cell); + memcpy(sig_ptr, sig.sig, establish_intro_cell->sig_len); + /* Re-encode with the new signature. */ + cell_len = get_establish_intro_payload(cell_body, sizeof(cell_body), + establish_intro_cell); + } + + /* Receive the cell. Should fail because our MAC is wrong. */ + setup_full_capture_of_logs(LOG_INFO); + retval = hs_intro_received_establish_intro(intro_circ, cell_body, cell_len); + expect_log_msg_containing("ESTABLISH_INTRO handshake_auth not as expected"); + teardown_capture_of_logs(); + tt_int_op(retval, ==, -1); + + done: + hs_cell_establish_intro_free(establish_intro_cell); + circuit_free(TO_CIRCUIT(intro_circ)); +} + +/* Send a legit ESTABLISH_INTRO cell but with a wrong auth key length. Should + * fail. */ +static void +test_establish_intro_wrong_auth_key_len(void *arg) +{ + int retval; + hs_cell_establish_intro_t *establish_intro_cell = NULL; + or_circuit_t *intro_circ = or_circuit_new(0,NULL);; + uint8_t cell_body[RELAY_PAYLOAD_SIZE]; + ssize_t cell_len = 0; + size_t bad_auth_key_len = ED25519_PUBKEY_LEN - 1; + uint8_t circuit_key_material[DIGEST_LEN] = {0}; + + (void)arg; + + /* Get the auth key of the intro point */ + crypto_rand((char *) circuit_key_material, sizeof(circuit_key_material)); + helper_prepare_circ_for_intro(intro_circ, circuit_key_material); + + /* Create outgoing ESTABLISH_INTRO cell and extract its payload so that we + attempt to parse it. */ + establish_intro_cell = generate_establish_intro_cell(circuit_key_material, + sizeof(circuit_key_material)); + tt_assert(establish_intro_cell); + /* Mangle the auth key length. */ + hs_cell_establish_intro_set_auth_key_len(establish_intro_cell, + bad_auth_key_len); + hs_cell_establish_intro_setlen_auth_key(establish_intro_cell, + bad_auth_key_len); + cell_len = get_establish_intro_payload(cell_body, sizeof(cell_body), + establish_intro_cell); + tt_int_op(cell_len, >, 0); + + /* Receive the cell. Should fail. */ + setup_full_capture_of_logs(LOG_INFO); + retval = hs_intro_received_establish_intro(intro_circ, cell_body, cell_len); + expect_log_msg_containing("ESTABLISH_INTRO auth key length is invalid"); + teardown_capture_of_logs(); + tt_int_op(retval, ==, -1); + + done: + hs_cell_establish_intro_free(establish_intro_cell); + circuit_free(TO_CIRCUIT(intro_circ)); +} + +/* Send a legit ESTABLISH_INTRO cell but with a wrong sig length. Should + * fail. */ +static void +test_establish_intro_wrong_sig_len(void *arg) +{ + int retval; + hs_cell_establish_intro_t *establish_intro_cell = NULL; + or_circuit_t *intro_circ = or_circuit_new(0,NULL);; + uint8_t cell_body[RELAY_PAYLOAD_SIZE]; + ssize_t cell_len = 0; + size_t bad_sig_len = ED25519_SIG_LEN - 1; + uint8_t circuit_key_material[DIGEST_LEN] = {0}; + + (void)arg; + + /* Get the auth key of the intro point */ + crypto_rand((char *) circuit_key_material, sizeof(circuit_key_material)); + helper_prepare_circ_for_intro(intro_circ, circuit_key_material); + + /* Create outgoing ESTABLISH_INTRO cell and extract its payload so that we + attempt to parse it. */ + establish_intro_cell = generate_establish_intro_cell(circuit_key_material, + sizeof(circuit_key_material)); + tt_assert(establish_intro_cell); + /* Mangle the signature length. */ + hs_cell_establish_intro_set_sig_len(establish_intro_cell, bad_sig_len); + hs_cell_establish_intro_setlen_sig(establish_intro_cell, bad_sig_len); + cell_len = get_establish_intro_payload(cell_body, sizeof(cell_body), + establish_intro_cell); + tt_int_op(cell_len, >, 0); + + /* Receive the cell. Should fail. */ + setup_full_capture_of_logs(LOG_INFO); + retval = hs_intro_received_establish_intro(intro_circ, cell_body, cell_len); + expect_log_msg_containing("ESTABLISH_INTRO sig len is invalid"); + teardown_capture_of_logs(); + tt_int_op(retval, ==, -1); + + done: + hs_cell_establish_intro_free(establish_intro_cell); + circuit_free(TO_CIRCUIT(intro_circ)); +} + /* Send a legit ESTABLISH_INTRO cell but slightly change the signature. Should * fail. */ static void @@ -294,7 +533,8 @@ test_intro_point_registration(void *arg) the_hs_circuitmap = get_hs_circuitmap(); tt_assert(the_hs_circuitmap); tt_int_op(1, ==, HT_SIZE(the_hs_circuitmap)); - get_auth_key_from_establish_intro_cell(&auth_key, establish_intro_cell); + get_auth_key_from_cell(&auth_key, RELAY_COMMAND_ESTABLISH_INTRO, + establish_intro_cell); returned_intro_circ = hs_circuitmap_get_intro_circ_v3(&auth_key); tt_ptr_op(intro_circ, ==, returned_intro_circ); } @@ -340,6 +580,246 @@ test_intro_point_registration(void *arg) UNMOCK(hs_intro_send_intro_established_cell); } +static void +test_introduce1_suitable_circuit(void *arg) +{ + int ret; + or_circuit_t *circ = NULL; + + (void) arg; + + /* Valid suitable circuit. */ + { + circ = or_circuit_new(0, NULL); + circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_OR); + ret = circuit_is_suitable_for_introduce1(circ); + circuit_free(TO_CIRCUIT(circ)); + tt_int_op(ret, OP_EQ, 1); + } + + /* Test if the circuit purpose safeguard works correctly. */ + { + circ = or_circuit_new(0, NULL); + circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_INTRO_POINT); + ret = circuit_is_suitable_for_introduce1(circ); + circuit_free(TO_CIRCUIT(circ)); + tt_int_op(ret, OP_EQ, 0); + } + + /* Test the non-edge circuit safeguard works correctly. */ + { + circ = or_circuit_new(0, NULL); + circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_OR); + /* Bogus pointer, the check is against NULL on n_chan. */ + circ->base_.n_chan = (channel_t *) circ; + ret = circuit_is_suitable_for_introduce1(circ); + circuit_free(TO_CIRCUIT(circ)); + tt_int_op(ret, OP_EQ, 0); + } + + /* Mangle the circuit a bit more so see if our only one INTRODUCE1 cell + * limit works correctly. */ + { + circ = or_circuit_new(0, NULL); + circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_OR); + circ->already_received_introduce1 = 1; + ret = circuit_is_suitable_for_introduce1(circ); + circuit_free(TO_CIRCUIT(circ)); + tt_int_op(ret, OP_EQ, 0); + } + + done: + ; +} + +static void +test_introduce1_is_legacy(void *arg) +{ + int ret; + uint8_t request[256]; + + (void) arg; + + /* For a cell to be considered legacy, according to the specification, the + * first 20 bytes MUST BE non-zero else it's a v3 cell. */ + memset(request, 'a', DIGEST_LEN); + memset(request + DIGEST_LEN, 0, sizeof(request) - DIGEST_LEN); + ret = introduce1_cell_is_legacy(request); + tt_int_op(ret, OP_EQ, 1); + + /* This is a NON legacy cell. */ + memset(request, 0, DIGEST_LEN); + memset(request + DIGEST_LEN, 'a', sizeof(request) - DIGEST_LEN); + ret = introduce1_cell_is_legacy(request); + tt_int_op(ret, OP_EQ, 0); + + done: + ; +} + +static void +test_introduce1_validation(void *arg) +{ + int ret; + hs_cell_introduce1_t *cell = NULL; + + (void) arg; + + /* Create our decoy cell that we'll modify as we go to test the validation + * function of that parsed cell. */ + cell = helper_create_introduce1_cell(); + + /* It should NOT be a legacy cell which will trigger a BUG(). */ + memset(cell->legacy_key_id, 'a', sizeof(cell->legacy_key_id)); + tor_capture_bugs_(1); + ret = validate_introduce1_parsed_cell(cell); + tor_end_capture_bugs_(); + tt_int_op(ret, OP_EQ, -1); + /* Reset legacy ID and make sure it's correct. */ + memset(cell->legacy_key_id, 0, sizeof(cell->legacy_key_id)); + ret = validate_introduce1_parsed_cell(cell); + tt_int_op(ret, OP_EQ, 0); + + /* Non existing auth key type. */ + cell->auth_key_type = 42; + ret = validate_introduce1_parsed_cell(cell); + tt_int_op(ret, OP_EQ, -1); + /* Reset is to correct value and make sure it's correct. */ + cell->auth_key_type = HS_INTRO_AUTH_KEY_TYPE_ED25519; + ret = validate_introduce1_parsed_cell(cell); + tt_int_op(ret, OP_EQ, 0); + + /* Really bad key length. */ + cell->auth_key_len = 0; + ret = validate_introduce1_parsed_cell(cell); + tt_int_op(ret, OP_EQ, -1); + cell->auth_key_len = UINT16_MAX; + ret = validate_introduce1_parsed_cell(cell); + tt_int_op(ret, OP_EQ, -1); + /* Correct size, let's try that. */ + cell->auth_key_len = sizeof(ed25519_public_key_t); + ret = validate_introduce1_parsed_cell(cell); + tt_int_op(ret, OP_EQ, 0); + /* Set an invalid size of the auth key buffer. */ + hs_cell_introduce1_setlen_auth_key(cell, 3); + ret = validate_introduce1_parsed_cell(cell); + tt_int_op(ret, OP_EQ, -1); + /* Reset auth key buffer and make sure it works. */ + hs_cell_introduce1_setlen_auth_key(cell, sizeof(ed25519_public_key_t)); + ret = validate_introduce1_parsed_cell(cell); + tt_int_op(ret, OP_EQ, 0); + + /* Empty encrypted section. */ + hs_cell_introduce1_setlen_encrypted(cell, 0); + ret = validate_introduce1_parsed_cell(cell); + tt_int_op(ret, OP_EQ, -1); + /* Reset it to some non zero bytes and validate. */ + hs_cell_introduce1_setlen_encrypted(cell, 1); + ret = validate_introduce1_parsed_cell(cell); + tt_int_op(ret, OP_EQ, 0); + + done: + hs_cell_introduce1_free(cell); +} + +static void +test_received_introduce1_handling(void *arg) +{ + int ret; + uint8_t *request = NULL, buf[128]; + hs_cell_introduce1_t *cell = NULL; + or_circuit_t *circ = NULL; + + (void) arg; + + MOCK(relay_send_command_from_edge_, mock_relay_send_command_from_edge); + + hs_circuitmap_init(); + + /* Too small request length. An INTRODUCE1 expect at the very least a + * DIGEST_LEN size. */ + { + circ = helper_create_intro_circuit(); + ret = hs_intro_received_introduce1(circ, buf, DIGEST_LEN - 1); + tt_int_op(ret, OP_EQ, -1); + circuit_free(TO_CIRCUIT(circ)); + } + + /* We have a unit test only for the suitability of a circuit to receive an + * INTRODUCE1 cell so from now on we'll only test the handling of a cell. */ + + /* Bad request. */ + { + circ = helper_create_intro_circuit(); + uint8_t test[2]; /* Too small request. */ + ret = handle_introduce1(circ, test, sizeof(test)); + tor_free(circ->p_chan); + circuit_free(TO_CIRCUIT(circ)); + tt_int_op(ret, OP_EQ, -1); + } + + /* Valid case. */ + { + cell = helper_create_introduce1_cell(); + ssize_t request_len = hs_cell_introduce1_encoded_len(cell); + tt_size_op(request_len, OP_GT, 0); + request = tor_malloc_zero(request_len); + ssize_t encoded_len = + hs_cell_introduce1_encode(request, request_len, cell); + tt_size_op(encoded_len, OP_GT, 0); + + circ = helper_create_intro_circuit(); + or_circuit_t *service_circ = helper_create_intro_circuit(); + circuit_change_purpose(TO_CIRCUIT(service_circ), + CIRCUIT_PURPOSE_INTRO_POINT); + /* Register the circuit in the map for the auth key of the cell. */ + ed25519_public_key_t auth_key; + const uint8_t *cell_auth_key = + hs_cell_introduce1_getconstarray_auth_key(cell); + memcpy(auth_key.pubkey, cell_auth_key, ED25519_PUBKEY_LEN); + hs_circuitmap_register_intro_circ_v3(service_circ, &auth_key); + ret = hs_intro_received_introduce1(circ, request, request_len); + circuit_free(TO_CIRCUIT(circ)); + circuit_free(TO_CIRCUIT(service_circ)); + tt_int_op(ret, OP_EQ, 0); + } + + /* Valid legacy cell. */ + { + tor_free(request); + hs_cell_introduce1_free(cell); + cell = helper_create_introduce1_cell(); + uint8_t *legacy_key_id = hs_cell_introduce1_getarray_legacy_key_id(cell); + memset(legacy_key_id, 'a', DIGEST_LEN); + /* Add an arbitrary amount of data for the payload of a v2 cell. */ + size_t request_len = hs_cell_introduce1_encoded_len(cell) + 256; + tt_size_op(request_len, OP_GT, 0); + request = tor_malloc_zero(request_len + 256); + ssize_t encoded_len = + hs_cell_introduce1_encode(request, request_len, cell); + tt_size_op(encoded_len, OP_GT, 0); + + circ = helper_create_intro_circuit(); + or_circuit_t *service_circ = helper_create_intro_circuit(); + circuit_change_purpose(TO_CIRCUIT(service_circ), + CIRCUIT_PURPOSE_INTRO_POINT); + /* Register the circuit in the map for the auth key of the cell. */ + uint8_t token[REND_TOKEN_LEN]; + memcpy(token, legacy_key_id, sizeof(token)); + hs_circuitmap_register_intro_circ_v2(service_circ, token); + ret = hs_intro_received_introduce1(circ, request, request_len); + circuit_free(TO_CIRCUIT(circ)); + circuit_free(TO_CIRCUIT(service_circ)); + tt_int_op(ret, OP_EQ, 0); + } + + done: + hs_cell_introduce1_free(cell); + tor_free(request); + hs_circuitmap_free_all(); + UNMOCK(relay_send_command_from_edge_); +} + struct testcase_t hs_intropoint_tests[] = { { "intro_point_registration", test_intro_point_registration, TT_FORK, NULL, NULL }, @@ -356,6 +836,27 @@ struct testcase_t hs_intropoint_tests[] = { { "receive_establish_intro_wrong_sig", test_establish_intro_wrong_sig, TT_FORK, NULL, NULL }, + { "receive_establish_intro_wrong_sig_len", + test_establish_intro_wrong_sig_len, TT_FORK, NULL, NULL }, + + { "receive_establish_intro_wrong_auth_key_len", + test_establish_intro_wrong_auth_key_len, TT_FORK, NULL, NULL }, + + { "receive_establish_intro_wrong_mac", + test_establish_intro_wrong_mac, TT_FORK, NULL, NULL }, + + { "introduce1_suitable_circuit", + test_introduce1_suitable_circuit, TT_FORK, NULL, NULL }, + + { "introduce1_is_legacy", + test_introduce1_is_legacy, TT_FORK, NULL, NULL }, + + { "introduce1_validation", + test_introduce1_validation, TT_FORK, NULL, NULL }, + + { "received_introduce1_handling", + test_received_introduce1_handling, TT_FORK, NULL, NULL }, + END_OF_TESTCASES }; diff --git a/src/test/test_options.c b/src/test/test_options.c index e85e11805b..41c015bdd4 100644 --- a/src/test/test_options.c +++ b/src/test/test_options.c @@ -18,6 +18,7 @@ #include "sandbox.h" #include "memarea.h" #include "policies.h" +#include "test_helpers.h" #define NS_MODULE test_options @@ -332,7 +333,8 @@ fixed_get_uname(void) "VirtualAddrNetworkIPv4 127.192.0.0/10\n" \ "VirtualAddrNetworkIPv6 [FE80::]/10\n" \ "SchedulerHighWaterMark__ 42\n" \ - "SchedulerLowWaterMark__ 10\n" + "SchedulerLowWaterMark__ 10\n" \ + "UseEntryGuards 1\n" typedef struct { or_options_t *old_opt; @@ -650,16 +652,18 @@ test_options_validate__authdir(void *ignored) setup_capture_of_logs(LOG_INFO); options_test_data_t *tdata = get_options_test_data( "AuthoritativeDirectory 1\n" - "Address this.should.not_exist.example.org"); + "Address this.should.not!exist!.example.org"); sandbox_disable_getaddrinfo_cache(); + MOCK(tor_addr_lookup, mock_tor_addr_lookup__fail_on_bad_addrs); ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + UNMOCK(tor_addr_lookup); tt_int_op(ret, OP_EQ, -1); tt_str_op(msg, OP_EQ, "Failed to resolve/guess local address. See logs for" " details."); expect_log_msg("Could not resolve local Address " - "'this.should.not_exist.example.org'. Failing.\n"); + "'this.should.not!exist!.example.org'. Failing.\n"); tor_free(msg); free_options_test_data(tdata); @@ -1794,14 +1798,6 @@ test_options_validate__reachable_addresses(void *ignored) /* Test IPv4-only clients setting IPv6 preferences */ -#define WARN_PLEASE_USE_IPV6_OR_LOG_MSG \ - "ClientPreferIPv6ORPort 1 is ignored unless tor is using IPv6. " \ - "Please set ClientUseIPv6 1, ClientUseIPv4 0, or configure bridges.\n" - -#define WARN_PLEASE_USE_IPV6_DIR_LOG_MSG \ - "ClientPreferIPv6DirPort 1 is ignored unless tor is using IPv6. " \ - "Please set ClientUseIPv6 1, ClientUseIPv4 0, or configure bridges.\n" - free_options_test_data(tdata); tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES "ClientUseIPv4 1\n" @@ -1811,7 +1807,6 @@ test_options_validate__reachable_addresses(void *ignored) ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); tt_int_op(ret, OP_EQ, 0); - expect_log_msg(WARN_PLEASE_USE_IPV6_OR_LOG_MSG); tor_free(msg); free_options_test_data(tdata); @@ -1823,7 +1818,6 @@ test_options_validate__reachable_addresses(void *ignored) ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); tt_int_op(ret, OP_EQ, 0); - expect_log_msg(WARN_PLEASE_USE_IPV6_DIR_LOG_MSG); tor_free(msg); /* Now test an IPv4/IPv6 client setting IPv6 preferences */ @@ -1945,6 +1939,19 @@ test_options_validate__use_bridges(void *ignored) tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES "UseBridges 1\n" "Bridge 10.0.0.1\n" + "UseEntryGuards 0\n" + ); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, + "Setting UseBridges requires also setting UseEntryGuards."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "UseBridges 1\n" + "Bridge 10.0.0.1\n" "Bridge !!!\n" ); @@ -3037,6 +3044,7 @@ test_options_validate__proxy(void *ignored) options_test_data_t *tdata = NULL; sandbox_disable_getaddrinfo_cache(); setup_capture_of_logs(LOG_WARN); + MOCK(tor_addr_lookup, mock_tor_addr_lookup__fail_on_bad_addrs); free_options_test_data(tdata); tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES @@ -3057,6 +3065,7 @@ test_options_validate__proxy(void *ignored) tor_free(msg); free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES "HttpProxy not_so_valid!\n" ); @@ -3357,6 +3366,7 @@ test_options_validate__proxy(void *ignored) policies_free_all(); // sandbox_free_getaddrinfo_cache(); tor_free(msg); + UNMOCK(tor_addr_lookup); } static void diff --git a/src/test/test_policy.c b/src/test/test_policy.c index 4df40f618e..71a31118a1 100644 --- a/src/test/test_policy.c +++ b/src/test/test_policy.c @@ -1083,8 +1083,12 @@ test_policies_getinfo_helper_policies(void *arg) append_exit_policy_string(&mock_my_routerinfo.exit_policy, "reject *6:*"); mock_options.IPv6Exit = 1; - tor_addr_from_ipv4h(&mock_options.OutboundBindAddressIPv4_, TEST_IPV4_ADDR); - tor_addr_parse(&mock_options.OutboundBindAddressIPv6_, TEST_IPV6_ADDR); + tor_addr_from_ipv4h( + &mock_options.OutboundBindAddresses[OUTBOUND_ADDR_EXIT][0], + TEST_IPV4_ADDR); + tor_addr_parse( + &mock_options.OutboundBindAddresses[OUTBOUND_ADDR_EXIT][1], + TEST_IPV6_ADDR); mock_options.ExitPolicyRejectPrivate = 1; mock_options.ExitPolicyRejectLocalInterfaces = 1; diff --git a/src/test/test_routerlist.c b/src/test/test_routerlist.c index 73e8d1047c..78f1cf16b7 100644 --- a/src/test/test_routerlist.c +++ b/src/test/test_routerlist.c @@ -204,55 +204,6 @@ mock_usable_consensus_flavor(void) return mock_usable_consensus_flavor_value; } -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM -static smartlist_t *mock_is_guard_list = NULL; - -static int -mock_is_node_used_as_guard(const node_t *n) -{ - if (mock_is_guard_list) { - SMARTLIST_FOREACH_BEGIN(mock_is_guard_list, node_t *, e) { - if (e == n) return 1; - } SMARTLIST_FOREACH_END(e); - } - - return 0; -} - -static void -mark_node_used_as_guard(node_t *n) -{ - if (!n) return; - - if (!mock_is_guard_list) { - mock_is_guard_list = smartlist_new(); - } - - if (!mock_is_node_used_as_guard(n)) { - smartlist_add(mock_is_guard_list, n); - } -} - -static void -mark_node_unused_as_guard(node_t *n) -{ - if (!n) return; - - if (!mock_is_guard_list) return; - - smartlist_remove(mock_is_guard_list, n); -} - -static void -clear_mock_guard_list(void) -{ - if (mock_is_guard_list) { - smartlist_free(mock_is_guard_list); - mock_is_guard_list = NULL; - } -} -#endif - static void test_router_pick_directory_server_impl(void *arg) { @@ -273,9 +224,6 @@ test_router_pick_directory_server_impl(void *arg) (void)arg; MOCK(usable_consensus_flavor, mock_usable_consensus_flavor); -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM - MOCK(is_node_used_as_guard, mock_is_node_used_as_guard); -#endif /* With no consensus, we must be bootstrapping, regardless of time or flavor */ @@ -388,34 +336,6 @@ test_router_pick_directory_server_impl(void *arg) node_router1->is_valid = 1; node_router3->is_valid = 1; -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM - flags |= PDS_FOR_GUARD; - mark_node_used_as_guard(node_router1); - mark_node_used_as_guard(node_router2); - mark_node_used_as_guard(node_router3); - rs = router_pick_directory_server_impl(V3_DIRINFO, flags, NULL); - tt_assert(rs == NULL); - mark_node_unused_as_guard(node_router1); - rs = router_pick_directory_server_impl(V3_DIRINFO, flags, NULL); - tt_assert(rs != NULL); - tt_assert(tor_memeq(rs->identity_digest, router1_id, DIGEST_LEN)); - rs = NULL; - mark_node_unused_as_guard(node_router2); - mark_node_unused_as_guard(node_router3); -#endif - - /* One not valid, one guard. This should leave one remaining */ -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM - node_router1->is_valid = 0; - mark_node_used_as_guard(node_router2); - rs = router_pick_directory_server_impl(V3_DIRINFO, flags, NULL); - tt_assert(rs != NULL); - tt_assert(tor_memeq(rs->identity_digest, router3_id, DIGEST_LEN)); - rs = NULL; - node_router1->is_valid = 1; - mark_node_unused_as_guard(node_router2); -#endif - /* Manipulate overloaded */ node_router2->rs->last_dir_503_at = now; @@ -477,10 +397,6 @@ test_router_pick_directory_server_impl(void *arg) done: UNMOCK(usable_consensus_flavor); -#ifdef ENABLE_LEGACY_GUARD_ALGORITHM - UNMOCK(is_node_used_as_guard); - clear_mock_guard_list(); -#endif if (router1_id) tor_free(router1_id); diff --git a/src/test/test_util.c b/src/test/test_util.c index 86e3fea91a..fafb84f4fe 100644 --- a/src/test/test_util.c +++ b/src/test/test_util.c @@ -5479,26 +5479,26 @@ test_util_calloc_check(void *arg) { (void) arg; /* Easy cases that are good. */ - tt_assert(size_mul_check__(0,0)); - tt_assert(size_mul_check__(0,100)); - tt_assert(size_mul_check__(100,0)); - tt_assert(size_mul_check__(100,100)); + tt_assert(size_mul_check(0,0)); + tt_assert(size_mul_check(0,100)); + tt_assert(size_mul_check(100,0)); + tt_assert(size_mul_check(100,100)); /* Harder cases that are still good. */ - tt_assert(size_mul_check__(SIZE_MAX, 1)); - tt_assert(size_mul_check__(1, SIZE_MAX)); - tt_assert(size_mul_check__(SIZE_MAX / 10, 9)); - tt_assert(size_mul_check__(11, SIZE_MAX / 12)); + tt_assert(size_mul_check(SIZE_MAX, 1)); + tt_assert(size_mul_check(1, SIZE_MAX)); + tt_assert(size_mul_check(SIZE_MAX / 10, 9)); + tt_assert(size_mul_check(11, SIZE_MAX / 12)); const size_t sqrt_size_max_p1 = ((size_t)1) << (sizeof(size_t) * 4); - tt_assert(size_mul_check__(sqrt_size_max_p1, sqrt_size_max_p1 - 1)); + tt_assert(size_mul_check(sqrt_size_max_p1, sqrt_size_max_p1 - 1)); /* Cases that overflow */ - tt_assert(! size_mul_check__(SIZE_MAX, 2)); - tt_assert(! size_mul_check__(2, SIZE_MAX)); - tt_assert(! size_mul_check__(SIZE_MAX / 10, 11)); - tt_assert(! size_mul_check__(11, SIZE_MAX / 10)); - tt_assert(! size_mul_check__(SIZE_MAX / 8, 9)); - tt_assert(! size_mul_check__(sqrt_size_max_p1, sqrt_size_max_p1)); + tt_assert(! size_mul_check(SIZE_MAX, 2)); + tt_assert(! size_mul_check(2, SIZE_MAX)); + tt_assert(! size_mul_check(SIZE_MAX / 10, 11)); + tt_assert(! size_mul_check(11, SIZE_MAX / 10)); + tt_assert(! size_mul_check(SIZE_MAX / 8, 9)); + tt_assert(! size_mul_check(sqrt_size_max_p1, sqrt_size_max_p1)); done: ; diff --git a/src/test/test_util_format.c b/src/test/test_util_format.c index 1d58ba2bf8..21a6923c6d 100644 --- a/src/test/test_util_format.c +++ b/src/test/test_util_format.c @@ -202,6 +202,9 @@ test_util_format_base64_decode(void *ignored) res = base64_decode(dst, SIZE_T_CEILING+1, src, 10); tt_int_op(res, OP_EQ, -1); + res = base64_decode(dst, 1, real_src, SIZE_MAX/3+1); + tt_int_op(res, OP_EQ, -1); + const char *s = "T3BhIG11bmRv"; res = base64_decode(dst, 9, s, strlen(s)); tt_int_op(res, OP_EQ, 9); diff --git a/src/tools/tor-resolve.c b/src/tools/tor-resolve.c index 29f85c4d17..6ac866d3c0 100644 --- a/src/tools/tor-resolve.c +++ b/src/tools/tor-resolve.c @@ -80,6 +80,10 @@ build_socks_resolve_request(char **out, } ipv6 = reverse && tor_addr_family(&addr) == AF_INET6; addrlen = reverse ? (ipv6 ? 16 : 4) : 1 + strlen(hostname); + if (addrlen > UINT8_MAX) { + log_err(LD_GENERAL, "Hostname is too long!"); + return -1; + } len = 6 + addrlen; *out = tor_malloc(len); (*out)[0] = 5; /* SOCKS version 5 */ diff --git a/src/trunnel/hs/cell_establish_intro.c b/src/trunnel/hs/cell_establish_intro.c index 02094fe2bf..633bd7c214 100644 --- a/src/trunnel/hs/cell_establish_intro.c +++ b/src/trunnel/hs/cell_establish_intro.c @@ -231,6 +231,11 @@ hs_cell_establish_intro_getconstarray_handshake_mac(const hs_cell_establish_intr { return (const uint8_t *)hs_cell_establish_intro_getarray_handshake_mac((hs_cell_establish_intro_t*)inp); } +const uint8_t * +hs_cell_establish_intro_get_end_sig_fields(const hs_cell_establish_intro_t *inp) +{ + return inp->end_sig_fields; +} uint16_t hs_cell_establish_intro_get_sig_len(const hs_cell_establish_intro_t *inp) { @@ -242,11 +247,6 @@ hs_cell_establish_intro_set_sig_len(hs_cell_establish_intro_t *inp, uint16_t val inp->sig_len = val; return 0; } -const uint8_t * -hs_cell_establish_intro_get_end_sig_fields(const hs_cell_establish_intro_t *inp) -{ - return inp->end_sig_fields; -} size_t hs_cell_establish_intro_getlen_sig(const hs_cell_establish_intro_t *inp) { @@ -518,12 +518,12 @@ hs_cell_establish_intro_parse_into(hs_cell_establish_intro_t *obj, const uint8_t CHECK_REMAINING(TRUNNEL_SHA3_256_LEN, truncated); memcpy(obj->handshake_mac, ptr, TRUNNEL_SHA3_256_LEN); remaining -= TRUNNEL_SHA3_256_LEN; ptr += TRUNNEL_SHA3_256_LEN; + obj->end_sig_fields = ptr; /* Parse u16 sig_len */ CHECK_REMAINING(2, truncated); obj->sig_len = trunnel_ntohs(trunnel_get_uint16(ptr)); remaining -= 2; ptr += 2; - obj->end_sig_fields = ptr; /* Parse u8 sig[sig_len] */ CHECK_REMAINING(obj->sig_len, truncated); diff --git a/src/trunnel/hs/cell_establish_intro.h b/src/trunnel/hs/cell_establish_intro.h index a9166f10d8..725d47cd85 100644 --- a/src/trunnel/hs/cell_establish_intro.h +++ b/src/trunnel/hs/cell_establish_intro.h @@ -19,8 +19,8 @@ struct hs_cell_establish_intro_st { struct cell_extension_st *extensions; const uint8_t *end_mac_fields; uint8_t handshake_mac[TRUNNEL_SHA3_256_LEN]; - uint16_t sig_len; const uint8_t *end_sig_fields; + uint16_t sig_len; TRUNNEL_DYNARRAY_HEAD(, uint8_t) sig; uint8_t trunnel_error_code_; }; @@ -170,6 +170,9 @@ uint8_t * hs_cell_establish_intro_getarray_handshake_mac(hs_cell_establish_intro * a const pointer */ const uint8_t * hs_cell_establish_intro_getconstarray_handshake_mac(const hs_cell_establish_intro_t *inp); +/** Return the position for end_sig_fields when we parsed this object + */ +const uint8_t * hs_cell_establish_intro_get_end_sig_fields(const hs_cell_establish_intro_t *inp); /** Return the value of the sig_len field of the * hs_cell_establish_intro_t in 'inp' */ @@ -179,9 +182,6 @@ uint16_t hs_cell_establish_intro_get_sig_len(const hs_cell_establish_intro_t *in * return -1 and set the error code on 'inp' on failure. */ int hs_cell_establish_intro_set_sig_len(hs_cell_establish_intro_t *inp, uint16_t val); -/** Return the position for end_sig_fields when we parsed this object - */ -const uint8_t * hs_cell_establish_intro_get_end_sig_fields(const hs_cell_establish_intro_t *inp); /** Return the length of the dynamic array holding the sig field of * the hs_cell_establish_intro_t in 'inp'. */ diff --git a/src/trunnel/hs/cell_establish_intro.trunnel b/src/trunnel/hs/cell_establish_intro.trunnel index 4f9e8f7e08..33a133bf67 100644 --- a/src/trunnel/hs/cell_establish_intro.trunnel +++ b/src/trunnel/hs/cell_establish_intro.trunnel @@ -26,9 +26,9 @@ struct hs_cell_establish_intro { u8 handshake_mac[TRUNNEL_SHA3_256_LEN]; /* Signature */ - u16 sig_len; /* Indicate the end of the handshake authentication data. */ @ptr end_sig_fields; + u16 sig_len; u8 sig[sig_len]; }; diff --git a/src/win32/orconfig.h b/src/win32/orconfig.h index 208f627647..e111d96227 100644 --- a/src/win32/orconfig.h +++ b/src/win32/orconfig.h @@ -218,7 +218,7 @@ #define USING_TWOS_COMPLEMENT /* Version number of package */ -#define VERSION "0.3.0.1-alpha-dev" +#define VERSION "0.3.0.2-alpha-dev" |