diff options
70 files changed, 6874 insertions, 3681 deletions
diff --git a/.gitignore b/.gitignore index 369d925a9d..6a6c14e6a0 100644 --- a/.gitignore +++ b/.gitignore @@ -155,6 +155,7 @@ /src/test/Makefile /src/test/Makefile.in /src/test/test +/src/test/test-child # /src/tools/ diff --git a/acinclude.m4 b/acinclude.m4 index 3db25aa59a..ccfecff28d 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -121,13 +121,13 @@ AC_CACHE_CHECK([for $1 directory], tor_cv_library_$1_dir, [ # Can we link against (but not necessarily run, or find the headers for) # the binary? - AC_LINK_IFELSE(AC_LANG_PROGRAM([$5], [$6]), + AC_LINK_IFELSE([AC_LANG_PROGRAM([$5], [$6])], [linkable=yes], [linkable=no]) if test "$linkable" = yes; then tor_$1_any_linkable=yes # Okay, we can link against it. Can we find the headers? - AC_COMPILE_IFELSE(AC_LANG_PROGRAM([$4], [$6]), + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([$4], [$6])], [buildable=yes], [buildable=no]) if test "$buildable" = yes; then tor_cv_library_$1_dir=$tor_trydir @@ -179,7 +179,7 @@ if test "$cross_compiling" != yes; then else LDFLAGS="$tor_tryextra $orig_LDFLAGS" fi - AC_RUN_IFELSE(AC_LANG_PROGRAM([$5], [$6]), + AC_RUN_IFELSE([AC_LANG_PROGRAM([$5], [$6])], [runnable=yes], [runnable=no]) if test "$runnable" = yes; then tor_cv_library_$1_linker_option=$tor_tryextra @@ -211,7 +211,7 @@ dnl dnl TOR_CHECK_PROTYPE(1:functionname, 2:macroname, 2: includes) AC_DEFUN([TOR_CHECK_PROTOTYPE], [ AC_CACHE_CHECK([for declaration of $1], tor_cv_$1_declared, [ - AC_COMPILE_IFELSE(AC_LANG_PROGRAM([$3],[void *ptr= $1 ;]), + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([$3],[void *ptr= $1 ;])], tor_cv_$1_declared=yes,tor_cv_$1_declared=no)]) if test x$tor_cv_$1_declared != xno ; then AC_DEFINE($2, 1, diff --git a/changes/bug1982 b/changes/bug1982 new file mode 100644 index 0000000000..30ce2df7c6 --- /dev/null +++ b/changes/bug1982 @@ -0,0 +1,5 @@ + o Major features: + - Allow EntryNodes to include country codes like {de} or IP addresses + or network masks. Previously we had disallowed these options + because we didn't have an efficient way to keep the list up to + date. Resolves bug 1982. diff --git a/changes/bug1994 b/changes/bug1994 new file mode 100644 index 0000000000..07095aa7c9 --- /dev/null +++ b/changes/bug1994 @@ -0,0 +1,6 @@ + o Minor bugfixes: + - Correctly describe errors that occur when generating a TLS object + when logging them. Previously we would attribtue them to a failure + while generating a TLS context. Bugfix by Robert Ransom. Bugfix + on 0.1.0.4-rc. + diff --git a/changes/bug2020 b/changes/bug2020 new file mode 100644 index 0000000000..51c4d06112 --- /dev/null +++ b/changes/bug2020 @@ -0,0 +1,5 @@ + o Minor bugfixes: + - Fix warnings that newer versions of autoconf produced during + ./autogen.sh. From what I can tell these were harmless in our case, + but they were extremely verbose. Fixes bug 2020. + diff --git a/changes/geoip-oct2010 b/changes/geoip-oct2010 new file mode 100644 index 0000000000..a7235faaa5 --- /dev/null +++ b/changes/geoip-oct2010 @@ -0,0 +1,3 @@ + o Minor features: + - Update to the October 1 2010 Maxmind GeoLite Country database. + diff --git a/changes/nodelist b/changes/nodelist new file mode 100644 index 0000000000..033a6c10fb --- /dev/null +++ b/changes/nodelist @@ -0,0 +1,10 @@ + o Code refactorings + - Unified our node-listing and selecting logic. We had at least + two major ways to look at the question of "which Tor servers do + we know about": our list of router descriptors, and the current + consensus. We're adding a third in microdescriptors. Having + so many systems without an abstraction layer over them was + hurting the codebase. Now, we have a new "node_t" abstraction + that presents a consistent interface to a client's view of + a Tor node, and holds (nearly) all of the mutable state + formerly in routerinfo_t and routerstatus_t. diff --git a/configure.in b/configure.in index 18e312b7ae..5ddaf3f90f 100644 --- a/configure.in +++ b/configure.in @@ -182,7 +182,7 @@ AC_SUBST(TORGROUP) dnl If WIN32 is defined and non-zero, we are building for win32 AC_MSG_CHECKING([for win32]) -AC_RUN_IFELSE([ +AC_RUN_IFELSE([AC_LANG_SOURCE([ int main(int c, char **v) { #ifdef WIN32 #if WIN32 @@ -193,7 +193,7 @@ int main(int c, char **v) { #else return 2; #endif -}], +}])], bwin32=true; AC_MSG_RESULT([yes]), bwin32=false; AC_MSG_RESULT([no]), bwin32=cross; AC_MSG_RESULT([cross]) @@ -201,14 +201,14 @@ bwin32=cross; AC_MSG_RESULT([cross]) if test "$bwin32" = cross; then AC_MSG_CHECKING([for win32 (cross)]) -AC_COMPILE_IFELSE([ +AC_COMPILE_IFELSE([AC_LANG_SOURCE([ #ifdef WIN32 int main(int c, char **v) {return 0;} #else #error int main(int c, char **v) {return x(y);} #endif -], +])], bwin32=true; AC_MSG_RESULT([yes]), bwin32=false; AC_MSG_RESULT([no])) fi @@ -220,12 +220,12 @@ AM_CONDITIONAL(BUILD_NT_SERVICES, test x$bwin32 = xtrue) dnl Enable C99 when compiling with MIPSpro AC_MSG_CHECKING([for MIPSpro compiler]) -AC_COMPILE_IFELSE(AC_LANG_PROGRAM(, [ +AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [ #if (defined(__sgi) && defined(_COMPILER_VERSION)) #error return x(y); #endif -]), +])], bmipspro=false; AC_MSG_RESULT(no), bmipspro=true; AC_MSG_RESULT(yes)) @@ -352,14 +352,14 @@ dnl This isn't the best test for Libevent 2.0.3-alpha. Once it's released, dnl we can do much better. if test "$enable_bufferevents" = "yes" ; then if test "$ac_cv_header_event2_bufferevent_ssl_h" != "yes" ; then - AC_MSG_ERROR([You've asked for bufferevent support, but you're using a version of Libevent without SSL support. This won't work. We need Libevent 2.0.7-rc or later, and you don't seem to even have Libevent 2.0.3-alpha.]) + AC_MSG_ERROR([You've asked for bufferevent support, but you're using a version of Libevent without SSL support. This won't work. We need Libevent 2.0.8-rc or later, and you don't seem to even have Libevent 2.0.3-alpha.]) else CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent" # Check for the right version. First see if version detection works. AC_MSG_CHECKING([whether we can detect the Libevent version]) - AC_COMPILE_IFELSE([ + AC_COMPILE_IFELSE([AC_LANG_SOURCE([ #include <event2/event.h> #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 10 #error @@ -367,23 +367,23 @@ int x = y(zz); #else int x = 1; #endif - ], [event_version_number_works=yes; AC_MSG_RESULT([yes]) ], + ])], [event_version_number_works=yes; AC_MSG_RESULT([yes]) ], [event_version_number_works=no; AC_MSG_RESULT([no])]) if test "$event_version_number_works" != 'yes'; then AC_MSG_WARN([Version detection on Libevent seems broken. Your Libevent installation is probably screwed up or very old.]) else AC_MSG_CHECKING([whether Libevent is new enough for bufferevents]) - AC_COMPILE_IFELSE([ + AC_COMPILE_IFELSE([AC_LANG_SOURCE([ #include <event2/event.h> -#if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000700 +#if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000800 #error int x = y(zz); #else int x = 1; #endif - ], [ AC_MSG_RESULT([yes]) ], + ])], [ AC_MSG_RESULT([yes]) ], [ AC_MSG_RESULT([no]) - AC_MSG_ERROR([Libevent does not seem new enough to support bufferevents. We require 2.0.7-rc or later]) ] ) + AC_MSG_ERROR([Libevent does not seem new enough to support bufferevents. We require 2.0.8-rc or later]) ] ) fi fi fi @@ -677,7 +677,7 @@ AC_CHECK_TYPES([rlim_t], , , ]) AC_CACHE_CHECK([whether time_t is signed], tor_cv_time_t_signed, [ -AC_RUN_IFELSE(AC_LANG_SOURCE([ +AC_RUN_IFELSE([AC_LANG_SOURCE([ #ifdef HAVE_SYS_TYPES_H #include <sys/types.h> #endif @@ -687,7 +687,7 @@ AC_RUN_IFELSE(AC_LANG_SOURCE([ #ifdef HAVE_TIME_H #include <time.h> #endif -int main(int c, char**v) { if (((time_t)-1)<0) return 1; else return 0; }]), +int main(int c, char**v) { if (((time_t)-1)<0) return 1; else return 0; }])], tor_cv_time_t_signed=no, tor_cv_time_t_signed=yes, tor_cv_time_t_signed=cross) ]) @@ -836,14 +836,14 @@ AC_CHECK_FUNC(gethostbyname_r, [ AC_MSG_CHECKING([how many arguments gethostbyname_r() wants]) OLD_CFLAGS=$CFLAGS CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS" - AC_COMPILE_IFELSE(AC_LANG_PROGRAM([ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ #include <netdb.h> ], [[ char *cp1, *cp2; struct hostent *h1, *h2; int i1, i2; (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2); - ]]),[ + ]])],[ AC_DEFINE(HAVE_GETHOSTBYNAME_R) AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1, [Define this if gethostbyname_r takes 6 arguments]) @@ -884,25 +884,25 @@ AC_CHECK_FUNC(gethostbyname_r, [ AC_CACHE_CHECK([whether the C compiler supports __func__], tor_cv_have_func_macro, - AC_COMPILE_IFELSE([ + AC_COMPILE_IFELSE([AC_LANG_SOURCE([ #include <stdio.h> -int main(int c, char **v) { puts(__func__); }], +int main(int c, char **v) { puts(__func__); }])], tor_cv_have_func_macro=yes, tor_cv_have_func_macro=no)) AC_CACHE_CHECK([whether the C compiler supports __FUNC__], tor_cv_have_FUNC_macro, - AC_COMPILE_IFELSE([ + AC_COMPILE_IFELSE([AC_LANG_SOURCE([ #include <stdio.h> -int main(int c, char **v) { puts(__FUNC__); }], +int main(int c, char **v) { puts(__FUNC__); }])], tor_cv_have_FUNC_macro=yes, tor_cv_have_FUNC_macro=no)) AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__], tor_cv_have_FUNCTION_macro, - AC_COMPILE_IFELSE([ + AC_COMPILE_IFELSE([AC_LANG_SOURCE([ #include <stdio.h> -int main(int c, char **v) { puts(__FUNCTION__); }], +int main(int c, char **v) { puts(__FUNCTION__); }])], tor_cv_have_FUNCTION_macro=yes, tor_cv_have_FUNCTION_macro=no)) @@ -931,6 +931,13 @@ if test "x$exec_prefix" = "xNONE"; then exec_prefix=$prefix fi +if test "x$BUILDDIR" = "x"; then + BUILDDIR=`pwd` +fi +AC_SUBST(BUILDDIR) +AH_TEMPLATE([BUILDDIR],[tor's build directory]) +AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR") + if test "x$CONFDIR" = "x"; then CONFDIR=`eval echo $sysconfdir/tor` fi @@ -960,24 +967,24 @@ fi # released versions. (Some relevant gcc versions can't handle these.) if test x$enable_gcc_warnings = xyes || test x$enable_gcc_warnings_advisory = xyes; then - AC_COMPILE_IFELSE(AC_LANG_PROGRAM([], [ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [ #if !defined(__GNUC__) || (__GNUC__ < 4) #error -#endif]), have_gcc4=yes, have_gcc4=no) +#endif])], have_gcc4=yes, have_gcc4=no) - AC_COMPILE_IFELSE(AC_LANG_PROGRAM([], [ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [ #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 2) #error -#endif]), have_gcc42=yes, have_gcc42=no) +#endif])], have_gcc42=yes, have_gcc42=no) - AC_COMPILE_IFELSE(AC_LANG_PROGRAM([], [ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [ #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 3) #error -#endif]), have_gcc43=yes, have_gcc43=no) +#endif])], have_gcc43=yes, have_gcc43=no) save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Wshorten-64-to-32" - AC_COMPILE_IFELSE(AC_LANG_PROGRAM([], []), have_shorten64_flag=yes, + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], have_shorten64_flag=yes, have_shorten64_flag=no) CFLAGS="$save_CFLAGS" diff --git a/doc/nodefamily_routerset b/doc/nodefamily_routerset new file mode 100644 index 0000000000..0af62e11f6 --- /dev/null +++ b/doc/nodefamily_routerset @@ -0,0 +1,4 @@ + o Minor features + - The NodeFamily option -- which let you declare that you want to + consider nodes to be part of a family whether they list themselves + that way or not -- now allows IP address ranges and country codes. diff --git a/doc/tor.1.txt b/doc/tor.1.txt index 42eed6e3dd..8660fcb8f1 100644 --- a/doc/tor.1.txt +++ b/doc/tor.1.txt @@ -571,7 +571,8 @@ The following options are useful only for clients (that is, if constitute a "family" of similar or co-administered servers, so never use any two of them in the same circuit. Defining a NodeFamily is only needed when a server doesn't list the family itself (with MyFamily). This option - can be used multiple times. + can be used multiple times. In addition to nodes, you can also list + IP address and ranges and country codes in {curly braces}. **EnforceDistinctSubnets** **0**|**1**:: If 1, Tor will not put two servers whose IP addresses are "too close" on @@ -784,9 +785,9 @@ is non-zero): **BridgeRelay** **0**|**1**:: Sets the relay to act as a "bridge" with respect to relaying connections - from bridge users to the Tor network. Mainly it influences how the relay - will cache and serve directory information. Usually used in combination - with PublishServerDescriptor. + from bridge users to the Tor network. It mainly causes Tor to publish a + server descriptor to the bridge database, rather than publishing a relay + descriptor to the public directory authorities. **ContactInfo** __email_address__:: Administrative contact information for server. This line might get picked @@ -886,15 +887,17 @@ is non-zero): (Default: tor-fw-helper) **PublishServerDescriptor** **0**|**1**|**v1**|**v2**|**v3**|**bridge**|**hidserv**,**...**:: - This option is only considered if you have an ORPort defined. You can + This option specifies which descriptors Tor will publish when acting as + a relay or hidden service. You can choose multiple arguments, separated by commas. + - If set to 0, Tor will act as a server but it will not publish its - descriptor to the directory authorities. (This is useful if you're testing + If this option is set to 0, Tor will not publish its + descriptors to any directories. (This is useful if you're testing out your server, or if you're using a Tor controller that handles directory - publishing for you.) Otherwise, Tor will publish its descriptor to all - directory authorities of the type(s) specified. The value "1" is the - default, which means "publish to the appropriate authorities". + publishing for you.) Otherwise, Tor will publish its descriptors of all + type(s) specified. The default is "1", + which means "if running as a server or a hidden service, publish the + appropriate descriptors to the authorities". **ShutdownWaitLength** __NUM__:: When we get a SIGINT and we're a server, we begin shutting down: diff --git a/src/common/address.c b/src/common/address.c index dfe8f518e5..323e0eeac3 100644 --- a/src/common/address.c +++ b/src/common/address.c @@ -53,9 +53,7 @@ * socklen object in *<b>sa_out</b> of object size <b>len</b>. If not enough * room is free, or on error, return -1. Else return the length of the * sockaddr. */ -/* XXXX021 This returns socklen_t. socklen_t is sometimes unsigned. This - * function claims to return -1 sometimes. Problematic! */ -socklen_t +int tor_addr_to_sockaddr(const tor_addr_t *a, uint16_t port, struct sockaddr *sa_out, @@ -311,7 +309,7 @@ tor_addr_is_internal(const tor_addr_t *addr, int for_listening) * brackets. */ const char * -tor_addr_to_str(char *dest, const tor_addr_t *addr, int len, int decorate) +tor_addr_to_str(char *dest, const tor_addr_t *addr, size_t len, int decorate) { const char *ptr; tor_assert(addr && dest); diff --git a/src/common/address.h b/src/common/address.h index 9a3c3ef60b..e004ffb13f 100644 --- a/src/common/address.h +++ b/src/common/address.h @@ -39,7 +39,7 @@ static INLINE sa_family_t tor_addr_family(const tor_addr_t *a); static INLINE const struct in_addr *tor_addr_to_in(const tor_addr_t *a); static INLINE int tor_addr_eq_ipv4h(const tor_addr_t *a, uint32_t u); -socklen_t tor_addr_to_sockaddr(const tor_addr_t *a, uint16_t port, +int tor_addr_to_sockaddr(const tor_addr_t *a, uint16_t port, struct sockaddr *sa_out, socklen_t len); int tor_addr_from_sockaddr(tor_addr_t *a, const struct sockaddr *sa, uint16_t *port_out); @@ -145,7 +145,7 @@ int tor_addr_port_parse(const char *s, tor_addr_t *addr_out, int tor_addr_parse_mask_ports(const char *s, tor_addr_t *addr_out, maskbits_t *mask_out, uint16_t *port_min_out, uint16_t *port_max_out); -const char * tor_addr_to_str(char *dest, const tor_addr_t *addr, int len, +const char * tor_addr_to_str(char *dest, const tor_addr_t *addr, size_t len, int decorate); int tor_addr_from_str(tor_addr_t *addr, const char *src); void tor_addr_copy(tor_addr_t *dest, const tor_addr_t *src); diff --git a/src/common/aes.c b/src/common/aes.c index a17328317e..4998c386a0 100644 --- a/src/common/aes.c +++ b/src/common/aes.c @@ -288,11 +288,20 @@ void aes_crypt(aes_cnt_cipher_t *cipher, const char *input, size_t len, char *output) { - - /* XXXX This function is up to 5% of our runtime in some profiles; - * we should look into unrolling some of the loops; taking advantage - * of alignment, using a bigger buffer, and so on. Not till after 0.1.2.x, - * though. */ + /* This function alone is up to 5% of our runtime in some profiles; anything + * we could do to make it faster would be great. + * + * Experimenting suggests that unrolling the inner loop into a switch + * statement doesn't help. What does seem to help is making the input and + * output buffers word aligned, and never crypting anything besides an + * integer number of words at a time -- it shaves maybe 4-5% of the per-byte + * encryption time measured by bench_aes. We can't do that with the current + * Tor protocol, though: Tor really likes to crypt things in 509-byte + * chunks. + * + * If we were really ambitous, we'd force len to be a multiple of the block + * size, and shave maybe another 4-5% off. + */ int c = cipher->pos; if (PREDICT_UNLIKELY(!len)) return; diff --git a/src/common/compat.h b/src/common/compat.h index 5b6cfc40b5..2471e6b830 100644 --- a/src/common/compat.h +++ b/src/common/compat.h @@ -332,6 +332,13 @@ struct tm *tor_localtime_r(const time_t *timep, struct tm *result); struct tm *tor_gmtime_r(const time_t *timep, struct tm *result); #endif +/** Return true iff the tvp is related to uvp according to the relational + * operator cmp. Recognized values for cmp are ==, <=, <, >=, and >. */ +#define tor_timercmp(tvp, uvp, cmp) \ + (((tvp)->tv_sec == (uvp)->tv_sec) ? \ + ((tvp)->tv_usec cmp (uvp)->tv_usec) : \ + ((tvp)->tv_sec cmp (uvp)->tv_sec)) + /* ===== File compatibility */ int replace_file(const char *from, const char *to); int touch_file(const char *fname); diff --git a/src/common/compat_libevent.c b/src/common/compat_libevent.c index d94f615f74..a524c98318 100644 --- a/src/common/compat_libevent.c +++ b/src/common/compat_libevent.c @@ -340,17 +340,21 @@ tor_check_libevent_version(const char *m, int server, version = tor_get_libevent_version(&v); - /* XXX Would it be worthwhile disabling the methods that we know - * are buggy, rather than just warning about them and then proceeding - * to use them? If so, we should probably not wrap this whole thing - * in HAVE_EVENT_GET_VERSION and HAVE_EVENT_GET_METHOD. -RD */ - /* XXXX The problem is that it's not trivial to get libevent to change it's - * method once it's initialized, and it's not trivial to tell what method it - * will use without initializing it. I guess we could preemptively disable - * buggy libevent modes based on the version _before_ initializing it, - * though, but then there's no good way (afaict) to warn "I would have used - * kqueue, but instead I'm using select." -NM */ - /* XXXX022 revist the above; it is fixable now. */ + /* It would be better to disable known-buggy methods than to simply + warn about them. However, it's not trivial to get libevent to change its + method once it's initialized, and it's not trivial to tell what method it + will use without initializing it. + + If we saw that the version was definitely bad, we could disable all the + methods that were bad for that version. But the issue with that is that + if you've found a libevent before 1.1, you are not at all guaranteed to + have _any_ good method to use. + + As of Libevent 2, we can do better, and have more control over what + methods get used. But the problem here is that there are no versions of + Libevent 2 that have buggy event cores, so there's no point in writing + disable code yet. + */ if (!strcmp(m, "kqueue")) { if (version < V_OLD(1,1,'b')) buggy = 1; diff --git a/src/common/container.c b/src/common/container.c index 72f3470344..0a95f33aad 100644 --- a/src/common/container.c +++ b/src/common/container.c @@ -268,7 +268,6 @@ smartlist_subtract(smartlist_t *sl1, const smartlist_t *sl2) /** Remove the <b>idx</b>th element of sl; if idx is not the last * element, swap the last element of sl into the <b>idx</b>th space. - * Return the old value of the <b>idx</b>th element. */ void smartlist_del(smartlist_t *sl, int idx) diff --git a/src/common/memarea.c b/src/common/memarea.c index 77579e63be..b5ac7ad97a 100644 --- a/src/common/memarea.c +++ b/src/common/memarea.c @@ -53,7 +53,7 @@ realign_pointer(void *ptr) { uintptr_t x = (uintptr_t)ptr; x = (x+MEMAREA_ALIGN_MASK) & ~MEMAREA_ALIGN_MASK; - tor_assert(((void*)x) >= ptr); // XXXX021 remove this once bug 930 is solved + tor_assert(((void*)x) >= ptr); return (void*)x; } @@ -230,9 +230,10 @@ memarea_alloc(memarea_t *area, size_t sz) } result = chunk->next_mem; chunk->next_mem = chunk->next_mem + sz; - // XXXX021 remove these once bug 930 is solved. + tor_assert(chunk->next_mem >= chunk->u.mem); tor_assert(chunk->next_mem <= chunk->u.mem+chunk->mem_size); + chunk->next_mem = realign_pointer(chunk->next_mem); return result; } diff --git a/src/common/tortls.c b/src/common/tortls.c index ce5411a55e..716cfa1241 100644 --- a/src/common/tortls.c +++ b/src/common/tortls.c @@ -93,7 +93,9 @@ static int use_unsafe_renegotiation_op = 0; * SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION? */ static int use_unsafe_renegotiation_flag = 0; -/** Structure holding the TLS state for a single connection. */ +/** Holds a SSL_CTX object and related state used to configure TLS + * connections. + */ typedef struct tor_tls_context_t { int refcnt; SSL_CTX *ctx; @@ -123,8 +125,10 @@ struct tor_tls_t { * of the connection protocol (client sends * different cipher list, server sends only * one certificate). */ - /** True iff we should call negotiated_callback when we're done reading. */ + /** True iff we should call negotiated_callback when we're done reading. */ unsigned int got_renegotiate:1; + /** Incremented every time we start the server side of a handshake. */ + uint8_t server_handshake_count; size_t wantwrite_n; /**< 0 normally, >0 if we returned wantwrite last * time. */ /** Last values retrieved from BIO_number_read()/write(); see @@ -222,36 +226,46 @@ ssl_state_to_string(int ssl_state) return buf; } +void +tor_tls_log_one_error(tor_tls_t *tls, unsigned long err, + int severity, int domain, const char *doing) +{ + const char *state = NULL, *addr; + const char *msg, *lib, *func; + int st; + + st = (tls && tls->ssl) ? tls->ssl->state : -1; + state = (st>=0)?ssl_state_to_string(st):"---"; + + addr = tls ? tls->address : NULL; + + msg = (const char*)ERR_reason_error_string(err); + lib = (const char*)ERR_lib_error_string(err); + func = (const char*)ERR_func_error_string(err); + if (!msg) msg = "(null)"; + if (!lib) lib = "(null)"; + if (!func) func = "(null)"; + if (doing) { + log(severity, domain, "TLS error while %s%s%s: %s (in %s:%s:%s)", + doing, addr?" with ":"", addr?addr:"", + msg, lib, func, state); + } else { + log(severity, domain, "TLS error%s%s: %s (in %s:%s:%s)", + addr?" with ":"", addr?addr:"", + msg, lib, func, state); + } +} + /** Log all pending tls errors at level <b>severity</b>. Use * <b>doing</b> to describe our current activities. */ static void tls_log_errors(tor_tls_t *tls, int severity, int domain, const char *doing) { - const char *state = NULL; - int st; unsigned long err; - const char *msg, *lib, *func, *addr; - addr = tls ? tls->address : NULL; - st = (tls && tls->ssl) ? tls->ssl->state : -1; + while ((err = ERR_get_error()) != 0) { - msg = (const char*)ERR_reason_error_string(err); - lib = (const char*)ERR_lib_error_string(err); - func = (const char*)ERR_func_error_string(err); - if (!state) - state = (st>=0)?ssl_state_to_string(st):"---"; - if (!msg) msg = "(null)"; - if (!lib) lib = "(null)"; - if (!func) func = "(null)"; - if (doing) { - log(severity, domain, "TLS error while %s%s%s: %s (in %s:%s:%s)", - doing, addr?" with ":"", addr?addr:"", - msg, lib, func, state); - } else { - log(severity, domain, "TLS error%s%s: %s (in %s:%s:%s)", - addr?" with ":"", addr?addr:"", - msg, lib, func, state); - } + tor_tls_log_one_error(tls, err, severity, domain, doing); } } @@ -379,7 +393,7 @@ tor_tls_init(void) version = SSLeay(); - /* OpenSSL 0.9.8l introduced SSL3_FLAGS_ALLOW_UNSAGE_LEGACY_RENEGOTIATION + /* OpenSSL 0.9.8l introduced SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION * here, but without thinking too hard about it: it turns out that the * flag in question needed to be set at the last minute, and that it * conflicted with an existing flag number that had already been added @@ -562,9 +576,9 @@ tor_tls_create_certificate(crypto_pk_env_t *rsa, (TLS1_TXT_DHE_RSA_WITH_AES_256_SHA ":" \ TLS1_TXT_DHE_RSA_WITH_AES_128_SHA ":" \ SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA) -/* Note: for setting up your own private testing network with link crypto - * disabled, set the cipher lists to your cipher list to - * SSL3_TXT_RSA_NULL_SHA. If you do this, you won't be able to communicate +/* Note: to set up your own private testing network with link crypto + * disabled, set your Tors' cipher list to + * (SSL3_TXT_RSA_NULL_SHA). If you do this, you won't be able to communicate * with any of the "real" Tors, though. */ #ifdef V2_HANDSHAKE_CLIENT @@ -625,7 +639,7 @@ tor_tls_context_incref(tor_tls_context_t *ctx) /** Create a new TLS context for use with Tor TLS handshakes. * <b>identity</b> should be set to the identity key used to sign the - * certificate, and <b>nickname</b> set to the nickname to use. + * certificate. * * You can call this function multiple times. Each time you call it, * it generates new certificates; all new connections will use @@ -728,8 +742,8 @@ tor_tls_context_new(crypto_pk_env_t *identity, unsigned int key_lifetime) SSL_CTX_set_mode(result->ctx, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER); /* Free the old context if one exists. */ if (global_tls_context) { - /* This is safe even if there are open connections: OpenSSL does - * reference counting with SSL and SSL_CTX objects. */ + /* This is safe even if there are open connections: we reference- + * count tor_tls_context_t objects. */ tor_tls_context_decref(global_tls_context); } global_tls_context = result; @@ -829,6 +843,8 @@ tor_tls_server_info_callback(const SSL *ssl, int type, int val) /* Check whether we're watching for renegotiates. If so, this is one! */ if (tls->negotiated_callback) tls->got_renegotiate = 1; + if (tls->server_handshake_count < 127) /*avoid any overflow possibility*/ + ++tls->server_handshake_count; } else { log_warn(LD_BUG, "Couldn't look up the tls for an SSL*. How odd!"); } @@ -847,6 +863,10 @@ tor_tls_server_info_callback(const SSL *ssl, int type, int val) if (tls) { tls->wasV2Handshake = 1; +#ifdef USE_BUFFEREVENTS + if (use_unsafe_renegotiation_flag) + tls->ssl->s3->flags |= SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION; +#endif } else { log_warn(LD_BUG, "Couldn't look up the tls for an SSL*. How odd!"); } @@ -935,7 +955,7 @@ tor_tls_new(int sock, int isServer) tor_assert(global_tls_context); /* make sure somebody made it first */ if (!(result->ssl = SSL_new(global_tls_context->ctx))) { - tls_log_errors(NULL, LOG_WARN, LD_NET, "generating TLS context"); + tls_log_errors(NULL, LOG_WARN, LD_NET, "creating SSL object"); tor_free(result); return NULL; } @@ -992,7 +1012,7 @@ tor_tls_new(int sock, int isServer) #endif /* Not expected to get called. */ - tls_log_errors(NULL, LOG_WARN, LD_NET, "generating TLS context"); + tls_log_errors(NULL, LOG_WARN, LD_NET, "creating tor_tls_t object"); return result; } @@ -1055,6 +1075,19 @@ tor_tls_block_renegotiation(tor_tls_t *tls) tls->ssl->s3->flags &= ~SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION; } +void +tor_tls_assert_renegotiation_unblocked(tor_tls_t *tls) +{ + if (use_unsafe_renegotiation_flag) { + tor_assert(0 != (tls->ssl->s3->flags & + SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION)); + } + if (use_unsafe_renegotiation_op) { + long options = SSL_get_options(tls->ssl); + tor_assert(0 != (options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION)); + } +} + /** Return whether this tls initiated the connect (client) or * received it (server). */ int @@ -1646,6 +1679,22 @@ tor_tls_used_v1_handshake(tor_tls_t *tls) return 1; } +/** Return the number of server handshakes that we've noticed doing on + * <b>tls</b>. */ +int +tor_tls_get_num_server_handshakes(tor_tls_t *tls) +{ + return tls->server_handshake_count; +} + +/** Return true iff the server TLS connection <b>tls</b> got the renegotiation + * request it was waiting for. */ +int +tor_tls_server_got_renegotiate(tor_tls_t *tls) +{ + return tls->got_renegotiate; +} + /** Examine the amount of memory used and available for buffers in <b>tls</b>. * Set *<b>rbuf_capacity</b> to the amount of storage allocated for the read * buffer and *<b>rbuf_bytes</b> to the amount actually used. @@ -1720,6 +1769,10 @@ tor_tls_init_bufferevent(tor_tls_t *tls, struct bufferevent *bufev_in, state, BEV_OPT_DEFER_CALLBACKS); #endif + /* Unblock _after_ creating the bufferevent, since accept/connect tend to + * clear flags. */ + tor_tls_unblock_renegotiation(tls); + return out; } #endif diff --git a/src/common/tortls.h b/src/common/tortls.h index f8603b529b..c1de456611 100644 --- a/src/common/tortls.h +++ b/src/common/tortls.h @@ -68,6 +68,7 @@ int tor_tls_finish_handshake(tor_tls_t *tls); int tor_tls_renegotiate(tor_tls_t *tls); void tor_tls_unblock_renegotiation(tor_tls_t *tls); void tor_tls_block_renegotiation(tor_tls_t *tls); +void tor_tls_assert_renegotiation_unblocked(tor_tls_t *tls); int tor_tls_shutdown(tor_tls_t *tls); int tor_tls_get_pending_bytes(tor_tls_t *tls); size_t tor_tls_get_forced_write_size(tor_tls_t *tls); @@ -80,12 +81,16 @@ void tor_tls_get_buffer_sizes(tor_tls_t *tls, size_t *wbuf_capacity, size_t *wbuf_bytes); int tor_tls_used_v1_handshake(tor_tls_t *tls); +int tor_tls_get_num_server_handshakes(tor_tls_t *tls); +int tor_tls_server_got_renegotiate(tor_tls_t *tls); /* Log and abort if there are unhandled TLS errors in OpenSSL's error stack. */ #define check_no_tls_errors() _check_no_tls_errors(__FILE__,__LINE__) void _check_no_tls_errors(const char *fname, int line); +void tor_tls_log_one_error(tor_tls_t *tls, unsigned long err, + int severity, int domain, const char *doing); #ifdef USE_BUFFEREVENTS int tor_tls_start_renegotiating(tor_tls_t *tls); diff --git a/src/common/util.c b/src/common/util.c index ef9c5bb624..16e7370239 100644 --- a/src/common/util.c +++ b/src/common/util.c @@ -934,7 +934,7 @@ esc_for_log(const char *s) char *result, *outp; size_t len = 3; if (!s) { - return tor_strdup(""); + return tor_strdup("(null)"); } for (cp = s; *cp; ++cp) { @@ -1503,83 +1503,6 @@ update_approx_time(time_t now) #endif /* ===== - * Fuzzy time - * XXXX022 Use this consistently or rip most of it out. - * ===== */ - -/* In a perfect world, everybody would run NTP, and NTP would be perfect, so - * if we wanted to know "Is the current time before time X?" we could just say - * "time(NULL) < X". - * - * But unfortunately, many users are running Tor in an imperfect world, on - * even more imperfect computers. Hence, we need to track time oddly. We - * model the user's computer as being "skewed" from accurate time by - * -<b>ftime_skew</b> seconds, such that our best guess of the current time is - * time(NULL)+ftime_skew. We also assume that our measurements of time may - * have up to <b>ftime_slop</b> seconds of inaccuracy; IOW, our window of - * estimate for the current time is now + ftime_skew +/- ftime_slop. - */ -/** Our current estimate of our skew, such that we think the current time is - * closest to time(NULL)+ftime_skew. */ -static int ftime_skew = 0; -/** Tolerance during time comparisons, in seconds. */ -static int ftime_slop = 60; -/** Set the largest amount of sloppiness we'll allow in fuzzy time - * comparisons. */ -void -ftime_set_maximum_sloppiness(int seconds) -{ - tor_assert(seconds >= 0); - ftime_slop = seconds; -} -/** Set the amount by which we believe our system clock to differ from - * real time. */ -void -ftime_set_estimated_skew(int seconds) -{ - ftime_skew = seconds; -} -#if 0 -void -ftime_get_window(time_t now, ftime_t *ft_out) -{ - ft_out->earliest = now + ftime_skew - ftime_slop; - ft_out->latest = now + ftime_skew + ftime_slop; -} -#endif -/** Return true iff we think that <b>now</b> might be after <b>when</b>. */ -int -ftime_maybe_after(time_t now, time_t when) -{ - /* It may be after when iff the latest possible current time is after when */ - return (now + ftime_skew + ftime_slop) >= when; -} -/** Return true iff we think that <b>now</b> might be before <b>when</b>. */ -int -ftime_maybe_before(time_t now, time_t when) -{ - /* It may be before when iff the earliest possible current time is before */ - return (now + ftime_skew - ftime_slop) < when; -} -/** Return true if we think that <b>now</b> is definitely after <b>when</b>. */ -int -ftime_definitely_after(time_t now, time_t when) -{ - /* It is definitely after when if the earliest time it could be is still - * after when. */ - return (now + ftime_skew - ftime_slop) >= when; -} -/** Return true if we think that <b>now</b> is definitely before <b>when</b>. - */ -int -ftime_definitely_before(time_t now, time_t when) -{ - /* It is definitely before when if the latest time it could be is still - * before when. */ - return (now + ftime_skew + ftime_slop) < when; -} - -/* ===== * Rate limiting * ===== */ @@ -2498,18 +2421,21 @@ digit_to_num(char d) * success, store the result in <b>out</b>, advance bufp to the next * character, and return 0. On failure, return -1. */ static int -scan_unsigned(const char **bufp, unsigned *out, int width) +scan_unsigned(const char **bufp, unsigned *out, int width, int base) { unsigned result = 0; int scanned_so_far = 0; + const int hex = base==16; + tor_assert(base == 10 || base == 16); if (!bufp || !*bufp || !out) return -1; if (width<0) width=MAX_SCANF_WIDTH; - while (**bufp && TOR_ISDIGIT(**bufp) && scanned_so_far < width) { - int digit = digit_to_num(*(*bufp)++); - unsigned new_result = result * 10 + digit; + while (**bufp && (hex?TOR_ISXDIGIT(**bufp):TOR_ISDIGIT(**bufp)) + && scanned_so_far < width) { + int digit = hex?hex_decode_digit(*(*bufp)++):digit_to_num(*(*bufp)++); + unsigned new_result = result * base + digit; if (new_result > UINT32_MAX || new_result < result) return -1; /* over/underflow. */ result = new_result; @@ -2571,11 +2497,12 @@ tor_vsscanf(const char *buf, const char *pattern, va_list ap) if (!width) /* No zero-width things. */ return -1; } - if (*pattern == 'u') { + if (*pattern == 'u' || *pattern == 'x') { unsigned *u = va_arg(ap, unsigned *); + const int base = (*pattern == 'u') ? 10 : 16; if (!*buf) return n_matched; - if (scan_unsigned(&buf, u, width)<0) + if (scan_unsigned(&buf, u, width, base)<0) return n_matched; ++pattern; ++n_matched; @@ -2612,9 +2539,9 @@ tor_vsscanf(const char *buf, const char *pattern, va_list ap) /** Minimal sscanf replacement: parse <b>buf</b> according to <b>pattern</b> * and store the results in the corresponding argument fields. Differs from - * sscanf in that it: Only handles %u and %Ns. Does not handle arbitrarily - * long widths. %u does not consume any space. Is locale-independent. - * Returns -1 on malformed patterns. + * sscanf in that it: Only handles %u and %x and %Ns. Does not handle + * arbitrarily long widths. %u and %x do not consume any space. Is + * locale-independent. Returns -1 on malformed patterns. * * (As with other locale-independent functions, we need this to parse data that * is in ASCII without worrying that the C library's locale-handling will make @@ -2879,17 +2806,34 @@ load_windows_system_library(const TCHAR *library_name) } #endif -/** Format child_state and saved_errno as a hex string placed in hex_errno. - * Called between fork and _exit, so must be signal-handler safe */ +/** Format <b>child_state</b> and <b>saved_errno</b> as a hex string placed in + * <b>hex_errno</b>. Called between fork and _exit, so must be signal-handler + * safe. + * + * <b>hex_errno</b> must have at least HEX_ERRNO_SIZE bytes available. + * + * The format of <b>hex_errno</b> is: "CHILD_STATE/ERRNO\n", left-padded + * with spaces. Note that there is no trailing \0. CHILD_STATE indicates where + * in the processs of starting the child process did the failure occur (see + * CHILD_STATE_* macros for definition), and SAVED_ERRNO is the value of + * errno when the failure occurred. + */ + void format_helper_exit_status(unsigned char child_state, int saved_errno, char *hex_errno) { - /* Convert errno to be unsigned for hex conversion */ unsigned int unsigned_errno; char *cur; + size_t i; + + /* Fill hex_errno with spaces, and a trailing newline (memset may + not be signal handler safe, so we can't use it) */ + for (i = 0; i < (HEX_ERRNO_SIZE - 1); i++) + hex_errno[i] = ' '; + hex_errno[HEX_ERRNO_SIZE - 1] = '\n'; - /* If errno is negative, negate it */ + /* Convert errno to be unsigned for hex conversion */ if (saved_errno < 0) { unsigned_errno = (unsigned int) -saved_errno; } else { @@ -2899,17 +2843,26 @@ format_helper_exit_status(unsigned char child_state, int saved_errno, /* Convert errno to hex (start before \n) */ cur = hex_errno + HEX_ERRNO_SIZE - 2; + /* Check for overflow on first iteration of the loop */ + if (cur < hex_errno) + return; + do { *cur-- = "0123456789ABCDEF"[unsigned_errno % 16]; unsigned_errno /= 16; } while (unsigned_errno != 0 && cur >= hex_errno); - /* Add on the minus side if errno was negative */ - if (saved_errno < 0) + /* Prepend the minus sign if errno was negative */ + if (saved_errno < 0 && cur >= hex_errno) *cur-- = '-'; /* Leave a gap */ - *cur-- = '/'; + if (cur >= hex_errno) + *cur-- = '/'; + + /* Check for overflow on first iteration of the loop */ + if (cur < hex_errno) + return; /* Convert child_state to hex */ do { @@ -2934,13 +2887,20 @@ format_helper_exit_status(unsigned char child_state, int saved_errno, #define SPAWN_ERROR_MESSAGE "ERR: Failed to spawn background process - code " -/** Start a program in the background. If <b>filename</b> contains a '/', then - * it will be treated as an absolute or relative path. Otherwise the system - * path will be searched for <b>filename</b>. Returns pid on success, otherwise - * returns -1. - * Some parts of this code are based on the POSIX subprocess module from Python +/** Start a program in the background. If <b>filename</b> contains a '/', + * then it will be treated as an absolute or relative path. Otherwise the + * system path will be searched for <b>filename</b>. The strings in + * <b>argv</b> will be passed as the command line arguments of the child + * program (following convention, argv[0] should normally be the filename of + * the executable). The last element of argv must be NULL. If the child + * program is launched, the PID will be returned and <b>stdout_read</b> and + * <b>stdout_err</b> will be set to file descriptors from which the stdout + * and stderr, respectively, output of the child program can be read, and the + * stdin of the child process shall be set to /dev/null. Otherwise returns + * -1. Some parts of this code are based on the POSIX subprocess module from + * Python. */ -static int +int tor_spawn_background(const char *const filename, int *stdout_read, int *stderr_read, const char **argv) { @@ -2970,16 +2930,12 @@ tor_spawn_background(const char *const filename, int *stdout_read, and we are not allowed to use unsafe functions between fork and exec */ error_message_length = strlen(error_message); - /* Fill hex_errno with spaces, and a trailing newline */ - memset(hex_errno, ' ', sizeof(hex_errno) - 1); - hex_errno[sizeof(hex_errno) - 1] = '\n'; - child_state = CHILD_STATE_PIPE; /* Set up pipe for redirecting stdout and stderr of child */ retval = pipe(stdout_pipe); if (-1 == retval) { - log_err(LD_GENERAL, + log_warn(LD_GENERAL, "Failed to set up pipe for stdout communication with child process: %s", strerror(errno)); return -1; @@ -2987,7 +2943,7 @@ tor_spawn_background(const char *const filename, int *stdout_read, retval = pipe(stderr_pipe); if (-1 == retval) { - log_err(LD_GENERAL, + log_warn(LD_GENERAL, "Failed to set up pipe for stderr communication with child process: %s", strerror(errno)); return -1; @@ -3039,7 +2995,8 @@ tor_spawn_background(const char *const filename, int *stdout_read, child_state = CHILD_STATE_CLOSEFD; /* Close all other fds, including the read end of the pipe */ - /* TODO: use closefrom if available */ + /* XXX: use closefrom if available, or better still set FD_CLOEXEC + on all of Tor's open files */ for (fd = STDERR_FILENO + 1; fd < max_fd; fd++) close(fd); @@ -3055,7 +3012,7 @@ tor_spawn_background(const char *const filename, int *stdout_read, child_state = CHILD_STATE_FAILEXEC; error: - /* TODO: are we leaking fds from the pipe? */ + /* XXX: are we leaking fds from the pipe? */ format_helper_exit_status(child_state, errno, hex_errno); @@ -3071,7 +3028,7 @@ tor_spawn_background(const char *const filename, int *stdout_read, /* In parent */ if (-1 == pid) { - log_err(LD_GENERAL, "Failed to fork child process: %s", strerror(errno)); + log_warn(LD_GENERAL, "Failed to fork child process: %s", strerror(errno)); close(stdout_pipe[0]); close(stdout_pipe[1]); close(stderr_pipe[0]); @@ -3084,7 +3041,7 @@ tor_spawn_background(const char *const filename, int *stdout_read, retval = close(stdout_pipe[1]); if (-1 == retval) { - log_err(LD_GENERAL, + log_warn(LD_GENERAL, "Failed to close write end of stdout pipe in parent process: %s", strerror(errno)); /* Do not return -1, because the child is running, so the parent @@ -3095,7 +3052,7 @@ tor_spawn_background(const char *const filename, int *stdout_read, retval = close(stderr_pipe[1]); if (-1 == retval) { - log_err(LD_GENERAL, + log_warn(LD_GENERAL, "Failed to close write end of stderr pipe in parent process: %s", strerror(errno)); /* Do not return -1, because the child is running, so the parent @@ -3148,26 +3105,27 @@ log_from_pipe(FILE *stream, int severity, const char *executable, } else { /* No newline; check whether we overflowed the buffer */ if (!feof(stream)) - log_err(LD_GENERAL, + log_warn(LD_GENERAL, "Line from port forwarding helper was truncated: %s", buf); /* TODO: What to do with this error? */ } /* Check if buf starts with SPAWN_ERROR_MESSAGE */ - if (strstr(buf, SPAWN_ERROR_MESSAGE) == buf) { + if (strcmpstart(buf, SPAWN_ERROR_MESSAGE) == 0) { /* Parse error message */ int retval, child_state, saved_errno; - retval = sscanf(buf, SPAWN_ERROR_MESSAGE "%d/%d", - &child_state, &saved_errno); + retval = tor_sscanf(buf, SPAWN_ERROR_MESSAGE "%x/%x", + &child_state, &saved_errno); if (retval == 2) { - log_err(LD_GENERAL, + log_warn(LD_GENERAL, "Failed to start child process \"%s\" in state %d: %s", executable, child_state, strerror(saved_errno)); if (child_status) *child_status = 1; } else { - /* Failed to parse message from child process, log it as error */ - log_err(LD_GENERAL, + /* Failed to parse message from child process, log it as a + warning */ + log_warn(LD_GENERAL, "Unexpected message from port forwarding helper \"%s\": %s", executable, buf); } @@ -3226,14 +3184,14 @@ tor_check_port_forwarding(const char *filename, int dir_port, int or_port, /* Start the child, if it is not already running */ if (-1 == child_pid && time_to_run_helper < now) { - int fd_out, fd_err; + int fd_out=-1, fd_err=-1; /* Assume tor-fw-helper will succeed, start it later*/ time_to_run_helper = now + TIME_TO_EXEC_FWHELPER_SUCCESS; child_pid = tor_spawn_background(filename, &fd_out, &fd_err, argv); if (child_pid < 0) { - log_err(LD_GENERAL, "Failed to start port forwarding helper %s", + log_warn(LD_GENERAL, "Failed to start port forwarding helper %s", filename); child_pid = -1; return; @@ -3254,7 +3212,7 @@ tor_check_port_forwarding(const char *filename, int dir_port, int or_port, /* Read from stdout/stderr and log result */ retval = 0; stdout_status = log_from_pipe(stdout_read, LOG_INFO, filename, &retval); - stderr_status = log_from_pipe(stderr_read, LOG_ERR, filename, &retval); + stderr_status = log_from_pipe(stderr_read, LOG_WARN, filename, &retval); if (retval) { /* There was a problem in the child process */ time_to_run_helper = now + TIME_TO_EXEC_FWHELPER_FAIL; @@ -3276,7 +3234,7 @@ tor_check_port_forwarding(const char *filename, int dir_port, int or_port, if (1 == retval) { log_info(LD_GENERAL, "Port forwarding helper terminated"); } else { - log_err(LD_GENERAL, "Failed to read from port forwarding helper"); + log_warn(LD_GENERAL, "Failed to read from port forwarding helper"); } /* TODO: The child might not actually be finished (maybe it failed or diff --git a/src/common/util.h b/src/common/util.h index 86555eeb19..633c613d43 100644 --- a/src/common/util.h +++ b/src/common/util.h @@ -248,14 +248,22 @@ void update_approx_time(time_t now); #endif /* Fuzzy time. */ -void ftime_set_maximum_sloppiness(int seconds); -void ftime_set_estimated_skew(int seconds); -/* typedef struct ftime_t { time_t earliest; time_t latest; } ftime_t; */ -/* void ftime_get_window(time_t now, ftime_t *ft_out); */ -int ftime_maybe_after(time_t now, time_t when); -int ftime_maybe_before(time_t now, time_t when); -int ftime_definitely_after(time_t now, time_t when); -int ftime_definitely_before(time_t now, time_t when); + +/** Return true iff <a>a</b> is definitely after <b>b</b>, even if there + * could be up to <b>allow_seconds</b> of skew in one of them. */ +static INLINE int +time_definitely_after(time_t a, time_t b, int allow_skew) +{ + return a-allow_skew > b; +} + +/** Return true iff <a>a</b> is definitely before <b>b</b>, even if there + * could be up to <b>allow_seconds</b> of skew in one of them. */ +static INLINE int +time_definitely_before(time_t a, time_t b, int allow_skew) +{ + return a+allow_skew < b; +} /* Rate-limiter */ @@ -350,6 +358,8 @@ HANDLE load_windows_system_library(const TCHAR *library_name); #ifdef UTIL_PRIVATE /* Prototypes for private functions only used by util.c (and unit tests) */ +int tor_spawn_background(const char *const filename, int *stdout_read, + int *stderr_read, const char **argv); void format_helper_exit_status(unsigned char child_state, int saved_errno, char *hex_errno); diff --git a/src/config/geoip b/src/config/geoip index 082e163d94..6e2cbbdf49 100644 --- a/src/config/geoip +++ b/src/config/geoip @@ -1,4 +1,4 @@ -# Last updated based on September 1 2010 Maxmind GeoLite Country +# Last updated based on October 1 2010 Maxmind GeoLite Country # wget http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip # cut -d, -f3-5 < GeoIPCountryWhois.csv|sed 's/"//g' > geoip 16777216,17301503,AU @@ -35,13 +35,17 @@ 28573696,28966911,CN 28966912,29032447,IN 29097984,29884415,CN +29884416,29885439,AU 29949952,30015487,KR 30015488,30408703,CN 30408704,33554431,KR 33554432,34603007,FR +34603008,35127295,EU +35127296,35651583,GB 35651584,36700159,IT 36700160,36962303,AE 36962304,37224447,IL +37224448,37486591,UA 37748736,38273023,SE 38273024,38797311,KZ 38797312,39059455,PT @@ -52,6 +56,7 @@ 40370176,40894463,DK 40894464,41418751,IT 41418752,41943039,GB +44040192,45088767,DE 50331648,68257567,US 68257568,68257599,CA 68257600,68259583,US @@ -268,7 +273,9 @@ 209988528,209988535,VI 209988536,210022479,US 210022480,210022487,PR -210022488,210784255,US +210022488,210439559,US +210439560,210439567,PR +210439568,210784255,US 210784256,210784383,BO 210784384,210784767,US 210784768,210786303,BO @@ -546,8 +553,8 @@ 214858656,214858671,NL 214858672,216417663,US 216417664,216417727,PR -216417728,216627279,US -216627280,216627295,PR +216417728,216627287,US +216627288,216627295,PR 216627296,216637639,US 216637640,216637647,PR 216637648,216820479,US @@ -566,20 +573,72 @@ 217046776,217046783,PR 217046784,234881023,US 234882304,234882559,AP +234883072,234884095,JP +234885120,234889215,VN +234889216,234913791,KR +234913792,234946559,HK +234946560,234950655,JP +234950656,234951679,AU +234951680,234952703,HK +234952704,234954751,JP +234954752,234971135,NZ +234971136,234979327,IN +234979328,235012095,MY 235012096,235077631,AU 235143168,235405311,KR 235405312,235929599,JP +235929600,236978175,CN 236978176,241172479,KR 241172480,241434623,IN 241434624,241500159,SG 241500160,241565695,JP -241631232,242221055,CN +241565696,241598463,IN +241599488,241600511,JP +241600512,241602559,AU +241602560,241604607,MY +241604608,241605631,ID +241605632,241606655,CN +241606656,241614847,IN +241614848,241623039,JP +241623040,241627135,IN +241627136,241631231,HK +241631232,243269631,CN 243269632,243269887,AP -243335168,243400703,KR +243270656,243271679,NZ +243271680,243272703,TH +243272704,243273727,NP +243273728,243277823,JP +243277824,243286015,AU +243286016,243302399,JP +243302400,243400703,KR 243400704,243531775,CN +243531776,243662847,JP +243662848,243793919,CN +243793920,243859455,HK +243859456,243924991,AU +243924992,243990527,KR +243990528,244318207,IN +244318208,245366783,CN 245366784,247463935,VN +247463936,247472127,PH +247472128,247479295,JP +247479296,247480319,CN +247480320,247482367,MY +247482368,247483391,PG +247484416,247488511,KR +247488512,247496703,JP +247496704,247504895,PK +247504896,247513087,AU +247513088,247529471,MY 247529472,247595007,JP 247595008,247726079,IN +247726080,247857151,CN +247857152,247988223,HK +247988224,248250367,AU +248250368,248381439,CN +248381440,248446975,KR +248446976,248512511,TH +248512512,249561087,CN 249561088,251658239,VN 251658240,289011535,US 289011536,289011543,IT @@ -729,7 +788,7 @@ 418693120,418709503,CA 418709504,418766847,US 418766848,418770943,CA -418775040,419430399,US +418770944,419430399,US 419430400,436207615,GB 436207616,452984831,US 452984832,452985855,JP @@ -877,7 +936,16 @@ 460718080,460722175,JP 460722176,460726271,VN 460726272,460734463,IN -460734464,460849151,KR +460734464,460865535,KR +460865536,460931071,JP +460931072,460933119,AU +460935168,460937215,ID +460937216,460938239,AU +460939264,460940287,NZ +460941312,460942335,AU +460943360,460945407,AU +460947456,460980223,JP +460980224,460981247,NC 461373440,461504511,CN 461504512,461570047,TH 461570048,461572095,ID @@ -931,7 +999,9 @@ 539625392,539625407,GB 539625408,539626495,US 539626496,539626543,GB -539626544,539627391,US +539626544,539627127,US +539627128,539627135,SE +539627136,539627391,US 539627392,539627399,JP 539627400,539627407,IE 539627408,539627423,JP @@ -1101,6 +1171,7 @@ 692756480,692760575,RW 692760576,692768767,ZA 692768768,692772863,MG +692772864,692776959,ZA 692830208,692834303,NG 692834304,692838399,TZ 692838400,692842495,ZA @@ -1126,7 +1197,7 @@ 692891648,692893695,ZA 692893696,692895743,KE 692895744,692897791,NG -692897792,692903935,ZA +692897792,692905983,ZA 692969472,692971519,TZ 692973568,692975615,MZ 692975616,692977663,EG @@ -1166,6 +1237,8 @@ 693016576,693017599,GA 693017600,693018623,NG 693018624,693019647,UG +693019648,693020671,ZA +693020672,693021695,TZ 693101568,693102591,KE 693102592,693103615,CD 693103616,693104639,GN @@ -1186,7 +1259,9 @@ 693575680,693583871,KE 693583872,693592063,NG 693592064,693600255,MU -693624832,693633023,ZA +693600256,693608447,MA +693608448,693616639,BW +693616640,693633023,ZA 693633024,693698559,EG 693698560,693829631,KE 693829632,693895167,EG @@ -1545,6 +1620,7 @@ 702525440,702526463,DZ 702526464,702527487,TZ 702527488,702528511,CF +702528512,702529535,CG 702529536,702530559,NG 702530560,702531583,EG 702531584,702532607,SD @@ -1571,10 +1647,32 @@ 771751936,771817471,RU 771817472,771948543,TR 771948544,772014079,RU -772014080,772079615,DE -773062656,773066751,TR +772014080,772145151,DE +772145152,772210687,ES +772210688,772276223,IE +772276224,772341759,RU +772341760,772407295,NO +772407296,772472831,BG +772472832,772538367,MT +772538368,772603903,GR +772603904,772669439,CZ +772669440,772734975,CH +772800512,772802559,GB +772802560,772804607,RU +772804608,772806655,BZ +772806656,772808703,RU +773001216,773003263,NO +773062656,773062911,TR +773062912,773063167,US +773063168,773063935,TR +773063936,773064703,US +773064704,773066751,TR 773066752,773070847,AT 773070848,773074943,DE +773074944,773079039,PL +773079040,773083135,RU +773083136,773087231,IT +773087232,773091327,LB 773324800,773586943,ES 773586944,773588991,IT 773588992,773591039,PL @@ -1624,7 +1722,9 @@ 773675008,773677055,GB 773677056,773679103,DE 773679104,773679135,IT -773679136,773681151,A2 +773679136,773679359,A2 +773679360,773679423,GB +773679424,773681151,A2 773681152,773683199,RU 773683200,773685247,FR 773685248,773687295,UA @@ -1641,9 +1741,8 @@ 773709824,773711871,CZ 773711872,773713919,RU 773713920,773715967,NL -773715968,773716223,EE -773716224,773716479,SE -773716480,773716991,EE +773715968,773716479,EE +773716480,773716991,SE 773716992,773718015,US 773718016,773720063,DE 773720064,773722111,GB @@ -1660,6 +1759,51 @@ 773746688,773748735,DE 773748736,773750783,DK 773750784,773752831,FI +773752832,773754879,GB +773754880,773756927,CZ +773756928,773758975,RU +773758976,773761023,UA +773761024,773763071,IT +773763072,773765119,TR +773765120,773767167,NL +773767168,773769215,GB +773769216,773771263,SE +773771264,773773311,DK +773773312,773775359,IT +773775360,773777407,IQ +773777408,773779455,CZ +773779456,773781503,ME +773781504,773783551,IT +773783552,773785599,RU +773785600,773787647,NL +773787648,773789695,DK +773789696,773791743,RU +773791744,773793791,PL +773793792,773795839,FR +773795840,773797887,NL +773797888,773799935,ES +773799936,773801983,CY +773801984,773804031,IQ +773804032,773806079,GB +773806080,773808127,BE +773808128,773810175,IL +773810176,773812223,IT +773812224,773814271,TR +773814272,773816319,DE +773816320,773818367,IT +773818368,773820415,HR +773820416,773822463,TR +773822464,773824511,RU +773824512,773826559,FR +773826560,773828607,NL +773828608,773830655,HU +773830656,773832703,NO +773832704,773834751,FR +773834752,773836799,GB +773836800,773838847,FR +773838848,773840895,DE +773840896,773847039,GB +773847040,773849087,IT 773849088,773857279,IR 773857280,773865471,DK 773865472,773873663,RU @@ -1669,6 +1813,18 @@ 773898240,773906431,PS 773906432,773922815,GB 773922816,773931007,UA +773931008,773939199,FR +773939200,773947391,CZ +773947392,773955583,GB +773955584,773963775,FR +773963776,773971967,ME +773971968,773980159,UA +773980160,773988351,GB +773988352,774004735,ES +774004736,774012927,IR +774012928,774021119,RU +774021120,774029311,IR +774029312,774037503,RO 774373376,774389759,RS 774389760,774406143,BG 774406144,774422527,IT @@ -1687,6 +1843,13 @@ 774619136,774651903,RU 774651904,774668287,SA 774668288,774684671,NL +774684672,774701055,IT +774701056,774717439,RU +774717440,774733823,PL +774733824,774750207,TR +774750208,774782975,RU +774782976,774799359,UA +774799360,774815743,RU 774897664,774963199,RU 774963200,774995967,GE 774995968,775028735,RO @@ -1699,6 +1862,8 @@ 775225344,775258111,SY 775258112,775290879,BY 775290880,775323647,MT +775323648,775356415,SI +775356416,775389183,MD 775946240,776077311,GB 776077312,776208383,NO 776208384,776339455,GB @@ -1706,7 +1871,7 @@ 776470528,776601599,RU 776601600,776732671,AT 776732672,776863743,PL -776994816,778043391,DE +776863744,778043391,DE 778043392,778108927,RU 778108928,778174463,RO 778174464,778239999,UA @@ -1733,13 +1898,25 @@ 780009472,780140543,CH 788529152,805306367,CA 805306368,822083583,US +822083584,822083839,AP +822083840,822084095,AU +822214656,822345727,AU +822345728,822607871,CN +825229312,825360383,TH +825360384,825361407,AP +825425920,825491455,AU +830406656,830472703,AU +838795264,838860799,AP 838860800,838926335,US 838991872,838999039,US 838999040,838999295,CA 838999296,839010559,US 839010560,839010815,CA -839010816,839188479,US +839010816,839022079,US +839022080,839023103,CA +839023104,839254015,US 839385088,839909375,US +840957952,843055103,US 855638016,872415231,GB 872415232,889192447,US 889192448,905969663,DE @@ -2155,7 +2332,8 @@ 1026408448,1026416639,JP 1026416640,1026420735,ID 1026420736,1026422783,JP -1026422784,1026424831,AP +1026422784,1026423295,AU +1026423296,1026424831,AP 1026424832,1026490367,JP 1026490368,1026523135,TH 1026523136,1026539519,CN @@ -2249,8 +2427,8 @@ 1040469056,1040469071,FR 1040469072,1040469087,EU 1040469088,1040469183,FR -1040469184,1040469215,EU -1040469216,1040469279,FR +1040469184,1040469247,EU +1040469248,1040469279,FR 1040469280,1040469311,EU 1040469312,1040469343,FR 1040469344,1040469375,EU @@ -2298,9 +2476,7 @@ 1040983808,1040983815,NG 1040983816,1040984143,A2 1040984144,1040984151,NG -1040984152,1040984175,A2 -1040984176,1040984183,NG -1040984184,1040990207,A2 +1040984152,1040990207,A2 1040990208,1040994303,CY 1040994304,1040994815,RU 1040994816,1040998399,CY @@ -2385,7 +2561,11 @@ 1041701312,1041701551,GB 1041701552,1041701567,FR 1041701568,1041701631,GB -1041701632,1041702303,FR +1041701632,1041701647,FR +1041701648,1041701663,GB +1041701664,1041702167,FR +1041702168,1041702175,GB +1041702176,1041702303,FR 1041702304,1041702311,GB 1041702312,1041702327,FR 1041702328,1041702335,GB @@ -2752,10 +2932,10 @@ 1041722504,1041722535,FR 1041722536,1041722551,GB 1041722552,1041722567,FR -1041722568,1041722575,GB -1041722576,1041722583,FR -1041722584,1041722623,GB -1041722624,1041722983,FR +1041722568,1041722623,GB +1041722624,1041722703,FR +1041722704,1041722711,GB +1041722712,1041722983,FR 1041722984,1041723007,GB 1041723008,1041723047,FR 1041723048,1041723135,GB @@ -2771,28 +2951,34 @@ 1041724456,1041724463,GB 1041724464,1041724471,FR 1041724472,1041724479,GB -1041724480,1041724671,FR +1041724480,1041724535,FR +1041724536,1041724543,GB +1041724544,1041724671,FR 1041724672,1041724927,GB 1041724928,1041725119,FR 1041725120,1041725167,GB 1041725168,1041725175,FR -1041725176,1041725231,GB +1041725176,1041725183,GB +1041725184,1041725191,FR +1041725192,1041725231,GB 1041725232,1041725255,FR -1041725256,1041725271,GB -1041725272,1041725375,FR +1041725256,1041725279,GB +1041725280,1041725375,FR 1041725376,1041725407,GB 1041725408,1041725749,FR 1041725750,1041725751,GB 1041725752,1041725815,FR 1041725816,1041725823,GB -1041725824,1041726063,FR +1041725824,1041725863,FR +1041725864,1041725871,GB +1041725872,1041726063,FR 1041726064,1041726079,GB 1041726080,1041726127,FR 1041726128,1041726151,GB 1041726152,1041726159,FR 1041726160,1041726167,GB -1041726168,1041726511,FR -1041726512,1041726543,GB +1041726168,1041726503,FR +1041726504,1041726543,GB 1041726544,1041726639,FR 1041726640,1041726655,GB 1041726656,1041726671,FR @@ -2889,8 +3075,8 @@ 1041732960,1041732967,GB 1041732968,1041732991,FR 1041732992,1041733103,GB -1041733104,1041733503,FR -1041733504,1041733535,GB +1041733104,1041733511,FR +1041733512,1041733535,GB 1041733536,1041733567,FR 1041733568,1041733631,GB 1041733632,1041734927,FR @@ -3096,7 +3282,9 @@ 1041744360,1041744367,GB 1041744368,1041744399,FR 1041744400,1041744407,GB -1041744408,1041744479,FR +1041744408,1041744415,FR +1041744416,1041744447,GB +1041744448,1041744479,FR 1041744480,1041744543,GB 1041744544,1041744599,FR 1041744600,1041744607,GB @@ -3188,7 +3376,9 @@ 1041750776,1041750783,GB 1041750784,1041751695,FR 1041751696,1041751719,GB -1041751720,1041753319,FR +1041751720,1041751775,FR +1041751776,1041751807,GB +1041751808,1041753319,FR 1041753320,1041753327,GB 1041753328,1041753407,FR 1041753408,1041753503,GB @@ -3398,11 +3588,15 @@ 1042892960,1042892967,DE 1042892968,1042892975,PL 1042892976,1042892983,CH -1042892984,1042893055,NL +1042892984,1042892991,NL +1042892992,1042893007,FR +1042893008,1042893055,NL 1042893056,1042893087,GB 1042893088,1042893135,NL 1042893136,1042893143,DE -1042893144,1042893183,NL +1042893144,1042893151,NL +1042893152,1042893167,PL +1042893168,1042893183,NL 1042893184,1042893311,GB 1042893312,1042894079,NL 1042894080,1042894143,DE @@ -3430,7 +3624,11 @@ 1043202048,1043333119,AT 1043333120,1043341311,CH 1043341312,1043349503,IT -1043349504,1043357695,DE +1043349504,1043350851,DE +1043350852,1043350855,CH +1043350856,1043356023,DE +1043356024,1043356031,CH +1043356032,1043357695,DE 1043357696,1043365887,CH 1043365888,1043398655,PT 1043398656,1043464191,GB @@ -3879,9 +4077,7 @@ 1044020168,1044020187,BE 1044020188,1044020199,NL 1044020200,1044020203,BE -1044020204,1044020207,NL -1044020208,1044020211,BE -1044020212,1044020219,NL +1044020204,1044020219,NL 1044020220,1044020255,BE 1044020256,1044020263,NL 1044020264,1044020303,BE @@ -4109,9 +4305,13 @@ 1044668416,1044676607,BA 1044676608,1044684799,RU 1044684800,1044692991,HU -1044692992,1044697087,AT +1044692992,1044695935,AT +1044695936,1044696062,DE +1044696063,1044697087,AT 1044697088,1044697343,DE -1044697344,1044701183,AT +1044697344,1044697855,AT +1044697856,1044698110,DE +1044698111,1044701183,AT 1044701184,1044709375,EG 1044709376,1044717567,RU 1044717568,1044742143,GB @@ -4177,7 +4377,9 @@ 1044930928,1044930967,BE 1044930968,1044930975,FR 1044930976,1044930979,GB -1044930980,1044931375,BE +1044930980,1044931231,BE +1044931232,1044931239,GB +1044931240,1044931375,BE 1044931376,1044931391,GB 1044931392,1044931407,BE 1044931408,1044931439,GB @@ -4237,7 +4439,9 @@ 1044933024,1044933039,GB 1044933040,1044933055,BE 1044933056,1044933071,GB -1044933072,1044933215,BE +1044933072,1044933103,BE +1044933104,1044933107,GB +1044933108,1044933215,BE 1044933216,1044933227,GB 1044933228,1044933303,BE 1044933304,1044933311,GB @@ -4267,9 +4471,9 @@ 1044933844,1044933847,GB 1044933848,1044933863,BE 1044933864,1044933871,GB -1044933872,1044934103,BE -1044934104,1044934111,GB -1044934112,1044934191,BE +1044933872,1044933919,BE +1044933920,1044933951,GB +1044933952,1044934191,BE 1044934192,1044934199,GB 1044934200,1044934239,BE 1044934240,1044934247,GB @@ -4416,10 +4620,8 @@ 1045018752,1045020159,GB 1045020160,1045020255,ES 1045020256,1045020287,GB -1045020288,1045020519,ES -1045020520,1045020527,GB -1045020528,1045020543,ES -1045020544,1045020671,GB +1045020288,1045020639,ES +1045020640,1045020671,GB 1045020672,1045037055,NO 1045037056,1045119231,GR 1045119232,1045119743,AL @@ -4430,7 +4632,9 @@ 1045154560,1045154591,NL 1045154592,1045154623,DE 1045154624,1045154655,GB -1045154656,1045154751,DE +1045154656,1045154687,DE +1045154688,1045154719,NL +1045154720,1045154751,DE 1045154752,1045154783,SE 1045154784,1045155071,DE 1045155072,1045155327,CH @@ -4588,9 +4792,7 @@ 1045746096,1045746163,SE 1045746164,1045746175,GB 1045746176,1045746431,SE -1045746432,1045746447,GB -1045746448,1045746463,SE -1045746464,1045746495,GB +1045746432,1045746495,GB 1045746496,1045746527,SE 1045746528,1045746543,GB 1045746544,1045746559,SE @@ -4651,8 +4853,7 @@ 1046229120,1046282239,NO 1046282240,1046283007,DE 1046283008,1046283263,BZ -1046283264,1046283327,LU -1046283328,1046284287,DE +1046283264,1046284287,DE 1046284288,1046285311,BZ 1046285312,1046286663,DE 1046286664,1046286671,BZ @@ -4660,7 +4861,9 @@ 1046286928,1046286935,ES 1046286936,1046288383,DE 1046288384,1046288663,CZ -1046288664,1046288895,DE +1046288664,1046288767,DE +1046288768,1046288775,AG +1046288776,1046288895,DE 1046288896,1046290431,AG 1046290432,1046298623,PL 1046298624,1046299903,AT @@ -4988,9 +5191,7 @@ 1046528608,1046528639,DE 1046528640,1046528671,GB 1046528672,1046528767,DE -1046528768,1046529279,GB -1046529280,1046529535,DE -1046529536,1046530047,GB +1046528768,1046530047,GB 1046530048,1046530687,DE 1046530688,1046530815,GB 1046530816,1046530879,DE @@ -5265,9 +5466,7 @@ 1047563452,1047563455,NL 1047563456,1047563467,DE 1047563468,1047563471,CH -1047563472,1047563727,DE -1047563728,1047563731,AU -1047563732,1047566363,DE +1047563472,1047566363,DE 1047566364,1047566367,CH 1047566368,1047566403,DE 1047566404,1047566415,CH @@ -5323,9 +5522,7 @@ 1047567316,1047567319,AT 1047567320,1047567359,DE 1047567360,1047567375,ES -1047567376,1047567435,DE -1047567436,1047567439,CH -1047567440,1047567447,DE +1047567376,1047567447,DE 1047567448,1047567451,CH 1047567452,1047567455,AT 1047567456,1047567459,CH @@ -5364,8 +5561,8 @@ 1047567936,1047567939,CH 1047567940,1047568047,DE 1047568048,1047568059,CH -1047568060,1047568083,DE -1047568084,1047568095,CH +1047568060,1047568087,DE +1047568088,1047568095,CH 1047568096,1047568159,DE 1047568160,1047568163,CH 1047568164,1047568187,DE @@ -5471,8 +5668,8 @@ 1048604966,1048604967,UA 1048604968,1048604971,LT 1048604972,1048604975,UA -1048604976,1048605063,LT -1048605064,1048607231,UA +1048604976,1048605071,LT +1048605072,1048607231,UA 1048607232,1048607247,EE 1048607248,1048607487,UA 1048607488,1048607519,EE @@ -5635,7 +5832,9 @@ 1048856920,1048856927,DE 1048856928,1048856999,NL 1048857000,1048857007,DE -1048857008,1048857767,NL +1048857008,1048857207,NL +1048857208,1048857215,DE +1048857216,1048857767,NL 1048857768,1048857775,DE 1048857776,1048858111,NL 1048858112,1048858623,DE @@ -7809,11 +8008,11 @@ 1052507776,1052507903,EU 1052507904,1052596447,GB 1052596448,1052596463,IT -1052596464,1052602495,GB -1052602496,1052602623,ES -1052602624,1052621951,GB +1052596464,1052621951,GB 1052621952,1052622015,IE -1052622016,1052634943,GB +1052622016,1052631935,GB +1052631936,1052631999,FR +1052632000,1052634943,GB 1052634944,1052634951,IE 1052634952,1052644095,GB 1052644096,1052644351,SE @@ -8093,8 +8292,8 @@ 1053352192,1053353023,EU 1053353024,1053353031,IE 1053353032,1053353103,EU -1053353104,1053353111,IE -1053353112,1053353135,EU +1053353104,1053353119,IE +1053353120,1053353135,EU 1053353136,1053353215,IE 1053353216,1053353223,GB 1053353224,1053353255,IE @@ -8432,29 +8631,29 @@ 1055203360,1055203839,EU 1055203840,1055204095,CZ 1055204096,1055204863,EU -1055204864,1055205375,CZ -1055205376,1055205631,EU +1055204864,1055205119,CZ +1055205120,1055205631,EU 1055205632,1055205887,CZ 1055205888,1055206655,EU -1055206656,1055207423,CZ +1055206656,1055206911,CZ +1055206912,1055207167,EU +1055207168,1055207423,CZ 1055207424,1055207679,EU -1055207680,1055209471,CZ -1055209472,1055209727,EU +1055207680,1055209215,CZ +1055209216,1055209727,EU 1055209728,1055210239,CZ -1055210240,1055210495,EU -1055210496,1055210751,SK -1055210752,1055211263,EU +1055210240,1055211263,EU 1055211264,1055211519,CZ 1055211520,1055212043,EU -1055212044,1055212179,PT +1055212044,1055212131,PT +1055212132,1055212175,EU +1055212176,1055212179,PT 1055212180,1055212183,EU 1055212184,1055212247,PT 1055212248,1055212351,EU 1055212352,1055212415,PT -1055212416,1055212543,EU -1055212544,1055212799,PT -1055212800,1055213055,EU -1055213056,1055213307,PT +1055212416,1055213263,EU +1055213264,1055213307,PT 1055213308,1055213311,EU 1055213312,1055213319,PT 1055213320,1055213327,EU @@ -8463,8 +8662,8 @@ 1055213368,1055213455,PT 1055213456,1055213471,EU 1055213472,1055213567,PT -1055213568,1055213823,EU -1055213824,1055214239,PT +1055213568,1055214079,EU +1055214080,1055214239,PT 1055214240,1055214271,EU 1055214272,1055214847,PT 1055214848,1055215359,EU @@ -8493,8 +8692,8 @@ 1055220352,1055220399,NL 1055220400,1055221503,EU 1055221504,1055221631,BE -1055221632,1055223039,EU -1055223040,1055223807,NL +1055221632,1055223551,EU +1055223552,1055223807,NL 1055223808,1055223903,EU 1055223904,1055223999,LU 1055224000,1055224063,EU @@ -8825,7 +9024,9 @@ 1064973056,1064973183,AU 1064973184,1065049471,US 1065049472,1065049535,CA -1065049536,1065519359,US +1065049536,1065517087,US +1065517088,1065517119,A2 +1065517120,1065519359,US 1065519360,1065519487,CA 1065519488,1065520895,US 1065520896,1065520911,CA @@ -9055,7 +9256,9 @@ 1071362112,1071362207,US 1071362208,1071362239,HK 1071362240,1071472639,US -1071472640,1071480831,CA +1071472640,1071476735,CA +1071476736,1071477247,US +1071477248,1071480831,CA 1071480832,1071985631,US 1071985632,1071985663,ML 1071985664,1072440639,US @@ -9156,8 +9359,7 @@ 1072935680,1072935807,PH 1072935808,1072935871,CA 1072935872,1072935935,US -1072935936,1072936191,CA -1072936192,1072936447,US +1072935936,1072936447,CA 1072936448,1072936703,PH 1072936704,1072937215,US 1072937216,1072937471,IR @@ -9469,17 +9671,11 @@ 1075479568,1075479583,US 1075479584,1075479607,CA 1075479608,1075479615,US -1075479616,1075480463,CA -1075480464,1075480479,US -1075480480,1075480975,CA -1075480976,1075480991,US -1075480992,1075484047,CA +1075479616,1075484047,CA 1075484048,1075484063,US 1075484064,1075484263,CA 1075484264,1075484271,US -1075484272,1075484287,CA -1075484288,1075484415,US -1075484416,1075494911,CA +1075484272,1075494911,CA 1075494912,1075513151,US 1075513152,1075513183,KW 1075513184,1075532663,US @@ -9539,7 +9735,9 @@ 1075582504,1075582511,NL 1075582512,1075582615,NO 1075582616,1075582623,NL -1075582624,1075583119,NO +1075582624,1075582975,NO +1075582976,1075583007,NL +1075583008,1075583119,NO 1075583120,1075583123,NL 1075583124,1075583127,NO 1075583128,1075583135,NL @@ -9664,7 +9862,9 @@ 1075988320,1075988479,CA 1075988480,1075988735,US 1075988736,1075988991,CA -1075988992,1075989247,US +1075988992,1075989119,US +1075989120,1075989183,CA +1075989184,1075989247,US 1075989248,1075989311,FI 1075989312,1075989359,CA 1075989360,1075989375,US @@ -9778,10 +9978,10 @@ 1076007264,1076007679,CA 1076007680,1076007935,US 1076007936,1076007967,CA -1076007968,1076008191,US -1076008192,1076008383,CA -1076008384,1076008447,US -1076008448,1076009631,CA +1076007968,1076007983,US +1076007984,1076008063,CA +1076008064,1076008191,US +1076008192,1076009631,CA 1076009632,1076009639,US 1076009640,1076009643,CA 1076009644,1076009663,US @@ -9792,7 +9992,9 @@ 1076009920,1076010687,CA 1076010688,1076010695,US 1076010696,1076011007,CA -1076011008,1076026023,US +1076011008,1076024307,US +1076024308,1076024315,CA +1076024316,1076026023,US 1076026024,1076026031,CA 1076026032,1076026367,US 1076026368,1076026495,CA @@ -9806,8 +10008,8 @@ 1076027296,1076027391,CA 1076027392,1076027399,US 1076027400,1076027407,CA -1076027408,1076027455,US -1076027456,1076027711,CA +1076027408,1076027423,US +1076027424,1076027711,CA 1076027712,1076027727,US 1076027728,1076027775,CA 1076027776,1076027791,US @@ -10741,7 +10943,9 @@ 1077452800,1077460991,JP 1077460992,1077469183,US 1077469184,1077477375,CA -1077477376,1077506047,US +1077477376,1077489855,US +1077489856,1077489919,GB +1077489920,1077506047,US 1077506048,1077510143,LS 1077510144,1077561327,US 1077561328,1077561343,AR @@ -10749,9 +10953,7 @@ 1077565504,1077565567,AR 1077565568,1077567487,US 1077567488,1077571583,A2 -1077571584,1077571839,US -1077571840,1077571967,CA -1077571968,1077626239,US +1077571584,1077626239,US 1077626240,1077626271,WS 1077626272,1077627167,US 1077627168,1077627199,EC @@ -10840,7 +11042,188 @@ 1077869760,1077869823,GR 1077869824,1077870335,US 1077870336,1077870591,CN -1077870592,1077963775,US +1077870592,1077936137,US +1077936138,1077936141,CN +1077936142,1077936169,US +1077936170,1077936173,CA +1077936174,1077936177,GB +1077936178,1077936189,US +1077936190,1077936193,CA +1077936194,1077936201,US +1077936202,1077936205,GB +1077936206,1077936209,US +1077936210,1077936213,GR +1077936214,1077936225,US +1077936226,1077936229,IN +1077936230,1077936233,US +1077936234,1077936237,ES +1077936238,1077936257,US +1077936258,1077936261,AU +1077936262,1077936265,IN +1077936266,1077936273,US +1077936274,1077936277,BR +1077936278,1077936295,US +1077936296,1077936296,CA +1077936297,1077936297,US +1077936298,1077936301,NG +1077936302,1077936305,US +1077936306,1077936309,ZA +1077936310,1077936313,US +1077936314,1077936317,BR +1077936318,1077936321,US +1077936322,1077936325,GB +1077936326,1077936329,MX +1077936330,1077936345,US +1077936346,1077936349,PE +1077936350,1077936351,IN +1077936352,1077936365,US +1077936366,1077936369,NO +1077936370,1077936373,GB +1077936374,1077936377,US +1077936378,1077936381,IE +1077936382,1077936401,US +1077936402,1077936409,GB +1077936410,1077936413,CO +1077936414,1077936421,US +1077936422,1077936422,CA +1077936423,1077936426,US +1077936427,1077936429,TH +1077936430,1077936437,US +1077936438,1077936441,NO +1077936442,1077936445,TH +1077936446,1077936449,TW +1077936450,1077936453,US +1077936454,1077936457,PT +1077936458,1077936461,US +1077936462,1077936463,GB +1077936464,1077936465,US +1077936466,1077936469,IN +1077936470,1077936473,US +1077936474,1077936474,CA +1077936475,1077936475,US +1077936476,1077936477,GB +1077936478,1077936485,US +1077936486,1077936489,TR +1077936490,1077936493,FR +1077936494,1077936497,CN +1077936498,1077936501,US +1077936502,1077936505,AR +1077936506,1077936513,US +1077936514,1077936517,BR +1077936518,1077936521,US +1077936522,1077936525,IN +1077936526,1077936529,US +1077936530,1077936533,PH +1077936534,1077936545,US +1077936546,1077936549,MY +1077936550,1077936573,US +1077936574,1077936577,AR +1077936578,1077936585,US +1077936586,1077936589,GB +1077936590,1077936593,PH +1077936594,1077936597,GR +1077936598,1077936601,CA +1077936602,1077936605,TH +1077936606,1077936609,JO +1077936610,1077936621,US +1077936622,1077936622,AU +1077936623,1077936626,US +1077936627,1077936630,CH +1077936631,1077936634,PE +1077936635,1077936638,CA +1077936639,1077936645,US +1077936646,1077936649,HK +1077936650,1077936653,CA +1077936654,1077936667,US +1077936668,1077936671,CA +1077936672,1077936679,US +1077936680,1077936683,TH +1077936684,1077936684,RO +1077936685,1077936691,US +1077936692,1077936695,IT +1077936696,1077936699,US +1077936700,1077936703,TH +1077936704,1077936742,US +1077936743,1077936743,BE +1077936744,1077936747,IN +1077936748,1077936759,US +1077936760,1077936763,AU +1077936764,1077936767,US +1077936768,1077936777,AU +1077936778,1077936789,US +1077936790,1077936793,NG +1077936794,1077936797,AU +1077936798,1077936801,SI +1077936802,1077936805,AU +1077936806,1077936814,US +1077936815,1077936818,BR +1077936819,1077936822,RS +1077936823,1077936826,LV +1077936827,1077936834,US +1077936835,1077936838,CL +1077936839,1077936842,TH +1077936843,1077936846,US +1077936847,1077936850,PK +1077936851,1077936854,GB +1077936855,1077936859,IN +1077936860,1077936879,US +1077936880,1077936883,IT +1077936884,1077936887,CO +1077936888,1077938949,US +1077938950,1077938969,CA +1077938970,1077939209,US +1077939210,1077939210,BE +1077939211,1077939461,US +1077939462,1077939465,CA +1077939466,1077939725,US +1077939726,1077939727,DE +1077939728,1077939735,US +1077939736,1077939739,IN +1077939740,1077939743,MY +1077939744,1077939747,CA +1077939748,1077939751,US +1077939752,1077939755,BZ +1077939756,1077939776,US +1077939777,1077939780,CA +1077939781,1077939784,GB +1077939785,1077939973,US +1077939974,1077939977,CL +1077939978,1077939981,US +1077939982,1077939985,MU +1077939986,1077939993,US +1077939994,1077939997,CN +1077939998,1077940001,GB +1077940002,1077940005,EG +1077940006,1077940009,US +1077940010,1077940013,IN +1077940014,1077940060,US +1077940061,1077940068,GB +1077940069,1077940072,US +1077940073,1077940076,TH +1077940077,1077940089,US +1077940090,1077940097,GB +1077940098,1077940099,DE +1077940100,1077940101,US +1077940102,1077940105,IN +1077940106,1077940109,TR +1077940110,1077940113,CA +1077940114,1077940125,US +1077940126,1077940129,LV +1077940130,1077940133,US +1077940134,1077940137,GB +1077940138,1077940146,US +1077940147,1077940150,EG +1077940151,1077940174,US +1077940175,1077940178,GB +1077940179,1077940182,US +1077940183,1077940190,CA +1077940191,1077940196,US +1077940197,1077940200,MX +1077940201,1077940205,GB +1077940206,1077940209,IT +1077940210,1077940213,US +1077940214,1077940217,MX +1077940218,1077963775,US 1077963776,1077964031,CA 1077964032,1077977087,US 1077977088,1077985279,CA @@ -10853,7 +11236,15 @@ 1078124544,1078128639,CA 1078128640,1078247423,US 1078247424,1078251519,CA -1078251520,1078280191,US +1078251520,1078252559,US +1078252560,1078252591,MX +1078252592,1078252639,US +1078252640,1078252655,MX +1078252656,1078253823,US +1078253824,1078253887,MX +1078253888,1078254847,US +1078254848,1078255359,MX +1078255360,1078280191,US 1078280192,1078280575,CA 1078280576,1078280591,US 1078280592,1078280639,CA @@ -11075,7 +11466,9 @@ 1078456320,1078460415,CA 1078460416,1078517759,US 1078517760,1078525951,CA -1078525952,1078600639,US +1078525952,1078581311,US +1078581312,1078581327,CR +1078581328,1078600639,US 1078600640,1078600647,GB 1078600648,1078615679,US 1078615680,1078615711,GB @@ -11235,7 +11628,13 @@ 1078814136,1078814143,HK 1078814144,1078814399,US 1078814400,1078814415,CA -1078814416,1078956799,US +1078814416,1078895103,US +1078895104,1078895359,CN +1078895360,1078895967,US +1078895968,1078895983,CN +1078895984,1078945023,US +1078945024,1078945279,GB +1078945280,1078956799,US 1078956800,1078957055,GB 1078957056,1079320575,US 1079320576,1079320671,CA @@ -11426,8 +11825,7 @@ 1079432960,1079433215,CA 1079433216,1079435263,CR 1079435264,1079435775,CO -1079435776,1079436799,HT -1079436800,1079437311,CA +1079435776,1079437311,CA 1079437312,1079439359,US 1079439360,1079442431,CA 1079442432,1079442687,US @@ -11451,9 +11849,7 @@ 1079664640,1079668735,CA 1079668736,1079827871,US 1079827872,1079827887,RU -1079827888,1079856639,US -1079856640,1079856895,IN -1079856896,1079857887,US +1079827888,1079857887,US 1079857888,1079857903,NZ 1079857904,1079861247,US 1079861248,1079865343,CA @@ -11470,7 +11866,7 @@ 1079953600,1079994367,US 1079994368,1079996415,CA 1079996416,1080021999,US -1080022000,1080022007,CA +1080022000,1080022007,GT 1080022008,1080033279,US 1080033280,1080295423,CA 1080295424,1080722827,US @@ -11902,13 +12298,33 @@ 1081589112,1081589759,US 1081589760,1081593855,BB 1081593856,1081597951,CA -1081597952,1081608703,US -1081608704,1081608959,CA -1081608960,1081609823,US +1081597952,1081609823,US 1081609824,1081609831,LK 1081609832,1081609887,US 1081609888,1081609919,IN -1081609920,1081616831,US +1081609920,1081611415,US +1081611416,1081611423,IN +1081611424,1081611511,US +1081611512,1081611519,IN +1081611520,1081611815,US +1081611816,1081611823,IN +1081611824,1081611831,US +1081611832,1081611839,IN +1081611840,1081611847,US +1081611848,1081611855,IN +1081611856,1081611903,US +1081611904,1081611911,IN +1081611912,1081611919,US +1081611920,1081611927,IN +1081611928,1081611935,LK +1081611936,1081611943,IN +1081611944,1081612015,US +1081612016,1081612023,IN +1081612024,1081612159,US +1081612160,1081612191,IN +1081612192,1081612663,US +1081612664,1081612671,IN +1081612672,1081616831,US 1081616832,1081616839,GB 1081616840,1081618951,US 1081618952,1081618959,GB @@ -11916,9 +12332,7 @@ 1081803288,1081803295,PR 1081803296,1081803895,US 1081803896,1081803903,PR -1081803904,1081832663,US -1081832664,1081832671,PR -1081832672,1081862639,US +1081803904,1081862639,US 1081862640,1081862647,PR 1081862648,1081872663,US 1081872664,1081872671,FI @@ -12024,7 +12438,13 @@ 1083437056,1083441151,CA 1083441152,1083486911,US 1083486912,1083486943,IS -1083486944,1083621375,US +1083486944,1083618602,US +1083618603,1083618611,DE +1083618612,1083618714,US +1083618715,1083618725,BR +1083618726,1083619954,US +1083619955,1083619986,CY +1083619987,1083621375,US 1083621376,1083637759,BS 1083637760,1083686911,US 1083686912,1083703295,CA @@ -12307,9 +12727,7 @@ 1088020360,1088020367,PR 1088020368,1088030663,US 1088030664,1088030671,PR -1088030672,1088031839,US -1088031840,1088031847,PR -1088031848,1088031943,US +1088030672,1088031943,US 1088031944,1088031951,PR 1088031952,1088091583,US 1088091584,1088091591,PR @@ -12556,7 +12974,9 @@ 1090391303,1090391359,CA 1090391360,1090391360,US 1090391361,1090396159,CA -1090396160,1090424095,US +1090396160,1090423759,US +1090423760,1090423783,FI +1090423784,1090424095,US 1090424096,1090424111,FI 1090424112,1090424287,US 1090424288,1090424303,FI @@ -12568,13 +12988,9 @@ 1090447488,1090448127,CA 1090448128,1090448255,US 1090448256,1090453503,CA -1090453504,1090495487,US -1090495488,1090495743,NO -1090495744,1090497903,US +1090453504,1090497903,US 1090497904,1090497919,AU -1090497920,1090499583,US -1090499584,1090499839,NO -1090499840,1091444735,US +1090497920,1091444735,US 1091444736,1091445247,A2 1091445248,1091683357,US 1091683358,1091683367,GB @@ -12769,7 +13185,9 @@ 1093091328,1093107711,US 1093107712,1093107823,CA 1093107824,1093107839,US -1093107840,1093109367,CA +1093107840,1093108223,CA +1093108224,1093108479,US +1093108480,1093109367,CA 1093109368,1093109375,US 1093109376,1093109879,CA 1093109880,1093109887,US @@ -12783,7 +13201,9 @@ 1093110832,1093110911,US 1093110912,1093110927,CA 1093110928,1093110935,US -1093110936,1093111711,CA +1093110936,1093111039,CA +1093111040,1093111295,US +1093111296,1093111711,CA 1093111712,1093111727,US 1093111728,1093111743,CA 1093111744,1093111759,US @@ -12798,7 +13218,9 @@ 1093112416,1093112431,CA 1093112432,1093112479,US 1093112480,1093112527,CA -1093112528,1093114623,US +1093112528,1093112895,US +1093112896,1093112911,CA +1093112912,1093114623,US 1093114624,1093114679,CA 1093114680,1093114703,US 1093114704,1093114711,CA @@ -12876,8 +13298,8 @@ 1093122784,1093122791,CA 1093122792,1093122799,US 1093122800,1093122807,CA -1093122808,1093122815,US -1093122816,1093123839,CA +1093122808,1093123071,US +1093123072,1093123839,CA 1093123840,1093123903,US 1093123904,1093123935,AN 1093123936,1093123943,US @@ -13522,7 +13944,9 @@ 1096548352,1096810495,CA 1096810496,1096884223,US 1096884224,1096888319,CA -1096888320,1096925183,US +1096888320,1096890879,US +1096890880,1096891135,GB +1096891136,1096925183,US 1096925184,1096941567,CA 1096941568,1096942679,US 1096942680,1096942687,IE @@ -14025,9 +14449,7 @@ 1107800064,1107800319,CA 1107800320,1107801367,US 1107801368,1107801375,CA -1107801376,1107805695,US -1107805696,1107805951,TR -1107805952,1107808842,US +1107801376,1107808842,US 1107808843,1107808846,PE 1107808847,1107808877,US 1107808878,1107808881,PE @@ -14226,8 +14648,8 @@ 1109902512,1109902527,CY 1109902528,1109918463,US 1109918464,1109918719,GB -1109918720,1109919487,US -1109919488,1109919999,GB +1109918720,1109919743,US +1109919744,1109919999,GB 1109920000,1109923135,US 1109923136,1109923151,BG 1109923152,1109923183,US @@ -14514,7 +14936,7 @@ 1114511360,1114511871,US 1114511872,1114513407,CA 1114513408,1114515455,SA -1114515456,1114517503,GU +1114515456,1114517503,US 1114517504,1114520063,CA 1114520064,1114520319,PH 1114520320,1114520575,US @@ -15138,7 +15560,9 @@ 1118155184,1118155199,CA 1118155200,1118155215,US 1118155216,1118155231,PA -1118155232,1118156319,US +1118155232,1118155999,US +1118156000,1118156015,GT +1118156016,1118156319,US 1118156320,1118156335,PE 1118156336,1118156399,US 1118156400,1118156415,VE @@ -15193,10 +15617,10 @@ 1118791600,1118791615,ES 1118791616,1118792703,US 1118792704,1118792831,JM -1118792832,1118792895,US -1118792896,1118793151,JM -1118793152,1118793279,US -1118793280,1118793727,JM +1118792832,1118792959,US +1118792960,1118793087,JM +1118793088,1118793343,US +1118793344,1118793727,JM 1118793728,1118793823,US 1118793824,1118793839,CA 1118793840,1118793935,US @@ -15409,8 +15833,7 @@ 1118974128,1118974135,US 1118974136,1118974207,EC 1118974208,1118974215,US -1118974216,1118975231,A2 -1118975232,1118975487,NI +1118974216,1118975487,A2 1118975488,1118975743,KE 1118975744,1118975999,A2 1118976000,1118976255,GB @@ -15631,9 +16054,7 @@ 1119167896,1119167903,CA 1119167904,1119168023,US 1119168024,1119168031,CA -1119168032,1119168055,US -1119168056,1119168063,MX -1119168064,1119168183,US +1119168032,1119168183,US 1119168184,1119168191,CA 1119168192,1119168687,US 1119168688,1119168695,CA @@ -15837,10 +16258,8 @@ 1120374416,1120374479,CA 1120374480,1120374487,US 1120374488,1120374511,CA -1120374512,1120374527,US -1120374528,1120375231,CA -1120375232,1120375239,US -1120375240,1120375243,CA +1120374512,1120374783,US +1120374784,1120375243,CA 1120375244,1120375263,US 1120375264,1120376063,CA 1120376064,1120376079,US @@ -16153,7 +16572,7 @@ 1121248320,1121248335,CA 1121248336,1121248343,VG 1121248344,1121248351,BZ -1121248352,1121248367,CY +1121248352,1121248367,MT 1121248368,1121248383,CA 1121248384,1121248399,VG 1121248400,1121248407,CA @@ -16211,8 +16630,7 @@ 1121251048,1121251055,AW 1121251056,1121251071,CA 1121251072,1121251079,GB -1121251080,1121251087,CA -1121251088,1121251103,CY +1121251080,1121251103,CY 1121251104,1121251135,CA 1121251136,1121251167,AG 1121251168,1121251199,VG @@ -16239,7 +16657,8 @@ 1121251840,1121251847,BZ 1121251848,1121251871,CA 1121251872,1121251887,VG -1121251888,1121251903,CA +1121251888,1121251895,CY +1121251896,1121251903,CA 1121251904,1121251935,AG 1121251936,1121251943,CY 1121251944,1121251951,PA @@ -16577,13 +16996,19 @@ 1121717432,1121717439,JP 1121717440,1121717759,US 1121717760,1121718015,IT -1121718016,1121878015,US +1121718016,1121721711,US +1121721712,1121721727,CN +1121721728,1121878015,US 1121878016,1121910783,CA 1121910784,1122074623,US 1122074624,1122087935,CA 1122087936,1122088191,US 1122088192,1122091007,CA -1122091008,1122092799,US +1122091008,1122092623,US +1122092624,1122092631,CA +1122092632,1122092695,US +1122092696,1122092703,CA +1122092704,1122092799,US 1122092800,1122093055,CA 1122093056,1122093807,US 1122093808,1122093815,HK @@ -16662,7 +17087,9 @@ 1122498560,1122498815,PR 1122498816,1122499327,US 1122499328,1122500095,PR -1122500096,1122525855,US +1122500096,1122506751,US +1122506752,1122507007,IN +1122507008,1122525855,US 1122525856,1122525865,RU 1122525866,1122526096,US 1122526097,1122526111,RU @@ -16938,7 +17365,24 @@ 1125514496,1125514751,US 1125514752,1125515263,CA 1125515264,1125531647,US -1125531648,1125543935,CA +1125531648,1125539903,CA +1125539904,1125539935,US +1125539936,1125540151,CA +1125540152,1125540159,GB +1125540160,1125540207,CA +1125540208,1125540223,US +1125540224,1125540479,CA +1125540480,1125540495,US +1125540496,1125540511,CA +1125540512,1125540527,US +1125540528,1125540543,IE +1125540544,1125540575,CA +1125540576,1125540591,US +1125540592,1125540703,CA +1125540704,1125540711,US +1125540712,1125540927,CA +1125540928,1125540959,US +1125540960,1125543935,CA 1125543936,1125545983,US 1125548032,1125552127,CA 1125552128,1125572607,US @@ -17867,7 +18311,9 @@ 1137376352,1137376367,CA 1137376368,1137376383,US 1137376384,1137376463,CA -1137376464,1137377311,US +1137376464,1137376479,US +1137376480,1137376511,CA +1137376512,1137377311,US 1137377312,1137377327,DE 1137377328,1137377471,US 1137377472,1137377479,IN @@ -18153,7 +18599,9 @@ 1137927680,1137927807,CR 1137927808,1137927935,CA 1137927936,1137928063,VG -1137928064,1137930143,CA +1137928064,1137928255,CA +1137928256,1137928319,BZ +1137928320,1137930143,CA 1137930144,1137930159,MT 1137930160,1137934335,CA 1137934336,1137946145,US @@ -18655,7 +19103,9 @@ 1138774016,1138778111,CA 1138778112,1138780159,US 1138780160,1138780191,CA -1138780192,1138786303,US +1138780192,1138780271,US +1138780272,1138780287,CA +1138780288,1138786303,US 1138786304,1138819071,PR 1138819072,1138851839,CA 1138851840,1138851847,US @@ -18704,7 +19154,17 @@ 1145188352,1145192447,CA 1145192448,1145249791,US 1145249792,1145257983,CA -1145257984,1145262079,US +1145257984,1145259007,US +1145259008,1145259071,IN +1145259072,1145259263,US +1145259264,1145259327,IN +1145259328,1145260031,US +1145260032,1145260095,IN +1145260096,1145261055,US +1145261056,1145261119,IN +1145261120,1145261311,US +1145261312,1145261375,IN +1145261376,1145262079,US 1145262080,1145266175,CA 1145266176,1145307135,US 1145307136,1145311231,CA @@ -18714,8 +19174,7 @@ 1145405440,1145413631,CA 1145413632,1145421823,US 1145421824,1145430015,CA -1145430016,1145434111,US -1145438208,1145475071,US +1145430016,1145475071,US 1145475072,1145479167,CA 1145479168,1145491455,US 1145503744,1145520127,CA @@ -18798,8 +19257,7 @@ 1156071424,1156079615,CA 1156079616,1156259839,US 1156259840,1156265983,CA -1156265984,1156276223,US -1156284416,1156296703,US +1156265984,1156296703,US 1156296704,1156300799,CA 1156300800,1156335367,US 1156335368,1156335375,PR @@ -19416,7 +19874,13 @@ 1159213056,1159217151,CA 1159217152,1159249919,US 1159249920,1159254015,PR -1159254016,1159266935,US +1159254016,1159262471,US +1159262472,1159262475,TZ +1159262476,1159262479,SA +1159262480,1159262727,US +1159262728,1159262731,DE +1159262732,1159262735,RU +1159262736,1159266935,US 1159266936,1159266943,PR 1159266944,1159269119,US 1159269120,1159269375,CA @@ -19440,9 +19904,7 @@ 1159293488,1159293503,BR 1159293504,1159300607,US 1159300608,1159300863,SE -1159300864,1159304223,US -1159304224,1159304255,CA -1159304256,1159313919,US +1159300864,1159313919,US 1159313920,1159313927,MX 1159313928,1159314079,US 1159314080,1159314087,TR @@ -19484,8 +19946,8 @@ 1159513536,1159513567,CA 1159513568,1159513599,US 1159513600,1159514879,CA -1159514880,1159515391,US -1159515392,1159515647,CA +1159514880,1159515135,US +1159515136,1159515647,CA 1159515648,1159515711,US 1159515712,1159515887,CA 1159515888,1159515895,US @@ -19835,8 +20297,8 @@ 1160689304,1160689311,CA 1160689312,1160689319,IN 1160689320,1160689367,CA -1160689368,1160689383,US -1160689384,1160689419,CA +1160689368,1160689375,US +1160689376,1160689419,CA 1160689420,1160689447,US 1160689448,1160689531,CA 1160689532,1160689571,US @@ -19994,7 +20456,9 @@ 1161428224,1161428991,KN 1161428992,1161453567,US 1161453568,1161457663,CA -1161457664,1161576447,US +1161457664,1161501443,US +1161501444,1161501470,TR +1161501471,1161576447,US 1161576448,1161580543,CA 1161580544,1161586687,US 1161586688,1161586943,PA @@ -20003,16 +20467,16 @@ 1161625600,1161627695,US 1161627696,1161627703,AR 1161627704,1161627727,US -1161627728,1161627735,AR -1161627736,1161627759,US +1161627728,1161627743,AR +1161627744,1161627759,US 1161627760,1161627775,GB -1161627776,1161627839,US -1161627840,1161627863,AR +1161627776,1161627807,US +1161627808,1161627863,AR 1161627864,1161628479,US 1161628480,1161628487,GB 1161628488,1161628607,US 1161628608,1161628639,AR -1161628640,1161628647,CH +1161628640,1161628647,IN 1161628648,1161628655,CA 1161628656,1161628663,US 1161628664,1161628671,AR @@ -20025,9 +20489,7 @@ 1161629520,1161629527,GB 1161629528,1161629535,MY 1161629536,1161629551,GB -1161629552,1161629567,US -1161629568,1161629575,AU -1161629576,1161629695,US +1161629552,1161629695,US 1161629696,1161629951,PL 1161629952,1161630335,US 1161630336,1161630343,PL @@ -20060,7 +20522,9 @@ 1161631040,1161631047,GB 1161631048,1161631079,US 1161631080,1161631087,AR -1161631088,1161631159,US +1161631088,1161631127,US +1161631128,1161631135,BG +1161631136,1161631159,US 1161631160,1161631167,CA 1161631168,1161631183,US 1161631184,1161631199,GB @@ -20076,8 +20540,10 @@ 1161631520,1161631535,US 1161631536,1161631543,AR 1161631544,1161631551,BR -1161631552,1161631631,US -1161631632,1161631639,CH +1161631552,1161631591,US +1161631592,1161631599,BR +1161631600,1161631631,US +1161631632,1161631639,BR 1161631640,1161631647,US 1161631648,1161631655,AU 1161631656,1161631663,AR @@ -20099,7 +20565,9 @@ 1161633216,1161633231,EE 1161633232,1161634063,US 1161634064,1161634071,RO -1161634072,1161634199,US +1161634072,1161634127,US +1161634128,1161634135,AR +1161634136,1161634199,US 1161634200,1161634207,NZ 1161634208,1161634239,AR 1161634240,1161634247,GB @@ -20115,7 +20583,8 @@ 1161634976,1161635007,PL 1161635008,1161635855,US 1161635856,1161635871,BE -1161635872,1161636095,US +1161635872,1161636063,US +1161636064,1161636095,IL 1161636096,1161636127,GB 1161636128,1161636159,US 1161636160,1161636223,IL @@ -20170,9 +20639,7 @@ 1161639832,1161639839,AR 1161639840,1161639887,US 1161639888,1161639895,AT -1161639896,1161639935,US -1161639936,1161639943,CH -1161639944,1161639951,US +1161639896,1161639951,US 1161639952,1161639959,IL 1161639960,1161639967,GB 1161639968,1161639999,US @@ -20201,9 +20668,7 @@ 1161644704,1161644743,GB 1161644744,1161644751,AR 1161644752,1161644767,PL -1161644768,1161645839,US -1161645840,1161645855,PL -1161645856,1161645887,US +1161644768,1161645887,US 1161645888,1161645903,GB 1161645904,1161645911,US 1161645912,1161645919,GB @@ -20238,8 +20703,7 @@ 1161651104,1161651135,GB 1161651136,1161651487,US 1161651488,1161651503,GB -1161651504,1161651935,US -1161651936,1161651967,AR +1161651504,1161651967,US 1161651968,1161651975,CH 1161651976,1161652007,US 1161652008,1161652015,GB @@ -20247,7 +20711,9 @@ 1161652096,1161652103,CY 1161652104,1161652127,US 1161652128,1161652135,AR -1161652136,1161653791,US +1161652136,1161653023,US +1161653024,1161653055,AR +1161653056,1161653791,US 1161653792,1161653799,SI 1161653800,1161653831,US 1161653832,1161653839,HR @@ -20283,8 +20749,7 @@ 1161836032,1161836063,CA 1161836064,1161836159,US 1161836160,1161836191,BR -1161836192,1161836223,MX -1161836224,1161836255,US +1161836192,1161836255,US 1161836256,1161836287,UA 1161836288,1161836319,RS 1161836320,1161836383,US @@ -20433,7 +20898,9 @@ 1162836736,1162836991,US 1162836992,1162838015,BS 1162838016,1162870783,US -1162870784,1162887167,BB +1162870784,1162871295,BB +1162871296,1162874367,LC +1162874368,1162887167,BB 1162903552,1162923391,US 1162923392,1162923519,BE 1162923520,1162924031,US @@ -20579,23 +21046,19 @@ 1163527776,1163527791,US 1163527792,1163528191,CA 1163528192,1163528703,US -1163528704,1163528959,CA -1163528960,1163530239,US -1163530240,1163530527,CA -1163530528,1163530543,US -1163530544,1163530639,CA +1163528704,1163529215,CA +1163529216,1163530239,US +1163530240,1163530399,CA +1163530400,1163530431,US +1163530432,1163530639,CA 1163530640,1163530655,US -1163530656,1163530663,CA -1163530664,1163530671,US -1163530672,1163530783,CA -1163530784,1163530815,US -1163530816,1163530839,CA +1163530656,1163530839,CA 1163530840,1163530847,RS 1163530848,1163530887,CA 1163530888,1163530895,US 1163530896,1163530903,CA -1163530904,1163530943,US -1163530944,1163530959,CA +1163530904,1163530935,US +1163530936,1163530959,CA 1163530960,1163530967,US 1163530968,1163533023,CA 1163533024,1163533055,US @@ -20737,8 +21200,8 @@ 1163551664,1163551679,US 1163551680,1163551727,CA 1163551728,1163551743,US -1163551744,1163552255,CA -1163552256,1163552519,US +1163551744,1163552511,CA +1163552512,1163552519,US 1163552520,1163552527,CA 1163552528,1163552535,US 1163552536,1163552575,CA @@ -20760,7 +21223,9 @@ 1163554656,1163554703,CA 1163554704,1163554751,US 1163554752,1163554815,CA -1163554816,1163556095,US +1163554816,1163555071,US +1163555072,1163555327,CA +1163555328,1163556095,US 1163556096,1163556607,CA 1163556608,1163557727,US 1163557728,1163557759,CA @@ -20771,9 +21236,7 @@ 1163560448,1163560959,US 1163560960,1163561727,CA 1163561728,1163561983,FI -1163561984,1163561999,CA -1163562000,1163562007,US -1163562008,1163562063,CA +1163561984,1163562063,CA 1163562064,1163562079,US 1163562080,1163562119,CA 1163562120,1163562127,SG @@ -20789,9 +21252,7 @@ 1163568128,1163570431,US 1163570432,1163570495,CA 1163570496,1163571199,US -1163571200,1163571711,CA -1163571712,1163571967,US -1163571968,1163571983,CA +1163571200,1163571983,CA 1163571984,1163571999,US 1163572000,1163572031,CA 1163572032,1163572063,BE @@ -20799,11 +21260,9 @@ 1163572080,1163572087,US 1163572088,1163572175,CA 1163572176,1163572183,US -1163572184,1163572223,CA -1163572224,1163572479,US -1163572480,1163572671,CA -1163572672,1163572679,US -1163572680,1163573071,CA +1163572184,1163572687,CA +1163572688,1163572703,US +1163572704,1163573071,CA 1163573072,1163573087,US 1163573088,1163573199,CA 1163573200,1163573215,US @@ -20812,8 +21271,8 @@ 1163573440,1163573503,EG 1163573504,1163575295,US 1163575296,1163576703,CA -1163576704,1163576831,US -1163576832,1163576959,CA +1163576704,1163576799,US +1163576800,1163576959,CA 1163576960,1163576991,US 1163576992,1163577087,CA 1163577088,1163577151,US @@ -20914,16 +21373,22 @@ 1167693200,1167693215,UA 1167693216,1167851519,US 1167851520,1168113663,CA -1168113664,1168211967,US +1168113664,1168121855,US +1168130048,1168138239,US +1168138240,1168146431,JM +1168146432,1168211967,US 1168211968,1168220159,CA -1168228352,1168393215,US -1168393216,1168394151,CA -1168394152,1168394175,US -1168394176,1168394271,CA -1168394272,1168394287,US -1168394288,1168394367,CA -1168394368,1168394399,US -1168394400,1168394407,CA +1168220160,1168318719,US +1168318720,1168318975,CA +1168318976,1168321535,US +1168321536,1168321791,CA +1168321792,1168330751,US +1168343040,1168393215,US +1168393216,1168394271,CA +1168394272,1168394279,US +1168394280,1168394375,CA +1168394376,1168394383,US +1168394384,1168394407,CA 1168394408,1168394415,US 1168394416,1168394423,CA 1168394424,1168394463,US @@ -20932,7 +21397,9 @@ 1168394480,1168394495,CA 1168394496,1168394511,US 1168394512,1168394527,CA -1168394528,1168420863,US +1168394528,1168394559,US +1168394560,1168394687,CA +1168394688,1168420863,US 1168420864,1168424959,CA 1168424960,1168474111,US 1168474112,1168506879,CA @@ -20998,7 +21465,9 @@ 1168960608,1168960623,CA 1168960624,1168960639,US 1168960640,1168960767,CA -1168960768,1168960863,US +1168960768,1168960799,US +1168960800,1168960831,CA +1168960832,1168960863,US 1168960864,1168960887,CA 1168960888,1168960895,US 1168960896,1168961887,CA @@ -21014,7 +21483,36 @@ 1168973824,1168982015,CA 1168982016,1169051903,US 1169051904,1169051911,SG -1169051912,1169182975,US +1169051912,1169057039,US +1169057040,1169057055,BR +1169057056,1169057071,US +1169057072,1169057079,AR +1169057080,1169057087,US +1169057088,1169057119,BR +1169057120,1169057127,US +1169057128,1169057135,BR +1169057136,1169057143,US +1169057144,1169057151,BR +1169057152,1169057215,US +1169057216,1169057223,BR +1169057224,1169057231,US +1169057232,1169057247,BR +1169057248,1169057263,US +1169057264,1169057279,BR +1169057280,1169092639,US +1169092640,1169092671,GB +1169092672,1169093503,US +1169093504,1169093567,DE +1169093568,1169094713,US +1169094714,1169094726,CA +1169094727,1169094755,US +1169094756,1169094763,AU +1169094764,1169094771,IN +1169094772,1169094925,US +1169094926,1169094933,IN +1169094934,1169095017,US +1169095018,1169095027,IN +1169095028,1169182975,US 1169182976,1169183487,CA 1169183488,1169184767,US 1169184768,1169185023,CA @@ -21023,7 +21521,12 @@ 1169186048,1169186303,SG 1169186304,1169203199,US 1169203200,1169211391,CA -1169211392,1170472959,US +1169211392,1170448383,US +1170456576,1170461183,US +1170461184,1170461439,CO +1170461440,1170461695,US +1170461696,1170462719,IL +1170462720,1170472959,US 1170472960,1170481151,CA 1170481152,1170489343,US 1170489344,1170497535,CA @@ -21081,14 +21584,14 @@ 1176620784,1176620967,CA 1176620968,1176620975,US 1176620976,1176620991,CA -1176620992,1176621055,US +1176620992,1176620999,US +1176621000,1176621023,CA +1176621024,1176621055,US 1176621056,1176622079,CA 1176622080,1176623103,US 1176623104,1176623359,CA 1176623360,1176623487,US -1176623488,1176623583,CA -1176623584,1176623599,US -1176623600,1176623615,CA +1176623488,1176623615,CA 1176623616,1176623871,US 1176623872,1176629303,CA 1176629304,1176629311,US @@ -21104,7 +21607,8 @@ 1176629536,1176629695,CA 1176629696,1176629727,US 1176629728,1176631295,CA -1176631296,1176631807,US +1176631296,1176631551,NL +1176631552,1176631807,US 1176631808,1176632063,CR 1176632064,1176662015,US 1176662016,1176666111,CA @@ -21130,7 +21634,7 @@ 1176731648,1176735743,PR 1176735744,1176739839,A2 1176739840,1176743935,CA -1176748032,1176752127,US +1176743936,1176752127,US 1176752128,1176756223,CA 1176756224,1176764415,US 1176764416,1176768511,PM @@ -21581,9 +22085,20 @@ 1208333568,1208333823,GB 1208333824,1208337919,US 1208337920,1208338175,A2 -1208338176,1208518143,US +1208338176,1208516607,US +1208516608,1208516623,MX +1208516624,1208516671,US +1208516672,1208516735,TR +1208516736,1208516799,ID +1208516800,1208516855,US +1208516856,1208516859,CN +1208516860,1208518143,US 1208518144,1208518207,MY -1208518208,1208519551,US +1208518208,1208518291,US +1208518292,1208518295,CN +1208518296,1208519167,US +1208519168,1208519423,CN +1208519424,1208519551,US 1208519552,1208519679,TR 1208519680,1208519935,CA 1208519936,1208521983,US @@ -21592,9 +22107,14 @@ 1208523776,1208523903,GB 1208523904,1208523991,US 1208523992,1208523995,TR -1208523996,1208524159,US -1208524160,1208524287,TR -1208524288,1208524563,US +1208523996,1208524063,US +1208524064,1208524079,CN +1208524080,1208524159,US +1208524160,1208524223,ID +1208524224,1208524287,US +1208524288,1208524351,PK +1208524352,1208524415,CN +1208524416,1208524563,US 1208524564,1208524567,IT 1208524568,1208525823,US 1208525824,1208526079,CA @@ -21603,7 +22123,9 @@ 1208527872,1208528127,VN 1208528128,1208528895,US 1208528896,1208529151,CA -1208529152,1208531967,US +1208529152,1208529919,US +1208529920,1208530175,CN +1208530176,1208531967,US 1208531968,1208532223,CA 1208532224,1208586364,US 1208586365,1208586372,MA @@ -21787,9 +22309,7 @@ 1208656904,1208656911,LB 1208656912,1208657087,CA 1208657088,1208657103,MA -1208657104,1208657111,CA -1208657112,1208657119,MA -1208657120,1208657139,CA +1208657104,1208657139,CA 1208657140,1208657143,SE 1208657144,1208657415,CA 1208657416,1208657423,CH @@ -21900,7 +22420,9 @@ 1208832776,1208832783,CA 1208832784,1208833023,US 1208833024,1208833031,PR -1208833032,1208852479,US +1208833032,1208833439,US +1208833440,1208833471,GB +1208833472,1208852479,US 1208852480,1208860671,CA 1208860672,1208918015,US 1208918016,1208920007,CA @@ -21936,7 +22458,9 @@ 1209190852,1209190883,CA 1209190884,1209190911,US 1209190912,1209191167,MX -1209191168,1209270759,US +1209191168,1209270579,US +1209270580,1209270583,ID +1209270584,1209270759,US 1209270760,1209270767,CA 1209270768,1209270859,US 1209270860,1209270863,CA @@ -21948,15 +22472,19 @@ 1209271096,1209271099,CA 1209271100,1209271111,US 1209271112,1209271115,CA -1209271116,1209271463,US +1209271116,1209271435,US +1209271436,1209271439,CN +1209271440,1209271463,US 1209271464,1209271467,IN -1209271468,1209271495,US -1209271496,1209271499,CA -1209271500,1209271503,US +1209271468,1209271491,US +1209271492,1209271499,CA +1209271500,1209271503,MX 1209271504,1209271507,TR 1209271508,1209271527,US 1209271528,1209271531,CA -1209271532,1209271691,US +1209271532,1209271579,US +1209271580,1209271583,BD +1209271584,1209271691,US 1209271692,1209271695,CA 1209271696,1209271827,US 1209271828,1209271831,CA @@ -21964,17 +22492,28 @@ 1209271872,1209271875,TR 1209271876,1209271967,US 1209271968,1209271971,VN -1209271972,1209272003,US +1209271972,1209271975,TR +1209271976,1209272003,US 1209272004,1209272007,GB 1209272008,1209272035,US 1209272036,1209272039,IT -1209272040,1209274623,US +1209272040,1209273663,US +1209273664,1209273671,BD +1209273672,1209274623,US 1209274624,1209274751,CA 1209274752,1209274815,US 1209274816,1209274879,CA 1209274880,1209275910,US 1209275911,1209275911,MY -1209275912,1209276511,US +1209275912,1209275924,US +1209275925,1209275925,CN +1209275926,1209275928,US +1209275929,1209275929,MY +1209275930,1209275931,US +1209275932,1209275932,CN +1209275933,1209276351,US +1209276352,1209276415,CN +1209276416,1209276511,US 1209276512,1209276543,VN 1209276544,1209276799,US 1209276800,1209276807,BD @@ -21982,17 +22521,36 @@ 1209277184,1209277215,BD 1209277216,1209277575,US 1209277576,1209277583,BD -1209277584,1209279167,US +1209277584,1209278911,US +1209278912,1209278919,TR +1209278920,1209279167,US 1209279168,1209279231,VN -1209279232,1209280191,US +1209279232,1209279871,US +1209279872,1209279935,MY +1209279936,1209280191,US 1209280192,1209280255,VN 1209280256,1209280975,US 1209280976,1209280983,IT 1209280984,1209281247,US 1209281248,1209281279,CA -1209281280,1209283967,US +1209281280,1209281983,US +1209281984,1209282047,TR +1209282048,1209283587,US +1209283588,1209283591,CN +1209283592,1209283751,US +1209283752,1209283759,BD +1209283760,1209283871,US +1209283872,1209283875,TR +1209283876,1209283967,US 1209283968,1209284095,GB -1209284096,1209347839,US +1209284096,1209284799,US +1209284800,1209284815,TR +1209284816,1209284831,CN +1209284832,1209284855,US +1209284856,1209284863,TR +1209284864,1209285063,US +1209285064,1209285071,TR +1209285072,1209347839,US 1209347840,1209348095,GB 1209348096,1209357215,US 1209357216,1209357231,SI @@ -22844,7 +23402,11 @@ 1211388672,1211388687,IT 1211388688,1211391455,US 1211391456,1211391487,CN -1211391488,1211391743,US +1211391488,1211391711,US +1211391712,1211391719,CN +1211391720,1211391727,US +1211391728,1211391735,CN +1211391736,1211391743,US 1211391744,1211391999,IT 1211392000,1211392591,US 1211392592,1211392607,IT @@ -23207,7 +23769,9 @@ 1254490112,1254555647,CA 1254555648,1254604159,US 1254604160,1254604175,GB -1254604176,1254621183,US +1254604176,1254604191,US +1254604192,1254604199,IE +1254604200,1254621183,US 1254621184,1254629375,CA 1254629376,1254704383,US 1254704384,1254704639,PH @@ -24277,7 +24841,8 @@ 1279955104,1279955119,CA 1279955120,1279955151,US 1279955152,1279955159,AU -1279955160,1279956031,US +1279955160,1279956023,US +1279956024,1279956031,MX 1279956032,1279956047,CR 1279956048,1279956059,US 1279956060,1279956063,MX @@ -24778,7 +25343,8 @@ 1296242432,1296242687,BE 1296242688,1296243199,FR 1296243200,1296243455,GB -1296243456,1296244223,US +1296243456,1296243711,FR +1296243712,1296244223,US 1296244224,1296244479,NL 1296244480,1296244735,GB 1296244736,1296244991,IR @@ -24796,7 +25362,7 @@ 1296248256,1296248318,BE 1296248319,1296248319,FR 1296248320,1296248383,BE -1296248384,1296248447,FR +1296248384,1296248447,IT 1296248448,1296248575,US 1296248576,1296248703,IE 1296248704,1296249855,FR @@ -24812,7 +25378,9 @@ 1296250208,1296250239,ES 1296250240,1296250271,BE 1296250272,1296250303,DE -1296250304,1296251135,FR +1296250304,1296250335,FR +1296250336,1296250367,ES +1296250368,1296251135,FR 1296251136,1296251167,GB 1296251168,1296251199,HR 1296251200,1296251295,DE @@ -24820,7 +25388,8 @@ 1296251328,1296251359,IE 1296251360,1296251391,DE 1296251392,1296251775,NL -1296251776,1296252127,FR +1296251776,1296252111,FR +1296252112,1296252127,GB 1296252128,1296252143,ES 1296252144,1296252159,US 1296252160,1296252175,GB @@ -24835,7 +25404,9 @@ 1296252320,1296252367,FR 1296252368,1296252383,DE 1296252384,1296252415,IE -1296252416,1296252703,FR +1296252416,1296252687,FR +1296252688,1296252695,NL +1296252696,1296252703,IE 1296252704,1296252711,DE 1296252712,1296252719,FR 1296252720,1296252727,BE @@ -24898,10 +25469,14 @@ 1296265024,1296265087,FR 1296265088,1296265151,CA 1296265152,1296265215,FR -1296265216,1296267263,US +1296265216,1296265727,US +1296265728,1296265983,FR +1296265984,1296267263,US 1296267264,1296267519,FR 1296267520,1296267775,CA -1296267776,1296268799,US +1296267776,1296268031,US +1296268032,1296268287,FR +1296268288,1296268799,US 1296268800,1296269055,FR 1296269056,1296269311,US 1296269312,1296302079,TR @@ -24920,8 +25495,8 @@ 1296466416,1296466431,NG 1296466432,1296466559,NO 1296466560,1296466583,NG -1296466584,1296466591,NO -1296466592,1296466623,NG +1296466584,1296466607,NO +1296466608,1296466623,NG 1296466624,1296466639,NO 1296466640,1296466655,NG 1296466656,1296466671,BJ @@ -24944,8 +25519,8 @@ 1296473088,1296474623,LT 1296474624,1296476159,US 1296476160,1296480255,LT -1296480256,1296481791,NO -1296481792,1296498687,LT +1296480256,1296482303,NO +1296482304,1296498687,LT 1296498688,1296531455,BG 1296531456,1296564223,MT 1296564224,1296566271,GB @@ -24963,6 +25538,7 @@ 1296590848,1296592895,ES 1296592896,1296594943,NL 1296594944,1296596991,RU +1296596992,1296599039,DE 1296599040,1296601087,RU 1296601088,1296603135,DE 1296603136,1296605183,NL @@ -25343,7 +25919,9 @@ 1299017728,1299021823,BE 1299021824,1299026111,CH 1299026112,1299026127,ES -1299026128,1299032063,CH +1299026128,1299026251,CH +1299026252,1299026263,PT +1299026264,1299032063,CH 1299032064,1299032319,NL 1299032320,1299038207,CH 1299038208,1299054591,FI @@ -25363,6 +25941,7 @@ 1299447808,1299709951,AT 1299709952,1299972095,UA 1299972096,1300234239,IL +1300234240,1302331391,FR 1302331392,1303379967,NL 1303379968,1304428543,DE 1304428544,1305477119,FR @@ -25466,7 +26045,9 @@ 1307508736,1307516927,BA 1307516928,1307525119,CH 1307525120,1307533311,BA -1307533312,1307541503,GB +1307533312,1307535359,GB +1307535360,1307535615,DE +1307535616,1307541503,GB 1307541504,1307549695,IT 1307549696,1307557887,UA 1307557888,1307574271,RU @@ -25632,7 +26213,8 @@ 1307971584,1307979775,GB 1307979776,1307981823,ZW 1307981824,1307982847,ZA -1307982848,1307983871,GB +1307982848,1307983359,ZW +1307983360,1307983871,GB 1307983872,1307987967,LB 1307987968,1307992063,FR 1307992064,1307996159,RU @@ -25890,6 +26472,7 @@ 1310251008,1310255103,RU 1310255104,1310257151,CZ 1310257152,1310259199,FR +1310259200,1310261247,GB 1310261248,1310277631,UA 1310277632,1310310399,RU 1310310400,1310326783,GB @@ -26021,10 +26604,10 @@ 1311367808,1311367839,US 1311367840,1311367871,DK 1311367872,1311367887,LR -1311367888,1311367895,GB +1311367888,1311367895,A2 1311367896,1311367935,DK 1311367936,1311367967,BJ -1311367968,1311368191,GB +1311367968,1311368191,A2 1311368192,1311368319,BD 1311368320,1311368447,CF 1311368448,1311368575,TZ @@ -26276,7 +26859,9 @@ 1317129472,1317129727,IT 1317129728,1317137663,GB 1317137664,1317137919,SE -1317137920,1317142143,GB +1317137920,1317140095,GB +1317140096,1317140223,US +1317140224,1317142143,GB 1317142144,1317142271,CA 1317142272,1317142527,GB 1317142528,1317175295,PT @@ -26320,10 +26905,10 @@ 1317649920,1317650023,IE 1317650024,1317650031,GB 1317650032,1317650047,IE -1317650048,1317650087,GB -1317650088,1317650127,IE -1317650128,1317650175,GB -1317650176,1317650431,IE +1317650048,1317650111,GB +1317650112,1317650135,IE +1317650136,1317650143,GB +1317650144,1317650431,IE 1317650432,1317666815,RU 1317666816,1317666823,IQ 1317666824,1317666831,CD @@ -26331,27 +26916,21 @@ 1317666840,1317666855,GH 1317666856,1317666863,A2 1317666864,1317666871,GH -1317666872,1317666879,NG +1317666872,1317666879,A2 1317666880,1317666887,LR 1317666888,1317666911,NG -1317666912,1317666919,A2 -1317666920,1317666927,NG -1317666928,1317666959,A2 +1317666912,1317666959,A2 1317666960,1317666967,NG -1317666968,1317666983,A2 -1317666984,1317666991,CM -1317666992,1317666999,A2 +1317666968,1317666999,A2 1317667000,1317667007,AO 1317667008,1317667015,GH -1317667016,1317667023,A2 -1317667024,1317667031,LR -1317667032,1317667039,NG +1317667016,1317667039,A2 1317667040,1317667047,GH -1317667048,1317667055,NG +1317667048,1317667055,A2 1317667056,1317667063,LR -1317667064,1317667087,AO -1317667088,1317667095,A2 -1317667096,1317667103,GH +1317667064,1317667071,A2 +1317667072,1317667079,AO +1317667080,1317667103,A2 1317667104,1317667111,NG 1317667112,1317667119,GH 1317667120,1317667135,A2 @@ -26365,68 +26944,63 @@ 1317667192,1317667231,NG 1317667232,1317667239,GH 1317667240,1317667247,NG -1317667248,1317667255,A2 -1317667256,1317667263,NG +1317667248,1317667263,A2 1317667264,1317667271,GB 1317667272,1317667295,NG 1317667296,1317667303,A2 1317667304,1317667335,NG 1317667336,1317667343,A2 1317667344,1317667351,NG -1317667352,1317667367,AO +1317667352,1317667359,AO +1317667360,1317667367,A2 1317667368,1317667375,NG -1317667376,1317667391,AO -1317667392,1317667407,A2 +1317667376,1317667407,A2 1317667408,1317667423,NG 1317667424,1317667431,TD 1317667432,1317667439,GH -1317667440,1317667447,A2 -1317667448,1317667471,NG -1317667472,1317667479,A2 -1317667480,1317667487,NG +1317667440,1317667455,A2 +1317667456,1317667463,NG +1317667464,1317667487,A2 1317667488,1317667495,GH 1317667496,1317667503,NG -1317667504,1317667527,A2 -1317667528,1317667535,AO -1317667536,1317667543,A2 -1317667544,1317667551,AO +1317667504,1317667551,A2 1317667552,1317667567,NG -1317667568,1317667583,GH -1317667584,1317667759,NG +1317667568,1317667583,A2 +1317667584,1317667719,NG +1317667720,1317667735,A2 +1317667736,1317667743,NG +1317667744,1317667751,A2 +1317667752,1317667759,NG 1317667760,1317667767,FR 1317667768,1317667775,ZA -1317667776,1317667783,CD +1317667776,1317667783,A2 1317667784,1317667823,NG 1317667824,1317668095,A2 1317668096,1317668103,GH 1317668104,1317668111,ZM -1317668112,1317668127,AO -1317668128,1317668143,A2 +1317668112,1317668143,A2 1317668144,1317668151,AO 1317668152,1317668167,NG 1317668168,1317668183,A2 1317668184,1317668191,CI -1317668192,1317668199,NG +1317668192,1317668199,A2 1317668200,1317668207,BW 1317668208,1317668215,LR 1317668216,1317668223,CM 1317668224,1317668239,NG 1317668240,1317668247,A2 1317668248,1317668255,NG -1317668256,1317668263,A2 -1317668264,1317668271,AO +1317668256,1317668271,A2 1317668272,1317668279,SL 1317668280,1317668295,A2 1317668296,1317668303,CD 1317668304,1317668311,NG 1317668312,1317668319,IQ -1317668320,1317668327,A2 -1317668328,1317668343,NG +1317668320,1317668343,A2 1317668344,1317668351,AO 1317668352,1317668359,NG 1317668360,1317668367,SL -1317668368,1317668383,NG -1317668384,1317668391,A2 +1317668368,1317668391,A2 1317668392,1317668399,NG 1317668400,1317668407,A2 1317668408,1317668415,GH @@ -26435,18 +27009,18 @@ 1317668456,1317668463,NG 1317668464,1317668471,AO 1317668472,1317668479,NG -1317668480,1317668487,GH +1317668480,1317668487,A2 1317668488,1317668495,NG 1317668496,1317668503,GH 1317668504,1317668511,CD 1317668512,1317668519,IQ 1317668520,1317668527,MZ -1317668528,1317668535,AO +1317668528,1317668535,A2 1317668536,1317668543,BJ -1317668544,1317668551,UG +1317668544,1317668551,A2 1317668552,1317668559,AO 1317668560,1317668575,NG -1317668576,1317668583,IQ +1317668576,1317668583,A2 1317668584,1317668591,LR 1317668592,1317668599,NG 1317668600,1317668615,A2 @@ -26455,50 +27029,51 @@ 1317668632,1317668639,A2 1317668640,1317668655,NG 1317668656,1317668671,A2 -1317668672,1317668735,NG -1317668736,1317668743,A2 -1317668744,1317668751,AO -1317668752,1317668759,A2 +1317668672,1317668703,NG +1317668704,1317668727,A2 +1317668728,1317668735,NG +1317668736,1317668759,A2 1317668760,1317668767,IQ 1317668768,1317668775,LR 1317668776,1317668791,NG -1317668792,1317668799,A2 -1317668800,1317668807,AO +1317668792,1317668807,A2 1317668808,1317668815,NG -1317668816,1317668823,A2 -1317668824,1317668831,AO -1317668832,1317668855,NG +1317668816,1317668831,A2 +1317668832,1317668839,NG +1317668840,1317668847,A2 +1317668848,1317668855,NG 1317668856,1317668863,A2 1317668864,1317668871,LR -1317668872,1317668887,NG -1317668888,1317668895,A2 -1317668896,1317668903,NG -1317668904,1317668911,A2 +1317668872,1317668911,A2 1317668912,1317668927,NG 1317668928,1317668935,A2 -1317668936,1317668983,NG -1317668984,1317668991,A2 -1317668992,1317668999,NG +1317668936,1317668943,NG +1317668944,1317668959,A2 +1317668960,1317668983,NG +1317668984,1317668999,A2 1317669000,1317669007,CD -1317669008,1317669031,NG -1317669032,1317669055,A2 -1317669056,1317669103,NG +1317669008,1317669023,NG +1317669024,1317669055,A2 +1317669056,1317669079,NG +1317669080,1317669087,A2 +1317669088,1317669103,NG 1317669104,1317669111,A2 1317669112,1317669119,NG 1317669120,1317669375,GE 1317669376,1317669631,CG -1317669632,1317669887,A2 -1317669888,1317669895,AO -1317669896,1317669911,NG +1317669632,1317669903,A2 +1317669904,1317669911,NG 1317669912,1317669919,GH -1317669920,1317669959,NG +1317669920,1317669943,A2 +1317669944,1317669959,NG 1317669960,1317669983,A2 1317669984,1317669991,LR 1317669992,1317670015,NG -1317670016,1317670031,A2 -1317670032,1317670103,NG +1317670016,1317670063,A2 +1317670064,1317670103,NG 1317670104,1317670111,A2 -1317670112,1317670143,NG +1317670112,1317670135,NG +1317670136,1317670143,A2 1317670144,1317670175,SL 1317670176,1317670215,A2 1317670216,1317670223,NG @@ -26507,39 +27082,34 @@ 1317670240,1317670247,NG 1317670248,1317670255,A2 1317670256,1317670263,NG -1317670264,1317670399,A2 -1317670400,1317670415,CD +1317670264,1317670407,A2 +1317670408,1317670415,CD 1317670416,1317670423,A2 1317670424,1317670431,NG 1317670432,1317670447,A2 1317670448,1317670455,IQ 1317670456,1317670471,NG 1317670472,1317670479,CO -1317670480,1317670495,A2 -1317670496,1317670503,NG -1317670504,1317670511,A2 +1317670480,1317670511,A2 1317670512,1317670519,CI 1317670520,1317670543,NG 1317670544,1317670551,IQ 1317670552,1317670567,NG 1317670568,1317670575,A2 1317670576,1317670583,NG -1317670584,1317670599,GH -1317670600,1317670607,AO +1317670584,1317670591,GH +1317670592,1317670607,A2 1317670608,1317670639,NG 1317670640,1317670647,A2 1317670648,1317670655,NG 1317670656,1317670663,AO -1317670664,1317670671,A2 -1317670672,1317670679,CM +1317670664,1317670679,A2 1317670680,1317670703,NG 1317670704,1317670711,A2 1317670712,1317670719,GH 1317670720,1317670727,A2 1317670728,1317670735,GH -1317670736,1317670743,AO -1317670744,1317670751,NG -1317670752,1317670759,A2 +1317670736,1317670759,A2 1317670760,1317670767,NG 1317670768,1317670775,GH 1317670776,1317670783,A2 @@ -26547,18 +27117,14 @@ 1317670792,1317670807,NG 1317670808,1317670815,AO 1317670816,1317670823,NG -1317670824,1317670831,CD -1317670832,1317670839,NG -1317670840,1317670847,A2 +1317670824,1317670847,A2 1317670848,1317670855,NG 1317670856,1317670863,CD -1317670864,1317670871,A2 -1317670872,1317670887,NG -1317670888,1317670895,AO -1317670896,1317670896,A2 +1317670864,1317670879,A2 +1317670880,1317670887,NG +1317670888,1317670896,A2 1317670897,1317670911,NG -1317670912,1317671167,A2 -1317671168,1317671175,AO +1317670912,1317671175,A2 1317671176,1317671191,NG 1317671192,1317671199,A2 1317671200,1317671207,CI @@ -26569,7 +27135,9 @@ 1317671256,1317671263,CI 1317671264,1317671271,NG 1317671272,1317671279,A2 -1317671280,1317671335,NG +1317671280,1317671311,NG +1317671312,1317671319,A2 +1317671320,1317671335,NG 1317671336,1317671343,BW 1317671344,1317671351,CD 1317671352,1317671359,A2 @@ -26579,113 +27147,103 @@ 1317671384,1317671391,CI 1317671392,1317671399,NG 1317671400,1317671407,IQ -1317671408,1317671423,NG +1317671408,1317671415,A2 +1317671416,1317671423,NG 1317671424,1317671439,A2 1317671440,1317671487,NG -1317671488,1317671511,AO -1317671512,1317671519,A2 -1317671520,1317671527,AO +1317671488,1317671503,AO +1317671504,1317671527,A2 1317671528,1317671543,NG 1317671544,1317671551,GH 1317671552,1317671567,NG 1317671568,1317671583,A2 1317671584,1317671591,NG -1317671592,1317671599,A2 -1317671600,1317671607,NG +1317671592,1317671607,A2 1317671608,1317671615,GH 1317671616,1317671647,A2 1317671648,1317671679,NG 1317671680,1317671687,LR -1317671688,1317671703,A2 -1317671704,1317671727,NG -1317671728,1317671735,A2 -1317671736,1317671743,NG -1317671744,1317671759,A2 +1317671688,1317671711,A2 +1317671712,1317671727,NG +1317671728,1317671759,A2 1317671760,1317671767,IQ -1317671768,1317671775,A2 -1317671776,1317671807,NG +1317671768,1317671783,A2 +1317671784,1317671807,NG 1317671808,1317671823,CI 1317671824,1317671831,NG -1317671832,1317671839,GH -1317671840,1317671847,AO -1317671848,1317671871,NG -1317671872,1317671879,A2 -1317671880,1317671895,NG +1317671832,1317671847,A2 +1317671848,1317671863,NG +1317671864,1317671887,A2 +1317671888,1317671895,NG 1317671896,1317671903,CM 1317671904,1317671911,NG 1317671912,1317671919,AO 1317671920,1317671927,NG 1317671928,1317671935,A2 1317671936,1317672447,GA -1317672448,1317672455,NG -1317672456,1317672463,A2 +1317672448,1317672463,A2 1317672464,1317672471,NG 1317672472,1317672479,A2 1317672480,1317672487,ZM -1317672488,1317672511,NG -1317672512,1317672519,A2 -1317672520,1317672527,NG -1317672528,1317672543,A2 +1317672488,1317672503,NG +1317672504,1317672543,A2 1317672544,1317672551,CD 1317672552,1317672583,A2 1317672584,1317672591,CD 1317672592,1317672599,NG -1317672600,1317672607,A2 -1317672608,1317672615,CM -1317672616,1317672631,NG -1317672632,1317672639,A2 -1317672640,1317672655,NG +1317672600,1317672615,A2 +1317672616,1317672623,NG +1317672624,1317672655,A2 1317672656,1317672663,CD -1317672664,1317672695,NG -1317672696,1317672703,A2 +1317672664,1317672679,NG +1317672680,1317672703,A2 1317672704,1317672711,NG -1317672712,1317672719,A2 -1317672720,1317672727,LR +1317672712,1317672727,A2 1317672728,1317672735,NG 1317672736,1317672743,LR 1317672744,1317672759,A2 1317672760,1317672767,NG 1317672768,1317672775,A2 1317672776,1317672783,NG -1317672784,1317672791,AO -1317672792,1317672815,A2 +1317672784,1317672815,A2 1317672816,1317672823,BW 1317672824,1317672831,NG 1317672832,1317672839,A2 -1317672840,1317672855,NG -1317672856,1317672863,A2 +1317672840,1317672847,NG +1317672848,1317672863,A2 1317672864,1317672895,NG 1317672896,1317672903,A2 1317672904,1317672919,CI 1317672920,1317672927,GH 1317672928,1317672951,NG -1317672952,1317672959,AO +1317672952,1317672959,A2 1317672960,1317673239,NG 1317673240,1317673255,A2 -1317673256,1317673287,NG -1317673288,1317673295,LR -1317673296,1317673303,NG -1317673304,1317673311,A2 +1317673256,1317673271,NG +1317673272,1317673279,A2 +1317673280,1317673287,NG +1317673288,1317673311,A2 1317673312,1317673319,NG -1317673320,1317673327,LR -1317673328,1317673335,NG +1317673320,1317673335,A2 1317673336,1317673343,GH -1317673344,1317673351,A2 -1317673352,1317673375,NG +1317673344,1317673359,A2 +1317673360,1317673375,NG 1317673376,1317673383,AO -1317673384,1317673415,NG -1317673416,1317673423,A2 +1317673384,1317673391,NG +1317673392,1317673399,A2 +1317673400,1317673407,NG +1317673408,1317673423,A2 1317673424,1317673431,NG -1317673432,1317673439,AO -1317673440,1317673447,A2 +1317673432,1317673447,A2 1317673448,1317673463,AO 1317673464,1317673471,A2 1317673472,1317673479,NG -1317673480,1317673487,A2 -1317673488,1317673495,HK +1317673480,1317673495,A2 1317673496,1317673527,NG 1317673528,1317673535,A2 -1317673536,1317673575,NG +1317673536,1317673551,NG +1317673552,1317673559,A2 +1317673560,1317673575,NG 1317673576,1317673583,CD 1317673584,1317673591,A2 1317673592,1317673615,NG @@ -26693,31 +27251,23 @@ 1317673624,1317673631,NG 1317673632,1317673639,A2 1317673640,1317673647,AO -1317673648,1317673655,A2 -1317673656,1317673671,NG +1317673648,1317673671,A2 1317673672,1317673679,CM 1317673680,1317673687,IQ -1317673688,1317673711,NG +1317673688,1317673695,A2 +1317673696,1317673703,NG +1317673704,1317673711,A2 1317673712,1317673719,CO 1317673720,1317673727,NG -1317673728,1317673743,AO +1317673728,1317673735,A2 +1317673736,1317673743,AO 1317673744,1317673751,IQ -1317673752,1317673759,A2 -1317673760,1317673767,NG -1317673768,1317673775,AO -1317673776,1317673783,NG -1317673784,1317673791,AO -1317673792,1317673799,NG -1317673800,1317673807,A2 -1317673808,1317673815,NG +1317673752,1317673815,A2 1317673816,1317673823,LR -1317673824,1317673831,NG -1317673832,1317673839,AO -1317673840,1317673847,NG -1317673848,1317673855,A2 +1317673824,1317673855,A2 1317673856,1317673871,NG -1317673872,1317673895,A2 -1317673896,1317673911,NG +1317673872,1317673903,A2 +1317673904,1317673911,NG 1317673912,1317673919,AO 1317673920,1317673927,CI 1317673928,1317673943,NG @@ -26728,7 +27278,7 @@ 1317674240,1317674247,A2 1317674248,1317674255,NG 1317674256,1317674263,CM -1317674264,1317674271,AO +1317674264,1317674271,A2 1317674272,1317674279,NG 1317674280,1317674287,CD 1317674288,1317674295,GH @@ -26736,29 +27286,23 @@ 1317674304,1317674319,NG 1317674320,1317674351,A2 1317674352,1317674359,NG -1317674360,1317674367,AO -1317674368,1317674375,NG -1317674376,1317674383,A2 +1317674360,1317674383,A2 1317674384,1317674399,NG -1317674400,1317674407,A2 -1317674408,1317674415,NG +1317674400,1317674415,A2 1317674416,1317674423,AO 1317674424,1317674431,NG -1317674432,1317674440,AO +1317674432,1317674439,A2 +1317674440,1317674440,AO 1317674441,1317674447,A2 1317674448,1317674455,AO 1317674456,1317674471,NG -1317674472,1317674479,A2 -1317674480,1317674487,AO +1317674472,1317674487,A2 1317674488,1317674495,NG -1317674496,1317674503,A2 -1317674504,1317674511,AO -1317674512,1317674519,NG -1317674520,1317674527,A2 +1317674496,1317674527,A2 1317674528,1317674535,NG 1317674536,1317674543,IQ -1317674544,1317674599,NG -1317674600,1317674607,A2 +1317674544,1317674575,NG +1317674576,1317674607,A2 1317674608,1317674615,NG 1317674616,1317674623,IQ 1317674624,1317674631,NG @@ -26766,21 +27310,23 @@ 1317674640,1317674647,NG 1317674648,1317674655,A2 1317674656,1317674671,NG -1317674672,1317674679,A2 -1317674680,1317674687,AO -1317674688,1317674735,NG +1317674672,1317674687,A2 +1317674688,1317674703,NG +1317674704,1317674711,A2 +1317674712,1317674735,NG 1317674736,1317674743,AO 1317674744,1317674751,IQ 1317674752,1317674791,NG 1317674792,1317674799,A2 1317674800,1317674807,NG 1317674808,1317674823,A2 -1317674824,1317674871,NG -1317674872,1317674879,A2 +1317674824,1317674863,NG +1317674864,1317674879,A2 1317674880,1317674887,NG -1317674888,1317674911,AO +1317674888,1317674895,AO +1317674896,1317674911,A2 1317674912,1317674927,NG -1317674928,1317674935,AO +1317674928,1317674935,A2 1317674936,1317674943,NG 1317674944,1317674951,GA 1317674952,1317674959,NG @@ -26789,32 +27335,32 @@ 1317674976,1317674991,A2 1317674992,1317675007,NG 1317675008,1317675023,A2 -1317675024,1317675047,NG +1317675024,1317675031,NG +1317675032,1317675039,A2 +1317675040,1317675047,NG 1317675048,1317675055,A2 1317675056,1317675063,NG 1317675064,1317675071,AO 1317675072,1317675095,NG 1317675096,1317675119,A2 1317675120,1317675127,NG -1317675128,1317675135,HK -1317675136,1317675143,NG -1317675144,1317675159,A2 -1317675160,1317675167,AO -1317675168,1317675175,NG -1317675176,1317675183,A2 +1317675128,1317675183,A2 1317675184,1317675199,CM -1317675200,1317675231,NG +1317675200,1317675223,NG +1317675224,1317675231,A2 1317675232,1317675239,LR -1317675240,1317675255,AO -1317675256,1317675263,A2 -1317675264,1317675279,NG +1317675240,1317675247,A2 +1317675248,1317675255,AO +1317675256,1317675271,A2 +1317675272,1317675279,NG 1317675280,1317675287,CM 1317675288,1317675295,A2 1317675296,1317675319,NG 1317675320,1317675343,CM -1317675344,1317675351,AO +1317675344,1317675351,A2 1317675352,1317675359,IQ -1317675360,1317675375,NG +1317675360,1317675367,NG +1317675368,1317675375,A2 1317675376,1317675383,CM 1317675384,1317675391,NG 1317675392,1317675407,A2 @@ -26823,19 +27369,18 @@ 1317675424,1317675439,NG 1317675440,1317675447,A2 1317675448,1317675455,NG -1317675456,1317675463,CD +1317675456,1317675463,A2 1317675464,1317675471,CI 1317675472,1317675479,A2 -1317675480,1317675511,NG -1317675512,1317675519,A2 -1317675520,1317675527,NG -1317675528,1317675535,AO +1317675480,1317675487,NG +1317675488,1317675503,A2 +1317675504,1317675511,NG +1317675512,1317675535,A2 1317675536,1317675543,NG 1317675544,1317675551,IQ 1317675552,1317675559,NG 1317675560,1317675567,NA -1317675568,1317675575,AO -1317675576,1317675583,A2 +1317675568,1317675583,A2 1317675584,1317675591,LR 1317675592,1317675607,NG 1317675608,1317675623,A2 @@ -26844,47 +27389,46 @@ 1317675648,1317675655,LR 1317675656,1317675663,NG 1317675664,1317675671,A2 -1317675672,1317675687,NG -1317675688,1317675695,CM +1317675672,1317675679,NG +1317675680,1317675695,A2 1317675696,1317675703,NG 1317675704,1317675711,A2 1317675712,1317675719,CM 1317675720,1317675735,NG -1317675736,1317675743,CD +1317675736,1317675743,A2 1317675744,1317675751,GH 1317675752,1317675759,NG 1317675760,1317675775,GH 1317675776,1317675783,NG 1317675784,1317675815,A2 1317675816,1317675831,NG -1317675832,1317675855,A2 -1317675856,1317675863,CM -1317675864,1317675903,A2 -1317675904,1317675911,GN +1317675832,1317675911,A2 1317675912,1317675927,NG -1317675928,1317675935,A2 -1317675936,1317675943,NG -1317675944,1317675951,A2 -1317675952,1317675959,NG -1317675960,1317676287,A2 +1317675928,1317675951,A2 +1317675952,1317675967,NG +1317675968,1317676287,A2 1317676288,1317676543,LR 1317676544,1317676583,A2 1317676584,1317676591,NG -1317676592,1317676663,A2 -1317676664,1317676671,NG -1317676672,1317676807,A2 -1317676808,1317676815,NG -1317676816,1317676823,A2 +1317676592,1317676655,A2 +1317676656,1317676671,NG +1317676672,1317676823,A2 1317676824,1317676831,NG -1317676832,1317676847,A2 -1317676848,1317676855,NG -1317676856,1317676895,A2 -1317676896,1317676935,NG -1317676936,1317676991,A2 +1317676832,1317676895,A2 +1317676896,1317676919,NG +1317676920,1317676991,A2 1317676992,1317676999,LR 1317677000,1317677007,IQ 1317677008,1317677015,IT -1317677016,1317677223,A2 +1317677016,1317677023,A2 +1317677024,1317677031,NG +1317677032,1317677079,A2 +1317677080,1317677087,SD +1317677088,1317677143,A2 +1317677144,1317677151,SD +1317677152,1317677199,A2 +1317677200,1317677207,NG +1317677208,1317677223,A2 1317677224,1317677231,NG 1317677232,1317677247,A2 1317677248,1317677255,NG @@ -26899,9 +27443,7 @@ 1317685504,1317685631,BE 1317685632,1317686271,DE 1317686272,1317686287,NL -1317686288,1317686303,DE -1317686304,1317686319,NL -1317686320,1317686335,DE +1317686288,1317686335,DE 1317686336,1317686399,NL 1317686400,1317695743,DE 1317695744,1317695999,CH @@ -27002,11 +27544,15 @@ 1318707200,1318707775,FR 1318707776,1318707783,GB 1318707784,1318708511,FR -1318708512,1318708527,GB -1318708528,1318708543,FR -1318708544,1318708547,GB -1318708548,1318708559,FR -1318708560,1318708991,GB +1318708512,1318708519,GB +1318708520,1318708523,FR +1318708524,1318708527,GB +1318708528,1318708599,FR +1318708600,1318708607,GB +1318708608,1318708631,FR +1318708632,1318708731,GB +1318708732,1318708735,FR +1318708736,1318708991,GB 1318708992,1318711647,FR 1318711648,1318711663,IT 1318711664,1318713855,FR @@ -27160,6 +27706,7 @@ 1331929088,1331931135,FR 1331931136,1331933183,SE 1331933184,1331935231,TR +1331935232,1331937279,NL 1331937280,1331937535,GB 1331937536,1331937567,SM 1331937568,1331937583,US @@ -27217,7 +27764,8 @@ 1333428224,1333460991,RU 1333460992,1333493759,GB 1333493760,1333526527,TR -1333526528,1333559295,BG +1333526528,1333551103,BG +1333551104,1333559295,PL 1333559296,1333592063,UA 1333592064,1333624831,IE 1333624832,1333657599,MK @@ -27286,9 +27834,7 @@ 1334584256,1334584287,AT 1334584288,1334584351,DE 1334584352,1334584383,LU -1334584384,1334584903,DE -1334584904,1334584911,AT -1334584912,1334584999,DE +1334584384,1334584999,DE 1334585000,1334585007,US 1334585008,1334585111,DE 1334585112,1334585119,AT @@ -27579,47 +28125,7 @@ 1346392064,1346396159,UA 1346396160,1346400255,RU 1346400256,1346404351,IT -1346404352,1346404859,AT -1346404860,1346404863,NL -1346404864,1346404927,AT -1346404928,1346404943,NL -1346404944,1346405087,AT -1346405088,1346405103,NL -1346405104,1346405135,AT -1346405136,1346405199,NL -1346405200,1346405255,AT -1346405256,1346405263,NL -1346405264,1346405319,AT -1346405320,1346405351,NL -1346405352,1346405663,AT -1346405664,1346405887,NL -1346405888,1346406159,AT -1346406160,1346406231,NL -1346406232,1346406255,AT -1346406256,1346406258,NL -1346406259,1346406259,AT -1346406260,1346406263,NL -1346406264,1346406271,AT -1346406272,1346406295,NL -1346406296,1346406351,AT -1346406352,1346406359,NL -1346406360,1346406495,AT -1346406496,1346406503,NL -1346406504,1346406543,AT -1346406544,1346406575,NL -1346406576,1346406655,AT -1346406656,1346406671,NL -1346406672,1346406919,AT -1346406920,1346406927,NL -1346406928,1346406951,AT -1346406952,1346406975,NL -1346406976,1346406991,AT -1346406992,1346407039,NL -1346407040,1346407167,AT -1346407168,1346407183,NL -1346407184,1346407207,AT -1346407208,1346407295,NL -1346407296,1346408447,AT +1346404352,1346408447,AT 1346408448,1346412543,LU 1346412544,1346416639,RU 1346416640,1346420735,DE @@ -27772,6 +28278,7 @@ 1346846720,1346854911,DK 1346854912,1346859007,MT 1346859008,1346863103,IR +1346863104,1346867199,DK 1346867200,1346871295,BA 1346871296,1346879487,RU 1346879488,1346883583,FI @@ -27788,7 +28295,6 @@ 1346928640,1346932735,DE 1346932736,1346936831,DK 1346936832,1346940927,IT -1346940928,1346945023,DE 1346945024,1346949119,PL 1346949120,1346957311,RU 1346957312,1346961407,DE @@ -27858,6 +28364,7 @@ 1347162112,1347166207,IT 1347166208,1347174399,GR 1347174400,1347182591,IT +1347182592,1347186687,RU 1347186688,1347190783,GB 1347190784,1347194879,RU 1347194880,1347198975,SE @@ -28128,6 +28635,7 @@ 1347424352,1347427135,DK 1347427136,1347427327,NO 1347427328,1347428351,DK +1347428352,1347432447,BA 1347432448,1347436543,HR 1347436544,1347440639,SE 1347440640,1347444735,ES @@ -28320,8 +28828,8 @@ 1347858504,1347858527,DE 1347858528,1347858559,EU 1347858560,1347858575,DE -1347858576,1347858591,EU -1347858592,1347858631,DE +1347858576,1347858623,EU +1347858624,1347858631,DE 1347858632,1347858639,EU 1347858640,1347859351,DE 1347859352,1347859359,EU @@ -28382,9 +28890,7 @@ 1347978008,1347978015,NG 1347978016,1347978023,A2 1347978024,1347978039,NG -1347978040,1347978143,A2 -1347978144,1347978159,NG -1347978160,1347978191,A2 +1347978040,1347978191,A2 1347978192,1347978199,NG 1347978200,1347978263,A2 1347978264,1347978271,NG @@ -28400,8 +28906,8 @@ 1347978448,1347978463,NG 1347978464,1347978575,A2 1347978576,1347978655,NG -1347978656,1347978719,A2 -1347978720,1347978735,NG +1347978656,1347978727,A2 +1347978728,1347978735,NG 1347978736,1347978775,A2 1347978776,1347978783,NG 1347978784,1347978847,A2 @@ -28454,8 +28960,8 @@ 1347981936,1347982031,A2 1347982032,1347982055,NG 1347982056,1347982223,A2 -1347982224,1347982239,NG -1347982240,1347982279,A2 +1347982224,1347982231,NG +1347982232,1347982279,A2 1347982280,1347982287,NG 1347982288,1347982887,A2 1347982888,1347982895,NG @@ -28495,9 +29001,7 @@ 1347984720,1347984735,NG 1347984736,1347984879,A2 1347984880,1347984895,NG -1347984896,1347984935,A2 -1347984936,1347984943,NG -1347984944,1347984959,A2 +1347984896,1347984959,A2 1347984960,1347984991,NG 1347984992,1347985031,A2 1347985032,1347985039,NG @@ -28760,7 +29264,9 @@ 1352445688,1352445703,NL 1352445704,1352663039,DE 1352663040,1353187327,DK -1353187328,1353253791,GB +1353187328,1353253663,GB +1353253664,1353253671,NL +1353253672,1353253791,GB 1353253792,1353253823,FR 1353253824,1353255071,GB 1353255072,1353255087,CA @@ -28789,7 +29295,9 @@ 1353266976,1353267455,GB 1353267456,1353268223,IE 1353268224,1353268479,GB -1353268480,1353269247,BE +1353268480,1353268551,BE +1353268552,1353268559,GB +1353268560,1353269247,BE 1353269248,1353270527,GB 1353270528,1353270783,IE 1353270784,1353271295,GB @@ -28820,9 +29328,7 @@ 1353272808,1353272815,GB 1353272816,1353272847,ES 1353272848,1353272879,GB -1353272880,1353272951,ES -1353272952,1353272959,GB -1353272960,1353273047,ES +1353272880,1353273047,ES 1353273048,1353273055,GB 1353273056,1353273343,ES 1353273344,1353273631,BE @@ -28864,9 +29370,11 @@ 1353279752,1353279759,IT 1353279760,1353279763,GB 1353279764,1353280119,IT -1353280120,1353280135,GB -1353280136,1353280543,IT -1353280544,1353280575,GB +1353280120,1353280127,GB +1353280128,1353280143,IT +1353280144,1353280151,GB +1353280152,1353280559,IT +1353280560,1353280575,GB 1353280576,1353281023,IT 1353281024,1353281535,BE 1353281536,1353282047,GB @@ -28892,15 +29400,21 @@ 1353288520,1353288527,GB 1353288528,1353288607,IE 1353288608,1353288639,GB -1353288640,1353288831,IE +1353288640,1353288663,IE +1353288664,1353288671,GB +1353288672,1353288831,IE 1353288832,1353288839,GB 1353288840,1353288847,IE 1353288848,1353288855,GB -1353288856,1353288887,IE -1353288888,1353288895,GB -1353288896,1353289247,IE +1353288856,1353288879,IE +1353288880,1353288895,GB +1353288896,1353288959,IE +1353288960,1353289087,GB +1353289088,1353289247,IE 1353289248,1353289255,GB -1353289256,1353289359,IE +1353289256,1353289279,IE +1353289280,1353289295,GB +1353289296,1353289359,IE 1353289360,1353289367,GB 1353289368,1353289391,IE 1353289392,1353289407,GB @@ -28923,16 +29437,18 @@ 1353298704,1353298707,SE 1353298708,1353298719,GB 1353298720,1353298751,DE -1353298752,1353298881,SE +1353298752,1353298815,SE +1353298816,1353298831,PT +1353298832,1353298879,GB +1353298880,1353298881,SE 1353298882,1353298887,GB -1353298888,1353299711,SE -1353299712,1353299839,GB +1353298888,1353299647,SE +1353299648,1353299839,GB 1353299840,1353299855,SE 1353299856,1353299863,GB -1353299864,1353300063,SE -1353300064,1353300071,GB -1353300072,1353300079,SE -1353300080,1353300103,GB +1353299864,1353300079,SE +1353300080,1353300095,PT +1353300096,1353300103,GB 1353300104,1353300111,SE 1353300112,1353300175,GB 1353300176,1353300191,SE @@ -28942,9 +29458,7 @@ 1353300280,1353300735,SE 1353300736,1353301095,GB 1353301096,1353301103,US -1353301104,1353305599,GB -1353305600,1353305607,IE -1353305608,1353306111,GB +1353301104,1353306111,GB 1353306112,1353306623,ES 1353306624,1353306624,BE 1353306625,1353306687,GB @@ -28964,7 +29478,9 @@ 1353310608,1353310719,ES 1353310720,1353311175,IT 1353311176,1353311183,ES -1353311184,1353311231,IT +1353311184,1353311207,IT +1353311208,1353311215,GB +1353311216,1353311231,IT 1353311232,1353312255,GB 1353312256,1353312767,CH 1353312768,1353313111,IT @@ -29201,10 +29717,9 @@ 1357336576,1357337599,NL 1357337600,1357337855,ES 1357337856,1357338111,SA -1357338112,1357338623,EU -1357338624,1357338879,FR +1357338112,1357338879,FR 1357338880,1357339391,NO -1357339392,1357339647,AT +1357339392,1357339647,ES 1357339648,1357339903,DZ 1357339904,1357340159,GB 1357340160,1357340415,DE @@ -29364,7 +29879,8 @@ 1357883760,1357883935,FR 1357883936,1357883999,EU 1357884000,1357884031,FR -1357884032,1357884159,EU +1357884032,1357884095,RU +1357884096,1357884159,EU 1357884160,1357884423,FR 1357884424,1357884427,BE 1357884428,1357884439,EU @@ -29582,8 +30098,8 @@ 1358224652,1358224655,DE 1358224656,1358224719,BE 1358224720,1358224927,DE -1358224928,1358225119,IT -1358225120,1358225407,DE +1358224928,1358225127,IT +1358225128,1358225407,DE 1358225408,1358229503,RU 1358229504,1358229631,DE 1358229632,1358229639,LU @@ -29775,7 +30291,7 @@ 1358598144,1358602239,IL 1358602240,1358622719,RU 1358622720,1358626815,SK -1358626816,1358630911,GB +1358626816,1358630911,A2 1358630912,1358634495,US 1358634496,1358635007,GB 1358635008,1358639103,TR @@ -29786,10 +30302,8 @@ 1358655488,1358667775,RU 1358667776,1358668067,PT 1358668068,1358668071,GB -1358668072,1358668231,PT -1358668232,1358668239,GB -1358668240,1358668263,PT -1358668264,1358668279,GB +1358668072,1358668271,PT +1358668272,1358668279,GB 1358668280,1358668359,PT 1358668360,1358668367,GB 1358668368,1358668463,PT @@ -29801,9 +30315,7 @@ 1358668800,1358668807,GB 1358668808,1358668927,PT 1358668928,1358668959,ES -1358668960,1358668983,PT -1358668984,1358668991,GB -1358668992,1358669351,PT +1358668960,1358669351,PT 1358669352,1358669359,GB 1358669360,1358669431,PT 1358669432,1358669439,GB @@ -29819,9 +30331,9 @@ 1358670016,1358670023,GB 1358670024,1358670071,PT 1358670072,1358670079,GB -1358670080,1358670175,PT -1358670176,1358670335,GB -1358670336,1358671415,PT +1358670080,1358670183,PT +1358670184,1358670207,GB +1358670208,1358671415,PT 1358671416,1358671423,GB 1358671424,1358671431,PT 1358671432,1358671439,GB @@ -29899,7 +30411,9 @@ 1358740672,1358740687,GB 1358740688,1358740883,SE 1358740884,1358740887,NL -1358740888,1358741055,SE +1358740888,1358740927,SE +1358740928,1358740943,DK +1358740944,1358741055,SE 1358741056,1358741071,GB 1358741072,1358741503,SE 1358741504,1358745599,IT @@ -30343,7 +30857,6 @@ 1360322560,1360326655,FI 1360326656,1360330751,PT 1360330752,1360334847,UA -1360334848,1360338943,AT 1360338944,1360343039,CY 1360343040,1360347135,SA 1360347136,1360351231,GB @@ -30411,14 +30924,16 @@ 1360613376,1360617471,SE 1360617472,1360621567,IT 1360621568,1360625663,ES -1360625664,1360627711,A2 -1360627712,1360627743,LB -1360627744,1360627967,A2 +1360625664,1360627455,DE +1360627456,1360627743,LB +1360627744,1360627967,DE 1360627968,1360628095,IQ 1360628096,1360628223,LU 1360628224,1360628735,LB 1360628736,1360628991,IQ -1360628992,1360629503,A2 +1360628992,1360629055,TR +1360629056,1360629247,DE +1360629248,1360629503,A2 1360629504,1360629759,IQ 1360629760,1360633855,SE 1360633856,1360637951,RU @@ -30917,7 +31432,6 @@ 1361038312,1361038319,NL 1361038320,1361038335,US 1361038336,1361039359,NL -1361039360,1361043455,IT 1361043456,1361051647,NO 1361051648,1362100223,ES 1362100224,1362395135,FR @@ -30989,9 +31503,7 @@ 1364526592,1364528639,GB 1364528640,1364528895,UA 1364528896,1364530175,GB -1364530176,1364539903,NL -1364539904,1364540159,US -1364540160,1364540671,NL +1364530176,1364540671,NL 1364540672,1364540927,US 1364540928,1364577023,NL 1364577024,1364577279,GB @@ -31096,8 +31608,8 @@ 1364970496,1364971519,GB 1364971520,1364975615,CZ 1364975616,1364979711,BJ -1364979712,1364983039,GB -1364983040,1364983551,CH +1364979712,1364982783,GB +1364982784,1364983551,CH 1364983552,1364983807,GB 1364983808,1364991999,DE 1364992000,1364996095,IT @@ -31243,35 +31755,157 @@ 1365204992,1365209087,CZ 1365209088,1365213183,BE 1365213184,1365217279,RU -1365217280,1365220391,GB +1365217280,1365217791,GB +1365217792,1365217823,US +1365217824,1365218047,GB +1365218048,1365218303,US +1365218304,1365218311,CA +1365218312,1365218319,AR +1365218320,1365218327,ZA +1365218328,1365218351,US +1365218352,1365218367,CY +1365218368,1365218375,RO +1365218376,1365218383,UA +1365218384,1365218407,EG +1365218408,1365218415,IN +1365218416,1365218431,GB +1365218432,1365218439,EG +1365218440,1365218447,GB +1365218448,1365218455,CA +1365218456,1365218459,GB +1365218460,1365218463,US +1365218464,1365218471,EG +1365218472,1365218479,GB +1365218480,1365218511,GR +1365218512,1365218519,AU +1365218520,1365218527,US +1365218528,1365218543,GR +1365218544,1365218551,CY +1365218552,1365218559,GR +1365218560,1365218815,GB +1365218816,1365218879,EG +1365218880,1365218895,US +1365218896,1365218903,GB +1365218904,1365218911,MU +1365218912,1365218927,US +1365218928,1365218943,BR +1365218944,1365218951,IN +1365218952,1365218959,NL +1365218960,1365218967,GB +1365218968,1365218975,US +1365218976,1365219007,CN +1365219008,1365219023,US +1365219024,1365219031,DK +1365219032,1365219039,CY +1365219040,1365219071,GB +1365219072,1365219103,TR +1365219104,1365219111,SA +1365219112,1365219119,GB +1365219120,1365219135,US +1365219136,1365219143,SA +1365219144,1365219159,US +1365219160,1365219167,CA +1365219168,1365219183,ES +1365219184,1365219191,CA +1365219192,1365219199,DE +1365219200,1365219207,IN +1365219208,1365219215,US +1365219216,1365219231,GB +1365219232,1365219247,CY +1365219248,1365219279,GB +1365219280,1365219287,BD +1365219288,1365219295,US +1365219296,1365219311,GB +1365219312,1365219327,TR +1365219328,1365219391,US +1365219392,1365219399,DK +1365219400,1365219407,AU +1365219408,1365219415,GB +1365219416,1365219423,TR +1365219424,1365219431,US +1365219432,1365219439,RU +1365219440,1365219455,US +1365219456,1365219463,NL +1365219464,1365219471,AU +1365219472,1365219479,IL +1365219480,1365219511,GB +1365219512,1365219519,BD +1365219520,1365219583,US +1365219584,1365219647,CN +1365219648,1365219663,IN +1365219664,1365219671,TR +1365219672,1365219679,GB +1365219680,1365219687,BD +1365219688,1365219695,US +1365219696,1365219703,DK +1365219704,1365219711,UA +1365219712,1365219743,TR +1365219744,1365219751,US +1365219752,1365219759,SG +1365219760,1365219775,UA +1365219776,1365219783,PY +1365219784,1365219791,BA +1365219792,1365219799,NO +1365219800,1365219807,TR +1365219808,1365219811,US +1365219812,1365219815,AU +1365219816,1365219903,US +1365219904,1365219919,ES +1365219920,1365219935,IN +1365219936,1365219951,CA +1365219952,1365219967,DK +1365219968,1365219983,ES +1365219984,1365219991,IT +1365219992,1365220007,EE +1365220008,1365220015,ES +1365220016,1365220023,GB +1365220024,1365220031,US +1365220032,1365220127,CN +1365220128,1365220143,TR +1365220144,1365220151,IL +1365220152,1365220159,AR +1365220160,1365220223,US +1365220224,1365220255,JO +1365220256,1365220263,KW +1365220264,1365220271,GB +1365220272,1365220287,KW +1365220288,1365220303,AR +1365220304,1365220311,NL +1365220312,1365220319,BR +1365220320,1365220371,US +1365220372,1365220375,GB +1365220376,1365220387,US +1365220388,1365220391,JO 1365220392,1365220399,ZA -1365220400,1365220471,GB +1365220400,1365220407,GB +1365220408,1365220423,US +1365220424,1365220431,GB +1365220432,1365220435,JO +1365220436,1365220439,US +1365220440,1365220471,GB 1365220472,1365220479,US 1365220480,1365220487,AU 1365220488,1365220495,GB 1365220496,1365220503,US 1365220504,1365220511,GB -1365220512,1365220519,US -1365220520,1365220527,GB +1365220512,1365220523,US +1365220524,1365220527,GB 1365220528,1365220535,IS 1365220536,1365220551,GB 1365220552,1365220567,IS -1365220568,1365220575,GB +1365220568,1365220575,IL 1365220576,1365220583,CH 1365220584,1365220599,TR 1365220600,1365220607,GR 1365220608,1365220615,TR -1365220616,1365220623,GB -1365220624,1365220631,US -1365220632,1365220663,GB +1365220616,1365220631,US +1365220632,1365220639,GR +1365220640,1365220663,GB 1365220664,1365220679,US 1365220680,1365220687,IT -1365220688,1365220703,US -1365220704,1365220719,GB -1365220720,1365220727,US -1365220728,1365220735,GB -1365220736,1365220743,US -1365220744,1365220767,GB +1365220688,1365220727,US +1365220728,1365220735,JO +1365220736,1365220767,US 1365220768,1365220775,GR 1365220776,1365220783,JO 1365220784,1365220791,IN @@ -31280,13 +31914,31 @@ 1365220808,1365220815,GB 1365220816,1365220823,IN 1365220824,1365220831,GB -1365220832,1365220839,IT -1365220840,1365220847,GB +1365220832,1365220847,IT 1365220848,1365220855,AU -1365220856,1365220863,US -1365220864,1365220895,GB +1365220856,1365220895,US 1365220896,1365220903,GR -1365220904,1365221375,GB +1365220904,1365220911,CA +1365220912,1365220919,GB +1365220920,1365220927,KW +1365220928,1365220935,IT +1365220936,1365220939,AR +1365220940,1365220943,US +1365220944,1365220975,GB +1365220976,1365220979,US +1365220980,1365220983,GB +1365220984,1365220991,BR +1365220992,1365220999,ZA +1365221000,1365221007,TR +1365221008,1365221023,US +1365221024,1365221031,TR +1365221032,1365221047,IL +1365221048,1365221055,GB +1365221056,1365221063,KW +1365221064,1365221071,GB +1365221072,1365221087,ES +1365221088,1365221119,US +1365221120,1365221375,GB 1365221376,1365225471,GE 1365225472,1365229567,UA 1365229568,1365233663,PL @@ -31548,9 +32200,7 @@ 1372702720,1372702735,DE 1372702736,1372702751,EU 1372702752,1372702991,DE -1372702992,1372703231,EU -1372703232,1372703263,DE -1372703264,1372703271,EU +1372702992,1372703271,EU 1372703272,1372703323,DE 1372703324,1372703327,EU 1372703328,1372703407,DE @@ -31712,7 +32362,7 @@ 1382214896,1382216831,NL 1382216832,1382216895,GB 1382216896,1382216959,NL -1382216960,1382217215,FR +1382216960,1382217215,GB 1382217216,1382217727,NL 1382217728,1382217983,GB 1382217984,1382218399,NL @@ -31741,7 +32391,9 @@ 1382229512,1382232575,SE 1382232576,1382232639,NO 1382232640,1382232703,DK -1382232704,1382233407,SE +1382232704,1382233279,SE +1382233280,1382233343,NO +1382233344,1382233407,SE 1382233408,1382233423,NO 1382233424,1382252543,SE 1382252544,1382268927,CZ @@ -31824,7 +32476,42 @@ 1383194624,1383202815,GB 1383202816,1383211007,RU 1383211008,1383219199,CY -1383219200,1383227391,RS +1383219200,1383220223,AL +1383220224,1383222415,RS +1383222416,1383222431,AL +1383222432,1383222440,RS +1383222441,1383222455,AL +1383222456,1383222459,RS +1383222460,1383222471,AL +1383222472,1383222479,RS +1383222480,1383222487,AL +1383222488,1383223119,RS +1383223120,1383223123,AL +1383223124,1383223131,RS +1383223132,1383223135,AL +1383223136,1383223191,RS +1383223192,1383223199,AL +1383223200,1383223208,RS +1383223209,1383223215,AL +1383223216,1383223231,RS +1383223232,1383223239,AL +1383223240,1383223551,RS +1383223552,1383223567,AL +1383223568,1383223583,RS +1383223584,1383223615,AL +1383223616,1383223631,RS +1383223632,1383223663,AL +1383223664,1383223695,RS +1383223696,1383223703,AL +1383223704,1383223711,RS +1383223712,1383223727,AL +1383223728,1383223759,RS +1383223760,1383223807,AL +1383223808,1383225599,RS +1383225600,1383226623,AL +1383226624,1383226751,RS +1383226752,1383226815,AL +1383226816,1383227391,RS 1383227392,1383239295,RU 1383239296,1383239423,AR 1383239424,1383243775,RU @@ -31927,9 +32614,7 @@ 1383590656,1383590911,SK 1383590912,1383591167,CZ 1383591168,1383591935,SK -1383591936,1383592887,CZ -1383592888,1383592895,VC -1383592896,1383596031,CZ +1383591936,1383596031,CZ 1383596032,1384120319,FR 1384120320,1384153087,NG 1384153088,1384185855,FI @@ -32027,27 +32712,76 @@ 1384801088,1384802495,FR 1384802496,1384802559,IT 1384802560,1384808447,FR -1384808448,1384808959,EU -1384808960,1384808967,DE -1384808968,1384808975,SE +1384808448,1384808479,BE +1384808480,1384808735,EU +1384808736,1384808799,BE +1384808800,1384808831,FR +1384808832,1384808959,FI +1384808960,1384808967,BE +1384808968,1384808975,EU 1384808976,1384808991,DE -1384808992,1384809007,FI -1384809008,1384809015,PT +1384808992,1384809015,BE 1384809016,1384809023,GB -1384809024,1384809039,EU -1384809040,1384809055,FR -1384809056,1384809063,GE -1384809064,1384809071,GB -1384809072,1384809087,EU -1384809088,1384809103,FR -1384809104,1384811007,EU +1384809024,1384809039,FR +1384809040,1384809047,BE +1384809048,1384809055,EU +1384809056,1384809071,BE +1384809072,1384809087,FR +1384809088,1384809103,BE +1384809104,1384809111,EU +1384809112,1384809119,GE +1384809120,1384809175,BE +1384809176,1384809183,EU +1384809184,1384809199,BE +1384809200,1384809207,EU +1384809208,1384809215,BE +1384809216,1384809407,BR +1384809408,1384809439,FR +1384809440,1384809471,DE +1384809472,1384809983,US +1384809984,1384810239,PT +1384810240,1384811007,US 1384811008,1384811519,GB 1384811520,1384811647,IR -1384811648,1384812799,EU -1384812800,1384813311,GB -1384813312,1384818463,EU -1384818464,1384818495,BE -1384818496,1384824831,EU +1384811648,1384811711,EU +1384811712,1384811743,ES +1384811744,1384811775,BE +1384811776,1384812031,FR +1384812032,1384812159,PR +1384812160,1384812287,PT +1384812288,1384812543,ES +1384812544,1384813567,GB +1384813568,1384814079,ES +1384814080,1384814591,GB +1384814592,1384815103,BE +1384815104,1384815615,FR +1384815616,1384816127,BE +1384816128,1384816255,EU +1384816256,1384816383,ES +1384816384,1384816639,EU +1384816640,1384817151,DK +1384817152,1384817407,EU +1384817408,1384817439,GB +1384817440,1384817471,EU +1384817472,1384817503,SE +1384817504,1384817599,BE +1384817600,1384817663,FR +1384817664,1384817919,BE +1384817920,1384818175,EU +1384818176,1384818815,BE +1384818816,1384818879,NL +1384818880,1384819199,EU +1384819200,1384819711,GB +1384819712,1384820223,CH +1384820224,1384820735,BE +1384820736,1384821247,EU +1384821248,1384821759,BE +1384821760,1384822271,DK +1384822272,1384822783,ES +1384822784,1384823295,BE +1384823296,1384823807,CH +1384823808,1384824703,EU +1384824704,1384824831,BE 1384824832,1384841215,GB 1384841216,1384857599,PL 1384857600,1384873983,NL @@ -32084,7 +32818,6 @@ 1385259008,1385267199,IT 1385267200,1385275391,SE 1385275392,1385283583,IT -1385283584,1385287679,KW 1385291776,1385299967,TR 1385299968,1385308159,BG 1385308160,1385309439,BE @@ -32138,8 +32871,8 @@ 1385563936,1385564031,EU 1385564032,1385564095,IE 1385564096,1385564103,EU -1385564104,1385564127,IE -1385564128,1385564159,EU +1385564104,1385564111,IE +1385564112,1385564159,EU 1385564160,1385564231,HU 1385564232,1385564383,EU 1385564384,1385564671,HU @@ -32250,11 +32983,15 @@ 1388388936,1388388991,NG 1388388992,1388389119,IT 1388389120,1388389135,NG -1388389136,1388389439,IT -1388389440,1388389471,NG +1388389136,1388389447,IT +1388389448,1388389471,NG 1388389472,1388389567,IT 1388389568,1388389631,NG -1388389632,1388390143,IT +1388389632,1388389903,IT +1388389904,1388389911,NG +1388389912,1388389919,IT +1388389920,1388390015,NG +1388390016,1388390143,IT 1388390144,1388394495,NG 1388394496,1388395519,IT 1388395520,1388396287,NG @@ -32344,9 +33081,7 @@ 1388658688,1388666879,GB 1388675072,1388675327,NL 1388675328,1388675583,EU -1388675584,1388676095,DE -1388676096,1388676607,EU -1388676608,1388676863,DE +1388675584,1388676863,DE 1388676864,1388677119,EU 1388677120,1388677375,GB 1388677376,1388677631,EU @@ -32453,20 +33188,20 @@ 1388745928,1388745935,GB 1388745936,1388745971,IE 1388745972,1388745975,GB -1388745976,1388746151,IE -1388746152,1388746155,GB -1388746156,1388746167,IE -1388746168,1388746239,GB +1388745976,1388746155,IE +1388746156,1388746159,GB +1388746160,1388746171,IE +1388746172,1388746239,GB 1388746240,1388746659,IE 1388746660,1388746671,GB 1388746672,1388746703,IE -1388746704,1388746707,GB -1388746708,1388746859,IE +1388746704,1388746719,GB +1388746720,1388746859,IE 1388746860,1388746863,GB 1388746864,1388746895,IE 1388746896,1388746903,GB -1388746904,1388746967,IE -1388746968,1388746975,GB +1388746904,1388746959,IE +1388746960,1388746975,GB 1388746976,1388747083,IE 1388747084,1388747087,GB 1388747088,1388747551,IE @@ -32610,8 +33345,8 @@ 1389213208,1389213215,LY 1389213216,1389213311,A2 1389213312,1389213343,LY -1389213344,1389215231,A2 -1389215232,1389217791,AF +1389213344,1389215743,A2 +1389215744,1389217791,AF 1389217792,1389218303,A2 1389218304,1389219839,AF 1389219840,1389220095,A2 @@ -32672,9 +33407,7 @@ 1389224512,1389224543,A2 1389224544,1389224559,IR 1389224560,1389224575,SA -1389224576,1389224703,A2 -1389224704,1389224959,LY -1389224960,1389225215,A2 +1389224576,1389225215,A2 1389225216,1389225471,SA 1389225472,1389225535,A2 1389225536,1389225599,IQ @@ -32778,8 +33511,10 @@ 1389269377,1389269759,A2 1389269760,1389269887,CD 1389269888,1389270015,A2 -1389270016,1389270271,CD -1389270272,1389270815,A2 +1389270016,1389270079,CD +1389270080,1389270095,A2 +1389270096,1389270111,CD +1389270112,1389270815,A2 1389270816,1389270823,US 1389270824,1389271039,A2 1389271040,1389271295,CA @@ -33083,7 +33818,9 @@ 1401241600,1401242623,DK 1401242624,1401244159,DE 1401244160,1401246719,EU -1401246720,1401264903,DE +1401246720,1401257983,DE +1401257984,1401264127,EU +1401264128,1401264903,DE 1401264904,1401265151,EU 1401265152,1401265919,DE 1401265920,1401266175,EU @@ -33136,6 +33873,7 @@ 1401477120,1401479167,BE 1401479168,1401481215,PL 1401481216,1401485311,RU +1401485312,1401487359,FI 1401487360,1401489407,GB 1401489408,1401491455,SE 1401491456,1401493503,NL @@ -33179,9 +33917,7 @@ 1401565184,1401567231,RU 1401567232,1401569279,GB 1401569280,1401585663,DE -1401585664,1401595087,GB -1401595088,1401595095,NG -1401595096,1401599167,GB +1401585664,1401599167,GB 1401599168,1401599231,IE 1401599232,1401602047,GB 1401602048,1401618431,ES @@ -33271,8 +34007,8 @@ 1401746224,1401746239,SE 1401746240,1401746255,NL 1401746256,1401746271,ES -1401746272,1401746275,GB -1401746276,1401746431,SE +1401746272,1401746279,GB +1401746280,1401746431,SE 1401746432,1401746447,NL 1401746448,1401746467,SE 1401746468,1401746471,NL @@ -33303,7 +34039,8 @@ 1401747280,1401747295,ES 1401747296,1401747391,SE 1401747392,1401747407,DE -1401747408,1401747487,SE +1401747408,1401747423,GB +1401747424,1401747487,SE 1401747488,1401747495,DK 1401747496,1401747499,SE 1401747500,1401747503,GB @@ -33565,7 +34302,8 @@ 1404026880,1404043263,ES 1404043264,1404076031,SE 1404076032,1404084223,DE -1404084224,1404184063,SE +1404084224,1404092415,NO +1404092416,1404184063,SE 1404184064,1404184575,NO 1404184576,1404186623,SE 1404186624,1404187647,NO @@ -33582,8 +34320,8 @@ 1404197888,1404198911,LT 1404198912,1404200959,SE 1404200960,1404203007,NL -1404203008,1404204031,HR -1404204032,1404207103,SE +1404203008,1404204800,HR +1404204801,1404207103,SE 1404207104,1404210175,NO 1404210176,1404212223,LV 1404212224,1404215295,SE @@ -33612,10 +34350,9 @@ 1404411904,1404645375,SE 1404645376,1404645887,HR 1404645888,1404764159,SE -1404764160,1404768255,NL -1404768256,1404802047,SE -1404802048,1404802815,EE -1404802816,1404803071,SE +1404764160,1404768511,NL +1404768512,1404802047,SE +1404802048,1404803071,EE 1404803072,1404803583,LV 1404803584,1404805119,SE 1404805120,1404813311,AT @@ -33705,7 +34442,6 @@ 1406763008,1406771199,BE 1406771200,1406779391,GB 1406779392,1406787583,RU -1406787584,1406795775,AM 1406795776,1406803967,GB 1406803968,1406812159,DE 1406812160,1406820351,SE @@ -33728,7 +34464,7 @@ 1406951424,1406959615,PL 1406959616,1406964287,DE 1406964288,1406964319,CH -1406964320,1406964327,BG +1406964320,1406964327,DE 1406964328,1406964351,NL 1406964352,1406964735,DE 1406964736,1406964927,US @@ -33776,7 +34512,9 @@ 1407516672,1407516679,A2 1407516680,1407516687,NG 1407516688,1407516703,A2 -1407516704,1407516735,NG +1407516704,1407516711,NG +1407516712,1407516727,A2 +1407516728,1407516735,NG 1407516736,1407516743,UG 1407516744,1407516751,LR 1407516752,1407516759,SL @@ -33784,15 +34522,16 @@ 1407516768,1407516775,AO 1407516776,1407516783,A2 1407516784,1407516791,NG -1407516792,1407516799,AO -1407516800,1407516807,GH +1407516792,1407516807,A2 1407516808,1407516815,NG 1407516816,1407516831,A2 1407516832,1407516839,NG 1407516840,1407516847,A2 1407516848,1407516855,NG 1407516856,1407516863,A2 -1407516864,1407516895,NG +1407516864,1407516871,NG +1407516872,1407516879,A2 +1407516880,1407516895,NG 1407516896,1407516911,A2 1407516912,1407516927,NG 1407516928,1407517183,ZW @@ -33800,9 +34539,10 @@ 1407517312,1407517383,A2 1407517384,1407517391,CD 1407517392,1407517415,A2 -1407517416,1407517439,NG -1407517440,1407517823,A2 -1407517824,1407517887,NG +1407517416,1407517423,NG +1407517424,1407517431,A2 +1407517432,1407517439,NG +1407517440,1407517887,A2 1407517888,1407517919,CD 1407517920,1407517951,A2 1407517952,1407518015,SL @@ -33812,31 +34552,30 @@ 1407518048,1407518063,NG 1407518064,1407518079,A2 1407518080,1407518111,FR -1407518112,1407518127,NG +1407518112,1407518119,A2 +1407518120,1407518127,NG 1407518128,1407518135,KE 1407518136,1407518143,GH -1407518144,1407518159,ZA +1407518144,1407518151,A2 +1407518152,1407518159,ZA 1407518160,1407518167,NG 1407518168,1407518175,CD -1407518176,1407518183,GH -1407518184,1407518199,NG +1407518176,1407518183,A2 +1407518184,1407518191,NG +1407518192,1407518199,A2 1407518200,1407518207,AE 1407518208,1407518215,ZW -1407518216,1407518223,ZA -1407518224,1407518231,A2 -1407518232,1407518255,NG -1407518256,1407518263,CD +1407518216,1407518231,A2 +1407518232,1407518247,NG +1407518248,1407518263,A2 1407518264,1407518269,GH 1407518270,1407518335,A2 1407518336,1407518343,CG 1407518344,1407518351,ZA -1407518352,1407518359,GH +1407518352,1407518359,A2 1407518360,1407518367,NG 1407518368,1407518375,ZA -1407518376,1407518391,NG -1407518392,1407518399,CD -1407518400,1407518719,A2 -1407518720,1407518783,AO +1407518376,1407518783,A2 1407518784,1407518815,CD 1407518816,1407518831,A2 1407518832,1407518847,NG @@ -33846,8 +34585,7 @@ 1407518976,1407518983,NG 1407518984,1407518991,A2 1407518992,1407518999,NG -1407519000,1407519007,A2 -1407519008,1407519015,NG +1407519000,1407519015,A2 1407519016,1407519023,AO 1407519024,1407519031,NG 1407519032,1407519039,AO @@ -33855,7 +34593,7 @@ 1407519048,1407519055,A2 1407519056,1407519063,NG 1407519064,1407519071,BJ -1407519072,1407519079,CD +1407519072,1407519079,A2 1407519080,1407519095,NG 1407519096,1407519103,CM 1407519104,1407519111,NG @@ -33864,23 +34602,20 @@ 1407519144,1407519151,AO 1407519152,1407519159,A2 1407519160,1407519167,AO -1407519168,1407519175,NG +1407519168,1407519175,A2 1407519176,1407519183,SL 1407519184,1407519191,NG 1407519192,1407519199,CD -1407519200,1407519207,AO +1407519200,1407519207,A2 1407519208,1407519215,TG 1407519216,1407519223,NG 1407519224,1407519231,A2 1407519232,1407519615,NG -1407519616,1407519743,A2 -1407519744,1407519751,NG -1407519752,1407519759,A2 -1407519760,1407519775,NG -1407519776,1407519783,A2 +1407519616,1407519751,A2 +1407519752,1407519767,NG +1407519768,1407519783,A2 1407519784,1407519791,NG -1407519792,1407519799,IQ -1407519800,1407519839,A2 +1407519792,1407519839,A2 1407519840,1407519855,NG 1407519856,1407519863,A2 1407519864,1407519871,NG @@ -33889,14 +34624,12 @@ 1407520280,1407520303,A2 1407520304,1407520327,NG 1407520328,1407520335,SL -1407520336,1407520343,A2 -1407520344,1407520359,NG +1407520336,1407520351,A2 +1407520352,1407520359,NG 1407520360,1407520367,CD 1407520368,1407520375,A2 1407520376,1407520397,NG -1407520398,1407520399,A2 -1407520400,1407520423,NG -1407520424,1407520439,A2 +1407520398,1407520439,A2 1407520440,1407520447,CD 1407520448,1407520463,NG 1407520464,1407520519,A2 @@ -33913,21 +34646,16 @@ 1407520632,1407520639,A2 1407520640,1407520655,NG 1407520656,1407520663,GA -1407520664,1407520671,A2 -1407520672,1407520679,CM -1407520680,1407520687,A2 +1407520664,1407520687,A2 1407520688,1407520695,NG 1407520696,1407520711,A2 1407520712,1407520719,NG -1407520720,1407520727,A2 -1407520728,1407520735,AO -1407520736,1407520759,A2 +1407520720,1407520759,A2 1407520760,1407520767,CD 1407520768,1407520775,ZW 1407520776,1407520783,A2 1407520784,1407520791,SD -1407520792,1407520839,A2 -1407520840,1407520847,NG +1407520792,1407520847,A2 1407520848,1407520855,ZM 1407520856,1407520863,A2 1407520864,1407520871,NG @@ -33936,25 +34664,23 @@ 1407520904,1407520911,NG 1407520912,1407520919,ZW 1407520920,1407520927,IQ -1407520928,1407520943,A2 -1407520944,1407520951,IQ +1407520928,1407520951,A2 1407520952,1407520959,ZW 1407520960,1407520967,TZ 1407520968,1407520975,CD 1407520976,1407520983,A2 1407520984,1407520991,ZM -1407520992,1407520999,AO -1407521000,1407521023,A2 +1407520992,1407521023,A2 1407521024,1407521031,ZW 1407521032,1407521055,A2 1407521056,1407521063,KE 1407521064,1407521127,A2 1407521128,1407521135,NG -1407521136,1407521415,A2 +1407521136,1407521215,A2 +1407521216,1407521223,NG +1407521224,1407521415,A2 1407521416,1407521423,LR -1407521424,1407522047,A2 -1407522048,1407522303,TZ -1407522304,1407522319,A2 +1407521424,1407522319,A2 1407522320,1407522327,BF 1407522328,1407522335,NG 1407522336,1407522351,SO @@ -33962,19 +34688,17 @@ 1407522360,1407522367,NG 1407522368,1407522375,A2 1407522376,1407522383,LR -1407522384,1407522399,A2 -1407522400,1407522407,NG +1407522384,1407522407,A2 1407522408,1407522415,LR -1407522416,1407522431,NG +1407522416,1407522431,A2 1407522432,1407522439,IQ 1407522440,1407522440,NG 1407522441,1407522463,A2 1407522464,1407522479,NG -1407522480,1407522487,CD -1407522488,1407522495,A2 +1407522480,1407522495,A2 1407522496,1407522503,NG -1407522504,1407522527,A2 -1407522528,1407522559,NG +1407522504,1407522535,A2 +1407522536,1407522559,NG 1407522560,1407522567,A2 1407522568,1407522575,NG 1407522576,1407522583,A2 @@ -33993,20 +34717,21 @@ 1407522712,1407522727,A2 1407522728,1407522735,CD 1407522736,1407522775,A2 -1407522776,1407522799,NG +1407522776,1407522791,NG +1407522792,1407522799,A2 1407522800,1407522807,ZM -1407522808,1407522815,IQ +1407522808,1407522815,A2 1407522816,1407523071,ZW 1407523072,1407523279,A2 1407523280,1407523287,MZ 1407523288,1407523295,NG 1407523296,1407523327,A2 -1407523328,1407523343,MW +1407523328,1407523335,MW +1407523336,1407523343,A2 1407523344,1407523351,NG 1407523352,1407523359,LU 1407523360,1407523367,ZW -1407523368,1407523375,NG -1407523376,1407523391,A2 +1407523368,1407523391,A2 1407523392,1407523455,ZW 1407523456,1407523519,MW 1407523520,1407523535,A2 @@ -34015,24 +34740,32 @@ 1407523560,1407523567,KE 1407523568,1407523575,A2 1407523576,1407523583,MW -1407523584,1407523839,SO +1407523584,1407523839,A2 1407523840,1407524351,MW 1407524352,1407524607,GB -1407524608,1407524615,A2 +1407524608,1407524615,ZW 1407524616,1407524623,CM 1407524624,1407524631,NG -1407524632,1407524639,BF -1407524640,1407524655,A2 +1407524632,1407524639,A2 +1407524640,1407524647,NG +1407524648,1407524655,CD 1407524656,1407524663,NG 1407524664,1407524687,A2 1407524688,1407524703,MZ -1407524704,1407525071,A2 +1407524704,1407524735,A2 +1407524736,1407524743,NG +1407524744,1407524783,A2 +1407524784,1407524791,ZW +1407524792,1407524967,A2 +1407524968,1407524975,NG +1407524976,1407525071,A2 1407525072,1407525079,NG -1407525080,1407526911,A2 -1407526912,1407527935,MZ -1407527936,1407529023,A2 +1407525080,1407525247,A2 +1407525248,1407525255,CD +1407525256,1407525263,NG +1407525264,1407529023,A2 1407529024,1407529087,NG -1407529088,1407529095,TZ +1407529088,1407529095,A2 1407529096,1407529103,ZW 1407529104,1407529111,NG 1407529112,1407529127,A2 @@ -34041,25 +34774,20 @@ 1407529144,1407529151,ZW 1407529152,1407529183,A2 1407529184,1407529191,NG -1407529192,1407529199,MZ -1407529200,1407529207,A2 +1407529192,1407529207,A2 1407529208,1407529215,NG 1407529216,1407531007,A2 -1407531008,1407531775,NG -1407531776,1407532543,A2 +1407531008,1407531519,NG +1407531520,1407532543,A2 1407532544,1407532551,UG 1407532552,1407532559,AO 1407532560,1407532583,A2 1407532584,1407532591,ZW -1407532592,1407532607,A2 -1407532608,1407532615,ZW +1407532592,1407532615,A2 1407532616,1407532623,KG -1407532624,1407532631,A2 -1407532632,1407532639,MW -1407532640,1407532647,TZ -1407532648,1407532663,A2 +1407532624,1407532663,A2 1407532664,1407532671,TZ -1407532672,1407532799,ZW +1407532672,1407532799,A2 1407532800,1407532927,SO 1407532928,1407533055,A2 1407533056,1407533311,NG @@ -34070,8 +34798,8 @@ 1407533376,1407533407,CD 1407533408,1407533423,A2 1407533424,1407533567,GH -1407533568,1407533591,NG -1407533592,1407533607,A2 +1407533568,1407533583,NG +1407533584,1407533607,A2 1407533608,1407533631,NG 1407533632,1407533663,IQ 1407533664,1407533679,A2 @@ -34083,7 +34811,9 @@ 1407533736,1407533743,GN 1407533744,1407533751,NG 1407533752,1407533759,A2 -1407533760,1407533783,NG +1407533760,1407533767,NG +1407533768,1407533775,A2 +1407533776,1407533783,NG 1407533784,1407533815,A2 1407533816,1407533823,NG 1407533824,1407534079,A2 @@ -34101,8 +34831,8 @@ 1407534560,1407534567,NG 1407534568,1407534575,A2 1407534576,1407534583,CD -1407534584,1407534591,A2 -1407534592,1407534727,NG +1407534584,1407534719,A2 +1407534720,1407534727,NG 1407534728,1407534735,A2 1407534736,1407534775,NG 1407534776,1407534783,ML @@ -34110,7 +34840,11 @@ 1407534792,1407534847,A2 1407534848,1407535103,CM 1407535104,1407535615,GA -1407535616,1407536127,A2 +1407535616,1407535711,A2 +1407535712,1407535719,GB +1407535720,1407535735,A2 +1407535736,1407535743,NG +1407535744,1407536127,A2 1407536128,1407536639,GA 1407536640,1407536895,CD 1407536896,1407536903,A2 @@ -34125,54 +34859,50 @@ 1407537040,1407537047,A2 1407537048,1407537055,NG 1407537056,1407537071,GH -1407537072,1407537087,NG +1407537072,1407537079,A2 +1407537080,1407537087,NG 1407537088,1407537095,GH 1407537096,1407537103,A2 1407537104,1407537111,NG 1407537112,1407537119,LR 1407537120,1407537135,A2 1407537136,1407537143,NG -1407537144,1407537167,A2 -1407537168,1407537175,ZM -1407537176,1407537191,NG +1407537144,1407537183,A2 +1407537184,1407537191,NG 1407537192,1407537199,A2 1407537200,1407537207,NG -1407537208,1407537215,A2 -1407537216,1407537255,NG +1407537208,1407537231,A2 +1407537232,1407537255,NG 1407537256,1407537263,A2 1407537264,1407537279,NG -1407537280,1407537287,LR +1407537280,1407537287,A2 1407537288,1407537295,NG -1407537296,1407537303,A2 -1407537304,1407537311,NG -1407537312,1407537327,A2 -1407537328,1407537351,NG -1407537352,1407537359,A2 -1407537360,1407537367,LR -1407537368,1407537391,NG -1407537392,1407537399,LR -1407537400,1407537423,A2 -1407537424,1407537455,NG +1407537296,1407537335,A2 +1407537336,1407537351,NG +1407537352,1407537367,A2 +1407537368,1407537383,NG +1407537384,1407537431,A2 +1407537432,1407537455,NG 1407537456,1407537479,A2 1407537480,1407537487,CM 1407537488,1407537495,GH 1407537496,1407537511,NG 1407537512,1407537519,LR -1407537520,1407537527,A2 -1407537528,1407537535,NG +1407537520,1407537535,A2 1407537536,1407537543,LR 1407537544,1407537559,A2 1407537560,1407537567,NG 1407537568,1407537575,A2 -1407537576,1407537639,NG +1407537576,1407537599,NG +1407537600,1407537623,A2 +1407537624,1407537639,NG 1407537640,1407537663,A2 1407537664,1407537671,AO -1407537672,1407537679,NG +1407537672,1407537679,A2 1407537680,1407537687,IQ 1407537688,1407537703,A2 1407537704,1407537735,NG -1407537736,1407537743,A2 -1407537744,1407537751,IQ +1407537736,1407537751,A2 1407537752,1407537847,NG 1407537848,1407537855,A2 1407537856,1407537863,NG @@ -34181,17 +34911,15 @@ 1407537880,1407537887,A2 1407537888,1407537895,NG 1407537896,1407537903,IQ -1407537904,1407537911,A2 -1407537912,1407537927,NG -1407537928,1407537935,A2 +1407537904,1407537935,A2 1407537936,1407537943,GH -1407537944,1407537959,NG +1407537944,1407537951,A2 +1407537952,1407537959,NG 1407537960,1407537967,A2 1407537968,1407537991,NG 1407537992,1407537999,IQ 1407538000,1407538023,NG -1407538024,1407538039,A2 -1407538040,1407538047,IQ +1407538024,1407538047,A2 1407538048,1407538055,NG 1407538056,1407538071,LU 1407538072,1407538079,NG @@ -34199,26 +34927,21 @@ 1407538088,1407538095,AO 1407538096,1407538111,A2 1407538112,1407538119,LR -1407538120,1407538135,NG -1407538136,1407538143,A2 +1407538120,1407538127,NG +1407538128,1407538143,A2 1407538144,1407538151,GN 1407538152,1407538167,A2 1407538168,1407538175,IQ -1407538176,1407538295,AT +1407538176,1407538295,A2 1407538296,1407538303,AO -1407538304,1407538431,AT -1407538432,1407538439,A2 +1407538304,1407538439,A2 1407538440,1407538447,NG 1407538448,1407538463,A2 1407538464,1407538471,ZM 1407538472,1407538479,NG -1407538480,1407538495,A2 -1407538496,1407538503,NG -1407538504,1407538559,A2 -1407538560,1407538623,CD -1407538624,1407538663,A2 -1407538664,1407538687,NG -1407538688,1407538751,A2 +1407538480,1407538663,A2 +1407538664,1407538679,NG +1407538680,1407538751,A2 1407538752,1407538783,NG 1407538784,1407538847,A2 1407538848,1407538863,NG @@ -34230,19 +34953,14 @@ 1407538920,1407538927,A2 1407538928,1407538935,NG 1407538936,1407538943,GH -1407538944,1407538967,A2 -1407538968,1407538975,CM +1407538944,1407538975,A2 1407538976,1407538983,NG 1407538984,1407538991,SL 1407538992,1407538999,A2 1407539000,1407539007,NG 1407539008,1407539055,A2 1407539056,1407539063,NG -1407539064,1407539071,A2 -1407539072,1407539079,NG -1407539080,1407539087,A2 -1407539088,1407539095,AO -1407539096,1407539103,A2 +1407539064,1407539103,A2 1407539104,1407539111,NG 1407539112,1407539143,A2 1407539144,1407539151,NG @@ -34251,16 +34969,17 @@ 1407539176,1407539183,GH 1407539184,1407539199,NG 1407539200,1407539455,GE -1407539456,1407539967,NG -1407539968,1407541471,A2 +1407539456,1407540119,A2 +1407540120,1407540127,NG +1407540128,1407541471,A2 1407541472,1407541495,NG 1407541496,1407541535,A2 1407541536,1407541543,CM 1407541544,1407541551,A2 1407541552,1407541559,NG 1407541560,1407541567,GH -1407541568,1407541703,A2 -1407541704,1407541719,NG +1407541568,1407541711,A2 +1407541712,1407541719,NG 1407541720,1407541727,A2 1407541728,1407541735,NG 1407541736,1407541751,A2 @@ -34284,12 +35003,11 @@ 1407542680,1407542687,NG 1407542688,1407542695,CD 1407542696,1407542703,NG -1407542704,1407542719,A2 -1407542720,1407542735,NG +1407542704,1407542727,A2 +1407542728,1407542735,NG 1407542736,1407542767,A2 1407542768,1407542775,GA -1407542776,1407542783,NG -1407542784,1407542791,A2 +1407542776,1407542791,A2 1407542792,1407542799,NG 1407542800,1407542831,A2 1407542832,1407542863,NG @@ -34298,13 +35016,13 @@ 1407542912,1407543039,AT 1407543040,1407543167,A2 1407543168,1407543183,GH -1407543184,1407543239,NG +1407543184,1407543191,A2 +1407543192,1407543239,NG 1407543240,1407543255,A2 1407543256,1407543263,NG 1407543264,1407543279,A2 1407543280,1407543287,NG -1407543288,1407545343,A2 -1407545344,1407546367,SL +1407543288,1407546367,A2 1407546368,1407546495,AE 1407546496,1407546879,A2 1407546880,1407547135,ZW @@ -34316,12 +35034,13 @@ 1407547184,1407547199,NG 1407547200,1407547207,AO 1407547208,1407547215,TD -1407547216,1407547223,SL -1407547224,1407547231,A2 -1407547232,1407547255,SL +1407547216,1407547239,A2 +1407547240,1407547255,SL 1407547256,1407547263,A2 1407547264,1407547271,SL -1407547272,1407547295,NG +1407547272,1407547279,NG +1407547280,1407547287,A2 +1407547288,1407547295,NG 1407547296,1407547303,A2 1407547304,1407547311,SL 1407547312,1407547327,NG @@ -34498,8 +35217,7 @@ 1410010400,1410010431,LY 1410010432,1410010543,DE 1410010544,1410010575,LY -1410010576,1410010591,DE -1410010592,1410010599,LY +1410010576,1410010599,DE 1410010600,1410010607,IR 1410010608,1410010623,LY 1410010624,1410010687,DE @@ -34685,15 +35403,11 @@ 1410206544,1410206551,ES 1410206552,1410212863,FR 1410212864,1410213119,GB -1410213120,1410214495,FR -1410214496,1410214503,PT -1410214504,1410221663,FR +1410213120,1410221663,FR 1410221664,1410221671,GB 1410221672,1410250551,FR 1410250552,1410250559,GB -1410250560,1410255895,FR -1410255896,1410255911,CH -1410255912,1410261007,FR +1410250560,1410261007,FR 1410261008,1410261015,GB 1410261016,1410262799,FR 1410262800,1410262815,DE @@ -34823,16 +35537,18 @@ 1410745248,1410745279,US 1410745280,1410745855,FR 1410745856,1410746111,CH -1410746112,1410746623,AO -1410746624,1410748415,A2 +1410746112,1410746879,AO +1410746880,1410748415,A2 1410748416,1410752511,DE -1410752512,1410752639,AQ -1410752640,1410752763,DE +1410752512,1410752703,AQ +1410752704,1410752763,DE 1410752764,1410752785,AQ 1410752786,1410752799,DE 1410752800,1410752827,AQ 1410752828,1410753023,DE -1410753024,1410753151,AQ +1410753024,1410753031,AQ +1410753032,1410753055,BS +1410753056,1410753151,AQ 1410753152,1410753303,DE 1410753304,1410753327,AQ 1410753328,1410753335,DE @@ -34840,7 +35556,8 @@ 1410753344,1410753351,DE 1410753352,1410753367,AQ 1410753368,1410753391,DE -1410753392,1410754831,AQ +1410753392,1410753399,NL +1410753400,1410754831,AQ 1410754832,1410754855,DE 1410754856,1410754859,AQ 1410754860,1410754867,DE @@ -34856,7 +35573,8 @@ 1410757120,1410758655,DE 1410758656,1410760191,AQ 1410760192,1410760455,DE -1410760456,1410760479,AQ +1410760456,1410760471,AQ +1410760472,1410760479,SC 1410760480,1410760487,DE 1410760488,1410760503,AQ 1410760504,1410760683,DE @@ -34978,20 +35696,16 @@ 1411999784,1411999791,SI 1411999792,1411999799,BA 1411999800,1411999807,SI -1411999808,1411999823,BA -1411999824,1411999831,SI -1411999832,1411999839,BA +1411999808,1411999839,BA 1411999840,1411999871,SI 1411999872,1412000767,BA 1412000768,1412000783,SI 1412000784,1412000791,BA 1412000792,1412000863,SI 1412000864,1412000879,BA -1412000880,1412000895,SI -1412000896,1412000911,BA -1412000912,1412000959,SI -1412000960,1412001023,BA -1412001024,1412001311,SI +1412000880,1412000903,SI +1412000904,1412000911,BA +1412000912,1412001311,SI 1412001312,1412001319,DE 1412001320,1412001807,SI 1412001808,1412001855,RO @@ -35011,20 +35725,20 @@ 1412003056,1412003119,BA 1412003120,1412003135,SI 1412003136,1412003143,BA -1412003144,1412003167,SI -1412003168,1412003215,BA +1412003144,1412003199,SI +1412003200,1412003215,BA 1412003216,1412003223,SI 1412003224,1412003231,BA 1412003232,1412003247,SI 1412003248,1412003263,BA 1412003264,1412003271,SI 1412003272,1412003303,BA -1412003304,1412003359,SI +1412003304,1412003327,SI +1412003328,1412003343,BA +1412003344,1412003359,SI 1412003360,1412003375,BA -1412003376,1412003383,SI -1412003384,1412003391,BA -1412003392,1412003399,HR -1412003400,1412003407,BA +1412003376,1412003391,SI +1412003392,1412003407,BA 1412003408,1412003423,SI 1412003424,1412003527,BA 1412003528,1412003535,SI @@ -35212,8 +35926,8 @@ 1424594104,1424594111,GB 1424594112,1424594175,FR 1424594176,1424594431,GB -1424594432,1424594495,IE -1424594496,1424595455,GB +1424594432,1424594519,IE +1424594520,1424595455,GB 1424595456,1424595527,IT 1424595528,1424595535,GB 1424595536,1424595551,IT @@ -35231,7 +35945,9 @@ 1424597264,1424597311,CZ 1424597312,1424597343,GB 1424597344,1424597351,CH -1424597352,1424597503,GB +1424597352,1424597375,GB +1424597376,1424597391,CZ +1424597392,1424597503,GB 1424597504,1424597759,FR 1424597760,1424598015,IT 1424598016,1424599039,GB @@ -35273,8 +35989,8 @@ 1424603392,1424603647,DE 1424603648,1424603903,GB 1424603904,1424604067,ES -1424604068,1424604095,GB -1424604096,1424604159,ES +1424604068,1424604071,GB +1424604072,1424604159,ES 1424604160,1424604543,NL 1424604544,1424604671,GB 1424604672,1424604799,NL @@ -35284,7 +36000,9 @@ 1424605136,1424605183,NL 1424605184,1424605439,GB 1424605440,1424605567,BG -1424605568,1424605607,GB +1424605568,1424605583,GB +1424605584,1424605599,BE +1424605600,1424605607,GB 1424605608,1424605623,BG 1424605624,1424605631,GB 1424605632,1424605695,BG @@ -35313,29 +36031,25 @@ 1424608280,1424608383,FR 1424608384,1424608399,ES 1424608400,1424608511,FR -1424608512,1424608567,ES -1424608568,1424608671,GB -1424608672,1424608687,ES +1424608512,1424608687,ES 1424608688,1424608695,GB -1424608696,1424608743,ES -1424608744,1424608751,GB -1424608752,1424609023,ES +1424608696,1424609023,ES 1424609024,1424609259,DE 1424609260,1424609271,GB 1424609272,1424609279,DE 1424609280,1424609395,CH 1424609396,1424609399,GB -1424609400,1424609543,CH -1424609544,1424609551,GB -1424609552,1424609791,CH +1424609400,1424609727,CH +1424609728,1424609743,GB +1424609744,1424609791,CH 1424609792,1424610303,GB 1424610304,1424610559,TZ 1424610560,1424610815,PL 1424610816,1424611071,FR -1424611072,1424611087,BE -1424611088,1424611103,GB -1424611104,1424611143,BE -1424611144,1424611151,GB +1424611072,1424611095,BE +1424611096,1424611103,GB +1424611104,1424611135,BE +1424611136,1424611151,GB 1424611152,1424611327,BE 1424611328,1424611583,PL 1424611584,1424612095,GB @@ -35353,7 +36067,9 @@ 1424614136,1424614143,IT 1424614144,1424614399,GB 1424614400,1424614415,FR -1424614416,1424614655,IT +1424614416,1424614559,IT +1424614560,1424614591,GB +1424614592,1424614655,IT 1424614656,1424614911,FR 1424614912,1424615167,RO 1424615168,1424615679,GB @@ -35389,9 +36105,9 @@ 1424618016,1424618239,IT 1424618240,1424618495,NL 1424618496,1424618751,GB -1424618752,1424618983,FR -1424618984,1424618991,GB -1424618992,1424619007,FR +1424618752,1424618943,FR +1424618944,1424618951,GB +1424618952,1424619007,FR 1424619008,1424619775,IT 1424619776,1424619807,BE 1424619808,1424619815,GB @@ -35511,7 +36227,6 @@ 1425426432,1425428479,KW 1425428480,1425430527,GB 1425430528,1425432575,SE -1425432576,1425434623,IT 1425434624,1425436671,FR 1425436672,1425438719,GB 1425438720,1425439271,DE @@ -35660,7 +36375,9 @@ 1425970944,1425971007,IT 1425971008,1425971071,NL 1425971072,1425971199,A2 -1425971200,1425971455,NL +1425971200,1425971231,NL +1425971232,1425971263,DE +1425971264,1425971455,NL 1425971456,1425971519,A2 1425971520,1425971583,IT 1425971584,1425971647,A2 @@ -35879,9 +36596,7 @@ 1427031680,1427031743,AT 1427031744,1427031807,DE 1427031808,1427032063,AT -1427032064,1427032143,DE -1427032144,1427032151,AT -1427032152,1427032183,DE +1427032064,1427032183,DE 1427032184,1427032191,PL 1427032192,1427032223,DE 1427032224,1427032231,GR @@ -35932,12 +36647,12 @@ 1427728672,1427728703,TR 1427728704,1427728799,DE 1427728800,1427728831,RU -1427728832,1427728863,DE -1427728864,1427728895,CY +1427728832,1427728895,CY 1427728896,1427728927,DE 1427728928,1427728959,IL 1427728960,1427728991,RU -1427728992,1427729055,DE +1427728992,1427729023,DE +1427729024,1427729055,AT 1427729056,1427729087,CA 1427729088,1427729119,DE 1427729120,1427729151,RO @@ -35989,34 +36704,29 @@ 1427745696,1427745727,US 1427745728,1427745791,DE 1427745792,1427745823,GB -1427745824,1427745983,DE -1427745984,1427746015,PL -1427746016,1427746079,DE +1427745824,1427745855,US +1427745856,1427746079,DE 1427746080,1427746111,GB 1427746112,1427746239,DE -1427746240,1427746271,TR +1427746240,1427746271,NL 1427746272,1427746367,DE 1427746368,1427746399,SE 1427746400,1427747839,DE 1427747840,1427747871,FI 1427747872,1427748543,DE 1427748544,1427748575,MX -1427748576,1427748831,DE -1427748832,1427748863,US -1427748864,1427749503,DE +1427748576,1427749503,DE 1427749504,1427749535,UA 1427749536,1427749567,DE 1427749568,1427749599,CY 1427749600,1427749631,DE 1427749632,1427749663,US -1427749664,1427749695,DE -1427749696,1427749727,PL -1427749728,1427749919,DE -1427749920,1427749983,RU +1427749664,1427749951,DE +1427749952,1427749983,RU 1427749984,1427750143,DE 1427750144,1427750175,TR 1427750176,1427750239,DE -1427750240,1427750271,TR +1427750240,1427750271,NL 1427750272,1427750303,DE 1427750304,1427750335,GB 1427750336,1427751167,DE @@ -36069,7 +36779,8 @@ 1428094976,1428096031,AT 1428096032,1428096039,CH 1428096040,1428103167,AT -1428103168,1428119551,GB +1428103168,1428111359,GB +1428111360,1428119551,A2 1428119552,1428121599,LV 1428121600,1428123647,FR 1428123648,1428126975,RU @@ -36085,33 +36796,26 @@ 1428142080,1428143263,DE 1428143264,1428143279,CH 1428143280,1428144127,DE -1428144128,1428147103,FR -1428147104,1428147119,GB -1428147120,1428147127,FR -1428147128,1428147135,GB -1428147136,1428147359,FR -1428147360,1428147375,IT -1428147376,1428147391,ES -1428147392,1428147591,FR -1428147592,1428147711,GB +1428144128,1428147111,FR +1428147112,1428147119,GB +1428147120,1428147595,FR +1428147596,1428147711,GB 1428147712,1428147855,FR 1428147856,1428147871,US -1428147872,1428147903,GB -1428147904,1428148031,FR -1428148032,1428148063,GB -1428148064,1428148143,FR -1428148144,1428148151,DE -1428148152,1428148159,NL -1428148160,1428148175,FR +1428147872,1428147895,FR +1428147896,1428147903,GB +1428147904,1428148039,FR +1428148040,1428148047,GB +1428148048,1428148175,FR 1428148176,1428148191,CH 1428148192,1428148223,GB -1428148224,1428150495,FR -1428150496,1428150511,GB -1428150512,1428150735,FR +1428148224,1428150735,FR 1428150736,1428150751,GB 1428150752,1428151007,FR 1428151008,1428151039,GB -1428151040,1428152127,FR +1428151040,1428151231,FR +1428151232,1428151295,GB +1428151296,1428152127,FR 1428152128,1428152319,GB 1428152320,1428160511,PL 1428160512,1429209087,IT @@ -36192,11 +36896,17 @@ 1432131584,1432133631,PH 1432133632,1432150015,GB 1432150016,1432158207,BA -1432158208,1432159743,DE +1432158208,1432159042,DE +1432159043,1432159046,IR +1432159047,1432159311,DE +1432159312,1432159321,IR +1432159322,1432159743,DE 1432159744,1432159871,PL 1432159872,1432160255,DE 1432160256,1432160511,CH -1432160512,1432165247,DE +1432160512,1432162907,DE +1432162908,1432162914,IR +1432162915,1432165247,DE 1432165248,1432165375,PL 1432165376,1432166399,DE 1432166400,1432174591,RU @@ -36220,13 +36930,22 @@ 1432322048,1432338431,RU 1432338432,1432346623,FR 1432346624,1433403391,TR -1433403392,1433407487,ES -1433407488,1433410559,NL +1433403392,1433406239,ES +1433406240,1433406271,US +1433406272,1433406431,ES +1433406432,1433406447,US +1433406448,1433407487,ES +1433407488,1433410047,NL +1433410048,1433410559,US 1433410560,1433411071,ES -1433411072,1433411375,TR -1433411376,1433411391,US -1433411392,1433411407,NL -1433411408,1433411583,TR +1433411072,1433411327,US +1433411328,1433411343,ES +1433411344,1433411359,TR +1433411360,1433411375,ES +1433411376,1433411407,US +1433411408,1433411455,TR +1433411456,1433411519,US +1433411520,1433411583,ES 1433411584,1433419775,RU 1433419776,1433427967,LB 1433427968,1433436159,RU @@ -36280,7 +36999,6 @@ 1433739264,1433747455,GE 1433747456,1433755647,RU 1433755648,1433763839,EE -1433763840,1433772031,CZ 1433772032,1433788415,SE 1433788416,1433796607,UZ 1433796608,1433804799,GB @@ -36368,8 +37086,8 @@ 1434681856,1434682111,MY 1434682112,1434682303,DE 1434682304,1434682367,NL -1434682368,1434683087,DE -1434683088,1434683135,NL +1434682368,1434683103,DE +1434683104,1434683135,NL 1434683136,1434683263,DE 1434683264,1434683391,NL 1434683392,1434684415,DE @@ -36450,7 +37168,7 @@ 1436471808,1436473343,BE 1436473344,1436475391,RO 1436475392,1436477439,AT -1436477440,1436481535,CH +1436477440,1436479487,CH 1436481536,1436483583,NL 1436483584,1436485631,UA 1436485632,1436487471,DE @@ -36534,7 +37252,15 @@ 1438842880,1438859263,SE 1438859264,1438861823,DE 1438861824,1438862079,CH -1438862080,1438873119,DE +1438862080,1438869591,DE +1438869592,1438869595,RU +1438869596,1438869647,DE +1438869648,1438869651,LV +1438869652,1438869655,US +1438869656,1438869663,UA +1438869664,1438869671,DE +1438869672,1438869679,CY +1438869680,1438873119,DE 1438873120,1438873127,PA 1438873128,1438873671,DE 1438873672,1438873679,PA @@ -36733,9 +37459,7 @@ 1441384592,1441384599,AU 1441384600,1441384607,FR 1441384608,1441384639,CN -1441384640,1441385103,FR -1441385104,1441385119,ES -1441385120,1441386111,FR +1441384640,1441386111,FR 1441386112,1441386239,IL 1441386240,1441388671,FR 1441388672,1441388799,CA @@ -36766,7 +37490,8 @@ 1441543152,1441543167,LI 1441543168,1441543567,DE 1441543568,1441543583,CH -1441543584,1441544063,DE +1441543584,1441543599,HR +1441543600,1441544063,DE 1441544064,1441544127,TR 1441544128,1441544143,DE 1441544144,1441544159,CH @@ -37116,7 +37841,9 @@ 1467340960,1467340991,TR 1467340992,1467344127,GB 1467344128,1467344383,CA -1467344384,1467347903,GB +1467344384,1467344639,GB +1467344640,1467344895,ZA +1467344896,1467347903,GB 1467347904,1467347935,SE 1467347936,1467351039,GB 1467351040,1467367423,NO @@ -37326,8 +38053,10 @@ 1475223552,1475229695,NO 1475229696,1475229759,SE 1475229760,1475229951,NO -1475229952,1475229991,SE -1475229992,1475233791,NO +1475229952,1475230003,SE +1475230004,1475230015,NO +1475230016,1475230047,SE +1475230048,1475233791,NO 1475233792,1475234303,GB 1475234304,1475234559,IE 1475234560,1475235839,GB @@ -37337,14 +38066,10 @@ 1475241984,1475242239,MC 1475242240,1475243775,FR 1475243776,1475244031,MC -1475244032,1475244287,DE -1475244288,1475244311,CV -1475244312,1475244319,DE -1475244320,1475244543,CV -1475244544,1475245055,DE +1475244032,1475245055,DE 1475245056,1475245183,IE 1475245184,1475245311,SD -1475245312,1475245567,CV +1475245312,1475245567,DE 1475245568,1475246078,SA 1475246079,1475246079,DE 1475246080,1475248127,CH @@ -37454,7 +38179,9 @@ 1475636400,1475636415,JE 1475636416,1475636431,GB 1475636432,1475636447,JE -1475636448,1475637479,GB +1475636448,1475637287,GB +1475637288,1475637295,JE +1475637296,1475637479,GB 1475637480,1475637487,JE 1475637488,1475637503,GB 1475637504,1475638783,JE @@ -37471,7 +38198,9 @@ 1475639344,1475639351,JE 1475639352,1475639367,GB 1475639368,1475639383,JE -1475639384,1475639595,GB +1475639384,1475639527,GB +1475639528,1475639543,JE +1475639544,1475639595,GB 1475639596,1475639599,JE 1475639600,1475639727,GB 1475639728,1475639735,JE @@ -38375,9 +39104,7 @@ 1502980096,1502980159,US 1502980160,1502980351,FR 1502980352,1502980871,US -1502980872,1502980927,FR -1502980928,1502980991,US -1502980992,1502981119,FR +1502980872,1502981119,FR 1502981120,1502981887,US 1502981888,1502982143,NL 1502982144,1502982911,DE @@ -38425,8 +39152,8 @@ 1503821824,1503854591,UA 1503854592,1503887359,RU 1503887360,1503895607,DE -1503895608,1503895623,NL -1503895624,1503895631,DE +1503895608,1503895615,NL +1503895616,1503895631,DE 1503895632,1503895639,AT 1503895640,1503895671,DE 1503895672,1503895679,PL @@ -38453,19 +39180,16 @@ 1503897312,1503897367,DE 1503897368,1503897375,BE 1503897376,1503897383,GR -1503897384,1503897391,DE -1503897392,1503897399,CH -1503897400,1503897407,DE +1503897384,1503897407,DE 1503897408,1503897415,IT -1503897416,1503897423,CH -1503897424,1503897431,DE +1503897416,1503897431,DE 1503897432,1503897439,IT 1503897440,1503897463,DE 1503897464,1503897471,GR 1503897472,1503897479,AT 1503897480,1503897575,DE -1503897576,1503897583,GB -1503897584,1503898119,DE +1503897576,1503897591,GB +1503897592,1503898119,DE 1503898120,1503898135,TH 1503898136,1503898167,DE 1503898168,1503898175,RO @@ -38474,7 +39198,20 @@ 1503898192,1503898199,GR 1503898200,1503898207,US 1503898208,1503898215,BE -1503898216,1503908351,DE +1503898216,1503898223,DE +1503898224,1503898231,CH +1503898232,1503898239,GR +1503898240,1503898303,IT +1503898304,1503898311,BE +1503898312,1503898327,DE +1503898328,1503898335,AT +1503898336,1503898343,CH +1503898344,1503898351,DE +1503898352,1503898359,CH +1503898360,1503898415,DE +1503898416,1503898423,BE +1503898424,1503898431,CH +1503898432,1503908351,DE 1503908352,1503909375,IT 1503909376,1503920127,DE 1503920128,1503985663,HR @@ -38532,7 +39269,11 @@ 1505273088,1505273095,NZ 1505273096,1505279999,NL 1505280000,1505280007,IR -1505280008,1505284863,AE +1505280008,1505280255,AE +1505280256,1505280271,IR +1505280272,1505284095,AE +1505284096,1505284607,IR +1505284608,1505284863,AE 1505284864,1505288191,IR 1505288192,1505296383,RU 1505296384,1505304575,UA @@ -38588,7 +39329,9 @@ 1505333624,1505333631,GB 1505333632,1505336063,IE 1505336064,1505336071,GB -1505336072,1505336831,IE +1505336072,1505336576,IE +1505336577,1505336639,GB +1505336640,1505336831,IE 1505336832,1505336863,GB 1505336864,1505336864,IE 1505336865,1505336879,GB @@ -38641,7 +39384,9 @@ 1505456928,1505456935,US 1505456936,1505458175,GB 1505458176,1505458431,US -1505458432,1505460223,GB +1505458432,1505458463,GB +1505458464,1505458495,US +1505458496,1505460223,GB 1505460224,1505476607,CZ 1505476608,1505484799,RU 1505484800,1505492991,PL @@ -38727,11 +39472,14 @@ 1506438864,1506438871,DE 1506438872,1506438879,FR 1506438880,1506438883,US -1506438884,1506438911,DE +1506438884,1506438895,DE +1506438896,1506438911,CH 1506438912,1506439039,US 1506439040,1506439463,DE 1506439464,1506439471,GB -1506439472,1506439935,DE +1506439472,1506439571,DE +1506439572,1506439575,US +1506439576,1506439935,DE 1506439936,1506440191,US 1506440192,1506440447,DE 1506440448,1506440575,US @@ -38817,7 +39565,9 @@ 1506446160,1506446175,GB 1506446176,1506446335,FR 1506446336,1506447359,NL -1506447360,1506448383,IT +1506447360,1506447423,IT +1506447424,1506447455,GB +1506447456,1506448383,IT 1506448384,1506448639,AT 1506448640,1506448647,GB 1506448648,1506448663,AT @@ -38839,8 +39589,8 @@ 1506450848,1506450863,CZ 1506450864,1506450879,GB 1506450880,1506450943,CZ -1506450944,1506451007,DK -1506451008,1506451199,GB +1506450944,1506451023,DK +1506451024,1506451199,GB 1506451200,1506451895,ES 1506451896,1506451903,GB 1506451904,1506452223,ES @@ -38854,8 +39604,8 @@ 1506453400,1506453415,SE 1506453416,1506453423,GB 1506453424,1506453439,SE -1506453440,1506453455,GB -1506453456,1506453471,SE +1506453440,1506453447,GB +1506453448,1506453471,SE 1506453472,1506453503,GB 1506453504,1506453759,DE 1506453760,1506454015,FR @@ -38871,7 +39621,9 @@ 1506456576,1506456831,IE 1506456832,1506456847,IT 1506456848,1506456863,GB -1506456864,1506457087,IT +1506456864,1506456959,IT +1506456960,1506456991,GB +1506456992,1506457087,IT 1506457088,1506458239,GB 1506458240,1506458623,CH 1506458624,1506459135,GB @@ -38902,7 +39654,9 @@ 1506462624,1506462719,FR 1506462720,1506463231,IT 1506463232,1506463487,SE -1506463488,1506463999,DE +1506463488,1506463527,DE +1506463528,1506463535,GB +1506463536,1506463999,DE 1506464000,1506464767,GB 1506464768,1506465279,NL 1506465280,1506465791,GB @@ -38933,8 +39687,8 @@ 1506474272,1506474303,SE 1506474304,1506474495,IT 1506474496,1506474751,FR -1506474752,1506474879,IT -1506474880,1506475007,GB +1506474752,1506474887,IT +1506474888,1506475007,GB 1506475008,1506475519,IT 1506475520,1506475527,AT 1506475528,1506476031,GB @@ -38976,7 +39730,6 @@ 1506781888,1506781951,AU 1506781952,1506783231,GB 1506783232,1506785279,RU -1506785280,1506787327,UA 1506787328,1506789375,ME 1506789376,1506791423,DE 1506791424,1506793471,GB @@ -39076,8 +39829,8 @@ 1508642816,1508646911,SE 1508646912,1508646927,DK 1508646928,1508646935,SE -1508646936,1508647015,DK -1508647016,1508648447,SE +1508646936,1508647031,DK +1508647032,1508648447,SE 1508648448,1508648703,DK 1508648704,1508650751,SE 1508650752,1508650815,DK @@ -39224,7 +39977,8 @@ 1515467264,1515467519,FR 1515467520,1515468031,US 1515468032,1515468287,ES -1515468288,1515486975,FR +1515468288,1515468415,NL +1515468416,1515486975,FR 1515486976,1515487231,CD 1515487232,1515487359,HK 1515487360,1515487999,FR @@ -39238,12 +39992,10 @@ 1518452736,1518460927,AT 1518460928,1518501887,SE 1518501888,1518503935,EE -1518503936,1518504959,LT -1518504960,1518505983,SE -1518505984,1518508031,LT -1518508032,1518510079,SE -1518510080,1518514175,LV -1518514176,1518665727,SE +1518503936,1518508543,LT +1518508544,1518510079,SE +1518510080,1518516479,LV +1518516480,1518665727,SE 1518665728,1518727167,RU 1518727168,1518731263,SE 1518731264,1518927871,DE @@ -39414,7 +40166,9 @@ 1520074752,1520099327,BG 1520099328,1520099583,A2 1520099584,1520107519,BG -1520107520,1520140287,GB +1520107520,1520138167,GB +1520138168,1520138175,IE +1520138176,1520140287,GB 1520140288,1520173055,RU 1520173056,1520205823,PL 1520205824,1520230399,RU @@ -39568,7 +40322,7 @@ 1534713888,1534713935,FR 1534713936,1534713943,CH 1534713944,1534713947,DE -1534713948,1534713951,GB +1534713948,1534713951,PL 1534713952,1534713955,DE 1534713956,1534713959,BE 1534713960,1534713963,CH @@ -39629,10 +40383,12 @@ 1534714864,1534714871,FR 1534714872,1534714875,DE 1534714876,1534714879,FR -1534714880,1534714895,IT +1534714880,1534714895,PL 1534714896,1534714911,FR 1534714912,1534714927,DE -1534714928,1534715039,FR +1534714928,1534714943,FR +1534714944,1534714975,DE +1534714976,1534715039,FR 1534715040,1534715055,GB 1534715056,1534715071,PL 1534715072,1534715135,FR @@ -39673,8 +40429,7 @@ 1534715632,1534715647,ES 1534715648,1534715663,PL 1534715664,1534715679,ES -1534715680,1534715695,GB -1534715696,1534715711,FR +1534715680,1534715711,FR 1534715712,1534715727,PT 1534715728,1534715731,FR 1534715732,1534715735,GB @@ -39709,9 +40464,7 @@ 1534716432,1534716447,PL 1534716448,1534716479,FR 1534716480,1534716495,ES -1534716496,1534716511,FR -1534716512,1534716527,DE -1534716528,1534716575,FR +1534716496,1534716575,FR 1534716576,1534716607,PL 1534716608,1534716639,FR 1534716640,1534716647,BE @@ -39725,9 +40478,13 @@ 1534716752,1534716759,PL 1534716760,1534716763,FR 1534716764,1534716767,ES -1534716768,1534716879,FR +1534716768,1534716823,FR +1534716824,1534716831,GB +1534716832,1534716879,FR 1534716880,1534716895,BE -1534716896,1534716927,FR +1534716896,1534716903,ES +1534716904,1534716911,DE +1534716912,1534716927,FR 1534716928,1534716943,DE 1534716944,1534716991,FR 1534716992,1534717007,DE @@ -39749,8 +40506,7 @@ 1534717344,1534717359,GB 1534717360,1534717375,PL 1534717376,1534717503,FR -1534717504,1534717519,DE -1534717520,1534717535,FR +1534717504,1534717535,DE 1534717536,1534717551,PL 1534717552,1534717567,CZ 1534717568,1534717583,PL @@ -39784,7 +40540,8 @@ 1534718032,1534718063,FR 1534718064,1534718079,IT 1534718080,1534718087,ES -1534718088,1534718095,CZ +1534718088,1534718091,DE +1534718092,1534718095,ES 1534718096,1534718111,PL 1534718112,1534718127,IT 1534718128,1534718143,ES @@ -39822,7 +40579,11 @@ 1534718976,1534719039,FR 1534719040,1534719167,BE 1534719168,1534719215,PL -1534719216,1534719359,FR +1534719216,1534719295,FR +1534719296,1534719311,DE +1534719312,1534719335,FR +1534719336,1534719343,PL +1534719344,1534719359,FR 1534719360,1534719375,PL 1534719376,1534719391,DE 1534719392,1534719395,CH @@ -39845,15 +40606,18 @@ 1534719704,1534719711,GB 1534719712,1534719759,FR 1534719760,1534719775,IT -1534719776,1534719823,FR +1534719776,1534719799,FR +1534719800,1534719803,ES +1534719804,1534719807,GB +1534719808,1534719823,FR 1534719824,1534719839,CH 1534719840,1534719871,FR 1534719872,1534719887,PL 1534719888,1534719951,FR 1534719952,1534719967,DE 1534719968,1534719983,PL -1534719984,1534720007,FR -1534720008,1534720015,PL +1534719984,1534720003,FR +1534720004,1534720015,PL 1534720016,1534720031,GB 1534720032,1534720047,DE 1534720048,1534720063,ES @@ -39866,7 +40630,8 @@ 1534720224,1534720239,DE 1534720240,1534720255,BE 1534720256,1534720287,PL -1534720288,1534720367,FR +1534720288,1534720351,FR +1534720352,1534720367,ES 1534720368,1534720383,IT 1534720384,1534720431,FR 1534720432,1534720435,DE @@ -39884,7 +40649,8 @@ 1534720512,1534720527,DE 1534720528,1534720535,FR 1534720536,1534720539,PL -1534720540,1534720575,FR +1534720540,1534720543,FI +1534720544,1534720575,FR 1534720576,1534720591,ES 1534720592,1534720607,FR 1534720608,1534720623,GB @@ -39935,7 +40701,9 @@ 1534721232,1534721247,DE 1534721248,1534721263,FR 1534721264,1534721279,GB -1534721280,1534721311,FR +1534721280,1534721287,PL +1534721288,1534721295,NL +1534721296,1534721311,FR 1534721312,1534721319,PL 1534721320,1534721327,PT 1534721328,1534721343,NL @@ -39953,8 +40721,8 @@ 1534721532,1534721535,FR 1534721536,1534721583,GB 1534721584,1534721599,FR -1534721600,1534721623,ES -1534721624,1534721627,PL +1534721600,1534721619,ES +1534721620,1534721627,PL 1534721628,1534721631,NL 1534721632,1534721663,FR 1534721664,1534721679,ES @@ -39984,9 +40752,13 @@ 1534721968,1534721975,DE 1534721976,1534721979,ES 1534721980,1534721983,GB -1534721984,1534721999,PL -1534722000,1534722031,FR -1534722032,1534722047,BE +1534721984,1534722007,PL +1534722008,1534722011,PT +1534722012,1534722015,DE +1534722016,1534722031,FR +1534722032,1534722039,GB +1534722040,1534722043,BE +1534722044,1534722047,FR 1534722048,1534787583,RU 1534787584,1534791679,RO 1534791680,1534795775,UA @@ -40059,7 +40831,7 @@ 1536045056,1536045439,DE 1536045440,1536045567,A2 1536045568,1536046079,IQ -1536046080,1536046591,A2 +1536046080,1536046591,DE 1536046592,1536046847,IQ 1536046848,1536046975,A2 1536046976,1536047039,SA @@ -40077,9 +40849,10 @@ 1536048672,1536048703,LU 1536048704,1536048719,IQ 1536048720,1536048735,NL -1536048736,1536049151,A2 +1536048736,1536048895,DE +1536048896,1536049151,A2 1536049152,1536051199,IT -1536053248,1536057343,RU +1536051200,1536057343,RU 1536057344,1536061439,IE 1536061440,1536065535,SE 1536065536,1536065791,GB @@ -40154,16 +40927,13 @@ 1536655360,1536659455,GE 1536659456,1536659759,DE 1536659760,1536659775,BI -1536659776,1536659791,LB +1536659776,1536659791,DE 1536659792,1536659823,SD -1536659824,1536659967,DE -1536659968,1536659975,EG -1536659976,1536659991,DE -1536659992,1536660003,EG +1536659824,1536659991,DE +1536659992,1536659999,EG +1536660000,1536660003,DE 1536660004,1536660007,SO -1536660008,1536660015,DE -1536660016,1536660019,KW -1536660020,1536660031,DE +1536660008,1536660031,DE 1536660032,1536660039,DJ 1536660040,1536660735,DE 1536660736,1536660991,SA @@ -40176,19 +40946,18 @@ 1536662320,1536662335,LB 1536662336,1536662351,DE 1536662352,1536662359,TD -1536662360,1536662367,IR +1536662360,1536662367,DE 1536662368,1536662399,IQ 1536662400,1536662415,DE 1536662416,1536662431,GN -1536662432,1536662527,IQ -1536662528,1536662783,DE +1536662432,1536662463,IQ +1536662464,1536662783,DE 1536662784,1536663039,SA 1536663040,1536663295,DE 1536663296,1536663311,LB 1536663312,1536663319,DE 1536663320,1536663327,LB -1536663328,1536663335,CV -1536663336,1536663359,DE +1536663328,1536663359,DE 1536663360,1536663391,IQ 1536663392,1536663423,DE 1536663424,1536663551,KW @@ -40196,6 +40965,7 @@ 1536667648,1536675839,RU 1536675840,1536679935,GB 1536679936,1536684031,LB +1536684032,1536688127,GB 1536688128,1537212415,FI 1537212416,1538260991,FR 1538260992,1538785279,BE @@ -40214,8 +40984,8 @@ 1538859008,1538875391,RU 1538875392,1538883583,RS 1538883584,1538891775,BE -1538891776,1538898431,DE -1538898432,1538899967,FR +1538891776,1538898175,DE +1538898176,1538899967,FR 1538899968,1538904031,SI 1538904032,1538904039,BH 1538904040,1538908159,SI @@ -41332,7 +42102,7 @@ 1539878912,1539879935,EU 1539879936,1539880959,UA 1539880960,1539881983,PL -1539881984,1539884031,UA +1539881984,1539883007,UA 1539884032,1539885055,MT 1539885056,1539886079,UA 1539886080,1539887103,FR @@ -42821,7 +43591,6 @@ 1540742912,1540743167,RU 1540743168,1540743423,NO 1540743424,1540743679,RU -1540743680,1540743935,MD 1540743936,1540744191,CH 1540744192,1540744447,GR 1540744448,1540744703,UA @@ -43208,9 +43977,33 @@ 1540960256,1540960767,PL 1540960768,1540961279,RU 1540961280,1540961791,CZ -1540961792,1540962303,HU 1540962304,1540962815,NL -1540962816,1540963327,EU +1540962816,1540963839,UA +1540963840,1540964351,RU +1540964352,1540964863,IR +1540964864,1540965375,UA +1540965888,1540966399,RU +1540966400,1540966911,GB +1540966912,1540967935,RU +1540967936,1540968447,UA +1540968448,1540969471,RO +1540969472,1540969983,GB +1540969984,1540970495,DE +1540970496,1540971007,IE +1540971008,1540971519,UA +1540971520,1540972031,SI +1540972032,1540972543,FR +1540972544,1540973055,CZ +1540973056,1540973567,PL +1540973568,1540974079,UA +1540974080,1540974591,RU +1540974592,1540975103,PL +1540975104,1540975615,UA +1540976128,1540976639,RU +1540976640,1540977151,UA +1540977152,1540977663,PL +1540977664,1540978175,FI +1540978176,1540978687,AT 1540980736,1540980991,CH 1540980992,1540981247,RU 1540981248,1540981503,RO @@ -43254,6 +44047,81 @@ 1540991744,1540991999,PL 1540992000,1540992255,FR 1540992256,1540992511,AT +1540992512,1540993279,DE +1540993280,1540993535,LB +1540993536,1540993791,SC +1540993792,1540994047,UA +1540994048,1540994303,RU +1540994304,1540994559,SE +1540994560,1540994815,PL +1540994816,1540995071,UA +1540995072,1540995327,RU +1540995328,1540995583,IQ +1540995584,1540995839,SE +1540995840,1540996095,RO +1540996096,1540996351,DE +1540996352,1540996607,NL +1540996608,1540996863,RU +1540996864,1540997119,NL +1540997120,1540997375,RU +1540997376,1540997631,TR +1540997632,1540998399,RU +1540998400,1540998655,UA +1540998656,1540998911,PL +1540998912,1540999167,DE +1540999168,1540999423,RU +1540999424,1540999679,DK +1540999680,1540999935,RU +1540999936,1541000191,RO +1541000192,1541000447,PL +1541000448,1541000703,BG +1541000704,1541000959,DE +1541000960,1541001215,RU +1541001216,1541001471,PL +1541001472,1541001727,SE +1541001728,1541001983,NL +1541001984,1541002239,FI +1541002240,1541002495,RU +1541002496,1541002751,AT +1541002752,1541003007,DE +1541003008,1541003263,BG +1541003264,1541003519,GB +1541003520,1541004031,PL +1541004032,1541004287,IL +1541004288,1541004543,RU +1541004544,1541004799,PL +1541004800,1541005055,SI +1541005056,1541005311,NL +1541005312,1541005567,PL +1541005568,1541006079,AT +1541006080,1541006335,RU +1541006336,1541006591,PL +1541006592,1541006847,AT +1541006848,1541007103,DE +1541007104,1541007359,GB +1541007360,1541007615,DE +1541007616,1541007871,RU +1541007872,1541008127,FR +1541008128,1541008383,NL +1541008384,1541008639,UA +1541008640,1541008895,GB +1541008896,1541009151,TR +1541009152,1541009407,RU +1541009408,1541009663,UA +1541009664,1541009919,CH +1541009920,1541010175,PL +1541010176,1541010431,GR +1541010432,1541010687,UA +1541010688,1541010943,GB +1541010944,1541011199,CY +1541011200,1541011455,CH +1541011456,1541011711,FI +1541011712,1541011967,UA +1541011968,1541012223,RU +1541012224,1541012479,DE +1541012480,1541012735,FI +1541012736,1541013247,UA +1541013248,1541013503,SI 1541013504,1541014527,RO 1541014528,1541015551,AM 1541015552,1541016575,RU @@ -43310,6 +44178,18 @@ 1541079040,1541080063,PL 1541080064,1541081087,RU 1541081088,1541082111,DE +1541082112,1541083135,RU +1541083136,1541084159,RO +1541084160,1541086207,RU +1541086208,1541088255,UA +1541088256,1541089279,RU +1541089280,1541090303,GB +1541090304,1541091327,CZ +1541091328,1541092351,RU +1541092352,1541093375,UA +1541093376,1541094399,RU +1541094400,1541095423,UA +1541095424,1541096447,RU 1543503872,1545601023,GB 1545601024,1545863167,SE 1545863168,1545895935,RU @@ -43518,7 +44398,8 @@ 1547564288,1547564311,CH 1547564312,1547564315,BG 1547564316,1547564335,NL -1547564336,1547564415,US +1547564336,1547564351,US +1547564352,1547564415,CY 1547564416,1547564439,NZ 1547564440,1547564543,NL 1547564544,1547564799,US @@ -43777,6 +44658,7 @@ 1566158848,1566162943,RU 1566162944,1566167039,PL 1566167040,1566171135,UA +1566171136,1566175231,TR 1566175232,1566179327,IE 1566179328,1566183423,DK 1566183424,1566187519,ES @@ -43788,7 +44670,9 @@ 1566212096,1566216191,DE 1566216192,1566220287,SE 1566220288,1566224383,CZ -1566224384,1566228479,DE +1566224384,1566226343,DE +1566226344,1566226351,NL +1566226352,1566228479,DE 1566228480,1566232575,GB 1566232576,1566248959,RU 1566248960,1566257151,GB @@ -43916,9 +44800,17 @@ 1566469392,1566469407,HU 1566469408,1566470143,BE 1566470144,1566470320,IE -1566470321,1566470399,GB -1566470400,1566470719,IE -1566470720,1566470911,GB +1566470321,1566470343,GB +1566470344,1566470351,IE +1566470352,1566470367,GB +1566470368,1566470719,IE +1566470720,1566470727,GB +1566470728,1566470739,IE +1566470740,1566470743,GB +1566470744,1566470747,IE +1566470748,1566470767,GB +1566470768,1566470847,IE +1566470848,1566470911,GB 1566470912,1566472191,IE 1566472192,1566474239,GB 1566474240,1566476287,DE @@ -44026,6 +44918,7 @@ 1568505856,1568538623,NL 1568538624,1568555007,IR 1568555008,1568571391,UA +1568571392,1568604159,LB 1568604160,1568636927,UA 1568636928,1568669439,DE 1568669440,1568669695,MD @@ -44331,7 +45224,9 @@ 1572504320,1572504575,DE 1572504576,1572504703,RO 1572504704,1572504831,TR -1572504832,1572507647,IT +1572504832,1572507199,IT +1572507200,1572507207,GB +1572507208,1572507647,IT 1572507648,1572511743,GB 1572511744,1572515839,DE 1572515840,1572517759,NL @@ -44370,8 +45265,8 @@ 1572569088,1572571135,NL 1572571136,1572573183,RO 1572573184,1572574975,GG -1572574976,1572575103,GB -1572575104,1572575231,GG +1572574976,1572575167,GB +1572575168,1572575231,GG 1572575232,1572577279,RU 1572577280,1572579327,AM 1572579328,1572581375,GB @@ -44400,7 +45295,6 @@ 1572620568,1572622335,CH 1572622336,1572624383,RU 1572624384,1572626431,NO -1572626432,1572628479,RU 1572628480,1572630527,DE 1572630528,1572632575,IT 1572632576,1572634623,RU @@ -44492,12 +45386,13 @@ 1572800512,1572804607,RU 1572804608,1572808703,GB 1572808704,1572810751,FR -1572810752,1572812799,DE +1572810752,1572812031,DE +1572812032,1572812543,RO +1572812544,1572812799,DE 1572812800,1572814847,RU 1572814848,1572816895,KW 1572816896,1572818943,RU 1572818944,1572820991,FR -1572820992,1572823039,GB 1572823040,1572825087,BY 1572825088,1572827135,RU 1572827136,1572829183,NO @@ -44505,6 +45400,7 @@ 1572831232,1572833279,BH 1572833280,1572835327,ES 1572835328,1572837375,IE +1572837376,1572839423,DK 1572839424,1572841471,DE 1572841472,1572842239,EU 1572842240,1572842495,LV @@ -44590,8 +45486,7 @@ 1578591024,1578591039,PL 1578591040,1578591055,NL 1578591056,1578591087,FR -1578591088,1578591103,ES -1578591104,1578591119,GB +1578591088,1578591119,GB 1578591120,1578591127,FR 1578591128,1578591135,DE 1578591136,1578591143,FR @@ -44606,7 +45501,7 @@ 1578591292,1578591295,ES 1578591296,1578591327,FR 1578591328,1578591343,PL -1578591344,1578591359,ES +1578591344,1578591359,FR 1578591360,1578591375,PL 1578591376,1578591391,FR 1578591392,1578591407,CH @@ -44622,7 +45517,9 @@ 1578591552,1578591555,BE 1578591556,1578591559,IT 1578591560,1578591563,PL -1578591564,1578591583,FR +1578591564,1578591575,FR +1578591576,1578591579,DE +1578591580,1578591583,ES 1578591584,1578591599,IT 1578591600,1578591663,FR 1578591664,1578591695,PL @@ -44639,8 +45536,7 @@ 1578591892,1578591903,FR 1578591904,1578591919,PL 1578591920,1578591939,ES -1578591940,1578591943,GB -1578591944,1578591951,FR +1578591940,1578591951,FR 1578591952,1578591967,PT 1578591968,1578591983,FR 1578591984,1578592031,PL @@ -44689,13 +45585,16 @@ 1578592720,1578592735,CH 1578592736,1578592751,FR 1578592752,1578592783,DE -1578592784,1578592815,FR +1578592784,1578592799,FR +1578592800,1578592815,GB 1578592816,1578592823,PL 1578592824,1578592827,FR 1578592828,1578592831,IE 1578592832,1578592847,PL -1578592848,1578592863,FR -1578592864,1578592879,PL +1578592848,1578592851,BE +1578592852,1578592855,DE +1578592856,1578592859,FR +1578592860,1578592879,PL 1578592880,1578592883,FR 1578592884,1578592891,GB 1578592892,1578592895,FR @@ -44703,7 +45602,10 @@ 1578592960,1578593007,FR 1578593008,1578593279,DE 1578593280,1578593295,PL -1578593296,1578593327,FR +1578593296,1578593299,ES +1578593300,1578593303,GB +1578593304,1578593307,ES +1578593308,1578593327,FR 1578593328,1578593343,IT 1578593344,1578593359,FR 1578593360,1578593407,GB @@ -44760,7 +45662,10 @@ 1578594240,1578594255,FR 1578594256,1578594271,GB 1578594272,1578594303,PL -1578594304,1578594319,FR +1578594304,1578594307,GB +1578594308,1578594311,FI +1578594312,1578594315,PL +1578594316,1578594319,FR 1578594320,1578594335,PL 1578594336,1578594375,FR 1578594376,1578594383,PT @@ -44774,7 +45679,10 @@ 1578594512,1578594515,DE 1578594516,1578594519,FR 1578594520,1578594523,PL -1578594524,1578594559,FR +1578594524,1578594543,FR +1578594544,1578594551,ES +1578594552,1578594555,PL +1578594556,1578594559,LT 1578594560,1578594575,PL 1578594576,1578594607,ES 1578594608,1578594623,FR @@ -44806,7 +45714,7 @@ 1578595232,1578595263,BE 1578595264,1578595267,ES 1578595268,1578595271,FR -1578595272,1578595275,PL +1578595272,1578595275,DE 1578595276,1578595279,ES 1578595280,1578595287,FR 1578595288,1578595295,PL @@ -44814,7 +45722,9 @@ 1578595328,1578595343,IT 1578595344,1578595363,FR 1578595364,1578595367,DE -1578595368,1578595379,FR +1578595368,1578595371,FR +1578595372,1578595375,BE +1578595376,1578595379,FR 1578595380,1578595383,CH 1578595384,1578595387,ES 1578595388,1578595391,PL @@ -44891,15 +45801,16 @@ 1578611328,1578611343,BE 1578611344,1578611359,FR 1578611360,1578611375,CH -1578611376,1578611391,FR -1578611392,1578611407,DE +1578611376,1578611399,FR +1578611400,1578611403,BE +1578611404,1578611407,ES 1578611408,1578611423,IT 1578611424,1578611439,FR 1578611440,1578611455,IT 1578611456,1578611711,FR 1578611712,1578611775,CH -1578611776,1578611791,ES -1578611792,1578611807,FR +1578611776,1578611783,DE +1578611784,1578611807,FR 1578611808,1578611839,CH 1578611840,1578611919,FR 1578611920,1578611935,BE @@ -45107,13 +46018,17 @@ 1583800320,1583804415,ME 1583804416,1583808511,GB 1583808512,1583812607,MD -1583812608,1583813679,NL +1583812608,1583813663,NL +1583813664,1583813671,US +1583813672,1583813679,NL 1583813680,1583813683,GB 1583813684,1583813711,NL 1583813712,1583813727,US 1583813728,1583813735,NL 1583813736,1583813743,DE -1583813744,1583816703,NL +1583813744,1583813808,NL +1583813809,1583813815,US +1583813816,1583816703,NL 1583816704,1583820799,TR 1583820800,1583824895,LV 1583824896,1583828991,SI @@ -45182,12 +46097,8 @@ 1585265696,1585265727,IM 1585265728,1585265767,FR 1585265768,1585265775,IM -1585265776,1585265943,FR -1585265944,1585265951,IM -1585265952,1585265967,FR -1585265968,1585265983,IM -1585265984,1585266047,FR -1585266048,1585266687,IM +1585265776,1585266111,FR +1585266112,1585266687,IM 1585266688,1585270783,DE 1585270784,1585272831,IT 1585272832,1585274879,RU @@ -45447,7 +46358,8 @@ 1590056960,1590059007,ES 1590059008,1590060223,IT 1590060224,1590060255,CH -1590060256,1590061055,IT +1590060256,1590060799,IT +1590060800,1590061055,US 1590061056,1590063103,RU 1590063104,1590065151,CZ 1590065152,1590067199,IE @@ -45532,9 +46444,12 @@ 1592061952,1592066047,RU 1592066048,1592067583,US 1592067584,1592067711,NO -1592067712,1592069631,CY +1592067712,1592069375,CY +1592069376,1592069407,US +1592069408,1592069631,CY 1592069632,1592069695,NL -1592069696,1592069887,CY +1592069696,1592069855,CY +1592069856,1592069887,NL 1592069888,1592074239,RU 1592074240,1592078335,SK 1592078336,1592082431,NL @@ -45903,7 +46818,11 @@ 1602392064,1602394111,GB 1602394112,1602396159,FR 1602396160,1602398207,DE -1602398208,1602400255,TR +1602398208,1602398400,TR +1602398401,1602398406,US +1602398407,1602399231,TR +1602399232,1602399487,US +1602399488,1602400255,TR 1602400256,1602402303,RU 1602402304,1602404351,LU 1602404352,1602406399,GB @@ -46014,7 +46933,9 @@ 1603167168,1603167231,NL 1603167232,1603167743,BE 1603167744,1603167871,NO -1603167872,1603169919,NL +1603167872,1603169199,NL +1603169200,1603169207,US +1603169208,1603169919,NL 1603169920,1603169983,US 1603169984,1603170047,SE 1603170048,1603170303,NL @@ -46036,14 +46957,16 @@ 1603220504,1603223551,CH 1603223552,1603223615,FR 1603223616,1603223631,GB -1603223632,1603223703,FR -1603223704,1603223711,GB +1603223632,1603223704,FR +1603223705,1603223711,GB 1603223712,1603223936,FR -1603223937,1603223999,GB -1603224000,1603224319,FR -1603224320,1603226623,GB -1603226624,1603226879,FR -1603226880,1603227647,GB +1603223937,1603223951,GB +1603223952,1603224319,FR +1603224320,1603224575,GB +1603224576,1603224735,FR +1603224736,1603226623,GB +1603226624,1603227391,FR +1603227392,1603227647,GB 1603227648,1603231743,AT 1603231744,1603235839,IT 1603235840,1603239935,RU @@ -46131,9 +47054,9 @@ 1604893696,1604893951,DE 1604893952,1604894463,TR 1604894464,1604894719,DE -1604894720,1604899007,CZ -1604899008,1604899039,SK -1604899040,1604902911,CZ +1604894720,1604895487,CZ +1604895488,1604895491,SK +1604895492,1604902911,CZ 1604902912,1604911103,BG 1604911104,1604919295,UA 1604919296,1604927487,NO @@ -46162,16 +47085,16 @@ 1605115904,1605124095,RU 1605124096,1605124351,US 1605124352,1605125263,GB -1605125264,1605125279,US -1605125280,1605125327,GB +1605125264,1605125287,US +1605125288,1605125311,GB +1605125312,1605125319,US +1605125320,1605125327,GB 1605125328,1605125335,US 1605125336,1605125375,GB -1605125376,1605125439,US -1605125440,1605125503,GB -1605125504,1605125631,US +1605125376,1605125631,US 1605125632,1605126143,DE -1605126144,1605127167,US -1605127168,1605132287,GB +1605126144,1605127679,US +1605127680,1605132287,GB 1605132288,1605148671,RU 1605148672,1605156863,PT 1605156864,1605165055,JO @@ -46221,19 +47144,17 @@ 1606156288,1606418431,RU 1606418432,1607467007,SE 1607467008,1607532543,DE -1607532544,1607570431,SE -1607570432,1607571455,DK +1607532544,1607569407,SE +1607569408,1607571455,DK 1607571456,1607585791,SE -1607585792,1607587839,DK -1607587840,1607588863,SE -1607588864,1607598079,DK +1607585792,1607598079,DK 1607598080,1607610367,IT 1607610368,1607612415,IE 1607612416,1607614463,A2 1607614464,1607616511,GR 1607616512,1607630847,A2 -1607630848,1607632895,IE -1607632896,1607663615,A2 +1607630848,1607633919,IE +1607633920,1607663615,A2 1607663616,1607729151,NL 1607729152,1607761919,EG 1607761920,1607766015,SY @@ -47134,7 +48055,12 @@ 1673986048,1674051583,CA 1674051584,1674575871,US 1674575872,1677721599,CA -1795162112,1795686399,US +1694498816,1694499071,AP +1694499072,1694499327,AU +1697775616,1697776639,AP +1700790272,1702887679,AU +1711210496,1711276031,AP +1795162112,1796210687,US 1811939328,1828716543,US 1828716544,1830813695,FR 1830813696,1831337983,NL @@ -47210,9 +48136,11 @@ 1833299968,1833302015,LU 1833302016,1833304063,AT 1833304064,1833308159,NL -1833308160,1833308755,FR -1833308756,1833308759,NL -1833308760,1833310207,FR +1833308160,1833308751,FR +1833308752,1833308759,NL +1833308760,1833308763,FR +1833308764,1833308767,NL +1833308768,1833310207,FR 1833310208,1833312255,RU 1833312256,1833314303,ES 1833314304,1833315903,IM @@ -47493,9 +48421,9 @@ 1836048384,1836056575,RS 1836056576,1836580863,IT 1836580864,1836597247,RU -1836597248,1836597759,LU -1836597760,1836601599,DE -1836601600,1836613631,LU +1836597248,1836598015,LU +1836598016,1836604159,DE +1836604160,1836613631,LU 1836613632,1836630015,RU 1836630016,1836646399,BG 1836646400,1836679167,RS @@ -47570,8 +48498,8 @@ 1839801856,1839802111,GB 1839802112,1839802239,RO 1839802240,1839806463,GB -1839806464,1839808511,US -1839808512,1839816703,GB +1839806464,1839809535,US +1839809536,1839816703,GB 1839816704,1839824895,NO 1839824896,1839890431,RU 1839890432,1839923199,GB @@ -47939,7 +48867,7 @@ 1844318208,1844322303,IT 1844322304,1844326399,CZ 1844326400,1844330495,DK -1844330496,1844338687,GB +1844330496,1844334591,GB 1844338688,1844342783,RU 1844342784,1844346879,IT 1844346880,1844347007,US @@ -48083,7 +49011,7 @@ 1851555840,1851588607,KR 1851588608,1851590655,JP 1851590656,1851591679,AU -1851592704,1851593727,AU +1851592704,1851594751,AU 1851594752,1851596799,KR 1851596800,1851604991,IN 1851604992,1851613183,PH @@ -48587,6 +49515,7 @@ 1921943552,1921945599,IN 1921945600,1921949695,HK 1921949696,1921953791,AU +1921953792,1921957887,JP 1921957888,1921974271,GU 1921974272,1922039807,IN 1922039808,1925447679,JP @@ -48688,7 +49617,7 @@ 1937637376,1937670143,HK 1937670144,1937672191,NZ 1937674240,1937678335,JP -1937678336,1937682431,NC +1937678336,1937686527,NC 1937686528,1937702911,KR 1937702912,1937768447,BD 1937768448,1938030591,AU @@ -49442,7 +50371,7 @@ 2022184960,2022187007,KH 2022187008,2022187071,US 2022187072,2022191103,HK -2022191104,2022193151,NZ +2022191104,2022195199,NZ 2022195200,2022211583,KR 2022211584,2022227967,CN 2022227968,2022244351,JP @@ -49631,6 +50560,8 @@ 2053519360,2053521407,BD 2053521408,2053529599,CN 2053529600,2053533695,AU +2053533696,2053534719,VN +2053535744,2053537791,IN 2053537792,2053636095,JP 2053636096,2054160383,AU 2054160384,2054422527,CN @@ -49875,7 +50806,7 @@ 2072510464,2072514559,HK 2072514560,2072516607,IN 2072516608,2072518655,BD -2072518656,2072522751,AU +2072518656,2072526847,AU 2072526848,2072528895,SG 2072528896,2072530943,PH 2072530944,2072535039,CN @@ -51524,7 +52455,7 @@ 2365390848,2365456383,AU 2365456384,2365521919,US 2365587456,2366308351,DE -2366308352,2366373887,FR +2366308352,2366373887,GB 2366373888,2367487999,DE 2367488000,2367553535,SI 2367553536,2370895871,DE @@ -51626,7 +52557,9 @@ 2386067456,2386083839,US 2386083840,2386624511,CA 2386624512,2386690047,US -2386690048,2386989055,CA +2386690048,2386988287,CA +2386988288,2386988543,CH +2386988544,2386989055,CA 2386989056,2386989311,GB 2386989312,2387410943,CA 2387410944,2387476479,US @@ -53974,7 +54907,9 @@ 2899443712,2899574783,FR 2899574784,2899902463,GB 2902458368,2902462463,A1 -2902462464,2902507519,US +2902462464,2902470936,US +2902470937,2902470938,LK +2902470939,2902507519,US 2902507520,2902515711,CA 2902515712,2904555519,US 2904555520,2904817663,CA @@ -54024,7 +54959,9 @@ 2905473024,2905481215,CA 2905481216,2913992703,US 2913992704,2914516991,CA -2914516992,2915765279,US +2914516992,2915250175,US +2915250176,2915254271,CA +2915254272,2915765279,US 2915765280,2915765287,IN 2915765288,2915765343,US 2915765344,2915765351,NZ @@ -54357,7 +55294,26 @@ 2916450304,2916515839,US 2916548608,2916581375,US 2916581376,2916614143,PR -2916614144,2917195775,US +2916614144,2917167679,US +2917167680,2917167743,BR +2917167744,2917167775,US +2917167776,2917167807,IR +2917167808,2917167967,US +2917167968,2917167999,GB +2917168000,2917168095,US +2917168096,2917168127,NZ +2917168128,2917168223,US +2917168224,2917168255,BR +2917168256,2917168287,US +2917168288,2917168319,TR +2917168320,2917168351,AR +2917168352,2917168383,US +2917168384,2917168415,BR +2917168416,2917168607,US +2917168608,2917168639,BR +2917168640,2917169663,US +2917169664,2917169695,DE +2917169696,2917195775,US 2917195776,2917196031,CA 2917196032,2917199871,A2 2917199872,2917203967,CA @@ -54417,7 +55373,9 @@ 2918055936,2918121471,CA 2918121472,2918154239,US 2918154240,2918170623,CA -2918170624,2918232063,US +2918170624,2918199679,US +2918199680,2918199743,CA +2918199744,2918232063,US 2918232064,2918236159,CA 2918236160,2918260735,US 2918260736,2918264831,CA @@ -54436,19 +55394,27 @@ 2918404096,2918408191,PR 2918408192,2918432767,US 2918432768,2918436863,CA -2918436864,2918580223,US +2918436864,2918533119,US +2918533120,2918533127,CN +2918533128,2918533167,US +2918533168,2918533183,CN +2918533184,2918533247,US +2918533248,2918533375,CA +2918533376,2918534911,US +2918534912,2918534943,KR +2918534944,2918580223,US 2918580224,2918588415,CA 2918588416,2918596607,US 2918596608,2918604799,CA 2918604800,2918608895,US -2918612992,2918653951,US -2918653952,2918662143,CA -2918662144,2918760447,US +2918612992,2918760447,US 2918760448,2918776831,CA -2918776832,2918842367,US -2918842368,2918875135,CA +2918776832,2918813695,US +2918825984,2918838271,US +2918838272,2918875135,CA 2918875136,2918973439,US 2918973440,2918989823,CA +2919006208,2919071743,US 2919170048,2919174143,US 2919174144,2919178239,CA 2919178240,2919186431,US @@ -54782,7 +55748,8 @@ 2928312320,2928316415,CA 2928316416,2928321311,US 2928321312,2928321327,GB -2928321328,2928323135,US +2928321328,2928321343,CN +2928321344,2928323135,US 2928323136,2928323143,RU 2928323144,2928323967,US 2928323968,2928323983,RU @@ -55431,9 +56398,9 @@ 2987425792,2987429887,BG 2987429888,2987433215,RU 2987433216,2987433235,KZ -2987433236,2987433247,RU -2987433248,2987433279,KZ -2987433280,2987433983,RU +2987433236,2987433239,RU +2987433240,2987433287,KZ +2987433288,2987433983,RU 2987433984,2987438079,FR 2987438080,2987442175,FI 2987442176,2987446271,IE @@ -55568,7 +56535,8 @@ 2987784192,2987786239,DK 2987786240,2987788287,FR 2987788288,2987788543,GB -2987788544,2987790335,TR +2987788544,2987788799,DE +2987788800,2987790335,TR 2987790336,2987792383,GB 2987792384,2987794431,CH 2987794432,2987796479,IQ @@ -55662,7 +56630,8 @@ 2988442900,2988442903,FR 2988442904,2988442907,IT 2988442908,2988442911,FR -2988442912,2988442919,NL +2988442912,2988442915,NL +2988442916,2988442919,IT 2988442920,2988442923,LT 2988442924,2988442927,GB 2988442928,2988442975,FR @@ -55720,8 +56689,7 @@ 2988445984,2988446207,DE 2988446208,2988446271,PL 2988446272,2988446275,IT -2988446276,2988446279,GB -2988446280,2988446287,FR +2988446276,2988446287,FR 2988446288,2988446303,GB 2988446304,2988446323,FR 2988446324,2988446327,LT @@ -55849,7 +56817,12 @@ 2988459632,2988459639,FR 2988459640,2988459643,IT 2988459644,2988459647,CH -2988459648,2988459711,FR +2988459648,2988459679,GB +2988459680,2988459683,ES +2988459684,2988459687,DE +2988459688,2988459691,IT +2988459692,2988459695,PL +2988459696,2988459711,FR 2988459712,2988459715,ES 2988459716,2988459723,FR 2988459724,2988459727,DE @@ -55890,7 +56863,7 @@ 2988460352,2988460375,GB 2988460376,2988460543,FR 2988460544,2988460547,GB -2988460548,2988460551,FR +2988460548,2988460551,DE 2988460552,2988460575,PL 2988460576,2988460591,PT 2988460592,2988460607,GB @@ -56000,7 +56973,7 @@ 2988462588,2988462591,DE 2988462592,2988462599,FR 2988462600,2988462603,IT -2988462604,2988462607,ES +2988462604,2988462607,BE 2988462608,2988462735,FR 2988462736,2988462743,IT 2988462744,2988462767,FR @@ -56013,7 +56986,8 @@ 2988462824,2988462847,FR 2988462848,2988463103,BE 2988463104,2988463107,IT -2988463108,2988463119,FR +2988463108,2988463111,FR +2988463112,2988463119,ES 2988463120,2988463127,GB 2988463128,2988463131,FR 2988463132,2988463135,PL @@ -56077,7 +57051,8 @@ 2988464352,2988464355,DE 2988464356,2988464359,FR 2988464360,2988464363,PL -2988464364,2988464511,FR +2988464364,2988464367,GB +2988464368,2988464511,FR 2988464512,2988464519,PT 2988464520,2988464527,FR 2988464528,2988464543,DE @@ -56093,7 +57068,11 @@ 2988464640,2988464783,FR 2988464784,2988464787,IT 2988464788,2988464791,ES -2988464792,2988464831,FR +2988464792,2988464799,FR +2988464800,2988464815,DE +2988464816,2988464819,FR +2988464820,2988464823,NL +2988464824,2988464831,PL 2988464832,2988464895,ES 2988464896,2988464927,NL 2988464928,2988464947,FR @@ -56114,7 +57093,7 @@ 2988465376,2988465391,IT 2988465392,2988465407,FR 2988465408,2988465423,CH -2988465424,2988465439,FR +2988465424,2988465439,PT 2988465440,2988465471,GB 2988465472,2988465503,FR 2988465504,2988465507,DE @@ -56303,7 +57282,8 @@ 2988509364,2988509367,IT 2988509368,2988509371,CH 2988509372,2988509375,PL -2988509376,2988509407,FR +2988509376,2988509403,FR +2988509404,2988509407,GB 2988509408,2988509411,PL 2988509412,2988509415,DE 2988509416,2988509419,ES @@ -56401,13 +57381,12 @@ 2988511088,2988511103,FR 2988511104,2988511167,PL 2988511168,2988511183,FR -2988511184,2988511187,CZ -2988511188,2988511191,GB +2988511184,2988511191,GB 2988511192,2988511487,FR 2988511488,2988511551,PL -2988511552,2988511559,FR -2988511560,2988511567,GB -2988511568,2988511575,FR +2988511552,2988511555,FR +2988511556,2988511559,CZ +2988511560,2988511575,FR 2988511576,2988511583,GB 2988511584,2988511663,FR 2988511664,2988511671,DE @@ -56425,7 +57404,28 @@ 2988511724,2988511727,GB 2988511728,2988511735,FR 2988511736,2988511739,DE -2988511740,2988511999,FR +2988511740,2988511743,FR +2988511744,2988511747,PL +2988511748,2988511751,GB +2988511752,2988511759,CZ +2988511760,2988511775,FR +2988511776,2988511807,GB +2988511808,2988511823,ES +2988511824,2988511831,DE +2988511832,2988511835,ES +2988511836,2988511855,FR +2988511856,2988511871,GB +2988511872,2988511887,PL +2988511888,2988511903,FR +2988511904,2988511911,IT +2988511912,2988511915,FR +2988511916,2988511919,PL +2988511920,2988511923,GB +2988511924,2988511927,ES +2988511928,2988511931,IT +2988511932,2988511935,PL +2988511936,2988511951,PT +2988511952,2988511999,GB 2988512000,2988512031,PL 2988512032,2988512055,FR 2988512056,2988512059,PL @@ -56494,9 +57494,7 @@ 2988512896,2988512899,PL 2988512900,2988512907,GB 2988512908,2988512911,LT -2988512912,2988512919,FR -2988512920,2988512927,CH -2988512928,2988512943,FR +2988512912,2988512943,FR 2988512944,2988512951,GB 2988512952,2988512955,FR 2988512956,2988512959,LT @@ -56515,8 +57513,8 @@ 2988513196,2988513199,ES 2988513200,2988513207,PT 2988513208,2988513219,FR -2988513220,2988513223,DE -2988513224,2988513227,PT +2988513220,2988513223,CZ +2988513224,2988513227,NL 2988513228,2988513271,FR 2988513272,2988513275,DE 2988513276,2988513279,CH @@ -56563,19 +57561,21 @@ 2988513884,2988513895,FR 2988513896,2988513899,IT 2988513900,2988513903,PL -2988513904,2988513951,FR +2988513904,2988513919,IT +2988513920,2988513951,FR 2988513952,2988513983,PT 2988513984,2988514015,GB -2988514016,2988514019,FR +2988514016,2988514019,PT 2988514020,2988514023,NL -2988514024,2988514031,IE -2988514032,2988514111,FR +2988514024,2988514027,PT +2988514028,2988514111,FR 2988514112,2988514115,DE 2988514116,2988514119,FR 2988514120,2988514127,PT 2988514128,2988514131,IE -2988514132,2988514135,IT -2988514136,2988514159,FR +2988514132,2988514139,IT +2988514140,2988514143,PL +2988514144,2988514159,FR 2988514160,2988514163,IT 2988514164,2988514167,DE 2988514168,2988514171,FR @@ -56603,7 +57603,7 @@ 2988514432,2988514447,FR 2988514448,2988514463,ES 2988514464,2988514527,FR -2988514528,2988514559,GB +2988514528,2988514559,DE 2988514560,2988514623,FR 2988514624,2988514655,DE 2988514656,2988514671,FR @@ -56617,7 +57617,9 @@ 2988514744,2988514747,BE 2988514748,2988514751,IT 2988514752,2988514815,FI -2988514816,2988514831,FR +2988514816,2988514823,FR +2988514824,2988514827,PL +2988514828,2988514831,DE 2988514832,2988514839,PL 2988514840,2988514879,ES 2988514880,2988514943,PL @@ -56800,7 +57802,120 @@ 2988542032,2988542055,FR 2988542056,2988542063,BE 2988542064,2988542067,GB -2988542068,2988572671,FR +2988542068,2988542071,ES +2988542072,2988542367,FR +2988542368,2988542399,CZ +2988542400,2988542407,FR +2988542408,2988542415,PL +2988542416,2988542431,FR +2988542432,2988542443,ES +2988542444,2988542447,FR +2988542448,2988542455,PL +2988542456,2988542459,FR +2988542460,2988542463,ES +2988542464,2988542495,NL +2988542496,2988542527,FR +2988542528,2988542535,DE +2988542536,2988542539,NL +2988542540,2988542543,LT +2988542544,2988542551,NL +2988542552,2988542559,ES +2988542560,2988542591,FR +2988542592,2988542595,PT +2988542596,2988542599,FI +2988542600,2988542603,GB +2988542604,2988542615,FR +2988542616,2988542623,DE +2988542624,2988542655,FR +2988542656,2988542719,BE +2988542720,2988542783,CH +2988542784,2988542847,CZ +2988542848,2988542919,DE +2988542920,2988542923,PL +2988542924,2988542943,GB +2988542944,2988542959,DE +2988542960,2988542963,FR +2988542964,2988542967,CH +2988542968,2988542971,NL +2988542972,2988542975,DE +2988542976,2988543039,FR +2988543040,2988543043,CZ +2988543044,2988543047,ES +2988543048,2988543051,IE +2988543052,2988543067,FR +2988543068,2988543071,GB +2988543072,2988543231,FR +2988543232,2988543235,IT +2988543236,2988543243,FR +2988543244,2988543247,IT +2988543248,2988543251,FR +2988543252,2988543255,ES +2988543256,2988543263,PL +2988543264,2988543279,ES +2988543280,2988543295,DE +2988543296,2988543299,ES +2988543300,2988543303,FR +2988543304,2988543307,ES +2988543308,2988543311,PL +2988543312,2988543315,DE +2988543316,2988543319,IE +2988543320,2988543323,FI +2988543324,2988543327,PL +2988543328,2988543383,FR +2988543384,2988543399,DE +2988543400,2988543403,GB +2988543404,2988543407,NL +2988543408,2988543423,GB +2988543424,2988543431,DE +2988543432,2988543439,GB +2988543440,2988543447,FR +2988543448,2988543451,BE +2988543452,2988543455,PL +2988543456,2988543463,FR +2988543464,2988543471,GB +2988543472,2988543487,FR +2988543488,2988543503,BE +2988543504,2988543527,FR +2988543528,2988543535,GB +2988543536,2988543551,PL +2988543552,2988543555,GB +2988543556,2988543559,NL +2988543560,2988543563,PT +2988543564,2988543567,FR +2988543568,2988543579,PL +2988543580,2988543583,FR +2988543584,2988543615,DE +2988543616,2988543743,ES +2988543744,2988543935,FR +2988543936,2988543939,FI +2988543940,2988543947,IT +2988543948,2988543959,BE +2988543960,2988543967,PL +2988543968,2988543999,FR +2988544000,2988544127,CZ +2988544128,2988544159,GB +2988544160,2988544163,FR +2988544164,2988544167,PL +2988544168,2988544175,GB +2988544176,2988544179,CH +2988544180,2988544183,IT +2988544184,2988544191,DE +2988544192,2988544227,ES +2988544228,2988544255,FR +2988544256,2988544383,LT +2988544384,2988544511,NL +2988544512,2988544527,FR +2988544528,2988544535,ES +2988544536,2988544539,PL +2988544540,2988544543,LT +2988544544,2988544639,ES +2988544640,2988544735,DE +2988544736,2988544751,PL +2988544752,2988544799,FR +2988544800,2988544831,FI +2988544832,2988544863,FR +2988544864,2988544895,PL +2988544896,2988572671,FR 2988572672,2988703743,RU 2988703744,2988834815,PL 2988834816,2988965887,CH @@ -56843,51 +57958,143 @@ 2991182336,2991182591,GB 2991182592,2991185919,SE 2991185920,2991185951,GB -2991185952,2991186175,SE +2991185952,2991185967,NL +2991185968,2991185983,DE +2991185984,2991185999,DK +2991186000,2991186015,FI +2991186016,2991186175,SE 2991186176,2991186207,GB -2991186208,2991186431,SE +2991186208,2991186223,NL +2991186224,2991186239,DE +2991186240,2991186255,DK +2991186256,2991186271,FI +2991186272,2991186431,SE 2991186432,2991186463,GB -2991186464,2991186687,SE +2991186464,2991186479,NL +2991186480,2991186495,DE +2991186496,2991186511,DK +2991186512,2991186527,FI +2991186528,2991186687,SE 2991186688,2991186719,GB -2991186720,2991186943,SE +2991186720,2991186735,NL +2991186736,2991186751,DE +2991186752,2991186767,DK +2991186768,2991186783,FI +2991186784,2991186943,SE 2991186944,2991186975,GB -2991186976,2991187199,SE +2991186976,2991186991,NL +2991186992,2991187007,DE +2991187008,2991187023,DK +2991187024,2991187039,FI +2991187040,2991187199,SE 2991187200,2991187231,GB -2991187232,2991187455,SE +2991187232,2991187247,NL +2991187248,2991187263,DE +2991187264,2991187279,DK +2991187280,2991187295,FI +2991187296,2991187455,SE 2991187456,2991187487,GB -2991187488,2991187711,SE +2991187488,2991187503,NL +2991187504,2991187519,DE +2991187520,2991187535,DK +2991187536,2991187551,FI +2991187552,2991187711,SE 2991187712,2991187743,GB -2991187744,2991187967,SE +2991187744,2991187759,NL +2991187760,2991187775,DE +2991187776,2991187791,DK +2991187792,2991187807,FI +2991187808,2991187967,SE 2991187968,2991187999,GB -2991188000,2991188223,SE +2991188000,2991188015,NL +2991188016,2991188031,DE +2991188032,2991188047,DK +2991188048,2991188063,FI +2991188064,2991188223,SE 2991188224,2991188255,GB -2991188256,2991188479,SE +2991188256,2991188271,NL +2991188272,2991188287,DE +2991188288,2991188303,DK +2991188304,2991188319,FI +2991188320,2991188479,SE 2991188480,2991188511,GB -2991188512,2991188735,SE +2991188512,2991188527,NL +2991188528,2991188543,DE +2991188544,2991188559,DK +2991188560,2991188575,FI +2991188576,2991188735,SE 2991188736,2991188767,GB -2991188768,2991188991,SE +2991188768,2991188783,NL +2991188784,2991188799,DE +2991188800,2991188815,DK +2991188816,2991188831,FI +2991188832,2991188991,SE 2991188992,2991189023,GB -2991189024,2991189247,SE +2991189024,2991189039,NL +2991189040,2991189055,DE +2991189056,2991189071,DK +2991189072,2991189087,FI +2991189088,2991189247,SE 2991189248,2991189279,GB -2991189280,2991189503,SE +2991189280,2991189295,NL +2991189296,2991189311,DE +2991189312,2991189327,DK +2991189328,2991189343,FI +2991189344,2991189503,SE 2991189504,2991189535,GB -2991189536,2991189759,SE +2991189536,2991189551,NL +2991189552,2991189567,DE +2991189568,2991189583,DK +2991189584,2991189599,FI +2991189600,2991189759,SE 2991189760,2991189791,GB -2991189792,2991190015,SE +2991189792,2991189807,NL +2991189808,2991189823,DE +2991189824,2991189839,DK +2991189840,2991189855,FI +2991189856,2991190015,SE 2991190016,2991190047,GB -2991190048,2991190271,SE +2991190048,2991190063,NL +2991190064,2991190079,DE +2991190080,2991190095,DK +2991190096,2991190111,FI +2991190112,2991190271,SE 2991190272,2991190303,GB -2991190304,2991190527,SE +2991190304,2991190319,NL +2991190320,2991190335,DE +2991190336,2991190351,DK +2991190352,2991190367,FI +2991190368,2991190527,SE 2991190528,2991190559,GB -2991190560,2991190783,SE +2991190560,2991190575,NL +2991190576,2991190591,DE +2991190592,2991190607,DK +2991190608,2991190623,FI +2991190624,2991190783,SE 2991190784,2991190815,GB -2991190816,2991191039,SE +2991190816,2991190831,NL +2991190832,2991190847,DE +2991190848,2991190863,DK +2991190864,2991190879,FI +2991190880,2991191039,SE 2991191040,2991191071,GB -2991191072,2991191295,SE +2991191072,2991191087,NL +2991191088,2991191103,DE +2991191104,2991191119,DK +2991191120,2991191135,FI +2991191136,2991191295,SE 2991191296,2991191327,GB -2991191328,2991191551,SE +2991191328,2991191343,NL +2991191344,2991191359,DE +2991191360,2991191375,DK +2991191376,2991191391,FI +2991191392,2991191551,SE 2991191552,2991191583,GB -2991191584,2991191807,SE +2991191584,2991191599,NL +2991191600,2991191615,DE +2991191616,2991191631,DK +2991191632,2991191647,FI +2991191648,2991191807,SE 2991191808,2991192063,FI 2991192064,2991192319,DK 2991192320,2991194111,SE @@ -56932,11 +58139,7 @@ 2991981464,2991981471,NA 2991981472,2991981495,UA 2991981496,2991981503,NA -2991981504,2991981583,UA -2991981584,2991981591,NA -2991981592,2991981631,UA -2991981632,2991981639,NA -2991981640,2991981647,UA +2991981504,2991981647,UA 2991981648,2991981655,NA 2991981656,2991981687,UA 2991981688,2991981695,NA @@ -56946,8 +58149,7 @@ 2991981912,2991981919,RU 2991981920,2991981935,UA 2991981936,2991981943,RU -2991981944,2991981951,US -2991981952,2991982535,UA +2991981944,2991982535,UA 2991982536,2991982543,GL 2991982544,2991982592,UA 2991982593,2991982846,JP @@ -56978,8 +58180,8 @@ 2996305920,2996436991,QA 2996436992,2996469759,BY 2996469760,2996479487,RU -2996479488,2996479491,US -2996479492,2996535295,RU +2996479488,2996479495,US +2996479496,2996535295,RU 2996535296,2996568063,DK 2996568064,2996600831,ES 2996600832,2996633599,RO @@ -56990,6 +58192,13 @@ 2996764672,2996768767,NL 2996768768,2996772863,RU 2996772864,2996776959,UA +2996776960,2996781055,RU +2996781056,2996785151,RO +2996785152,2996789247,RU +2996789248,2996797439,UA +2996797440,2996801535,PL +2996801536,2996805631,RO +2996805632,2996809727,PL 2996830208,2996862975,HR 2996862976,2996895743,AM 2996895744,2996928511,KW @@ -57018,30 +58227,38 @@ 2996996768,2996996831,RU 2996996832,2996996863,DE 2996996864,2996997119,CN -2996997120,2996997375,MK -2996997376,2996997631,DE +2996997120,2996997631,DE 2996997632,2996998143,BY 2996998144,2996998271,UA -2996998272,2996998527,DE +2996998272,2996998463,DE +2996998464,2996998527,CA 2996998528,2996998655,UA 2996998656,2996998719,DE 2996998720,2996998911,RU -2996998912,2996999231,DE +2996998912,2996999199,DE +2996999200,2996999231,AU 2996999232,2996999359,IN -2996999360,2996999679,DE +2996999360,2996999423,IL +2996999424,2996999551,IN +2996999552,2996999679,DE 2996999680,2996999935,GB 2996999936,2997000063,DE 2997000064,2997000447,CN 2997000448,2997000703,RU -2997000704,2997000831,DE +2997000704,2997000767,DE +2997000768,2997000831,SC 2997000832,2997000959,CA -2997000960,2997001727,DE +2997000960,2997000991,DE +2997000992,2997001119,RO +2997001120,2997001471,DE +2997001472,2997001727,BZ 2997001728,2997001983,UA 2997001984,2997003071,DE 2997003072,2997003135,RU -2997003136,2997003199,US +2997003136,2997003199,DE 2997003200,2997003263,RU -2997003264,2997003295,DE +2997003264,2997003287,DE +2997003288,2997003295,NL 2997003296,2997003327,CA 2997003328,2997003391,RU 2997003392,2997003583,DE @@ -57050,7 +58267,8 @@ 2997004032,2997004287,BZ 2997004288,2997004543,US 2997004544,2997004607,DE -2997004608,2997004799,RU +2997004608,2997004671,RU +2997004672,2997004799,DE 2997004800,2997005055,BZ 2997005056,2997005183,GB 2997005184,2997005375,DE @@ -57060,21 +58278,36 @@ 2997005824,2997006079,DE 2997006080,2997006335,GB 2997006336,2997006591,TR -2997006592,2997006719,DE +2997006592,2997006655,DE +2997006656,2997006719,TR 2997006720,2997006847,RU -2997006848,2997008191,DE -2997008192,2997008255,GR +2997006848,2997008255,DE 2997008256,2997008383,LT 2997008384,2997008447,DE 2997008448,2997008511,RU 2997008512,2997008639,LT -2997008640,2997008895,TR -2997008896,2997008959,DE +2997008640,2997008959,DE 2997008960,2997009023,RU 2997009024,2997010431,DE 2997010432,2997018623,US 2997018624,2997019135,GB -2997019136,2997026815,DE +2997019136,2997019391,TR +2997019392,2997019647,GB +2997019648,2997019679,DE +2997019680,2997019711,AU +2997019712,2997019903,US +2997019904,2997020159,IN +2997020160,2997020415,DE +2997020416,2997020671,CA +2997020672,2997020927,IR +2997020928,2997021183,CN +2997021184,2997021695,GB +2997021696,2997021951,NL +2997021952,2997022015,DE +2997022016,2997022143,GB +2997022144,2997022239,DE +2997022240,2997022303,NL +2997022304,2997026815,DE 2997026816,2997059583,RU 2997059584,2997092351,BY 2997092352,2997125119,NO @@ -57109,8 +58342,13 @@ 2999451648,2999713791,DE 2999713792,2999975935,RU 2999975936,2999984127,FR -2999984128,2999985663,BE -2999985664,2999992319,NL +2999984128,2999985695,BE +2999985696,2999985711,GB +2999985712,2999985727,BE +2999985728,2999985743,CZ +2999985744,2999985759,NL +2999985760,2999985919,BE +2999985920,2999992319,NL 2999992320,3000000511,RU 3000000512,3000008703,DE 3000008704,3000016895,RU @@ -57156,6 +58394,19 @@ 3000285184,3000287231,RO 3000287232,3000289279,UA 3000289280,3000291327,RO +3000291328,3000293375,RU +3000293376,3000295423,PL +3000295424,3000297471,RU +3000297472,3000301567,UA +3000301568,3000303615,RO +3000303616,3000305663,UA +3000305664,3000313855,RU +3000313856,3000315903,CZ +3000315904,3000317951,LV +3000317952,3000319999,PL +3000320000,3000322047,FR +3000322048,3000326143,RU +3000326144,3000328191,PL 3000369152,3000377343,PL 3000377344,3000385535,RU 3000385536,3000393727,PS @@ -57262,8 +58513,7 @@ 3001851904,3001855999,IT 3001856000,3001858559,NL 3001858560,3001859071,RO -3001859072,3001859327,MD -3001859328,3001860095,NL +3001859072,3001860095,MD 3001860096,3001864191,EE 3001864192,3001868287,RU 3001868288,3001872383,FR @@ -57273,7 +58523,9 @@ 3001884672,3001884927,SE 3001884928,3001885055,NL 3001885056,3001885087,US -3001885088,3001888767,NL +3001885088,3001885439,NL +3001885440,3001886463,BE +3001886464,3001888767,NL 3001888768,3001892863,BH 3001892864,3001896959,AZ 3001896960,3001901055,CH @@ -57293,7 +58545,29 @@ 3001962496,3001966591,GB 3001966592,3001970687,NL 3001970688,3001974783,RU -3001974784,3001982975,GB +3001974784,3001975567,GB +3001975568,3001975591,US +3001975592,3001975599,TW +3001975600,3001975607,CN +3001975608,3001975615,RU +3001975616,3001975623,US +3001975624,3001975631,RU +3001975632,3001976575,GB +3001976576,3001976607,TW +3001976608,3001976623,GB +3001976624,3001976639,CN +3001976640,3001976655,RU +3001976656,3001976679,GB +3001976680,3001976687,US +3001976688,3001976927,GB +3001976928,3001976959,RU +3001976960,3001977215,GB +3001977216,3001977247,RU +3001977248,3001977311,GB +3001977312,3001977343,CN +3001977344,3001977455,GB +3001977456,3001977463,US +3001977464,3001982975,GB 3001982976,3001987071,CH 3001987072,3001991167,JO 3001991168,3001995263,IR @@ -57309,6 +58583,13 @@ 3002028032,3002036223,GB 3002036224,3002040319,BG 3002040320,3002044415,PL +3002044416,3002048511,IR +3002048512,3002052607,GB +3002052608,3002056703,IT +3002056704,3002060799,FI +3002060800,3002064895,ES +3002064896,3002068991,BG +3002068992,3002073087,ES 3002073088,3002597375,TR 3002597376,3002599423,RU 3002599424,3002601471,CZ @@ -57326,9 +58607,12 @@ 3002619952,3002619967,GB 3002619968,3002619983,IT 3002619984,3002619991,GB -3002619992,3002620031,IT +3002619992,3002620023,IT +3002620024,3002620031,GB 3002620032,3002620039,DE -3002620040,3002621951,IT +3002620040,3002620047,IT +3002620048,3002620071,GB +3002620072,3002621951,IT 3002621952,3002623999,NO 3002624000,3002628095,GB 3002628096,3002630143,NO @@ -57682,7 +58966,6 @@ 3035326464,3035327487,AU 3035328512,3035332607,BD 3035332608,3035333631,AU -3035334656,3035335679,AU 3035335680,3035337727,JP 3035337728,3035338751,ID 3035338752,3035339007,SG @@ -57934,7 +59217,9 @@ 3093955576,3093955647,US 3093955648,3093955663,GB 3093955664,3093955679,CA -3093955680,3093956895,US +3093955680,3093956479,US +3093956480,3093956495,IE +3093956496,3093956895,US 3093956896,3093956943,CA 3093956944,3093957103,US 3093957104,3093957119,CA @@ -57950,13 +59235,27 @@ 3093958112,3093958119,CA 3093958120,3093958175,US 3093958176,3093958183,GB -3093958184,3093958663,US +3093958184,3093958231,US +3093958232,3093958239,AU +3093958240,3093958503,US +3093958504,3093958511,CA +3093958512,3093958623,US +3093958624,3093958631,MX +3093958632,3093958663,US 3093958664,3093958667,MX 3093958668,3093958721,US 3093958722,3093958723,IL -3093958724,3093960191,US +3093958724,3093958745,US +3093958746,3093958747,FR +3093958748,3093959559,US +3093959560,3093959567,CA +3093959568,3093960191,US 3093960192,3093960207,CA -3093960208,3093986367,US +3093960208,3093960351,US +3093960352,3093960383,CA +3093960384,3093962259,US +3093962260,3093962263,CA +3093962264,3093986367,US 3093986368,3093986431,DE 3093986432,3093986463,US 3093986464,3093986495,GB @@ -57966,8 +59265,8 @@ 3096444928,3096969215,CA 3096969216,3097493503,US 3097493504,3097755647,CA -3097755648,3098017791,US -3098083328,3098087423,US +3097755648,3098148863,US +3098148864,3098165247,JM 3098542080,3103784959,US 3120562176,3120594943,CO 3120594944,3120599039,AR @@ -57988,7 +59287,7 @@ 3120758784,3120824319,EC 3120824320,3120840703,CR 3120840704,3120857087,AR -3120857088,3120889855,EC +3120857088,3120922623,EC 3120955392,3121020927,DO 3121086464,3121151999,UY 3121152000,3121348607,CL @@ -58034,6 +59333,9 @@ 3131047936,3131310079,PE 3132096512,3132129279,CR 3132227584,3132293119,EC +3132358656,3132424191,CO +3132489728,3132555263,AR +3132620800,3132751871,VE 3133145088,3145727999,BR 3145728000,3154116607,MX 3154116608,3154182143,EU @@ -58176,12 +59478,15 @@ 3158889984,3158890239,HK 3158890240,3158891263,DE 3158891264,3158891519,CA -3158891520,3158891583,DE +3158891520,3158891551,DE +3158891552,3158891583,GB 3158891584,3158891647,RU 3158891648,3158891711,DE 3158891712,3158891775,RU 3158891776,3158892031,PL -3158892032,3158892671,DE +3158892032,3158892415,DE +3158892416,3158892543,GB +3158892544,3158892671,DE 3158892672,3158892799,RU 3158892800,3158893567,DE 3158893568,3158893823,GB @@ -58234,7 +59539,6 @@ 3160150016,3160152063,LV 3160152064,3160154111,IT 3160154112,3160156159,DE -3160156160,3160158207,AM 3160160256,3160162303,NL 3160162304,3160164351,FR 3160164352,3160166399,LV @@ -58441,7 +59745,9 @@ 3162316800,3162324991,PL 3162324992,3162327039,GB 3162327040,3162327296,CH -3162327297,3162333183,GB +3162327297,3162332671,GB +3162332672,3162332927,NL +3162332928,3162333183,DE 3162333184,3162341375,IT 3162341376,3162349567,PL 3162349568,3162357759,TR @@ -58496,16 +59802,12 @@ 3163162112,3163162143,TR 3163162144,3163162175,DE 3163162176,3163162207,US -3163162208,3163162239,IT +3163162208,3163162239,TR 3163162240,3163162271,CH 3163162272,3163162303,NL -3163162304,3163162335,DE -3163162336,3163162367,TR -3163162368,3163162495,DE -3163162496,3163162527,RU -3163162528,3163163743,DE -3163163744,3163163775,GB -3163163776,3163163871,DE +3163162304,3163162431,DE +3163162432,3163162463,CY +3163162464,3163163871,DE 3163163872,3163163903,RU 3163163904,3163163935,DE 3163163936,3163163967,VG @@ -58517,13 +59819,17 @@ 3163165760,3163165791,PL 3163165792,3163166175,DE 3163166176,3163166207,US -3163166208,3163166495,DE +3163166208,3163166335,DE +3163166336,3163166399,NL +3163166400,3163166431,DE +3163166432,3163166463,NL +3163166464,3163166495,DE 3163166496,3163166527,RO 3163166528,3163166559,DE 3163166560,3163166591,HU 3163166592,3163167775,DE 3163167776,3163167807,GR -3163167808,3163167839,TR +3163167808,3163167839,NL 3163167840,3163167967,DE 3163167968,3163167999,TR 3163168000,3163168031,DE @@ -58536,7 +59842,7 @@ 3163168352,3163168415,DE 3163168416,3163168447,CA 3163168448,3163168575,DE -3163168576,3163168607,TR +3163168576,3163168607,NL 3163168608,3163168671,DE 3163168672,3163168703,US 3163168704,3163169823,DE @@ -58553,21 +59859,17 @@ 3163170304,3163170335,IT 3163170336,3163170367,DE 3163170368,3163170399,IR -3163170400,3163170431,CY -3163170432,3163170495,DE +3163170400,3163170495,DE 3163170496,3163170527,BR 3163170528,3163170591,DE 3163170592,3163170623,BR -3163170624,3163172031,DE -3163172032,3163172063,PL -3163172064,3163172127,DE -3163172128,3163172159,TR +3163170624,3163172127,DE +3163172128,3163172159,NL 3163172160,3163172191,RU 3163172192,3163172223,DE -3163172224,3163172255,TR +3163172224,3163172255,NL 3163172256,3163172287,PL -3163172288,3163172319,TR -3163172320,3163172351,NL +3163172288,3163172351,NL 3163172352,3163172383,GB 3163172384,3163172607,DE 3163172608,3163172639,DK @@ -58575,11 +59877,10 @@ 3163172736,3163172767,GR 3163172768,3163174047,DE 3163174048,3163174079,DK -3163174080,3163174335,DE +3163174080,3163174303,DE +3163174304,3163174335,IL 3163174336,3163174367,RU -3163174368,3163174399,DE -3163174400,3163174431,DK -3163174432,3163174591,DE +3163174368,3163174591,DE 3163174592,3163174623,SE 3163174624,3163174655,GB 3163174656,3163174687,DE @@ -58587,16 +59888,14 @@ 3163174720,3163174751,NL 3163174752,3163174783,US 3163174784,3163176127,DE -3163176128,3163176159,TR +3163176128,3163176159,NL 3163176160,3163176255,DE 3163176256,3163176287,UG 3163176288,3163176479,DE 3163176480,3163176543,GB 3163176544,3163176575,DE 3163176576,3163176607,GR -3163176608,3163176671,DE -3163176672,3163176703,PL -3163176704,3163176767,DE +3163176608,3163176767,DE 3163176768,3163176799,PL 3163176800,3163176895,DE 3163176896,3163176927,SE @@ -58646,10 +59945,9 @@ 3164947044,3164947047,GB 3164947048,3164947063,FR 3164947064,3164947067,NL -3164947068,3164947199,DE -3164947200,3164947455,FR -3164947456,3164947711,DE -3164947712,3164947743,FR +3164947068,3164947071,PL +3164947072,3164947199,DE +3164947200,3164947743,FR 3164947744,3164947747,ES 3164947748,3164947751,BE 3164947752,3164947839,FR @@ -58667,11 +59965,18 @@ 3164949160,3164949163,PL 3164949164,3164949183,FR 3164949184,3164949215,DE -3164949216,3164949231,NL +3164949216,3164949219,PL +3164949220,3164949223,FR +3164949224,3164949227,PL +3164949228,3164949231,GB 3164949232,3164949247,BE 3164949248,3164949279,FR 3164949280,3164949295,ES -3164949296,3164949359,FR +3164949296,3164949327,FR +3164949328,3164949331,PL +3164949332,3164949335,ES +3164949336,3164949343,IE +3164949344,3164949359,FR 3164949360,3164949363,BE 3164949364,3164949391,FR 3164949392,3164949395,ES @@ -58680,7 +59985,7 @@ 3164949472,3164949503,FR 3164949504,3164950015,BE 3164950016,3164950271,GB -3164950272,3164950399,FR +3164950272,3164950399,DE 3164950400,3164950407,ES 3164950408,3164950411,FR 3164950412,3164950415,CZ @@ -58727,7 +60032,7 @@ 3164951572,3164951575,CZ 3164951576,3164951583,NL 3164951584,3164951591,GB -3164951592,3164951595,IE +3164951592,3164951595,DE 3164951596,3164951615,FR 3164951616,3164951663,GB 3164951664,3164951671,PL @@ -58820,7 +60125,8 @@ 3164954512,3164954515,PL 3164954516,3164954519,IT 3164954520,3164954543,GB -3164954544,3164954591,FR +3164954544,3164954559,LT +3164954560,3164954591,FR 3164954592,3164954623,PL 3164954624,3164956479,FR 3164956480,3164956543,GB @@ -58834,7 +60140,7 @@ 3164959040,3164959135,DE 3164959136,3164959231,ES 3164959232,3164959247,FR -3164959248,3164959255,BE +3164959248,3164959255,ES 3164959256,3164959263,PL 3164959264,3164959295,GB 3164959296,3164959303,IT @@ -58913,7 +60219,8 @@ 3164962280,3164962283,DE 3164962284,3164962295,ES 3164962296,3164962303,PL -3164962304,3164962335,NL +3164962304,3164962319,NL +3164962320,3164962335,FR 3164962336,3164962367,DE 3164962368,3164962431,PL 3164962432,3164962439,GB @@ -58930,7 +60237,12 @@ 3164962628,3164962631,CH 3164962632,3164962655,FR 3164962656,3164962687,ES -3164962688,3164962751,GB +3164962688,3164962703,GB +3164962704,3164962715,FR +3164962716,3164962719,NL +3164962720,3164962723,IT +3164962724,3164962727,ES +3164962728,3164962751,FR 3164962752,3164964863,ES 3164964864,3164966911,FI 3164966912,3164967039,FR @@ -58979,7 +60291,8 @@ 3164969144,3164969147,PT 3164969148,3164969183,GB 3164969184,3164969199,DE -3164969200,3164969207,GB +3164969200,3164969203,LT +3164969204,3164969207,ES 3164969208,3164969211,IT 3164969212,3164969471,FR 3164969472,3164969727,PL @@ -59094,8 +60407,24 @@ 3164973936,3164973939,IT 3164973940,3164973943,FR 3164973944,3164973951,PL -3164973952,3164974591,FR -3164974592,3164975103,GB +3164973952,3164974623,FR +3164974624,3164974639,DE +3164974640,3164974651,FR +3164974652,3164974655,DE +3164974656,3164974663,FR +3164974664,3164974667,GB +3164974668,3164974671,DE +3164974672,3164974675,FR +3164974676,3164974679,PT +3164974680,3164974719,PL +3164974720,3164974727,FR +3164974728,3164974731,PL +3164974732,3164974735,IT +3164974736,3164974751,PL +3164974752,3164974783,FR +3164974784,3164974815,GB +3164974816,3164974847,FR +3164974848,3164975103,GB 3164975104,3164975167,CH 3164975168,3164975231,GB 3164975232,3164975299,IT @@ -59209,18 +60538,18 @@ 3168116736,3168120831,RO 3168120832,3168124927,GB 3168124928,3168129023,RO -3168129024,3168141311,GB -3168141312,3168157695,RO +3168129024,3168137215,GB +3168137216,3168157695,RO 3168157696,3168178175,GB 3168178176,3168182271,RO 3168182272,3168194559,GB -3168194560,3168198655,RO -3168198656,3168202751,GB -3168202752,3168207103,RO +3168194560,3168207103,RO 3168207104,3168207359,CY 3168207360,3168214527,RO 3168214528,3168214783,CY -3168214784,3168272383,RO +3168214784,3168223743,RO +3168223744,3168224255,MD +3168224256,3168272383,RO 3168272384,3168534527,IT 3168534528,3168796671,GB 3168796672,3168829439,FR @@ -59499,6 +60828,7 @@ 3194601472,3194602495,AN 3194602496,3194605567,AR 3194609664,3194613759,AR +3194613760,3194617855,PE 3194617856,3194626047,NI 3194634240,3194638335,CR 3194642432,3194646527,AR @@ -59539,17 +60869,17 @@ 3194974208,3194976255,AR 3194978304,3194994687,PA 3194994688,3195002879,AR -3195011072,3195021311,AR +3195011072,3195023359,AR 3195023360,3195024383,CL 3195024384,3195025407,UY 3195025408,3195035647,AR -3195043840,3195052031,CO +3195043840,3195060223,CO 3195060224,3195064319,UY 3195068416,3195072511,AN 3195076608,3195084799,CL 3195092992,3195097087,AR 3195101184,3195105279,CR -3195109376,3195117567,AR +3195109376,3195125759,AR 3195125760,3195133951,PE 3195142144,3195150335,VE 3195158528,3195183103,AR @@ -59565,6 +60895,7 @@ 3195551744,3195555839,EC 3195559936,3195564031,AR 3195568128,3195572223,CO +3195572224,3195576319,AR 3195576320,3195580415,CL 3195584512,3195592703,HT 3195592704,3195596799,PA @@ -59650,6 +60981,8 @@ 3201302528,3201433599,CL 3201433600,3201499135,AR 3201499136,3201515519,CL +3201531904,3201533951,AR +3201540096,3201544191,CL 3201564672,3201630207,NI 3201630208,3201695743,TT 3201695744,3201761279,EC @@ -61177,7 +62510,7 @@ 3228106752,3228109311,US 3228109312,3228109567,NZ 3228109568,3228125951,US -3228125952,3228126207,DE +3228125952,3228126207,RU 3228126208,3228133375,US 3228133376,3228134655,CA 3228134656,3228150271,US @@ -61390,9 +62723,9 @@ 3229120768,3229151487,US 3229151488,3229151743,SE 3229151744,3229155327,US -3229155328,3229177407,SE -3229177408,3229177423,JP -3229177424,3229219583,SE +3229155328,3229171455,SE +3229171456,3229171711,MT +3229171712,3229219583,SE 3229219584,3229219839,EE 3229219840,3229220863,SE 3229220864,3229245439,GB @@ -63572,6 +64905,7 @@ 3239446016,3239446271,RU 3239446272,3239446527,FR 3239446528,3239451647,DE +3239451648,3239451903,PL 3239451904,3239452159,DE 3239452160,3239452415,CY 3239452416,3239452671,HR @@ -63822,7 +65156,6 @@ 3239761920,3239762175,BG 3239762432,3239762687,DK 3239762688,3239762943,RO -3239762944,3239763199,PL 3239763200,3239763455,SE 3239763456,3239763967,GB 3239763968,3239772159,DE @@ -63849,7 +65182,7 @@ 3239788544,3239789055,EU 3239789056,3239789567,RU 3239789568,3239790079,FR -3239790080,3239791103,RO +3239790080,3239790591,RO 3239791104,3239792127,CH 3239792128,3239792639,FR 3239792640,3239793151,UA @@ -65810,7 +67143,6 @@ 3245207552,3245208063,UA 3245208064,3245208575,DE 3245208576,3245209087,PL -3245209088,3245209599,RU 3245209600,3245210111,UA 3245210112,3245210623,FR 3245210624,3245211135,HU @@ -67260,7 +68592,6 @@ 3251122176,3251122687,CH 3251122688,3251123199,PL 3251123200,3251123711,FR -3251123712,3251124223,RO 3251124224,3251124735,NL 3251124736,3251125247,FR 3251125248,3251125759,BE @@ -67804,9 +69135,8 @@ 3252407584,3252407599,NG 3252407600,3252407615,BJ 3252407616,3252407711,NO -3252407712,3252407743,NG -3252407744,3252407751,NO -3252407752,3252407759,AO +3252407712,3252407727,NG +3252407728,3252407759,NO 3252407760,3252407767,NE 3252407768,3252407775,CD 3252407776,3252407791,GH @@ -67815,7 +69145,7 @@ 3252408000,3252408159,NO 3252408160,3252408191,GQ 3252408192,3252408319,NO -3252408320,3252408335,TR +3252408320,3252408335,LT 3252408336,3252408343,GN 3252408344,3252408351,LT 3252408352,3252408367,GN @@ -67824,12 +69154,9 @@ 3252408384,3252408391,BI 3252408392,3252408415,LT 3252408416,3252408479,NO -3252408480,3252408495,FI -3252408496,3252408511,LT +3252408480,3252408511,LT 3252408512,3252408519,AF -3252408520,3252408543,LT -3252408544,3252408551,AF -3252408552,3252408639,LT +3252408520,3252408639,LT 3252408640,3252408671,CF 3252408672,3252408703,SO 3252408704,3252408735,NG @@ -67853,7 +69180,9 @@ 3252409184,3252409191,UG 3252409192,3252409199,ZW 3252409200,3252409207,TZ -3252409208,3252409263,LT +3252409208,3252409215,LT +3252409216,3252409223,BW +3252409224,3252409263,LT 3252409264,3252409343,SO 3252409344,3252409375,TD 3252409376,3252409407,LT @@ -67866,10 +69195,8 @@ 3252409600,3252409615,MA 3252409616,3252409631,LT 3252409632,3252409647,AO -3252409648,3252409855,LT -3252409856,3252410111,BW -3252410112,3252410367,LT -3252410368,3252410391,BW +3252409648,3252410375,LT +3252410376,3252410391,BW 3252410392,3252410431,LT 3252410432,3252410463,BI 3252410464,3252410623,LT @@ -67903,11 +69230,11 @@ 3252414640,3252414647,GH 3252414648,3252414655,NE 3252414656,3252414719,ER -3252414720,3252414975,LT -3252414976,3252415007,IQ +3252414720,3252414983,LT +3252414984,3252415007,IQ 3252415008,3252415015,LT -3252415016,3252415119,IQ -3252415120,3252415551,LT +3252415016,3252415127,IQ +3252415128,3252415551,LT 3252415552,3252415567,NG 3252415568,3252415743,LT 3252415744,3252415775,GB @@ -67920,8 +69247,8 @@ 3252417024,3252417279,LT 3252417280,3252417287,IQ 3252417288,3252417359,AF -3252417360,3252417535,LT -3252417536,3252417855,NG +3252417360,3252417791,LT +3252417792,3252417855,NG 3252417856,3252417919,LT 3252417920,3252417935,MW 3252417936,3252417951,ZM @@ -67942,10 +69269,9 @@ 3252419168,3252419199,CD 3252419200,3252419215,LT 3252419216,3252419247,GN -3252419248,3252419263,SN +3252419248,3252419263,LT 3252419264,3252419279,TZ -3252419280,3252419295,LT -3252419296,3252419311,SN +3252419280,3252419311,LT 3252419312,3252419327,ZM 3252419328,3252419343,GH 3252419344,3252419359,LT @@ -67953,7 +69279,9 @@ 3252419424,3252419839,LT 3252419840,3252419911,IQ 3252419912,3252419919,LT -3252419920,3252419951,IQ +3252419920,3252419927,IQ +3252419928,3252419935,LT +3252419936,3252419951,IQ 3252419952,3252419991,LT 3252419992,3252420007,IQ 3252420008,3252420031,LT @@ -67980,8 +69308,8 @@ 3252420448,3252420455,LT 3252420456,3252420463,IQ 3252420464,3252420471,AF -3252420472,3252420575,LT -3252420576,3252420591,IQ +3252420472,3252420583,LT +3252420584,3252420591,IQ 3252420592,3252421119,LT 3252421120,3252421631,NO 3252421632,3252424703,LT @@ -67999,7 +69327,9 @@ 3252425472,3252425543,AO 3252425544,3252425551,LT 3252425552,3252425575,AO -3252425576,3252426239,LT +3252425576,3252425727,LT +3252425728,3252425983,A2 +3252425984,3252426239,LT 3252426240,3252426751,BW 3252426752,3252427263,MZ 3252427264,3252427519,NG @@ -68035,8 +69365,8 @@ 3252434688,3252434703,GH 3252434704,3252434711,TZ 3252434712,3252434719,LT -3252434720,3252434735,GH -3252434736,3252435199,LT +3252434720,3252434743,GH +3252434744,3252435199,LT 3252435200,3252435247,TZ 3252435248,3252435295,LT 3252435296,3252435311,TZ @@ -68066,8 +69396,7 @@ 3252436320,3252436335,LT 3252436336,3252436351,ZM 3252436352,3252436383,GN -3252436384,3252436399,SN -3252436400,3252436447,LT +3252436384,3252436447,LT 3252436448,3252436479,ER 3252436480,3252436991,LT 3252436992,3252437503,NG @@ -68185,7 +69514,11 @@ 3252505344,3252505855,US 3252505856,3252507135,SE 3252507136,3252507647,EU -3252507648,3252509951,GB +3252507648,3252508415,GB +3252508416,3252508671,BE +3252508672,3252508927,GB +3252508928,3252509183,BE +3252509184,3252509951,GB 3252509952,3252510719,CH 3252510720,3252514815,FR 3252514816,3252515071,SI @@ -68588,7 +69921,9 @@ 3253985280,3253993471,GB 3253993472,3254067199,BE 3254067200,3254069247,CZ -3254069248,3254124543,BE +3254069248,3254077439,BE +3254077440,3254083583,HU +3254083584,3254124543,BE 3254124544,3254156799,CH 3254156800,3254157055,LI 3254157056,3254177279,CH @@ -69122,9 +70457,13 @@ 3255243680,3255243711,LU 3255243712,3255245599,BE 3255245600,3255245631,LU -3255245632,3255245687,BE +3255245632,3255245655,BE +3255245656,3255245663,LU +3255245664,3255245687,BE 3255245688,3255245695,LU -3255245696,3255247455,BE +3255245696,3255246591,BE +3255246592,3255246623,LU +3255246624,3255247455,BE 3255247456,3255247487,LU 3255247488,3255247615,BE 3255247616,3255247631,LU @@ -69198,9 +70537,7 @@ 3255278048,3255278063,LU 3255278064,3255278607,BE 3255278608,3255278623,LU -3255278624,3255278719,BE -3255278720,3255278751,LU -3255278752,3255279007,BE +3255278624,3255279007,BE 3255279008,3255279039,LU 3255279040,3255279087,BE 3255279088,3255279103,LU @@ -69308,7 +70645,7 @@ 3255366144,3255367167,DK 3255367168,3255367679,RU 3255367680,3255368191,UA -3255368192,3255368703,MD +3255368192,3255368703,LV 3255368704,3255369215,CZ 3255369216,3255369727,GB 3255369728,3255370239,LU @@ -69653,8 +70990,8 @@ 3256698624,3256698879,GB 3256698880,3256699135,DE 3256699136,3256699391,NL -3256699392,3256699903,GB -3256699904,3256701183,EU +3256699392,3256700415,GB +3256700416,3256701183,EU 3256701184,3256701439,BE 3256701440,3256701695,GB 3256701696,3256705279,EU @@ -74669,8 +76006,8 @@ 3263499008,3263499775,EU 3263499776,3263500031,FR 3263500032,3263500287,GB -3263500288,3263500799,EU -3263500800,3263501341,GB +3263500288,3263501311,EU +3263501312,3263501341,GB 3263501342,3263501343,EU 3263501344,3263501439,GB 3263501440,3263501503,US @@ -74679,27 +76016,22 @@ 3263501528,3263501535,GB 3263501536,3263501551,DE 3263501552,3263501823,GB -3263501824,3263502079,EG -3263502080,3263503103,EU -3263503104,3263503167,DE +3263501824,3263503135,EU +3263503136,3263503167,DE 3263503168,3263503199,EU 3263503200,3263503267,DE 3263503268,3263503271,EU 3263503272,3263503279,DE 3263503280,3263503295,EU 3263503296,3263503359,DE -3263503360,3263503871,EU -3263503872,3263504127,GB +3263503360,3263504127,EU 3263504128,3263504255,EG 3263504256,3263506687,EU 3263506688,3263506815,DE 3263506816,3263506943,US 3263506944,3263507199,EU 3263507200,3263507455,US -3263507456,3263508223,EU -3263508224,3263508479,GB -3263508480,3263509503,EU -3263509504,3263509759,SE +3263507456,3263509759,EU 3263509760,3263509791,GB 3263509792,3263509807,IE 3263509808,3263509831,GB @@ -74717,9 +76049,7 @@ 3263512064,3263512311,GB 3263512312,3263513343,EU 3263513344,3263513599,US -3263513600,3263513855,EU -3263513856,3263514111,RU -3263514112,3263516671,EU +3263513600,3263516671,EU 3263516672,3263516927,US 3263516928,3263517183,GB 3263517184,3263517695,EU @@ -74727,16 +76057,12 @@ 3263517952,3263518463,GB 3263518464,3263518719,FR 3263518720,3263518751,IR -3263518752,3263518975,EU -3263518976,3263519231,GB -3263519232,3263519743,EU +3263518752,3263519743,EU 3263519744,3263519759,GB 3263519760,3263520255,EU 3263520256,3263520511,FR 3263520512,3263520767,US -3263520768,3263521791,EU -3263521792,3263522047,GB -3263522048,3263523071,EU +3263520768,3263523071,EU 3263523072,3263523583,DE 3263523584,3263525759,EU 3263525760,3263525887,DE @@ -74745,18 +76071,14 @@ 3263527680,3263527935,DE 3263527936,3263528191,EU 3263528192,3263528447,FR -3263528448,3263528703,EU -3263528704,3263528959,GB -3263528960,3263530495,EU +3263528448,3263530495,EU 3263530496,3263530751,GB 3263530752,3263531519,EU 3263531520,3263531535,DE 3263531536,3263531551,EU 3263531552,3263531775,DE -3263531776,3263532543,EU -3263532544,3263532799,GB -3263532800,3263537663,EU -3263537664,3263538431,TR +3263531776,3263538175,EU +3263538176,3263538431,TR 3263538432,3263540223,EU 3263540224,3263540479,TR 3263540480,3263540735,GB @@ -74767,13 +76089,11 @@ 3263557888,3263558655,EU 3263558656,3263558911,TR 3263558912,3263559679,GB -3263559680,3263560191,TR -3263560192,3263560447,EU +3263559680,3263560447,EU 3263560448,3263560703,TR -3263560704,3263560959,EU -3263560960,3263561231,TR -3263561232,3263561471,EU -3263561472,3263561727,TR +3263560704,3263561215,EU +3263561216,3263561231,TR +3263561232,3263561727,EU 3263561728,3263627263,NL 3263627264,3263657471,RU 3263657472,3263657727,KZ @@ -74831,7 +76151,6 @@ 3264015360,3264015615,DK 3264015616,3264015871,UA 3264015872,3264016127,PT -3264016128,3264016383,DE 3264016384,3264016639,SE 3264016640,3264016895,PL 3264016896,3264017151,GB @@ -75223,7 +76542,6 @@ 3264845312,3264845951,DE 3264845952,3264846079,GB 3264846080,3264846207,UG -3264846208,3264846335,PL 3264846336,3264846463,GB 3264846464,3264846591,NO 3264846592,3264846719,US @@ -76132,9 +77450,7 @@ 3267666272,3267666431,GR 3267666432,3267666447,GB 3267666448,3267666463,EU -3267666464,3267666479,GB -3267666480,3267666495,EU -3267666496,3267666543,GB +3267666464,3267666543,GB 3267666544,3267666575,EU 3267666576,3267666951,GB 3267666952,3267666959,EU @@ -76396,10 +77712,8 @@ 3268238360,3268238367,DE 3268238368,3268238463,GB 3268238464,3268238471,DE -3268238472,3268238535,GB -3268238536,3268238559,EU -3268238560,3268238591,GB -3268238592,3268239103,EU +3268238472,3268238623,GB +3268238624,3268239103,EU 3268239104,3268239359,GB 3268239360,3268239583,EU 3268239584,3268240127,GB @@ -76594,8 +77908,7 @@ 3268345856,3268411391,GB 3268411392,3268424959,AT 3268424960,3268425727,CH -3268425728,3268425983,LI -3268425984,3268426495,AT +3268425728,3268426495,AT 3268426496,3268428031,CH 3268428032,3268428287,AT 3268428288,3268428543,CH @@ -76603,9 +77916,7 @@ 3268429056,3268429311,CH 3268429312,3268429567,AT 3268429568,3268430079,CH -3268430080,3268430847,AT -3268430848,3268431103,LI -3268431104,3268476927,AT +3268430080,3268476927,AT 3268476928,3268542463,CH 3268542464,3268607999,PT 3268608000,3268673535,FI @@ -77378,7 +78689,7 @@ 3271803904,3271804927,UA 3271804928,3271805951,PL 3271805952,3271806975,UA -3271806976,3271807999,GB +3271806976,3271807999,EU 3271808000,3271810047,DE 3271810048,3271811071,PL 3271811072,3271812095,UA @@ -77626,18 +78937,18 @@ 3272178560,3272178623,UA 3272178624,3272212479,RU 3272212480,3272212991,GB -3272212992,3272213375,EU +3272212992,3272213375,ES 3272213376,3272213391,IT 3272213392,3272213399,GB -3272213400,3272213407,EU +3272213400,3272213407,ES 3272213408,3272213415,NL -3272213416,3272213423,EU +3272213416,3272213423,ES 3272213424,3272213431,NL 3272213432,3272213455,GB -3272213456,3272213471,EU +3272213456,3272213471,ES 3272213472,3272213487,CY 3272213488,3272213495,GB -3272213496,3272213503,EU +3272213496,3272213503,ES 3272213504,3272213567,IT 3272213568,3272213575,GB 3272213576,3272213583,IE @@ -78057,9 +79368,7 @@ 3272715016,3272715023,GB 3272715024,3272715135,SE 3272715136,3272715263,GB -3272715264,3272733119,SE -3272733120,3272733135,DE -3272733136,3272733983,SE +3272715264,3272733983,SE 3272733984,3272733991,RU 3272733992,3272736767,SE 3272736768,3272737791,IT @@ -78397,7 +79706,7 @@ 3273192448,3273192959,DK 3273192960,3273193471,FR 3273193472,3273193983,PL -3273193984,3273194495,GB +3273193984,3273194495,EU 3273194496,3273195007,UA 3273195008,3273195519,RU 3273195520,3273230983,FR @@ -78444,8 +79753,8 @@ 3273327280,3273327287,DE 3273327288,3273327359,EU 3273327360,3273327423,IE -3273327424,3273327495,GB -3273327496,3273327519,EU +3273327424,3273327503,GB +3273327504,3273327519,EU 3273327520,3273327551,IE 3273327552,3273328511,EU 3273328512,3273328639,DE @@ -78486,8 +79795,8 @@ 3273336000,3273336847,EU 3273336848,3273336863,DE 3273336864,3273336871,GB -3273336872,3273336879,DE -3273336880,3273336959,EU +3273336872,3273336895,DE +3273336896,3273336959,EU 3273336960,3273337087,DE 3273337088,3273337855,EU 3273337856,3273338111,DE @@ -78756,7 +80065,7 @@ 3273805824,3273806335,PL 3273806336,3273806847,DE 3273806848,3273807359,SE -3273807360,3273807871,A2 +3273807360,3273807871,LU 3273807872,3273808383,CH 3273808384,3273808895,UA 3273808896,3273809407,GB @@ -79156,9 +80465,7 @@ 3274604544,3274612735,TR 3274612736,3274620927,RU 3274620928,3274629119,FR -3274629120,3274629151,LU -3274629152,3274629159,A2 -3274629160,3274637175,LU +3274629120,3274637175,LU 3274637176,3274637183,A2 3274637184,3274637311,LU 3274637312,3274670079,CZ @@ -79487,14 +80794,16 @@ 3275424256,3275425791,EU 3275425792,3275426599,GB 3275426600,3275426607,EU -3275426608,3275426655,GB -3275426656,3275426815,EU +3275426608,3275426671,GB +3275426672,3275426815,EU 3275426816,3275427199,GB 3275427200,3275427327,EU 3275427328,3275427583,GB 3275427584,3275427839,EU 3275427840,3275428375,GB -3275428376,3275429887,EU +3275428376,3275428383,EU +3275428384,3275428399,GB +3275428400,3275429887,EU 3275429888,3275430143,GB 3275430144,3275430271,EU 3275430272,3275430399,GB @@ -79513,9 +80822,7 @@ 3275442720,3275444223,EU 3275444224,3275444735,GB 3275444736,3275446271,EU -3275446272,3275446831,GB -3275446832,3275446847,EU -3275446848,3275446943,GB +3275446272,3275446943,GB 3275446944,3275448319,EU 3275448320,3275449519,GB 3275449520,3275449527,FR @@ -79523,8 +80830,10 @@ 3275450880,3275451231,EU 3275451232,3275451263,GB 3275451264,3275452415,EU -3275452416,3275454111,GB -3275454112,3275454463,EU +3275452416,3275454127,GB +3275454128,3275454143,EU +3275454144,3275454159,GB +3275454160,3275454463,EU 3275454464,3275456383,GB 3275456384,3275456511,EU 3275456512,3275457023,GB @@ -79535,8 +80844,8 @@ 3275460608,3275460863,HK 3275460864,3275463471,GB 3275463472,3275463487,EU -3275463488,3275463503,GB -3275463504,3275463679,EU +3275463488,3275463519,GB +3275463520,3275463679,EU 3275463680,3275464031,GB 3275464032,3275464047,IE 3275464048,3275468655,GB @@ -79641,9 +80950,7 @@ 3275555744,3275555759,ES 3275555760,3275555767,EU 3275555768,3275555776,ES -3275555777,3275556607,EU -3275556608,3275556863,ES -3275556864,3275560959,EU +3275555777,3275560959,EU 3275560960,3275561215,ES 3275561216,3275561471,EU 3275561472,3275561727,ES @@ -79654,15 +80961,17 @@ 3275563520,3275563583,EU 3275563584,3275563647,CH 3275563648,3275563775,DE -3275563776,3275564287,CH -3275564288,3275564415,EU +3275563776,3275564031,CH +3275564032,3275564415,EU 3275564416,3275564495,CH 3275564496,3275564799,EU 3275564800,3275565055,CH 3275565056,3275565311,EU 3275565312,3275565567,CH 3275565568,3275565823,EU -3275565824,3275567359,CH +3275565824,3275566079,CH +3275566080,3275566847,EU +3275566848,3275567359,CH 3275567360,3275567615,EU 3275567616,3275568127,CH 3275568128,3275568383,EU @@ -79688,13 +80997,17 @@ 3275574160,3275574175,EU 3275574176,3275574191,PT 3275574192,3275574783,EU -3275574784,3275575231,PT +3275574784,3275575103,PT +3275575104,3275575167,EU +3275575168,3275575231,PT 3275575232,3275575423,EU 3275575424,3275575727,PT -3275575728,3275575807,EU -3275575808,3275575935,PT +3275575728,3275575871,EU +3275575872,3275575935,PT 3275575936,3275576063,EU -3275576064,3275577407,PT +3275576064,3275576319,PT +3275576320,3275577343,EU +3275577344,3275577407,PT 3275577408,3275577471,EU 3275577472,3275577495,PT 3275577496,3275577519,EU @@ -79705,9 +81018,7 @@ 3275577792,3275577807,PT 3275577808,3275577839,EU 3275577840,3275578623,PT -3275578624,3275578879,EU -3275578880,3275579007,PT -3275579008,3275579135,EU +3275578624,3275579135,EU 3275579136,3275579391,PT 3275579392,3275579519,FR 3275579520,3275579583,NL @@ -79725,8 +81036,8 @@ 3275581680,3275581695,NL 3275581696,3275582223,EU 3275582224,3275582247,NL -3275582248,3275582255,EU -3275582256,3275582287,NL +3275582248,3275582279,EU +3275582280,3275582287,NL 3275582288,3275582655,EU 3275582656,3275582719,NL 3275582720,3275582975,EU @@ -79737,9 +81048,7 @@ 3275584512,3275584527,NL 3275584528,3275585023,EU 3275585024,3275585279,NL -3275585280,3275587071,EU -3275587072,3275587136,NL -3275587137,3275587583,EU +3275585280,3275587583,EU 3275587584,3275587855,BE 3275587856,3275588095,EU 3275588096,3275588287,BE @@ -79765,10 +81074,9 @@ 3275591168,3275591423,EU 3275591424,3275591679,BE 3275591680,3275592063,RO -3275592064,3275592191,EU -3275592192,3275592959,RO -3275592960,3275593215,MD -3275593216,3275593343,EU +3275592064,3275592447,EU +3275592448,3275592959,RO +3275592960,3275593343,EU 3275593344,3275593855,RO 3275593856,3275593983,EU 3275593984,3275595007,RO @@ -79785,7 +81093,9 @@ 3275603968,3275604735,IT 3275604736,3275604767,IL 3275604768,3275604991,EU -3275604992,3275606271,IT +3275604992,3275605759,IT +3275605760,3275606015,EU +3275606016,3275606271,IT 3275606272,3275606527,EU 3275606528,3275606783,IT 3275606784,3275608831,EU @@ -79794,9 +81104,7 @@ 3275610112,3275610623,IT 3275610624,3275612159,EU 3275612160,3275612287,LU -3275612288,3275612415,EU -3275612416,3275612671,LU -3275612672,3275612927,BE +3275612288,3275612927,EU 3275612928,3275613951,LU 3275613952,3275620351,EU 3275620352,3275622399,RU @@ -79945,7 +81253,6 @@ 3275914496,3275914751,BG 3275914752,3275915007,RU 3275915008,3275915263,PT -3275915264,3275915775,FR 3275915776,3275916287,SE 3275916288,3275916799,US 3275916800,3275917311,NL @@ -80072,8 +81379,8 @@ 3276018208,3276018375,FR 3276018376,3276018383,GB 3276018384,3276018423,FR -3276018424,3276018431,GB -3276018432,3276018495,FR +3276018424,3276018447,GB +3276018448,3276018495,FR 3276018496,3276018527,GB 3276018528,3276018543,FR 3276018544,3276018623,GB @@ -80115,7 +81422,9 @@ 3276020432,3276020439,GB 3276020440,3276020495,FR 3276020496,3276020503,GB -3276020504,3276020623,FR +3276020504,3276020559,FR +3276020560,3276020567,GB +3276020568,3276020623,FR 3276020624,3276020631,GB 3276020632,3276020679,FR 3276020680,3276020687,GB @@ -80127,9 +81436,13 @@ 3276020944,3276020991,GB 3276020992,3276021103,FR 3276021104,3276021111,GB -3276021112,3276021591,FR +3276021112,3276021527,FR +3276021528,3276021535,GB +3276021536,3276021591,FR 3276021592,3276021599,GB -3276021600,3276022039,FR +3276021600,3276021855,FR +3276021856,3276021871,GB +3276021872,3276022039,FR 3276022040,3276022047,GB 3276022048,3276022087,FR 3276022088,3276022095,GB @@ -80165,7 +81478,9 @@ 3276023104,3276023279,GB 3276023280,3276023687,FR 3276023688,3276023695,GB -3276023696,3276023759,FR +3276023696,3276023727,FR +3276023728,3276023743,GB +3276023744,3276023759,FR 3276023760,3276023767,GB 3276023768,3276023871,FR 3276023872,3276023887,GB @@ -80300,9 +81615,7 @@ 3276031440,3276031519,FR 3276031520,3276031551,GB 3276031552,3276031559,FR -3276031560,3276031575,GB -3276031576,3276031583,FR -3276031584,3276031591,GB +3276031560,3276031591,GB 3276031592,3276031631,FR 3276031632,3276031679,GB 3276031680,3276031719,FR @@ -80409,16 +81722,14 @@ 3276040064,3276040095,GB 3276040096,3276040159,FR 3276040160,3276040175,GB -3276040176,3276040207,FR -3276040208,3276040215,GB +3276040176,3276040191,FR +3276040192,3276040215,GB 3276040216,3276040231,FR 3276040232,3276040239,GB 3276040240,3276040319,FR 3276040320,3276040327,GB 3276040328,3276040335,FR -3276040336,3276040343,GB -3276040344,3276040351,FR -3276040352,3276040367,GB +3276040336,3276040367,GB 3276040368,3276040439,FR 3276040440,3276040495,GB 3276040496,3276040543,FR @@ -82750,7 +84061,7 @@ 3276475984,3276476039,IT 3276476040,3276476047,EU 3276476048,3276476111,IT -3276476112,3276476119,EU +3276476112,3276476119,GB 3276476120,3276476159,IT 3276476160,3276476415,EU 3276476416,3276476671,CH @@ -82829,7 +84140,9 @@ 3276493216,3276493247,EU 3276493248,3276494383,GB 3276494384,3276494415,EU -3276494416,3276495503,GB +3276494416,3276494591,GB +3276494592,3276494847,EU +3276494848,3276495503,GB 3276495504,3276495519,EU 3276495520,3276495679,GB 3276495680,3276495775,EU @@ -82863,8 +84176,8 @@ 3276499760,3276499775,EU 3276499776,3276499791,DE 3276499792,3276499799,EU -3276499800,3276499815,DE -3276499816,3276499935,EU +3276499800,3276499823,DE +3276499824,3276499935,EU 3276499936,3276499999,DE 3276500000,3276500031,CH 3276500032,3276500095,DE @@ -83050,9 +84363,7 @@ 3276528800,3276528815,GB 3276528816,3276528831,EU 3276528832,3276528895,BE -3276528896,3276528903,IE -3276528904,3276528911,EU -3276528912,3276528927,IE +3276528896,3276528927,IE 3276528928,3276528935,EU 3276528936,3276528943,IE 3276528944,3276528959,EU @@ -83600,8 +84911,9 @@ 3276866864,3276866879,GB 3276866880,3276866959,DE 3276866960,3276866967,GB -3276866968,3276866975,DE -3276866976,3276867071,GB +3276866968,3276866983,DE +3276866984,3276867007,GB +3276867008,3276867071,DE 3276867072,3276868606,IT 3276868607,3276868607,GB 3276868608,3276868863,NL @@ -83615,8 +84927,8 @@ 3276872480,3276872511,GB 3276872512,3276872703,DE 3276872704,3276873727,GB -3276873728,3276874303,ES -3276874304,3276874367,GB +3276873728,3276874335,ES +3276874336,3276874367,GB 3276874368,3276874751,ES 3276874752,3276875007,NL 3276875008,3276875263,GB @@ -83649,8 +84961,8 @@ 3276883968,3276884487,PL 3276884488,3276886015,GB 3276886016,3276886271,RO -3276886272,3276887807,GB -3276887808,3276888063,DE +3276886272,3276887551,GB +3276887552,3276888063,DE 3276888064,3276888575,GB 3276888576,3276888831,AT 3276888832,3276889087,GB @@ -83678,14 +84990,12 @@ 3276897280,3276898303,GB 3276898304,3276898775,CH 3276898776,3276898783,GB -3276898784,3276899135,CH -3276899136,3276899167,GB -3276899168,3276900039,CH +3276898784,3276900039,CH 3276900040,3276900095,GB 3276900096,3276900351,CH 3276900352,3276900607,GB -3276900608,3276900671,CH -3276900672,3276902143,GB +3276900608,3276900735,CH +3276900736,3276902143,GB 3276902144,3276902151,CH 3276902152,3276902159,GB 3276902160,3276902175,CH @@ -83694,8 +85004,8 @@ 3276902576,3276902655,GB 3276902656,3276903422,SE 3276903423,3276903423,GB -3276903424,3276903679,SE -3276903680,3276905311,GB +3276903424,3276903935,SE +3276903936,3276905311,GB 3276905312,3276905319,ES 3276905320,3276905471,GB 3276905472,3276905727,SE @@ -83705,13 +85015,17 @@ 3276906496,3276906863,NL 3276906864,3276906879,GB 3276906880,3276907551,NL -3276907552,3276910079,GB +3276907552,3276907775,GB +3276907776,3276908031,NL +3276908032,3276910079,GB 3276910080,3276910591,NL 3276910592,3276910967,IT 3276910968,3276910975,GB 3276910976,3276912615,IT 3276912616,3276912623,GB -3276912624,3276913919,IT +3276912624,3276913183,IT +3276913184,3276913215,GB +3276913216,3276913919,IT 3276913920,3276913983,US 3276913984,3276914687,IT 3276914688,3276915455,ES @@ -83724,8 +85038,8 @@ 3276917280,3276917287,GB 3276917288,3276917311,ES 3276917312,3276917343,GB -3276917344,3276917759,ES -3276917760,3276918271,GB +3276917344,3276917823,ES +3276917824,3276918271,GB 3276918272,3276918783,ES 3276918784,3276920551,DE 3276920552,3276920559,GB @@ -83742,13 +85056,15 @@ 3276923432,3276923455,GB 3276923456,3276923615,FR 3276923616,3276923647,GB -3276923648,3276924039,FR +3276923648,3276923743,FR +3276923744,3276923751,GB +3276923752,3276924039,FR 3276924040,3276924095,GB -3276924096,3276924287,FR -3276924288,3276924415,GB +3276924096,3276924351,FR +3276924352,3276924415,GB 3276924416,3276925951,FR -3276925952,3276926463,GB -3276926464,3276926735,FR +3276925952,3276926207,GB +3276926208,3276926735,FR 3276926736,3276931071,GB 3276931072,3276939263,KZ 3276939264,3276955647,DE @@ -84026,7 +85342,7 @@ 3277700608,3277701119,UA 3277701120,3277701631,DK 3277701632,3277702143,AT -3277702144,3277702655,GB +3277702144,3277702655,EU 3277702656,3277703167,RO 3277703168,3277703679,DE 3277703680,3277704191,PL @@ -84182,9 +85498,7 @@ 3278110752,3278110767,ES 3278110768,3278111239,SE 3278111240,3278111247,ES -3278111248,3278114815,SE -3278114816,3278115071,ES -3278115072,3278115327,SE +3278111248,3278115327,SE 3278115328,3278116607,ES 3278116608,3278116863,SE 3278116864,3278118303,ES @@ -85170,7 +86484,8 @@ 3278942838,3278942838,ES 3278942839,3278942839,FR 3278942840,3278942841,DE -3278942842,3278942843,IT +3278942842,3278942842,IT +3278942843,3278942843,DE 3278942844,3278942844,ES 3278942845,3278942850,DE 3278942851,3278942851,HU @@ -86073,8 +87388,7 @@ 3278943999,3278944001,DE 3278944002,3278944002,GB 3278944003,3278944003,LU -3278944004,3278944004,PT -3278944005,3278944006,DE +3278944004,3278944006,DE 3278944007,3278944007,NL 3278944008,3278944008,IT 3278944009,3278944009,CH @@ -87066,9 +88380,7 @@ 3280023040,3280023551,EU 3280023552,3280024575,IT 3280024576,3280024831,SE -3280024832,3280027135,EU -3280027136,3280027391,IE -3280027392,3280027647,EU +3280024832,3280027647,EU 3280027648,3280027903,CH 3280027904,3280028159,EU 3280028160,3280028415,IT @@ -90693,7 +92005,9 @@ 3285496832,3285497855,DE 3285497856,3285497887,EU 3285497888,3285498031,DE -3285498032,3285498095,EU +3285498032,3285498047,EU +3285498048,3285498079,DE +3285498080,3285498095,EU 3285498096,3285498111,DE 3285498112,3285498367,IT 3285498368,3285498623,DE @@ -91752,11 +93066,11 @@ 3285930496,3285930559,EU 3285930560,3285930575,ES 3285930576,3285930623,GB -3285930624,3285930631,EU +3285930624,3285930631,BE 3285930632,3285930639,GB 3285930640,3285930655,ES 3285930656,3285930671,NL -3285930672,3285930679,EU +3285930672,3285930679,BE 3285930680,3285930687,DE 3285930688,3285930751,EU 3285930752,3285931007,GB @@ -92055,8 +93369,7 @@ 3286671360,3286679551,AT 3286679552,3286681631,IT 3286681632,3286681647,DE -3286681648,3286681655,GB -3286681656,3286681659,BE +3286681648,3286681659,IT 3286681660,3286681663,ES 3286681664,3286681695,FR 3286681696,3286681699,ES @@ -92068,8 +93381,7 @@ 3286681768,3286681775,DE 3286681776,3286681815,IT 3286681816,3286681823,FR -3286681824,3286682431,IT -3286682432,3286682463,FR +3286681824,3286682463,IT 3286682464,3286682495,RO 3286682496,3286682623,IT 3286682624,3286682879,SM @@ -92488,7 +93800,6 @@ 3287664896,3287665151,GB 3287665152,3287665407,NO 3287665408,3287665919,PL -3287665920,3287666175,AT 3287666176,3287666431,RU 3287666432,3287666687,DK 3287666688,3287666943,SI @@ -93011,6 +94322,9 @@ 3291168768,3291176959,TZ 3291176960,3291185151,ZW 3291185152,3291201535,UG +3291201536,3291201791,KE +3291201792,3291202047,ZM +3291202048,3291202303,GH 3291217920,3291230207,ZA 3291230208,3291234303,GH 3291234304,3291242495,ZA @@ -93182,6 +94496,8 @@ 3302753608,3302753615,GH 3302753616,3302760447,NG 3302760448,3302768639,ZA +3302768640,3302776831,NG +3302809600,3302817791,NG 3302817792,3302883327,EG 3302883328,3302948863,MA 3302948864,3302949119,MU @@ -93200,8 +94516,12 @@ 3302952960,3302953471,EG 3302953472,3302953727,NA 3302953728,3302953983,AO +3302953984,3302954239,SD +3302954240,3302954495,KE +3302987264,3302987775,MU 3305111552,3307208703,TN 3315597312,3316121599,EG +3316121600,3316645887,ZA 3317694464,3318218751,EG 3318218752,3318743039,DZ 3319791616,3320053759,MU @@ -93934,7 +95254,9 @@ 3339165696,3339167743,US 3339167744,3339168767,PR 3339168768,3339177983,US -3339177984,3339179007,PR +3339177984,3339178495,PR +3339178496,3339178751,DO +3339178752,3339179007,PR 3339179008,3339180031,US 3339180032,3339181055,CA 3339181056,3339184127,US @@ -93953,8 +95275,10 @@ 3339943936,3339952127,US 3339952128,3339956223,CA 3339956224,3339965439,US -3339965440,3339969535,CA -3339969536,3340058623,US +3339965440,3339969311,CA +3339969312,3339969327,AU +3339969328,3339969375,CA +3339969376,3340058623,US 3340075008,3340080127,US 3340080128,3340081151,CA 3340081152,3340084223,US @@ -93973,10 +95297,15 @@ 3340430080,3340451839,US 3340468224,3340481535,US 3340481536,3340482559,CA -3340482560,3340488703,US -3340500992,3340584703,US +3340482560,3340490751,US +3340490752,3340492799,CA +3340492800,3340584703,US 3340584704,3340584959,KW -3340584960,3340898047,US +3340584960,3340648447,US +3340664832,3340665855,CA +3340665856,3340677119,US +3340677120,3340679167,CA +3340679168,3340898047,US 3340898048,3340898303,CA 3340898304,3340925071,US 3340925072,3340925079,CA @@ -94231,7 +95560,10 @@ 3350470656,3350475775,US 3350475776,3350476799,CA 3350476800,3350478847,US -3350528000,3350790143,US +3350528000,3350593535,US +3350593536,3350609919,CA +3350614016,3350618111,US +3350626304,3350790143,US 3350790144,3350825727,CA 3350825728,3350825983,GB 3350825984,3350855679,CA @@ -94820,6 +96152,7 @@ 3356273408,3356273663,CL 3356273664,3356274431,SV 3356274432,3356278783,CO +3356278784,3356279039,AR 3356279040,3356279295,VE 3356279296,3356279807,CL 3356279808,3356280831,EC @@ -96631,6 +97964,18 @@ 3392923136,3392923391,BN 3392923392,3392923647,AP 3392923648,3392924159,CN +3392924160,3392924671,JP +3392924672,3392924927,PH +3392924928,3392925183,AU +3392925184,3392925695,VN +3392925696,3392926719,AU +3392926720,3392927231,IN +3392927232,3392927743,AU +3392927744,3392927999,IN +3392928000,3392928255,HK +3392928256,3392928767,TW +3392928768,3392929279,VN +3392929280,3392929535,PK 3392929792,3392931839,MU 3392931840,3392933887,PH 3392933888,3392942079,JP @@ -97025,6 +98370,8 @@ 3394896896,3394897919,TH 3394897920,3394899967,JP 3394899968,3394904063,SG +3394904064,3394904319,AU +3394904320,3394904575,IN 3394904576,3394905087,AU 3394905088,3394905343,BN 3394905344,3394906111,AU @@ -99015,7 +100362,6 @@ 3412296192,3412296703,ID 3412296704,3412297727,NZ 3412297728,3412298751,MY -3412298752,3412299263,SG 3412299264,3412299519,AU 3412299520,3412299775,HK 3412299776,3412302847,AU @@ -99156,6 +100502,8 @@ 3413596160,3413596671,AP 3413596672,3413597183,NP 3413597184,3413597695,AP +3413597696,3413597951,TW +3413597952,3413598207,AU 3413639168,3413704703,SG 3413704704,3413737471,MY 3413737472,3413753855,TH @@ -101660,15 +103008,21 @@ 3434917376,3434917887,AG 3434917888,3435069439,US 3435069440,3435134975,CA -3435134976,3436249087,US -3436249088,3436282367,CA +3435134976,3435507711,US +3435507712,3435511807,CA +3435528192,3436249087,US +3436249088,3436255743,CA +3436255744,3436256255,US +3436256256,3436282367,CA 3436282368,3436282623,US 3436282624,3436289791,CA 3436289792,3436290047,US 3436290048,3436314623,CA 3436314624,3436476415,US 3436476416,3436478463,AW -3436478464,3436697087,US +3436478464,3436492799,US +3436492800,3436493055,NL +3436493056,3436697087,US 3436697088,3436697343,VE 3436697344,3437232383,US 3437232384,3437232639,CA @@ -101693,7 +103047,9 @@ 3437293056,3437296639,US 3437296640,3437296895,CA 3437296896,3437297663,US -3437297664,3437310975,CA +3437297664,3437307391,CA +3437307392,3437307903,US +3437307904,3437310975,CA 3437310976,3437311487,US 3437311488,3437331711,CA 3437331712,3437331967,US @@ -101962,8 +103318,9 @@ 3438034944,3438051327,BS 3438051328,3438084095,US 3438084096,3438116863,CA -3438116864,3438215167,US -3438215168,3438217983,CA +3438116864,3438215423,US +3438215424,3438215935,CA +3438216192,3438217983,CA 3438217984,3438218239,US 3438218240,3438218751,CA 3438219264,3438280703,CA @@ -102129,7 +103486,10 @@ 3448545952,3448545967,SG 3448545968,3448545975,MY 3448545976,3448546007,AU -3448546008,3448556671,US +3448546008,3448546047,US +3448546048,3448546079,MY +3448546080,3448546111,SG +3448546112,3448556671,US 3448556672,3448556735,GB 3448556736,3448556799,US 3448556800,3448556815,GB @@ -102360,7 +103720,9 @@ 3451236352,3451236607,HU 3451236608,3451371519,US 3451371520,3451371775,GB -3451371776,3451506687,US +3451371776,3451482111,US +3451482112,3451486207,CA +3451486208,3451506687,US 3451506688,3451507199,BR 3451507200,3451715583,US 3451715584,3451737343,CA @@ -102420,7 +103782,7 @@ 3452436480,3452502015,CA 3452502016,3452678143,US 3452678144,3452682239,BE -3452682240,3452706815,US +3452682240,3452715007,US 3452715008,3452723199,CA 3452731392,3452764159,US 3452764160,3452764439,CA @@ -102998,7 +104360,9 @@ 3458144000,3458144015,DE 3458144016,3458144031,US 3458144032,3458144047,DE -3458144048,3458195455,US +3458144048,3458144111,US +3458144112,3458144119,CA +3458144120,3458195455,US 3458195456,3458196479,SG 3458196480,3458765631,US 3458765632,3458765695,CA @@ -103862,7 +105226,8 @@ 3464342544,3464342559,SE 3464342560,3464342703,US 3464342704,3464342711,JP -3464342712,3464342879,US +3464342712,3464342871,US +3464342872,3464342879,ZA 3464342880,3464342887,GB 3464342888,3464343111,US 3464343112,3464343119,CN @@ -104426,6 +105791,7 @@ 3469901824,3470131199,US 3470131200,3470137343,AG 3470137344,3470139391,VG +3470139392,3470143487,US 3470147584,3470148095,US 3470148096,3470148351,CA 3470148352,3470148607,US @@ -104914,6 +106280,7 @@ 3470188511,3470188521,US 3470188522,3470188541,HK 3470188542,3470192639,US +3470192640,3470196735,CA 3470196736,3470360631,US 3470360632,3470360639,CA 3470360640,3470360687,US @@ -106156,7 +107523,7 @@ 3486269440,3486285823,JM 3486285824,3486302207,PR 3486302208,3486310399,CA -3486318592,3486501951,US +3486310400,3486501951,US 3486501952,3486501967,DE 3486501968,3486580735,US 3486580736,3486580991,GB @@ -107261,7 +108628,9 @@ 3495023616,3495024639,CA 3495024640,3495065599,US 3495065600,3495066623,CA -3495066624,3495068223,US +3495066624,3495068031,US +3495068032,3495068047,PL +3495068048,3495068223,US 3495068224,3495068239,PL 3495068240,3495068655,US 3495068656,3495068671,PL @@ -107754,7 +109123,9 @@ 3497226296,3497226303,SG 3497226304,3497226391,US 3497226392,3497226399,IR -3497226400,3497226783,US +3497226400,3497226687,US +3497226688,3497226719,GB +3497226720,3497226783,US 3497226784,3497226815,CH 3497226816,3497226831,US 3497226832,3497226847,CH @@ -108111,7 +109482,13 @@ 3507134592,3507134607,GB 3507134608,3507290111,US 3507290112,3507355647,AR -3507355648,3507540015,US +3507355648,3507479079,US +3507479080,3507479080,CA +3507479081,3507479108,US +3507479109,3507479109,CA +3507479110,3507482153,US +3507482154,3507482155,CA +3507482156,3507540015,US 3507540016,3507540031,IN 3507540032,3507585023,US 3507585024,3507586623,CA @@ -110127,7 +111504,19 @@ 3513368576,3513376767,CA 3513376768,3513475071,US 3513475072,3513483263,CA -3513483264,3513670911,US +3513483264,3513501183,US +3513501184,3513501439,PH +3513501440,3513501567,US +3513501568,3513501631,AZ +3513501632,3513502719,US +3513502720,3513502975,A1 +3513502976,3513503743,US +3513503744,3513503999,SC +3513504000,3513506047,US +3513506048,3513506303,A1 +3513506304,3513506559,US +3513506560,3513506815,CA +3513506816,3513670911,US 3513670912,3513671167,A2 3513671168,3513778175,US 3513778176,3513794559,CA @@ -110737,9 +112126,9 @@ 3518760576,3518760703,HU 3518760704,3518762495,US 3518762496,3518762751,GB -3518762752,3518764031,US -3518764032,3518764287,GB -3518764288,3518764671,US +3518762752,3518764047,US +3518764048,3518764223,GB +3518764224,3518764671,US 3518764672,3518764703,NL 3518764704,3518765311,US 3518765312,3518765567,CA @@ -111016,7 +112405,9 @@ 3519715296,3519715327,GB 3519715328,3519716863,US 3519716864,3519716991,CA -3519716992,3519741951,US +3519716992,3519723519,US +3519723520,3519724031,CA +3519724032,3519741951,US 3519741952,3519758335,ZA 3519758336,3519791103,US 3519799296,3519799871,US @@ -111186,7 +112577,9 @@ 3520028688,3520028711,US 3520028712,3520029167,CA 3520029168,3520029175,IL -3520029176,3520030799,CA +3520029176,3520030719,CA +3520030720,3520030727,US +3520030728,3520030799,CA 3520030800,3520030807,US 3520030808,3520030951,CA 3520030952,3520030959,US @@ -111464,7 +112857,53 @@ 3521836688,3521836703,CA 3521836704,3521904639,US 3521904640,3521921023,JM -3521921024,3521965055,US +3521921024,3521933321,US +3521933322,3521933329,PK +3521933330,3521933345,MA +3521933346,3521933413,US +3521933414,3521933421,IN +3521933422,3521933429,MA +3521933430,3521933437,CA +3521933438,3521933497,US +3521933498,3521933505,EG +3521933506,3521933537,GB +3521933538,3521933577,US +3521933578,3521933585,EG +3521933586,3521933589,US +3521933590,3521933597,IN +3521933598,3521933605,US +3521933606,3521933613,AE +3521933614,3521933621,US +3521933622,3521933629,IN +3521933630,3521933645,US +3521933646,3521933653,GB +3521933654,3521933725,US +3521933726,3521933733,GB +3521933734,3521933741,US +3521933742,3521933785,GB +3521933786,3521933833,US +3521933834,3521933841,EG +3521933842,3521933929,US +3521933930,3521933937,IN +3521933938,3521933981,US +3521933982,3521933989,IN +3521933990,3521934089,US +3521934090,3521934097,EG +3521934098,3521934169,US +3521934170,3521934177,EG +3521934178,3521934421,US +3521934422,3521934429,EG +3521934430,3521934477,US +3521934478,3521934485,ID +3521934486,3521934509,US +3521934510,3521934517,IN +3521934518,3521934735,US +3521934736,3521934743,EG +3521934744,3521934768,US +3521934769,3521934776,MA +3521934777,3521935237,US +3521935238,3521935245,EG +3521935246,3521965055,US 3521965056,3521966079,DE 3521966080,3522029439,US 3522029440,3522029503,FI @@ -111477,11 +112916,14 @@ 3522034448,3522034463,GB 3522034464,3522101247,US 3522101248,3522109439,CA -3522109440,3522117631,US -3522117632,3522121983,A2 +3522109440,3522119935,US +3522119936,3522120191,LY +3522120192,3522120447,US +3522120448,3522121215,LY +3522121216,3522121471,US +3522121472,3522121983,LY 3522121984,3522122239,AW -3522122240,3522125823,A2 -3522125824,3522131455,US +3522122240,3522131455,US 3522131456,3522131487,PE 3522131488,3522131519,RS 3522131520,3522131711,US @@ -111490,7 +112932,7 @@ 3522131776,3522131807,BR 3522131808,3522132479,US 3522132480,3522132543,CO -3522132544,3522132575,US +3522132544,3522132575,TR 3522132576,3522132607,UA 3522132608,3522132639,CA 3522132640,3522132671,PE @@ -112042,7 +113484,8 @@ 3557138432,3557146623,RU 3557146624,3557154815,SK 3557154816,3557171199,RU -3557171200,3557172991,IR +3557171200,3557172479,IT +3557172480,3557172991,IR 3557172992,3557173503,IQ 3557173504,3557173631,IR 3557173632,3557173695,IQ @@ -112070,7 +113513,7 @@ 3557244928,3557253119,IT 3557253120,3557261311,RU 3557261312,3557277695,DE -3557277696,3557285887,PL +3557277696,3557285887,NL 3557285888,3557294079,RU 3557294080,3557302271,DE 3557302272,3557310463,UA @@ -112103,8 +113546,8 @@ 3557340192,3557340927,BE 3557340928,3557341183,EU 3557341184,3557341439,BE -3557341440,3557341487,EU -3557341488,3557341527,BE +3557341440,3557341471,EU +3557341472,3557341527,BE 3557341528,3557341535,EU 3557341536,3557341551,BE 3557341552,3557341559,EU @@ -112132,14 +113575,14 @@ 3557360408,3557360415,GB 3557360416,3557360431,JE 3557360432,3557360471,GB -3557360472,3557360479,JE -3557360480,3557360495,GB +3557360472,3557360487,JE +3557360488,3557360495,GB 3557360496,3557360527,JE 3557360528,3557360535,GB 3557360536,3557360543,JE 3557360544,3557360559,GB -3557360560,3557360567,JE -3557360568,3557360623,GB +3557360560,3557360575,JE +3557360576,3557360623,GB 3557360624,3557360639,JE 3557360640,3557360680,GB 3557360681,3557360687,JE @@ -112163,8 +113606,8 @@ 3557361416,3557361423,JE 3557361424,3557361607,GB 3557361608,3557361615,JE -3557361616,3557361919,GB -3557361920,3557361983,JE +3557361616,3557361663,GB +3557361664,3557361983,JE 3557361984,3557362047,GB 3557362048,3557362431,JE 3557362432,3557362687,GB @@ -112179,8 +113622,8 @@ 3557364480,3557364495,JE 3557364496,3557364527,GB 3557364528,3557364559,JE -3557364560,3557364587,GB -3557364588,3557364607,JE +3557364560,3557364575,GB +3557364576,3557364607,JE 3557364608,3557364631,GB 3557364632,3557364639,JE 3557364640,3557364703,GB @@ -112342,14 +113785,14 @@ 3558154624,3558154751,CI 3558154752,3558154879,CM 3558154880,3558155007,SD -3558155008,3558155135,GB +3558155008,3558155135,A2 3558155136,3558155263,SD 3558155264,3558155391,ET -3558155392,3558155519,GB +3558155392,3558155519,A2 3558155520,3558156031,SD -3558156032,3558156032,GB +3558156032,3558156032,A2 3558156033,3558156287,KG -3558156288,3558162431,GB +3558156288,3558162431,A2 3558162432,3558170623,DE 3558170624,3558178815,GB 3558178816,3558187007,BG @@ -112439,9 +113882,7 @@ 3558290576,3558290591,GB 3558290592,3558290599,BE 3558290600,3558290615,GB -3558290616,3558290623,BE -3558290624,3558290655,GB -3558290656,3558290663,BE +3558290616,3558290663,BE 3558290664,3558290671,GB 3558290672,3558290687,BE 3558290688,3558290871,ES @@ -112530,7 +113971,8 @@ 3558368448,3558368479,DE 3558368480,3558368495,ES 3558368496,3558368511,US -3558368512,3558369503,AT +3558368512,3558369487,AT +3558369488,3558369503,CH 3558369504,3558369519,FR 3558369520,3558372351,AT 3558372352,3558372607,BG @@ -112601,9 +114043,7 @@ 3558738992,3558739007,GG 3558739008,3558739039,GB 3558739040,3558739055,GG -3558739056,3558739071,GB -3558739072,3558739087,GG -3558739088,3558739199,GB +3558739056,3558739199,GB 3558739200,3558739231,GG 3558739232,3558739295,GB 3558739296,3558739711,GG @@ -112879,7 +114319,9 @@ 3559091012,3559091015,GB 3559091016,3559091087,BE 3559091088,3559091091,GB -3559091092,3559091203,BE +3559091092,3559091159,BE +3559091160,3559091167,GB +3559091168,3559091203,BE 3559091204,3559091207,GB 3559091208,3559091211,BE 3559091212,3559091215,GB @@ -113247,8 +114689,8 @@ 3559903232,3559903743,UA 3559903744,3559904023,EE 3559904024,3559904255,UA -3559904256,3559904319,EE -3559904320,3559904607,UA +3559904256,3559904383,EE +3559904384,3559904607,UA 3559904608,3559904639,EE 3559904640,3559905019,UA 3559905020,3559905031,EE @@ -113899,8 +115341,7 @@ 3560941964,3560941967,FR 3560941968,3560941971,DE 3560941972,3560941975,DK -3560941976,3560941979,IT -3560941980,3560941983,DE +3560941976,3560941983,DE 3560941984,3560941987,NL 3560941988,3560941991,DE 3560941992,3560941995,GB @@ -114451,8 +115892,7 @@ 3560943520,3560943520,DK 3560943521,3560943521,DE 3560943522,3560943522,GB -3560943523,3560943523,IT -3560943524,3560943524,DE +3560943523,3560943524,DE 3560943525,3560943525,NL 3560943526,3560943526,IT 3560943527,3560943527,DE @@ -115381,7 +116821,9 @@ 3560947500,3560947686,JP 3560947687,3560947687,DE 3560947688,3560947711,JP -3560947712,3560950863,SE +3560947712,3560950839,SE +3560950840,3560950843,CZ +3560950844,3560950863,SE 3560950864,3560950867,DK 3560950868,3560950871,ES 3560950872,3560950956,SE @@ -115402,7 +116844,8 @@ 3560951196,3560951199,DK 3560951200,3560951207,SE 3560951208,3560951211,DK -3560951212,3560951307,SE +3560951212,3560951215,IT +3560951216,3560951307,SE 3560951308,3560951311,IT 3560951312,3560951376,SE 3560951377,3560951378,PL @@ -115433,7 +116876,8 @@ 3560951584,3560951587,FI 3560951588,3560951591,SE 3560951592,3560951595,NO -3560951596,3560951679,SE +3560951596,3560951599,CZ +3560951600,3560951679,SE 3560951680,3560951683,DE 3560951684,3560951807,SE 3560951808,3560951811,US @@ -115447,12 +116891,16 @@ 3560951916,3560951919,PL 3560951920,3560951935,SE 3560951936,3560951940,NL -3560951941,3560952223,SE +3560951941,3560951943,SE +3560951944,3560951947,NO +3560951948,3560952223,SE 3560952224,3560952227,CZ 3560952228,3560952231,SE 3560952232,3560952235,US 3560952236,3560952239,PT -3560952240,3560953103,SE +3560952240,3560952255,SE +3560952256,3560952259,PL +3560952260,3560953103,SE 3560953104,3560953119,JP 3560953120,3560954239,SE 3560954240,3560954367,AX @@ -115541,7 +116989,9 @@ 3561496960,3561497087,GB 3561497088,3561497119,NL 3561497120,3561497215,GB -3561497216,3561497423,NL +3561497216,3561497311,NL +3561497312,3561497327,GB +3561497328,3561497423,NL 3561497424,3561497471,GB 3561497472,3561497535,NL 3561497536,3561497599,GB @@ -116337,33 +117787,20 @@ 3563848576,3563848583,ES 3563848584,3563848655,NL 3563848656,3563848959,ES -3563848960,3563848967,NL -3563848968,3563848975,ES -3563848976,3563848979,NL +3563848960,3563848979,NL 3563848980,3563848983,ES 3563848984,3563848987,NL 3563848988,3563848999,ES 3563849000,3563849151,NL 3563849152,3563849183,ES -3563849184,3563849197,NL -3563849198,3563849215,ES +3563849184,3563849191,NL +3563849192,3563849215,ES 3563849216,3563849727,GB -3563849728,3563849991,NL -3563849992,3563849999,ES +3563849728,3563849999,NL 3563850000,3563850007,FI -3563850008,3563850015,NL -3563850016,3563850047,ES -3563850048,3563850239,NL -3563850240,3563850751,GB -3563850752,3563850767,NL -3563850768,3563850783,ES -3563850784,3563850815,NL -3563850816,3563850831,ES -3563850832,3563850847,NL -3563850848,3563850879,ES -3563850880,3563851007,NL -3563851008,3563851199,ES -3563851200,3563851839,NL +3563850008,3563851023,NL +3563851024,3563851135,ES +3563851136,3563851839,NL 3563851840,3563851903,ES 3563851904,3563851967,NL 3563851968,3563852095,ES @@ -116423,8 +117860,8 @@ 3564024144,3564024447,GB 3564024448,3564024463,IT 3564024464,3564024671,GB -3564024672,3564024831,IT -3564024832,3564027903,GB +3564024672,3564024783,IT +3564024784,3564027903,GB 3564027904,3564041215,DE 3564041216,3564041727,RU 3564041728,3564044287,DE @@ -116742,11 +118179,13 @@ 3564566048,3564566079,US 3564566080,3564566143,GB 3564566144,3564566175,US -3564566176,3564566271,GB -3564566272,3564566527,US +3564566176,3564566239,GB +3564566240,3564566527,US 3564566528,3564567047,GB 3564567048,3564567055,US -3564567056,3564567143,GB +3564567056,3564567079,GB +3564567080,3564567087,US +3564567088,3564567143,GB 3564567144,3564567151,US 3564567152,3564567183,GB 3564567184,3564567199,US @@ -116937,9 +118376,7 @@ 3564884408,3564884415,NL 3564884416,3564884431,GB 3564884432,3564884439,NL -3564884440,3564884455,GB -3564884456,3564884463,NL -3564884464,3564884487,GB +3564884440,3564884487,GB 3564884488,3564884519,NL 3564884520,3564884527,FR 3564884528,3564884552,NL @@ -117096,8 +118533,8 @@ 3564904448,3564912639,DE 3564912640,3564920831,BG 3564920832,3564922879,ES -3564922880,3564927999,US -3564928000,3564929023,RU +3564922880,3564928511,US +3564928512,3564929023,RU 3564929024,3564937215,AT 3564937216,3564945407,RS 3564945408,3564947175,GB @@ -117309,9 +118746,7 @@ 3565036288,3565036543,GB 3565036544,3565037119,IE 3565037120,3565037135,GB -3565037136,3565037199,IE -3565037200,3565037215,GB -3565037216,3565037279,IE +3565037136,3565037279,IE 3565037280,3565037567,GB 3565037568,3565037823,IE 3565037824,3565038591,GB @@ -117914,17 +119349,11 @@ 3567399048,3567399071,GB 3567399072,3567399103,DE 3567399104,3567399167,GB -3567399168,3567399263,DE -3567399264,3567399295,GB -3567399296,3567399391,DE +3567399168,3567399391,DE 3567399392,3567399423,GB 3567399424,3567399439,DE 3567399440,3567399487,GB -3567399488,3567399679,DE -3567399680,3567399687,GB -3567399688,3567399695,DE -3567399696,3567399743,GB -3567399744,3567399871,DE +3567399488,3567399871,DE 3567399872,3567399935,GB 3567399936,3567400703,DE 3567400704,3567400735,GB @@ -118124,7 +119553,9 @@ 3568595080,3568595087,A2 3568595088,3568599039,FR 3568599040,3568631807,PL -3568631808,3568697343,SE +3568631808,3568650695,SE +3568650696,3568650699,US +3568650700,3568697343,SE 3568697344,3568730111,PL 3568730112,3568746495,NL 3568746496,3568752895,FI @@ -118203,9 +119634,7 @@ 3569255072,3569255103,LU 3569255104,3569258975,BE 3569258976,3569259007,LU -3569259008,3569271815,BE -3569271816,3569271823,LU -3569271824,3569271871,BE +3569259008,3569271871,BE 3569271872,3569271903,NL 3569271904,3569271911,BE 3569271912,3569271919,DE @@ -118572,7 +120001,9 @@ 3570756192,3570756223,RU 3570756224,3570760543,FI 3570760544,3570760575,RU -3570760576,3570794495,FI +3570760576,3570783007,FI +3570783008,3570783023,AX +3570783024,3570794495,FI 3570794496,3570860031,SE 3570860032,3570892799,CH 3570892800,3570925567,SA @@ -118610,8 +120041,8 @@ 3571286016,3571318911,DE 3571318912,3571319167,GB 3571319168,3571319295,DE -3571319296,3571319679,GB -3571319680,3571319935,DE +3571319296,3571319711,GB +3571319712,3571319935,DE 3571319936,3571320063,GB 3571320064,3571320575,DE 3571320576,3571320855,GB @@ -119197,9 +120628,7 @@ 3574155728,3574155731,AT 3574155732,3574155739,DE 3574155740,3574155743,AT -3574155744,3574155851,DE -3574155852,3574155855,NO -3574155856,3574155883,DE +3574155744,3574155883,DE 3574155884,3574155887,NL 3574155888,3574159919,DE 3574159920,3574159927,NL @@ -119282,8 +120711,8 @@ 3574833408,3574833439,NL 3574833440,3574834431,GB 3574834432,3574834559,NL -3574834560,3574834687,GB -3574834688,3574835199,NL +3574834560,3574834943,GB +3574834944,3574835199,NL 3574835200,3574836351,GB 3574836352,3574838015,NL 3574838016,3574838271,GB @@ -120292,7 +121721,9 @@ 3576242184,3576242199,GB 3576242200,3576242319,FR 3576242320,3576242327,GB -3576242328,3576243967,FR +3576242328,3576242335,FR +3576242336,3576242343,GB +3576242344,3576243967,FR 3576243968,3576243999,GB 3576244000,3576244031,FR 3576244032,3576244047,GB @@ -120550,9 +121981,7 @@ 3576264576,3576264623,GB 3576264624,3576264639,FR 3576264640,3576264687,GB -3576264688,3576265279,FR -3576265280,3576265287,GB -3576265288,3576265303,FR +3576264688,3576265303,FR 3576265304,3576265311,GB 3576265312,3576265327,FR 3576265328,3576265335,GB @@ -120615,7 +122044,9 @@ 3576954880,3576987647,NO 3576987648,3577001983,GB 3577001984,3577003583,NL -3577003584,3577003771,GB +3577003584,3577003743,GB +3577003744,3577003767,NL +3577003768,3577003771,GB 3577003772,3577003775,NL 3577003776,3577020415,GB 3577020416,3577085951,NL @@ -121267,7 +122698,7 @@ 3580686336,3580688383,BG 3580688384,3580698623,RU 3580698624,3580702719,PL -3580702720,3580710911,RU +3580706816,3580710911,RU 3580710912,3580715007,UA 3580715008,3580719103,RU 3580719104,3580723199,NL @@ -121723,7 +123154,8 @@ 3583019376,3583023215,CH 3583023216,3583023223,DE 3583023224,3583025151,CH -3583025152,3583028991,IT +3583025152,3583025279,BR +3583025280,3583028991,IT 3583028992,3583029119,DJ 3583029120,3583029247,US 3583029248,3583029375,SG @@ -121902,9 +123334,7 @@ 3583706104,3583706107,NA 3583706108,3583706151,UA 3583706152,3583706159,NA -3583706160,3583706175,UA -3583706176,3583706183,NA -3583706184,3583706191,UA +3583706160,3583706191,UA 3583706192,3583706199,NA 3583706200,3583706223,UA 3583706224,3583706231,NA @@ -121963,8 +123393,8 @@ 3583707224,3583707519,UA 3583707520,3583707535,NA 3583707536,3583707663,UA -3583707664,3583707679,NA -3583707680,3583707751,UA +3583707664,3583707671,NA +3583707672,3583707751,UA 3583707752,3583707767,NA 3583707768,3583707775,UA 3583707776,3583707791,NA @@ -121996,10 +123426,10 @@ 3583709448,3583709455,NA 3583709456,3583709463,DE 3583709464,3583709479,UA -3583709480,3583709487,NA +3583709480,3583709487,US 3583709488,3583709503,UA -3583709504,3583709511,NA -3583709512,3583709527,UA +3583709504,3583709519,RU +3583709520,3583709527,UA 3583709528,3583709543,NA 3583709544,3583709551,UA 3583709552,3583709559,NA @@ -122025,7 +123455,7 @@ 3583709824,3583709831,NA 3583709832,3583709839,UA 3583709840,3583709863,NA -3583709864,3583709871,UA +3583709864,3583709871,RU 3583709872,3583709879,NA 3583709880,3583709887,UA 3583709888,3583709911,NA @@ -122033,15 +123463,15 @@ 3583709928,3583709943,NA 3583709944,3583710055,UA 3583710056,3583710063,NA -3583710064,3583710079,DE -3583710080,3583710087,NA +3583710064,3583710072,DE +3583710073,3583710087,NA 3583710088,3583710103,UA 3583710104,3583710111,NA 3583710112,3583710119,UA 3583710120,3583710135,NA 3583710136,3583710211,UA -3583710212,3583710223,NA -3583710224,3583710239,UA +3583710212,3583710215,NA +3583710216,3583710239,UA 3583710240,3583710247,NA 3583710248,3583710319,UA 3583710320,3583710335,NA @@ -122080,7 +123510,8 @@ 3583710968,3583710991,UA 3583710992,3583710999,NA 3583711000,3583711007,UA -3583711008,3583711023,NA +3583711008,3583711015,RU +3583711016,3583711023,NA 3583711024,3583711079,UA 3583711080,3583711087,GB 3583711088,3583711095,NA @@ -122102,7 +123533,9 @@ 3583711568,3583711591,NA 3583711592,3583711607,UA 3583711608,3583711615,NA -3583711616,3583711695,UA +3583711616,3583711631,UA +3583711632,3583711639,RU +3583711640,3583711695,UA 3583711696,3583711703,NA 3583711704,3583711711,UA 3583711712,3583711727,NA @@ -122114,8 +123547,8 @@ 3583711808,3583711823,NA 3583711824,3583711831,UA 3583711832,3583711839,NA -3583711840,3583711863,UA -3583711864,3583711879,NA +3583711840,3583711871,UA +3583711872,3583711879,NA 3583711880,3583712015,UA 3583712016,3583712031,NA 3583712032,3583712095,UA @@ -122160,16 +123593,16 @@ 3583713008,3583713015,RU 3583713016,3583713031,UA 3583713032,3583713039,NA -3583713040,3583713071,UA +3583713040,3583713063,UA +3583713064,3583713071,KP 3583713072,3583713079,NA 3583713080,3583713103,UA -3583713104,3583713111,NA +3583713104,3583713111,AZ 3583713112,3583713127,UA 3583713128,3583713135,IT 3583713136,3583713143,UA 3583713144,3583713151,NA -3583713152,3583713159,UA -3583713160,3583713167,NA +3583713152,3583713167,UA 3583713168,3583713175,EG 3583713176,3583713183,UA 3583713184,3583713191,NA @@ -122376,9 +123809,7 @@ 3584508944,3584508951,KY 3584508952,3584509231,GB 3584509232,3584509239,AW -3584509240,3584509359,GB -3584509360,3584509367,KY -3584509368,3584510999,GB +3584509240,3584510999,GB 3584511000,3584511007,KY 3584511008,3584511023,GB 3584511024,3584511039,KY @@ -122470,18 +123901,13 @@ 3584958464,3584966655,DE 3584966656,3584974847,DK 3584974848,3584983039,FR -3584983040,3584983807,US -3584983808,3584984063,UA -3584984064,3584984319,US -3584984320,3584984575,UA -3584984576,3584988607,US -3584988608,3584988623,UA -3584988624,3584988655,US +3584983040,3584988655,US 3584988656,3584988671,UA 3584988672,3584990303,US 3584990304,3584990463,UA 3584990464,3584990495,NL -3584990496,3584990527,UA +3584990496,3584990511,US +3584990512,3584990527,UA 3584990528,3584990591,US 3584990592,3584990719,GB 3584990720,3584991231,US @@ -122498,7 +123924,9 @@ 3585055072,3585055087,NG 3585055088,3585056767,GB 3585056768,3585064959,LB -3585064960,3585081343,GB +3585064960,3585071405,GB +3585071406,3585071409,IN +3585071410,3585081343,GB 3585081344,3585114111,IR 3585114112,3585122303,IS 3585122304,3585130495,ES @@ -122509,8 +123937,8 @@ 3585163264,3585171455,BE 3585171456,3585179647,RU 3585179648,3585189887,BE -3585189888,3585190399,DZ -3585190400,3585190527,BE +3585189888,3585190143,DZ +3585190144,3585190527,BE 3585190528,3585190655,DZ 3585190656,3585196031,BE 3585196032,3585204223,ES @@ -122556,7 +123984,9 @@ 3585515520,3585523711,RU 3585523712,3585531903,LV 3585531904,3585540095,AT -3585540096,3585548287,DE +3585540096,3585542335,DE +3585542336,3585542351,TR +3585542352,3585548287,DE 3585548288,3585556479,RU 3585556480,3585564671,DE 3585564672,3585572863,RU @@ -122815,8 +124245,8 @@ 3586270080,3586270207,NL 3586270208,3586271231,ES 3586271232,3586271487,NL -3586271488,3586271831,ES -3586271832,3586271839,IT +3586271488,3586271823,ES +3586271824,3586271839,IT 3586271840,3586271999,ES 3586272000,3586272255,IT 3586272256,3586272383,NL @@ -122904,7 +124334,7 @@ 3586678680,3586678687,MU 3586678688,3586678783,GB 3586678784,3586679039,IT -3586679040,3586679103,US +3586679040,3586679103,FR 3586679104,3586679167,DE 3586679168,3586679231,US 3586679232,3586679327,FR @@ -122931,7 +124361,9 @@ 3586680832,3586681087,FR 3586681088,3586681343,IT 3586681344,3586682111,FR -3586682112,3586682367,US +3586682112,3586682175,US +3586682176,3586682239,FR +3586682240,3586682367,US 3586682368,3586682399,AT 3586682400,3586682879,FR 3586682880,3586686975,US @@ -123064,11 +124496,9 @@ 3587162112,3587178495,IR 3587178496,3587178795,AT 3587178796,3587178799,US -3587178800,3587179279,AT -3587179280,3587179287,AU -3587179288,3587179439,AT +3587178800,3587179439,AT 3587179440,3587179455,GB -3587179456,3587179463,TR +3587179456,3587179463,AT 3587179464,3587179471,CH 3587179472,3587186687,AT 3587186688,3587194495,DE @@ -123095,7 +124525,9 @@ 3587228088,3587228127,GB 3587228128,3587228271,NL 3587228272,3587228287,GB -3587228288,3587228591,NL +3587228288,3587228351,NL +3587228352,3587228367,GB +3587228368,3587228591,NL 3587228592,3587228607,GB 3587228608,3587228640,NL 3587228641,3587228647,GB @@ -123137,7 +124569,9 @@ 3587232536,3587232711,GB 3587232712,3587232719,NL 3587232720,3587232767,GB -3587232768,3587233295,NL +3587232768,3587233103,NL +3587233104,3587233119,GB +3587233120,3587233295,NL 3587233296,3587233319,GB 3587233320,3587233343,NL 3587233344,3587233359,GB @@ -123189,11 +124623,7 @@ 3587238608,3587238911,GB 3587238912,3587239303,NL 3587239304,3587239311,GB -3587239312,3587239679,NL -3587239680,3587239687,GB -3587239688,3587239767,NL -3587239768,3587239775,GB -3587239776,3587239791,NL +3587239312,3587239791,NL 3587239792,3587239807,GB 3587239808,3587239871,NL 3587239872,3587239935,GB @@ -123663,9 +125093,7 @@ 3589581440,3589581567,GB 3589581568,3589581791,NL 3589581792,3589581823,GB -3589581824,3589582591,NL -3589582592,3589582607,GB -3589582608,3589582639,NL +3589581824,3589582639,NL 3589582640,3589582655,GB 3589582656,3589583359,NL 3589583360,3589583647,GB @@ -124105,9 +125533,7 @@ 3590254128,3590254135,RU 3590254136,3590254143,FR 3590254144,3590254271,US -3590254272,3590254303,FR -3590254304,3590254335,US -3590254336,3590254463,FR +3590254272,3590254463,FR 3590254464,3590254879,ES 3590254880,3590254911,FR 3590254912,3590254975,ES @@ -124123,7 +125549,7 @@ 3590256384,3590256639,IT 3590256640,3590256703,US 3590256704,3590256719,BE -3590256720,3590256735,IE +3590256720,3590256735,FR 3590256736,3590256767,BE 3590256768,3590257151,US 3590257152,3590258175,DE @@ -124132,7 +125558,9 @@ 3590258392,3590258431,FR 3590258432,3590258447,GB 3590258448,3590258463,FR -3590258464,3590258687,US +3590258464,3590258495,US +3590258496,3590258559,FR +3590258560,3590258687,US 3590258688,3590291455,IT 3590291456,3590299647,EG 3590299648,3590307839,FI @@ -124145,26 +125573,21 @@ 3590308048,3590308055,NG 3590308056,3590308063,A2 3590308064,3590308071,ZW -3590308072,3590308079,A2 -3590308080,3590308087,MW +3590308072,3590308087,A2 3590308088,3590308095,AO -3590308096,3590308119,A2 -3590308120,3590308127,IQ -3590308128,3590308175,A2 -3590308176,3590308183,NG +3590308096,3590308183,A2 3590308184,3590308191,IQ 3590308192,3590308199,A2 -3590308200,3590308231,IQ -3590308232,3590308247,A2 +3590308200,3590308223,IQ +3590308224,3590308247,A2 3590308248,3590308263,IQ 3590308264,3590308271,A2 3590308272,3590308287,IQ -3590308288,3590308295,A2 -3590308296,3590308303,IQ +3590308288,3590308303,A2 3590308304,3590308311,SO 3590308312,3590308319,IQ -3590308320,3590308327,A2 -3590308328,3590308343,IQ +3590308320,3590308335,A2 +3590308336,3590308343,IQ 3590308344,3590308607,A2 3590308608,3590308735,NG 3590308736,3590308767,A2 @@ -124173,29 +125596,27 @@ 3590308784,3590308799,ZW 3590308800,3590308807,A2 3590308808,3590308815,ZM -3590308816,3590308831,KE +3590308816,3590308823,KE +3590308824,3590308831,A2 3590308832,3590308839,ZW 3590308840,3590308847,ET 3590308848,3590308855,A2 3590308856,3590308863,NG -3590308864,3590308911,A2 -3590308912,3590308927,ZW -3590308928,3590308951,A2 +3590308864,3590308951,A2 3590308952,3590308959,GH -3590308960,3590308991,A2 -3590308992,3590308999,NG +3590308960,3590308999,A2 3590309000,3590309007,UG 3590309008,3590309023,TZ -3590309024,3590309055,ZW +3590309024,3590309039,A2 +3590309040,3590309055,ZW 3590309056,3590309063,CD -3590309064,3590309071,LU +3590309064,3590309071,A2 3590309072,3590309079,MW 3590309080,3590309103,NG 3590309104,3590309111,ZW 3590309112,3590309119,A2 3590309120,3590309375,GB -3590309376,3590309503,A2 -3590309504,3590309511,NG +3590309376,3590309511,A2 3590309512,3590309519,AO 3590309520,3590309527,NG 3590309528,3590309535,CM @@ -124206,43 +125627,39 @@ 3590309584,3590309615,A2 3590309616,3590309623,UG 3590309624,3590309631,ZW -3590309632,3590309647,IQ -3590309648,3590309679,A2 -3590309680,3590309695,IQ -3590309696,3590309711,A2 -3590309712,3590309719,IQ -3590309720,3590309727,A2 -3590309728,3590309759,IQ -3590309760,3590309775,A2 -3590309776,3590309783,IQ -3590309784,3590309799,A2 +3590309632,3590309639,A2 +3590309640,3590309647,IQ +3590309648,3590309687,A2 +3590309688,3590309695,IQ +3590309696,3590309727,A2 +3590309728,3590309743,IQ +3590309744,3590309751,A2 +3590309752,3590309759,IQ +3590309760,3590309799,A2 3590309800,3590309807,IQ -3590309808,3590309823,A2 -3590309824,3590309839,IQ -3590309840,3590309863,A2 -3590309864,3590309871,IQ -3590309872,3590309879,A2 +3590309808,3590309831,A2 +3590309832,3590309839,IQ +3590309840,3590309879,A2 3590309880,3590309887,IQ -3590309888,3590310143,A2 -3590310144,3590310159,MZ +3590309888,3590310159,A2 3590310160,3590310167,IQ 3590310168,3590310175,A2 3590310176,3590310183,LR 3590310184,3590310191,IQ -3590310192,3590310247,A2 -3590310248,3590310255,IQ -3590310256,3590310279,A2 +3590310192,3590310279,A2 3590310280,3590310287,IQ 3590310288,3590310288,A2 3590310289,3590310303,IQ 3590310304,3590310327,A2 3590310328,3590310335,NG -3590310336,3590310351,IQ -3590310352,3590310367,A2 -3590310368,3590310399,IQ -3590310400,3590310655,UA +3590310336,3590310343,IQ +3590310344,3590310391,A2 +3590310392,3590310399,IQ +3590310400,3590310655,A2 3590310656,3590310911,GB -3590310912,3590311423,A2 +3590310912,3590311247,A2 +3590311248,3590311255,NG +3590311256,3590311423,A2 3590311424,3590311679,GB 3590311680,3590311935,YT 3590311936,3590312703,MW @@ -124283,28 +125700,20 @@ 3590316032,3590316039,TZ 3590316040,3590316047,A2 3590316048,3590316055,GH -3590316056,3590316079,IQ +3590316056,3590316071,IQ +3590316072,3590316079,A2 3590316080,3590316087,LB -3590316088,3590316095,A2 -3590316096,3590316127,IQ +3590316088,3590316127,A2 3590316128,3590316151,NG -3590316152,3590316159,A2 -3590316160,3590316175,LB -3590316176,3590316199,A2 -3590316200,3590316215,IQ -3590316216,3590316231,A2 +3590316152,3590316231,A2 3590316232,3590316239,LB 3590316240,3590316271,A2 3590316272,3590316279,IQ -3590316280,3590316287,A2 -3590316288,3590316543,LB -3590316544,3590316567,A2 +3590316280,3590316567,A2 3590316568,3590316575,IQ 3590316576,3590316591,A2 3590316592,3590316599,IQ -3590316600,3590316647,A2 -3590316648,3590316655,LY -3590316656,3590316663,IQ +3590316600,3590316663,A2 3590316664,3590316671,LY 3590316672,3590316727,A2 3590316728,3590316735,LB @@ -124313,18 +125722,18 @@ 3590316832,3590317055,A2 3590317056,3590317311,NG 3590317312,3590317343,AO -3590317344,3590317407,A2 -3590317408,3590317439,US +3590317344,3590317439,A2 3590317440,3590317447,AM 3590317448,3590317455,LB -3590317456,3590317471,IQ +3590317456,3590317463,IQ +3590317464,3590317471,A2 3590317472,3590317479,MW -3590317480,3590317487,US -3590317488,3590317495,A2 +3590317480,3590317495,A2 3590317496,3590317503,LB -3590317504,3590317519,A2 -3590317520,3590317527,LY -3590317528,3590317823,IQ +3590317504,3590317527,A2 +3590317528,3590317543,IQ +3590317544,3590317567,A2 +3590317568,3590317823,IQ 3590317824,3590317951,A2 3590317952,3590318047,UA 3590318048,3590319167,A2 @@ -124335,76 +125744,64 @@ 3590319424,3590319455,AE 3590319456,3590319967,A2 3590319968,3590319999,AE -3590320000,3590320191,A2 -3590320192,3590320199,LB +3590320000,3590320199,A2 3590320200,3590320207,IQ 3590320208,3590320231,A2 3590320232,3590320239,IQ -3590320240,3590320247,A2 -3590320248,3590320255,LB -3590320256,3590320271,A2 -3590320272,3590320295,IQ -3590320296,3590320303,A2 +3590320240,3590320303,A2 3590320304,3590320319,IQ 3590320320,3590320335,A2 3590320336,3590320343,UG -3590320344,3590320367,IQ -3590320368,3590320375,A2 +3590320344,3590320351,A2 +3590320352,3590320359,IQ +3590320360,3590320375,A2 3590320376,3590320383,IQ 3590320384,3590321151,A2 3590321152,3590321663,IQ 3590321664,3590321679,A2 3590321680,3590321687,CM -3590321688,3590321695,IQ +3590321688,3590321695,A2 3590321696,3590321711,ZW -3590321712,3590321727,IQ -3590321728,3590321791,A2 -3590321792,3590321823,IQ -3590321824,3590321855,A2 -3590321856,3590321887,IQ -3590321888,3590321927,A2 -3590321928,3590321935,IQ -3590321936,3590321943,LY +3590321712,3590321943,A2 3590321944,3590321959,IQ 3590321960,3590321967,A2 3590321968,3590321983,TR 3590321984,3590322007,A2 3590322008,3590322015,IQ -3590322016,3590322047,A2 -3590322048,3590322055,NG -3590322056,3590322063,A2 -3590322064,3590322079,IQ -3590322080,3590322111,A2 +3590322016,3590322063,A2 +3590322064,3590322071,IQ +3590322072,3590322111,A2 3590322112,3590322119,BJ -3590322120,3590322127,IQ +3590322120,3590322127,A2 3590322128,3590322135,GH 3590322136,3590322151,A2 3590322152,3590322159,LY -3590322160,3590322167,A2 -3590322168,3590322239,IQ -3590322240,3590322255,A2 -3590322256,3590322271,RW -3590322272,3590322335,A2 +3590322160,3590322175,A2 +3590322176,3590322239,IQ +3590322240,3590322335,A2 3590322336,3590322351,MG -3590322352,3590322375,A2 -3590322376,3590322383,LY -3590322384,3590322399,IQ +3590322352,3590322391,A2 +3590322392,3590322399,IQ 3590322400,3590322415,AO -3590322416,3590322423,LR -3590322424,3590322431,A2 +3590322416,3590322431,A2 3590322432,3590322559,LB -3590322560,3590322575,A2 -3590322576,3590322687,LB +3590322560,3590322607,A2 +3590322608,3590322687,LB 3590322688,3590323199,IQ 3590323200,3590323711,MW 3590323712,3590323903,A2 3590323904,3590323911,CD -3590323912,3590324023,A2 +3590323912,3590323967,A2 +3590323968,3590323975,SD +3590323976,3590323983,A2 +3590323984,3590323991,NG +3590323992,3590324023,A2 3590324024,3590324031,ZW 3590324032,3590324095,NG 3590324096,3590324103,A2 3590324104,3590324111,ZW -3590324112,3590324223,A2 +3590324112,3590324215,A2 +3590324216,3590324223,NG 3590324224,3623890943,US 3623890944,3623891199,ZA 3623891200,3623891455,US @@ -124433,7 +125830,7 @@ 3624284160,3624288255,CA 3624288256,3624290303,IN 3624290304,3624292351,CA -3624292352,3624292607,GP +3624292352,3624292607,MF 3624292608,3624294143,CA 3624294144,3624294399,US 3624294400,3624295935,CA @@ -124625,7 +126022,7 @@ 3624549888,3624550143,A2 3624550144,3624587263,US 3624587264,3624591359,JM -3624591360,3624730623,US +3624595456,3624730623,US 3624730624,3624796159,CA 3624796160,3624798207,US 3624798208,3624799231,CA @@ -124709,7 +126106,9 @@ 3624903424,3624903551,US 3624903552,3624903583,CA 3624903584,3624903679,US -3624903680,3624904703,CA +3624903680,3624903807,CA +3624903808,3624903935,US +3624903936,3624904703,CA 3624904704,3624904767,IN 3624904768,3624905087,US 3624905088,3624905151,CA @@ -125752,9 +127151,7 @@ 3628128704,3628128719,CA 3628128720,3628129087,US 3628129088,3628129103,CA -3628129104,3628138751,US -3628138752,3628139007,GB -3628139008,3628139311,US +3628129104,3628139311,US 3628139312,3628139327,SG 3628139328,3628139343,GB 3628139344,3628139487,US @@ -125767,9 +127164,7 @@ 3628139968,3628139999,AU 3628140000,3628140351,US 3628140352,3628140415,RU -3628140416,3628143615,US -3628143616,3628143871,GB -3628143872,3628145919,US +3628140416,3628145919,US 3628145920,3628146175,AU 3628146176,3628146527,US 3628146528,3628146559,GB @@ -126502,7 +127897,9 @@ 3631015254,3631015269,CA 3631015270,3631015295,US 3631015296,3631015311,CN -3631015312,3631016243,US +3631015312,3631015887,US +3631015888,3631015903,CN +3631015904,3631016243,US 3631016244,3631016257,BD 3631016258,3631016555,US 3631016556,3631016571,CN @@ -126540,8 +127937,7 @@ 3631058592,3631059229,US 3631059230,3631059239,NO 3631059240,3631112191,US -3631112192,3631112703,VC -3631112704,3631116543,BB +3631112192,3631116543,BB 3631116544,3631117567,GD 3631117568,3631117823,BB 3631117824,3631118079,GD @@ -126727,8 +128123,7 @@ 3632483408,3632483415,CA 3632483416,3632483423,US 3632483424,3632483455,SK -3632483456,3632483471,HK -3632483472,3632483551,US +3632483456,3632483551,US 3632483552,3632483583,GB 3632483584,3632483599,US 3632483600,3632483607,AU @@ -126928,8 +128323,8 @@ 3632491088,3632491151,US 3632491152,3632491167,IN 3632491168,3632491231,US -3632491232,3632491239,CA -3632491240,3632491263,US +3632491232,3632491247,CA +3632491248,3632491263,US 3632491264,3632491327,DM 3632491328,3632491343,FR 3632491344,3632491359,BR @@ -127152,9 +128547,7 @@ 3633032544,3633032567,NG 3633032568,3633032591,US 3633032592,3633032607,A2 -3633032608,3633032959,US -3633032960,3633033215,A2 -3633033216,3633033247,US +3633032608,3633033247,US 3633033248,3633033255,A2 3633033256,3633033263,US 3633033264,3633033271,A2 @@ -127237,7 +128630,9 @@ 3633548544,3633548799,GA 3633548800,3633548927,A2 3633548928,3633549055,GA -3633549056,3633549567,A2 +3633549056,3633549375,A2 +3633549376,3633549391,US +3633549392,3633549567,A2 3633549568,3633549823,GA 3633549824,3633550079,A2 3633550080,3633550335,US @@ -127318,7 +128713,9 @@ 3634053120,3634061311,CL 3634061312,3634065311,US 3634065312,3634065343,SV -3634065344,3634125831,US +3634065344,3634094079,US +3634094080,3634098175,SE +3634098176,3634125831,US 3634125832,3634125839,CA 3634125840,3634125855,JP 3634125856,3634125887,US @@ -127565,9 +128962,7 @@ 3636164328,3636164335,CA 3636164336,3636164351,US 3636164352,3636164607,CA -3636164608,3636165119,US -3636165120,3636165375,CA -3636165376,3636165471,US +3636164608,3636165471,US 3636165472,3636165503,CA 3636165504,3636166143,US 3636166144,3636166655,CA @@ -127996,7 +129391,7 @@ 3639397024,3639397119,A2 3639397120,3639397375,IN 3639397376,3639397631,US -3639397632,3639397887,NG +3639397632,3639397887,A2 3639397888,3639398399,US 3639398400,3639398423,A2 3639398424,3639398431,LB @@ -128148,7 +129543,13 @@ 3639886592,3639886599,SG 3639886600,3639888927,US 3639888928,3639888959,NO -3639888960,3639902207,US +3639888960,3639892359,US +3639892360,3639892367,ID +3639892368,3639892375,US +3639892376,3639892383,ID +3639892384,3639892415,US +3639892416,3639892431,MX +3639892432,3639902207,US 3639902208,3639918591,PE 3639918592,3639934975,AR 3639934976,3640001751,US @@ -128211,9 +129612,7 @@ 3640318976,3640319103,GQ 3640319104,3640319231,US 3640319232,3640319487,NG -3640319488,3640319743,US -3640319744,3640319999,A2 -3640320000,3640344959,US +3640319488,3640344959,US 3640344960,3640345007,MX 3640345008,3640345023,US 3640345024,3640345086,MX @@ -128268,7 +129667,9 @@ 3640560512,3640560527,US 3640560528,3640564455,CA 3640564456,3640564463,US -3640564464,3640582143,CA +3640564464,3640565631,CA +3640565632,3640565647,US +3640565648,3640582143,CA 3640582144,3640647679,US 3640647680,3640651775,JP 3640651776,3640655871,US @@ -128288,9 +129689,7 @@ 3641103720,3641103727,HU 3641103728,3641106951,DE 3641106952,3641106959,CH -3641106960,3641114031,DE -3641114032,3641114039,SK -3641114040,3641134367,DE +3641106960,3641134367,DE 3641134368,3641134375,BE 3641134376,3641140671,DE 3641140672,3641140679,US @@ -128495,7 +129894,11 @@ 3641670792,3641670911,GB 3641670912,3641671679,LS 3641671680,3641679871,RU -3641679872,3641683967,EU +3641679872,3641680127,DK +3641680128,3641681151,GB +3641681152,3641681407,SE +3641681408,3641681663,FR +3641681664,3641683967,EU 3641683968,3641688063,KZ 3641688064,3641692159,RU 3641692160,3641696255,IT @@ -128625,7 +130028,9 @@ 3641774080,3641778175,DE 3641778176,3641782271,PL 3641782272,3641784079,GB -3641784080,3641786367,BG +3641784080,3641784319,BG +3641784320,3641784575,GB +3641784576,3641786367,BG 3641786368,3641790463,SE 3641790464,3641794559,LT 3641794560,3641798655,RS @@ -128733,6 +130138,7 @@ 3642031744,3642031871,A2 3642031872,3642032127,GB 3642032128,3642036223,PS +3642036224,3642040319,HU 3642040320,3642048511,BY 3642048512,3642053439,A2 3642053440,3642053631,TZ @@ -128809,9 +130215,7 @@ 3642150912,3642163199,IT 3642163200,3642164046,NL 3642164047,3642164048,AF -3642164049,3642164595,NL -3642164596,3642164663,HK -3642164664,3642167295,NL +3642164049,3642167295,NL 3642167296,3642171391,RU 3642171392,3642175487,JO 3642175488,3642179583,DE @@ -128949,8 +130353,8 @@ 3642552832,3642552847,EE 3642552848,3642553095,UA 3642553096,3642553097,LV -3642553098,3642553103,UA -3642553104,3642553139,LV +3642553098,3642553099,UA +3642553100,3642553139,LV 3642553140,3642553143,UA 3642553144,3642553175,LV 3642553176,3642553183,UA @@ -128972,14 +130376,16 @@ 3642553520,3642553523,UA 3642553524,3642553535,RU 3642553536,3642553543,DE -3642553544,3642553589,RU +3642553544,3642553575,RU +3642553576,3642553579,UA +3642553580,3642553589,RU 3642553590,3642553591,UA 3642553592,3642553599,RU 3642553600,3642553855,UA 3642553856,3642553925,RU 3642553926,3642553935,UA -3642553936,3642553951,RU -3642553952,3642554111,UA +3642553936,3642553959,RU +3642553960,3642554111,UA 3642554112,3642554119,RU 3642554120,3642554123,UA 3642554124,3642554151,RU @@ -129013,7 +130419,7 @@ 3642554976,3642554977,CZ 3642554978,3642554979,FR 3642554980,3642554983,BE -3642554984,3642554987,DE +3642554984,3642554987,UA 3642554988,3642554989,FR 3642554990,3642554991,UA 3642554992,3642555015,DE @@ -129049,7 +130455,8 @@ 3642555736,3642555743,GB 3642555744,3642555759,SE 3642555760,3642555771,GB -3642555772,3642555783,SE +3642555772,3642555775,SE +3642555776,3642555783,UA 3642555784,3642555787,GB 3642555788,3642555789,UA 3642555790,3642555791,SE @@ -130540,8 +131947,8 @@ 3647965280,3647965295,ES 3647965296,3647965303,DE 3647965304,3647965311,ES -3647965312,3647965327,DE -3647965328,3647965343,ES +3647965312,3647965319,DE +3647965320,3647965343,ES 3647965344,3647965351,DE 3647965352,3647965359,ES 3647965360,3647965375,DE @@ -130561,12 +131968,17 @@ 3647970304,3647971327,FR 3647971328,3647971671,GB 3647971672,3647971679,DE -3647971680,3647972215,GB +3647971680,3647972191,GB +3647972192,3647972199,DE +3647972200,3647972215,GB 3647972216,3647972223,DE 3647972224,3647972259,GB 3647972260,3647972263,DE -3647972264,3647972351,GB -3647972352,3647973783,IT +3647972264,3647972343,GB +3647972344,3647972351,DE +3647972352,3647973679,IT +3647973680,3647973695,DE +3647973696,3647973783,IT 3647973784,3647973791,DE 3647973792,3647973967,IT 3647973968,3647973975,DE @@ -130574,7 +131986,9 @@ 3647974048,3647974055,DE 3647974056,3647974399,IT 3647974400,3647976447,ES -3647976448,3647976559,BE +3647976448,3647976503,BE +3647976504,3647976511,DE +3647976512,3647976559,BE 3647976560,3647976575,FR 3647976576,3647976607,BE 3647976608,3647976639,BR @@ -130590,14 +132004,20 @@ 3647976792,3647976799,DE 3647976800,3647976927,BE 3647976928,3647976935,DE -3647976936,3647977047,BE -3647977048,3647977215,DE +3647976936,3647977071,BE +3647977072,3647977087,DE +3647977088,3647977119,BE +3647977120,3647977215,DE 3647977216,3647977471,BE 3647977472,3647977791,GB 3647977792,3647977855,IE 3647977856,3647978495,GB -3647978496,3647979007,NL -3647979008,3647979519,DE +3647978496,3647978775,NL +3647978776,3647978783,DE +3647978784,3647978871,NL +3647978872,3647978879,DE +3647978880,3647978887,NL +3647978888,3647979519,DE 3647979520,3647980543,FR 3647980544,3647981055,GB 3647981056,3647981567,IE @@ -131199,7 +132619,8 @@ 3651108864,3651141631,EE 3651141632,3651173375,DE 3651173376,3651173631,ES -3651173632,3651199487,DE +3651173632,3651199231,DE +3651199232,3651199487,ES 3651199488,3651199743,GB 3651199744,3651200255,ES 3651200256,3651201023,PL @@ -131325,6 +132746,7 @@ 3651846144,3651850239,NO 3651850240,3651854335,RU 3651854336,3651858431,IT +3651858432,3651862527,IR 3651862528,3651866623,RU 3651866624,3651870719,FR 3651870720,3651874815,IT @@ -131449,7 +132871,7 @@ 3651964928,3651969023,SK 3651969024,3651977215,DE 3651977216,3651985407,IT -3651985408,3651993599,PL +3651985408,3651997695,PL 3651997696,3652001791,RU 3652001792,3652005887,HU 3652005888,3652009983,GB @@ -131614,78 +133036,56 @@ 3653402624,3653403135,AT 3653403136,3653403647,CD 3653403648,3653403903,ZW -3653403904,3653403911,UA +3653403904,3653403911,A2 3653403912,3653403919,IQ -3653403920,3653403931,UA -3653403932,3653403935,A2 -3653403936,3653403943,IQ +3653403920,3653403927,A2 +3653403928,3653403931,UA +3653403932,3653403943,A2 3653403944,3653403951,LB 3653403952,3653403959,IQ 3653403960,3653403967,MW -3653403968,3653403983,NG +3653403968,3653403975,NG +3653403976,3653403983,A2 3653403984,3653403999,UA 3653404000,3653404008,LB -3653404009,3653404015,A2 -3653404016,3653404023,LB -3653404024,3653404039,A2 -3653404040,3653404055,IQ -3653404056,3653404063,A2 +3653404009,3653404039,A2 +3653404040,3653404047,IQ +3653404048,3653404063,A2 3653404064,3653404071,LB 3653404072,3653404079,AO 3653404080,3653404087,UA -3653404088,3653404095,LB -3653404096,3653404103,IQ -3653404104,3653404111,A2 -3653404112,3653404119,MD -3653404120,3653404127,A2 +3653404088,3653404127,A2 3653404128,3653404135,RS 3653404136,3653404159,A2 3653404160,3653404415,AT 3653404416,3653404543,A2 3653404544,3653404559,NG -3653404560,3653404567,IQ -3653404568,3653404575,LY -3653404576,3653404591,TR -3653404592,3653404607,A2 -3653404608,3653404655,UA +3653404560,3653404639,A2 +3653404640,3653404655,UA 3653404656,3653404671,A2 3653404672,3653404679,TR 3653404680,3653404707,A2 3653404708,3653404713,IQ 3653404714,3653404719,A2 3653404720,3653404735,LB -3653404736,3653404751,A2 -3653404752,3653404759,AM -3653404760,3653404815,A2 -3653404816,3653404831,LB +3653404736,3653404823,A2 +3653404824,3653404831,LB 3653404832,3653404847,NG 3653404848,3653404855,A2 3653404856,3653404863,SL -3653404864,3653404871,LY -3653404872,3653404879,A2 -3653404880,3653404887,UA -3653404888,3653404903,A2 +3653404864,3653404903,A2 3653404904,3653404911,IQ 3653404912,3653404919,LY 3653404920,3653404959,A2 3653404960,3653404975,UA -3653404976,3653404983,A2 -3653404984,3653404991,AM -3653404992,3653404999,IQ -3653405000,3653405007,A2 -3653405008,3653405031,LB -3653405032,3653405039,A2 +3653404976,3653405039,A2 3653405040,3653405047,LB 3653405048,3653405055,IQ 3653405056,3653405063,A2 -3653405064,3653405079,IQ -3653405080,3653405087,A2 -3653405088,3653405095,LY +3653405064,3653405071,IQ +3653405072,3653405095,A2 3653405096,3653405103,NG -3653405104,3653405119,A2 -3653405120,3653405135,ZW -3653405136,3653405151,UA -3653405152,3653405167,A2 +3653405104,3653405167,A2 3653405168,3653405183,UA 3653405184,3653405439,AT 3653405440,3653407015,A2 @@ -131693,16 +133093,14 @@ 3653407024,3653407031,A2 3653407032,3653407039,ZW 3653407040,3653407071,NG -3653407072,3653407087,A2 -3653407088,3653407095,NG -3653407096,3653407103,A2 +3653407072,3653407103,A2 3653407104,3653407111,UG 3653407112,3653407119,ZM 3653407120,3653407127,ZW 3653407128,3653407167,A2 3653407168,3653407231,NG -3653407232,3653407359,A2 -3653407360,3653407375,NG +3653407232,3653407367,A2 +3653407368,3653407375,NG 3653407376,3653407391,A2 3653407392,3653407399,NG 3653407400,3653407423,A2 @@ -131723,17 +133121,13 @@ 3653408048,3653408063,A2 3653408064,3653408071,ZM 3653408072,3653408079,NG -3653408080,3653408087,MW -3653408088,3653408143,A2 +3653408080,3653408143,A2 3653408144,3653408151,NG -3653408152,3653408159,ZM -3653408160,3653408167,A2 +3653408152,3653408167,A2 3653408168,3653408175,ZW 3653408176,3653408183,A2 3653408184,3653408191,MW -3653408192,3653408215,A2 -3653408216,3653408223,MW -3653408224,3653408231,A2 +3653408192,3653408231,A2 3653408232,3653408239,KE 3653408240,3653408247,ZM 3653408248,3653408767,A2 @@ -131742,13 +133136,11 @@ 3653409040,3653409047,NG 3653409048,3653409087,A2 3653409088,3653409095,CD -3653409096,3653409103,A2 -3653409104,3653409127,NG +3653409096,3653409111,A2 +3653409112,3653409127,NG 3653409128,3653409143,CD 3653409144,3653409151,NG -3653409152,3653409175,A2 -3653409176,3653409183,NG -3653409184,3653409191,A2 +3653409152,3653409191,A2 3653409192,3653409199,NG 3653409200,3653409223,A2 3653409224,3653409231,NG @@ -131763,8 +133155,7 @@ 3653409640,3653409647,A2 3653409648,3653409663,NG 3653409664,3653409791,CM -3653409792,3653409855,ZW -3653409856,3653409919,A2 +3653409792,3653409919,A2 3653409920,3653410047,NG 3653410048,3653410063,YT 3653410064,3653410079,UG @@ -131787,8 +133178,7 @@ 3653410256,3653410263,A2 3653410264,3653410271,NG 3653410272,3653410279,SD -3653410280,3653410287,LU -3653410288,3653410295,A2 +3653410280,3653410295,A2 3653410296,3653410303,MW 3653410304,3653410815,GB 3653410816,3653414911,CZ @@ -131813,7 +133203,9 @@ 3653472560,3653472567,NL 3653472568,3653472575,AF 3653472576,3653472591,NL -3653472592,3653472807,AF +3653472592,3653472767,AF +3653472768,3653472775,NL +3653472776,3653472807,AF 3653472808,3653472815,NL 3653472816,3653472823,AF 3653472824,3653472831,NL @@ -131840,8 +133232,8 @@ 3653518368,3653518399,SK 3653518400,3653518479,AT 3653518480,3653518495,SK -3653518496,3653519815,AT -3653519816,3653519839,SK +3653518496,3653519823,AT +3653519824,3653519839,SK 3653519840,3653520223,AT 3653520224,3653520255,SK 3653520256,3653522975,AT @@ -131861,6 +133253,7 @@ 3653525216,3653525503,AT 3653525504,3653529599,RU 3653529600,3653533695,CZ +3653533696,3653537791,IT 3653537792,3653541887,AT 3653541888,3653545983,UA 3653545984,3653550079,CH @@ -131870,6 +133263,7 @@ 3653559672,3653559679,US 3653559680,3653566463,GB 3653566464,3653570559,RU +3653570560,3653574655,ES 3653574656,3653578751,CZ 3653578752,3653582847,SE 3653582848,3653586943,PL @@ -132299,8 +133693,22 @@ 3743120384,3743121407,JP 3743121408,3743125503,MY 3743125504,3743129599,ID +3743129600,3743130623,HK +3743130624,3743131647,AP +3743131648,3743133695,SG +3743133696,3743134719,AU +3743135744,3743136767,CN +3743136768,3743137791,MY +3743137792,3743154175,TH 3743154176,3743186943,MY 3743186944,3743219711,KR +3743219712,3743252479,JP +3743252480,3743260671,NC +3743268864,3743277055,IN +3743277056,3743281151,PK +3743281152,3743282175,AU +3743283200,3743284223,HK +3743284224,3743285247,PK 3743285248,3743416319,IN 3743416320,3745513471,KR 3745513472,3749838847,CN @@ -132312,7 +133720,7 @@ 3749855232,3749969919,KR 3749969920,3750232063,JP 3750232064,3750756351,TW -3751804928,3752067071,CN +3750756352,3752067071,CN 3752067072,3752132607,ID 3752132608,3752133631,BD 3752133632,3752134655,ID @@ -132325,6 +133733,7 @@ 3752165376,3752198143,KR 3752198144,3752329215,CN 3752329216,3752853503,KR +3752853504,3753902079,IN 3753902080,3754033151,CN 3754033152,3754164223,KR 3754164224,3754229759,IN @@ -132345,6 +133754,7 @@ 3755986944,3755988991,JP 3755988992,3755990015,HK 3755991040,3755999231,JP +3755999232,3757047807,IN 3757047808,3757834239,CN 3757834240,3757867007,AU 3757899776,3757965311,KR diff --git a/src/or/Makefile.am b/src/or/Makefile.am index 9d8fb663cf..ef9c9903b3 100644 --- a/src/or/Makefile.am +++ b/src/or/Makefile.am @@ -21,7 +21,7 @@ libtor_a_SOURCES = buffers.c circuitbuild.c circuitlist.c \ cpuworker.c directory.c dirserv.c dirvote.c \ dns.c dnsserv.c geoip.c hibernate.c main.c $(tor_platform_source) \ microdesc.c \ - networkstatus.c onion.c policies.c \ + networkstatus.c nodelist.c onion.c policies.c \ reasons.c relay.c rendcommon.c rendclient.c rendmid.c \ rendservice.c rephist.c router.c routerlist.c routerparse.c \ $(evdns_source) config_codedigest.c @@ -56,6 +56,7 @@ noinst_HEADERS = buffers.h circuitbuild.h circuitlist.h circuituse.h \ command.h config.h connection_edge.h connection.h connection_or.h \ control.h cpuworker.h directory.h dirserv.h dirvote.h dns.h \ dnsserv.h geoip.h hibernate.h main.h microdesc.h networkstatus.h \ + nodelist.h \ ntmain.h onion.h policies.h reasons.h relay.h rendclient.h \ rendcommon.h rendmid.h rendservice.h rephist.h router.h routerlist.h \ routerparse.h or.h eventdns.h eventdns_tor.h micro-revision.i diff --git a/src/or/buffers.c b/src/or/buffers.c index 11c656f23a..08ed8910a3 100644 --- a/src/or/buffers.c +++ b/src/or/buffers.c @@ -640,14 +640,10 @@ read_to_chunk_tls(buf_t *buf, chunk_t *chunk, tor_tls_t *tls, * (because of EOF), set *<b>reached_eof</b> to 1 and return 0. Return -1 on * error; else return the number of bytes read. */ -/* XXXX021 indicate "read blocked" somehow? */ int read_to_buf(int s, size_t at_most, buf_t *buf, int *reached_eof, int *socket_error) { - /* XXXX021 It's stupid to overload the return values for these functions: - * "error status" and "number of bytes read" are not mutually exclusive. - */ int r = 0; size_t total_read = 0; @@ -815,9 +811,6 @@ flush_chunk_tls(tor_tls_t *tls, buf_t *buf, chunk_t *chunk, int flush_buf(int s, buf_t *buf, size_t sz, size_t *buf_flushlen) { - /* XXXX021 It's stupid to overload the return values for these functions: - * "error status" and "number of bytes flushed" are not mutually exclusive. - */ int r; size_t flushed = 0; tor_assert(buf_flushlen); @@ -1119,8 +1112,7 @@ fetch_var_cell_from_evbuffer(struct evbuffer *buf, var_cell_t **out, int move_buf_to_buf(buf_t *buf_out, buf_t *buf_in, size_t *buf_flushlen) { - /* XXXX we can do way better here, but this doesn't turn up in any - * profiles. */ + /* We can do way better here, but this doesn't turn up in any profiles. */ char b[4096]; size_t cp, len; len = *buf_flushlen; diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c index 473b28e872..f8a198bb71 100644 --- a/src/or/circuitbuild.c +++ b/src/or/circuitbuild.c @@ -23,6 +23,7 @@ #include "directory.h" #include "main.h" #include "networkstatus.h" +#include "nodelist.h" #include "onion.h" #include "policies.h" #include "relay.h" @@ -54,8 +55,8 @@ extern circuit_t *global_circuitlist; /** An entry_guard_t represents our information about a chosen long-term * first hop, known as a "helper" node in the literature. We can't just - * use a routerinfo_t, since we want to remember these even when we - * don't have a directory. */ + * use a node_t, since we want to remember these even when we + * don't have any directory info. */ typedef struct { char nickname[MAX_NICKNAME_LEN+1]; char identity[DIGEST_LEN]; @@ -94,7 +95,7 @@ static int circuit_deliver_create_cell(circuit_t *circ, static int onion_pick_cpath_exit(origin_circuit_t *circ, extend_info_t *exit); static crypt_path_t *onion_next_hop_in_cpath(crypt_path_t *cpath); static int onion_extend_cpath(origin_circuit_t *circ); -static int count_acceptable_routers(smartlist_t *routers); +static int count_acceptable_nodes(smartlist_t *routers); static int onion_append_hop(crypt_path_t **head_ptr, extend_info_t *choice); static void entry_guards_changed(void); @@ -1401,10 +1402,9 @@ circuit_list_path_impl(origin_circuit_t *circ, int verbose, int verbose_names) hop = circ->cpath; do { - routerinfo_t *ri; - routerstatus_t *rs; char *elt; const char *id; + const node_t *node; if (!hop) break; if (!verbose && hop->state != CPATH_STATE_OPEN) @@ -1414,10 +1414,8 @@ circuit_list_path_impl(origin_circuit_t *circ, int verbose, int verbose_names) id = hop->extend_info->identity_digest; if (verbose_names) { elt = tor_malloc(MAX_VERBOSE_NICKNAME_LEN+1); - if ((ri = router_get_by_digest(id))) { - router_get_verbose_nickname(elt, ri); - } else if ((rs = router_get_consensus_status_by_id(id))) { - routerstatus_get_verbose_nickname(elt, rs); + if ((node = node_get_by_id(id))) { + node_get_verbose_nickname(node, elt); } else if (is_legal_nickname(hop->extend_info->nickname)) { elt[0] = '$'; base16_encode(elt+1, HEX_DIGEST_LEN+1, id, DIGEST_LEN); @@ -1429,9 +1427,9 @@ circuit_list_path_impl(origin_circuit_t *circ, int verbose, int verbose_names) base16_encode(elt+1, HEX_DIGEST_LEN+1, id, DIGEST_LEN); } } else { /* ! verbose_names */ - if ((ri = router_get_by_digest(id)) && - ri->is_named) { - elt = tor_strdup(hop->extend_info->nickname); + node = node_get_by_id(id); + if (node && node_is_named(node)) { + elt = tor_strdup(node_get_nickname(node)); } else { elt = tor_malloc(HEX_DIGEST_LEN+2); elt[0] = '$'; @@ -1500,31 +1498,28 @@ void circuit_rep_hist_note_result(origin_circuit_t *circ) { crypt_path_t *hop; - char *prev_digest = NULL; - routerinfo_t *router; + const char *prev_digest = NULL; hop = circ->cpath; if (!hop) /* circuit hasn't started building yet. */ return; if (server_mode(get_options())) { - routerinfo_t *me = router_get_my_routerinfo(); + const routerinfo_t *me = router_get_my_routerinfo(); if (!me) return; prev_digest = me->cache_info.identity_digest; } do { - router = router_get_by_digest(hop->extend_info->identity_digest); - if (router) { + const node_t *node = node_get_by_id(hop->extend_info->identity_digest); + if (node) { /* Why do we check this? We know the identity. -NM XXXX */ if (prev_digest) { if (hop->state == CPATH_STATE_OPEN) - rep_hist_note_extend_succeeded(prev_digest, - router->cache_info.identity_digest); + rep_hist_note_extend_succeeded(prev_digest, node->identity); else { - rep_hist_note_extend_failed(prev_digest, - router->cache_info.identity_digest); + rep_hist_note_extend_failed(prev_digest, node->identity); break; } } - prev_digest = router->cache_info.identity_digest; + prev_digest = node->identity; } else { prev_digest = NULL; } @@ -1794,7 +1789,7 @@ int inform_testing_reachability(void) { char dirbuf[128]; - routerinfo_t *me = router_get_my_routerinfo(); + const routerinfo_t *me = router_get_my_routerinfo(); if (!me) return 0; control_event_server_status(LOG_NOTICE, @@ -1866,7 +1861,7 @@ int circuit_send_next_onion_skin(origin_circuit_t *circ) { crypt_path_t *hop; - routerinfo_t *router; + const node_t *node; char payload[2+4+DIGEST_LEN+ONIONSKIN_CHALLENGE_LEN]; char *onionskin; size_t payload_len; @@ -1882,7 +1877,7 @@ circuit_send_next_onion_skin(origin_circuit_t *circ) else control_event_bootstrap(BOOTSTRAP_STATUS_CIRCUIT_CREATE, 0); - router = router_get_by_digest(circ->_base.n_conn->identity_digest); + node = node_get_by_id(circ->_base.n_conn->identity_digest); fast = should_use_create_fast_for_circuit(circ); if (!fast) { /* We are an OR and we know the right onion key: we should @@ -1916,7 +1911,7 @@ circuit_send_next_onion_skin(origin_circuit_t *circ) circuit_set_state(TO_CIRCUIT(circ), CIRCUIT_STATE_BUILDING); log_info(LD_CIRC,"First hop: finished sending %s cell to '%s'", fast ? "CREATE_FAST" : "CREATE", - router ? router->nickname : "<unnamed>"); + node ? node_get_nickname(node) : "<unnamed>"); } else { tor_assert(circ->cpath->state == CPATH_STATE_OPEN); tor_assert(circ->_base.state == CIRCUIT_STATE_BUILDING); @@ -1929,7 +1924,7 @@ circuit_send_next_onion_skin(origin_circuit_t *circ) struct timeval end; long timediff; tor_gettimeofday(&end); - timediff = tv_mdiff(&circ->_base.highres_created, &end); + timediff = tv_mdiff(&circ->_base.timestamp_created, &end); /* * If the circuit build time is much greater than we would have cut @@ -2390,12 +2385,12 @@ onionskin_answer(or_circuit_t *circ, uint8_t cell_type, const char *payload, */ static int new_route_len(uint8_t purpose, extend_info_t *exit, - smartlist_t *routers) + smartlist_t *nodes) { int num_acceptable_routers; int routelen; - tor_assert(routers); + tor_assert(nodes); routelen = DEFAULT_ROUTE_LEN; if (exit && @@ -2403,10 +2398,10 @@ new_route_len(uint8_t purpose, extend_info_t *exit, purpose != CIRCUIT_PURPOSE_S_ESTABLISH_INTRO) routelen++; - num_acceptable_routers = count_acceptable_routers(routers); + num_acceptable_routers = count_acceptable_nodes(nodes); log_debug(LD_CIRC,"Chosen route length %d (%d/%d routers suitable).", - routelen, num_acceptable_routers, smartlist_len(routers)); + routelen, num_acceptable_routers, smartlist_len(nodes)); if (num_acceptable_routers < 2) { log_info(LD_CIRC, @@ -2475,12 +2470,12 @@ circuit_all_predicted_ports_handled(time_t now, int *need_uptime, return enough; } -/** Return 1 if <b>router</b> can handle one or more of the ports in +/** Return 1 if <b>node</b> can handle one or more of the ports in * <b>needed_ports</b>, else return 0. */ static int -router_handles_some_port(routerinfo_t *router, smartlist_t *needed_ports) -{ +node_handles_some_port(const node_t *node, smartlist_t *needed_ports) +{ /* XXXX MOVE */ int i; uint16_t port; @@ -2490,7 +2485,10 @@ router_handles_some_port(routerinfo_t *router, smartlist_t *needed_ports) needed_ports is explicitly a smartlist of uint16_t's */ port = *(uint16_t *)smartlist_get(needed_ports, i); tor_assert(port); - r = compare_addr_to_addr_policy(0, port, router->exit_policy); + if (node) + r = compare_addr_to_node_policy(0, port, node); + else + continue; if (r != ADDR_POLICY_REJECTED && r != ADDR_POLICY_PROBABLY_REJECTED) return 1; } @@ -2523,18 +2521,17 @@ ap_stream_wants_exit_attention(connection_t *conn) * * Return NULL if we can't find any suitable routers. */ -static routerinfo_t * -choose_good_exit_server_general(routerlist_t *dir, int need_uptime, - int need_capacity) +static const node_t * +choose_good_exit_server_general(int need_uptime, int need_capacity) { int *n_supported; - int i; int n_pending_connections = 0; smartlist_t *connections; int best_support = -1; int n_best_support=0; - routerinfo_t *router; or_options_t *options = get_options(); + const smartlist_t *the_nodes; + const node_t *node=NULL; connections = get_connection_array(); @@ -2555,10 +2552,11 @@ choose_good_exit_server_general(routerlist_t *dir, int need_uptime, * * -1 means "Don't use this router at all." */ - n_supported = tor_malloc(sizeof(int)*smartlist_len(dir->routers)); - for (i = 0; i < smartlist_len(dir->routers); ++i) {/* iterate over routers */ - router = smartlist_get(dir->routers, i); - if (router_is_me(router)) { + the_nodes = nodelist_get_list(); + n_supported = tor_malloc(sizeof(int)*smartlist_len(the_nodes)); + SMARTLIST_FOREACH_BEGIN(the_nodes, const node_t *, node) { + const int i = node_sl_idx; + if (router_digest_is_me(node->identity)) { n_supported[i] = -1; // log_fn(LOG_DEBUG,"Skipping node %s -- it's me.", router->nickname); /* XXX there's probably a reverse predecessor attack here, but @@ -2566,13 +2564,15 @@ choose_good_exit_server_general(routerlist_t *dir, int need_uptime, */ continue; } - if (!router->is_running || router->is_bad_exit) { + if (!node_has_descriptor(node)) + continue; + if (!node->is_running || node->is_bad_exit) { n_supported[i] = -1; continue; /* skip routers that are known to be down or bad exits */ } - if (router_is_unreliable(router, need_uptime, need_capacity, 0) && + if (node_is_unreliable(node, need_uptime, need_capacity, 0) && (!options->ExitNodes || - !routerset_contains_router(options->ExitNodes, router))) { + !routerset_contains_node(options->ExitNodes, node))) { /* FFFF Someday, differentiate between a routerset that names * routers, and a routerset that names countries, and only do this * check if they've asked for specific exit relays. Or if the country @@ -2581,18 +2581,19 @@ choose_good_exit_server_general(routerlist_t *dir, int need_uptime, continue; /* skip routers that are not suitable, unless we have * ExitNodes set, in which case we asked for it */ } - if (!(router->is_valid || options->_AllowInvalid & ALLOW_INVALID_EXIT)) { + if (!(node->is_valid || options->_AllowInvalid & ALLOW_INVALID_EXIT)) { /* if it's invalid and we don't want it */ n_supported[i] = -1; // log_fn(LOG_DEBUG,"Skipping node %s (index %d) -- invalid router.", // router->nickname, i); continue; /* skip invalid routers */ } - if (options->ExcludeSingleHopRelays && router->allow_single_hop_exits) { + if (options->ExcludeSingleHopRelays && + node_allows_single_hop_exits(node)) { n_supported[i] = -1; continue; } - if (router_exit_policy_rejects_all(router)) { + if (node_exit_policy_rejects_all(node)) { n_supported[i] = -1; // log_fn(LOG_DEBUG,"Skipping node %s (index %d) -- it rejects all.", // router->nickname, i); @@ -2600,11 +2601,10 @@ choose_good_exit_server_general(routerlist_t *dir, int need_uptime, } n_supported[i] = 0; /* iterate over connections */ - SMARTLIST_FOREACH(connections, connection_t *, conn, - { + SMARTLIST_FOREACH_BEGIN(connections, connection_t *, conn) { if (!ap_stream_wants_exit_attention(conn)) continue; /* Skip everything but APs in CIRCUIT_WAIT */ - if (connection_ap_can_use_exit(TO_EDGE_CONN(conn), router, 1)) { + if (connection_ap_can_use_exit(TO_EDGE_CONN(conn), node, 1)) { ++n_supported[i]; // log_fn(LOG_DEBUG,"%s is supported. n_supported[%d] now %d.", // router->nickname, i, n_supported[i]); @@ -2612,7 +2612,7 @@ choose_good_exit_server_general(routerlist_t *dir, int need_uptime, // log_fn(LOG_DEBUG,"%s (index %d) would reject this stream.", // router->nickname, i); } - }); /* End looping over connections. */ + } SMARTLIST_FOREACH_END(conn); if (n_pending_connections > 0 && n_supported[i] == 0) { /* Leave best_support at -1 if that's where it is, so we can * distinguish it later. */ @@ -2629,7 +2629,7 @@ choose_good_exit_server_general(routerlist_t *dir, int need_uptime, * count of equally good routers.*/ ++n_best_support; } - } + } SMARTLIST_FOREACH_END(node); log_info(LD_CIRC, "Found %d servers that might support %d/%d pending connections.", n_best_support, best_support >= 0 ? best_support : 0, @@ -2640,18 +2640,19 @@ choose_good_exit_server_general(routerlist_t *dir, int need_uptime, if (best_support > 0) { smartlist_t *supporting = smartlist_create(), *use = smartlist_create(); - for (i = 0; i < smartlist_len(dir->routers); i++) - if (n_supported[i] == best_support) - smartlist_add(supporting, smartlist_get(dir->routers, i)); + SMARTLIST_FOREACH(the_nodes, const node_t *, node, { + if (n_supported[node_sl_idx] == best_support) + smartlist_add(supporting, (void*)node); + }); - routersets_get_disjunction(use, supporting, options->ExitNodes, + routersets_get_node_disjunction(use, supporting, options->ExitNodes, options->_ExcludeExitNodesUnion, 1); if (smartlist_len(use) == 0 && options->ExitNodes && !options->StrictNodes) { /* give up on exitnodes and try again */ - routersets_get_disjunction(use, supporting, NULL, + routersets_get_node_disjunction(use, supporting, NULL, options->_ExcludeExitNodesUnion, 1); } - router = routerlist_sl_choose_by_bandwidth(use, WEIGHT_FOR_EXIT); + node = node_sl_choose_by_bandwidth(use, WEIGHT_FOR_EXIT); smartlist_free(use); smartlist_free(supporting); } else { @@ -2670,7 +2671,7 @@ choose_good_exit_server_general(routerlist_t *dir, int need_uptime, need_capacity?", fast":"", need_uptime?", stable":""); tor_free(n_supported); - return choose_good_exit_server_general(dir, 0, 0); + return choose_good_exit_server_general(0, 0); } log_notice(LD_CIRC, "All routers are down or won't exit%s -- " "choosing a doomed exit at random.", @@ -2682,28 +2683,29 @@ choose_good_exit_server_general(routerlist_t *dir, int need_uptime, for (attempt = 0; attempt < 2; attempt++) { /* try once to pick only from routers that satisfy a needed port, * then if there are none, pick from any that support exiting. */ - for (i = 0; i < smartlist_len(dir->routers); i++) { - router = smartlist_get(dir->routers, i); - if (n_supported[i] != -1 && - (attempt || router_handles_some_port(router, needed_ports))) { + SMARTLIST_FOREACH_BEGIN(the_nodes, const node_t *, node) { + if (!node_has_descriptor(node)) + continue; + if (n_supported[node_sl_idx] != -1 && + (attempt || node_handles_some_port(node, needed_ports))) { // log_fn(LOG_DEBUG,"Try %d: '%s' is a possibility.", // try, router->nickname); - smartlist_add(supporting, router); + smartlist_add(supporting, (void*)node); } - } + } SMARTLIST_FOREACH_END(node); - routersets_get_disjunction(use, supporting, options->ExitNodes, + routersets_get_node_disjunction(use, supporting, options->ExitNodes, options->_ExcludeExitNodesUnion, 1); if (smartlist_len(use) == 0 && options->ExitNodes && !options->StrictNodes) { /* give up on exitnodes and try again */ - routersets_get_disjunction(use, supporting, NULL, + routersets_get_node_disjunction(use, supporting, NULL, options->_ExcludeExitNodesUnion, 1); } /* FFF sometimes the above results in null, when the requested * exit node is considered down by the consensus. we should pick * it anyway, since the user asked for it. */ - router = routerlist_sl_choose_by_bandwidth(use, WEIGHT_FOR_EXIT); - if (router) + node = node_sl_choose_by_bandwidth(use, WEIGHT_FOR_EXIT); + if (node) break; smartlist_clear(supporting); smartlist_clear(use); @@ -2715,9 +2717,9 @@ choose_good_exit_server_general(routerlist_t *dir, int need_uptime, } tor_free(n_supported); - if (router) { - log_info(LD_CIRC, "Chose exit server '%s'", router->nickname); - return router; + if (node) { + log_info(LD_CIRC, "Chose exit server '%s'", node_get_nickname(node)); + return node; } if (options->ExitNodes && options->StrictNodes) { log_warn(LD_CIRC, @@ -2737,12 +2739,12 @@ choose_good_exit_server_general(routerlist_t *dir, int need_uptime, * For client-side rendezvous circuits, choose a random node, weighted * toward the preferences in 'options'. */ -static routerinfo_t * -choose_good_exit_server(uint8_t purpose, routerlist_t *dir, +static const node_t * +choose_good_exit_server(uint8_t purpose, int need_uptime, int need_capacity, int is_internal) { or_options_t *options = get_options(); - router_crn_flags_t flags = 0; + router_crn_flags_t flags = CRN_NEED_DESC; if (need_uptime) flags |= CRN_NEED_UPTIME; if (need_capacity) @@ -2755,7 +2757,7 @@ choose_good_exit_server(uint8_t purpose, routerlist_t *dir, if (is_internal) /* pick it like a middle hop */ return router_choose_random_node(NULL, options->ExcludeNodes, flags); else - return choose_good_exit_server_general(dir,need_uptime,need_capacity); + return choose_good_exit_server_general(need_uptime,need_capacity); case CIRCUIT_PURPOSE_C_ESTABLISH_REND: if (options->_AllowInvalid & ALLOW_INVALID_RENDEZVOUS) flags |= CRN_ALLOW_INVALID; @@ -2836,13 +2838,12 @@ static int onion_pick_cpath_exit(origin_circuit_t *circ, extend_info_t *exit) { cpath_build_state_t *state = circ->build_state; - routerlist_t *rl = router_get_routerlist(); if (state->onehop_tunnel) { log_debug(LD_CIRC, "Launching a one-hop circuit for dir tunnel."); state->desired_path_len = 1; } else { - int r = new_route_len(circ->_base.purpose, exit, rl->routers); + int r = new_route_len(circ->_base.purpose, exit, nodelist_get_list()); if (r < 1) /* must be at least 1 */ return -1; state->desired_path_len = r; @@ -2853,14 +2854,15 @@ onion_pick_cpath_exit(origin_circuit_t *circ, extend_info_t *exit) log_info(LD_CIRC,"Using requested exit node '%s'", exit->nickname); exit = extend_info_dup(exit); } else { /* we have to decide one */ - routerinfo_t *router = - choose_good_exit_server(circ->_base.purpose, rl, state->need_uptime, + const node_t *node = + choose_good_exit_server(circ->_base.purpose, state->need_uptime, state->need_capacity, state->is_internal); - if (!router) { + if (!node) { log_warn(LD_CIRC,"failed to choose an exit server"); return -1; } - exit = extend_info_from_router(router); + exit = extend_info_from_node(node); + tor_assert(exit); } state->chosen_exit = exit; return 0; @@ -2911,35 +2913,30 @@ circuit_extend_to_new_exit(origin_circuit_t *circ, extend_info_t *exit) * and available for building circuits through. */ static int -count_acceptable_routers(smartlist_t *routers) +count_acceptable_nodes(smartlist_t *nodes) { - int i, n; int num=0; - routerinfo_t *r; - n = smartlist_len(routers); - for (i=0;i<n;i++) { - r = smartlist_get(routers, i); -// log_debug(LD_CIRC, + SMARTLIST_FOREACH_BEGIN(nodes, const node_t *, node) { + // log_debug(LD_CIRC, // "Contemplating whether router %d (%s) is a new option.", // i, r->nickname); - if (r->is_running == 0) { + if (! node->is_running) // log_debug(LD_CIRC,"Nope, the directory says %d is not running.",i); - goto next_i_loop; - } - if (r->is_valid == 0) { + continue; + if (! node->is_valid) // log_debug(LD_CIRC,"Nope, the directory says %d is not valid.",i); - goto next_i_loop; + continue; + if (! node_has_descriptor(node)) + continue; /* XXX This clause makes us count incorrectly: if AllowInvalidRouters * allows this node in some places, then we're getting an inaccurate * count. For now, be conservative and don't count it. But later we * should try to be smarter. */ - } - num++; + ++num; + } SMARTLIST_FOREACH_END(node); + // log_debug(LD_CIRC,"I like %d. num_acceptable_routers now %d.",i, num); - next_i_loop: - ; /* C requires an explicit statement after the label */ - } return num; } @@ -2967,31 +2964,31 @@ onion_append_to_cpath(crypt_path_t **head_ptr, crypt_path_t *new_hop) * circuit. In particular, make sure we don't pick the exit node or its * family, and make sure we don't duplicate any previous nodes or their * families. */ -static routerinfo_t * +static const node_t * choose_good_middle_server(uint8_t purpose, cpath_build_state_t *state, crypt_path_t *head, int cur_len) { int i; - routerinfo_t *r, *choice; + const node_t *r, *choice; crypt_path_t *cpath; smartlist_t *excluded; or_options_t *options = get_options(); - router_crn_flags_t flags = 0; + router_crn_flags_t flags = CRN_NEED_DESC; tor_assert(_CIRCUIT_PURPOSE_MIN <= purpose && purpose <= _CIRCUIT_PURPOSE_MAX); log_debug(LD_CIRC, "Contemplating intermediate hop: random choice."); excluded = smartlist_create(); - if ((r = build_state_get_exit_router(state))) { - smartlist_add(excluded, r); - routerlist_add_family(excluded, r); + if ((r = build_state_get_exit_node(state))) { + smartlist_add(excluded, (void*) r); + nodelist_add_node_family(excluded, r); } for (i = 0, cpath = head; i < cur_len; ++i, cpath=cpath->next) { - if ((r = router_get_by_digest(cpath->extend_info->identity_digest))) { - smartlist_add(excluded, r); - routerlist_add_family(excluded, r); + if ((r = node_get_by_id(cpath->extend_info->identity_digest))) { + smartlist_add(excluded, (void*)r); + nodelist_add_node_family(excluded, r); } } @@ -3014,13 +3011,14 @@ choose_good_middle_server(uint8_t purpose, * If <b>state</b> is NULL, we're choosing a router to serve as an entry * guard, not for any particular circuit. */ -static routerinfo_t * +static const node_t * choose_good_entry_server(uint8_t purpose, cpath_build_state_t *state) { - routerinfo_t *r, *choice; + const node_t *choice; smartlist_t *excluded; or_options_t *options = get_options(); - router_crn_flags_t flags = CRN_NEED_GUARD; + router_crn_flags_t flags = CRN_NEED_GUARD|CRN_NEED_DESC; + const node_t *node; if (state && options->UseEntryGuards && (purpose != CIRCUIT_PURPOSE_TESTING || options->BridgeRelay)) { @@ -3029,29 +3027,24 @@ choose_good_entry_server(uint8_t purpose, cpath_build_state_t *state) excluded = smartlist_create(); - if (state && (r = build_state_get_exit_router(state))) { - smartlist_add(excluded, r); - routerlist_add_family(excluded, r); + if (state && (node = build_state_get_exit_node(state))) { + smartlist_add(excluded, (void*)node); + nodelist_add_node_family(excluded, node); } if (firewall_is_fascist_or()) { - /*XXXX This could slow things down a lot; use a smarter implementation */ - /* exclude all ORs that listen on the wrong port, if anybody notices. */ - routerlist_t *rl = router_get_routerlist(); - int i; - - for (i=0; i < smartlist_len(rl->routers); i++) { - r = smartlist_get(rl->routers, i); - if (!fascist_firewall_allows_or(r)) - smartlist_add(excluded, r); - } + smartlist_t *nodes = nodelist_get_list(); + SMARTLIST_FOREACH(nodes, const node_t *,node, { + if (!fascist_firewall_allows_node(node)) + smartlist_add(excluded, (void*)node); + }); } /* and exclude current entry guards, if applicable */ if (options->UseEntryGuards && entry_guards) { SMARTLIST_FOREACH(entry_guards, entry_guard_t *, entry, { - if ((r = router_get_by_digest(entry->identity))) { - smartlist_add(excluded, r); - routerlist_add_family(excluded, r); + if ((node = node_get_by_id(entry->identity))) { + smartlist_add(excluded, (void*)node); + nodelist_add_node_family(excluded, node); } }); } @@ -3107,14 +3100,18 @@ onion_extend_cpath(origin_circuit_t *circ) if (cur_len == state->desired_path_len - 1) { /* Picking last node */ info = extend_info_dup(state->chosen_exit); } else if (cur_len == 0) { /* picking first node */ - routerinfo_t *r = choose_good_entry_server(purpose, state); - if (r) - info = extend_info_from_router(r); + const node_t *r = choose_good_entry_server(purpose, state); + if (r) { + info = extend_info_from_node(r); + tor_assert(info); + } } else { - routerinfo_t *r = + const node_t *r = choose_good_middle_server(purpose, state, circ->cpath, cur_len); - if (r) - info = extend_info_from_router(r); + if (r) { + info = extend_info_from_node(r); + tor_assert(info); + } } if (!info) { @@ -3173,7 +3170,7 @@ extend_info_alloc(const char *nickname, const char *digest, /** Allocate and return a new extend_info_t that can be used to build a * circuit to or through the router <b>r</b>. */ extend_info_t * -extend_info_from_router(routerinfo_t *r) +extend_info_from_router(const routerinfo_t *r) { tor_addr_t addr; tor_assert(r); @@ -3182,6 +3179,29 @@ extend_info_from_router(routerinfo_t *r) r->onion_pkey, &addr, r->or_port); } +/** Allocate and return a new extend_info that can be used to build a ircuit + * to or through the node <b>node</b>. May return NULL if there is not + * enough info about <b>node</b> to extend to it--for example, if there + * is no routerinfo_t or microdesc_t. + **/ +extend_info_t * +extend_info_from_node(const node_t *node) +{ + if (node->ri) { + return extend_info_from_router(node->ri); + } else if (node->rs && node->md) { + tor_addr_t addr; + tor_addr_from_ipv4h(&addr, node->rs->addr); + return extend_info_alloc(node->rs->nickname, + node->identity, + node->md->onion_pkey, + &addr, + node->rs->or_port); + } else { + return NULL; + } +} + /** Release storage held by an extend_info_t struct. */ void extend_info_free(extend_info_t *info) @@ -3212,12 +3232,12 @@ extend_info_dup(extend_info_t *info) * If there is no chosen exit, or if we don't know the routerinfo_t for * the chosen exit, return NULL. */ -routerinfo_t * -build_state_get_exit_router(cpath_build_state_t *state) +const node_t * +build_state_get_exit_node(cpath_build_state_t *state) { if (!state || !state->chosen_exit) return NULL; - return router_get_by_digest(state->chosen_exit->identity_digest); + return node_get_by_id(state->chosen_exit->identity_digest); } /** Return the nickname for the chosen exit router in <b>state</b>. If @@ -3239,9 +3259,8 @@ build_state_get_exit_nickname(cpath_build_state_t *state) * * If it's not usable, set *<b>reason</b> to a static string explaining why. */ -/*XXXX take a routerstatus, not a routerinfo. */ static int -entry_guard_set_status(entry_guard_t *e, routerinfo_t *ri, +entry_guard_set_status(entry_guard_t *e, const node_t *node, time_t now, or_options_t *options, const char **reason) { char buf[HEX_DIGEST_LEN+1]; @@ -3250,16 +3269,17 @@ entry_guard_set_status(entry_guard_t *e, routerinfo_t *ri, *reason = NULL; /* Do we want to mark this guard as bad? */ - if (!ri) + if (!node) *reason = "unlisted"; - else if (!ri->is_running) + else if (!node->is_running) *reason = "down"; - else if (options->UseBridges && ri->purpose != ROUTER_PURPOSE_BRIDGE) + else if (options->UseBridges && (!node->ri || + node->ri->purpose != ROUTER_PURPOSE_BRIDGE)) *reason = "not a bridge"; - else if (!options->UseBridges && !ri->is_possible_guard && - !routerset_contains_router(options->EntryNodes,ri)) + else if (!options->UseBridges && !node->is_possible_guard && + !routerset_contains_node(options->EntryNodes,node)) *reason = "not recommended as a guard"; - else if (routerset_contains_router(options->ExcludeNodes, ri)) + else if (routerset_contains_node(options->ExcludeNodes, node)) *reason = "excluded"; if (*reason && ! e->bad_since) { @@ -3303,7 +3323,7 @@ entry_is_time_to_retry(entry_guard_t *e, time_t now) return now > (e->last_attempted + 36*60*60); } -/** Return the router corresponding to <b>e</b>, if <b>e</b> is +/** 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; @@ -3317,11 +3337,11 @@ entry_is_time_to_retry(entry_guard_t *e, time_t now) * * If the answer is no, set *<b>msg</b> to an explanation of why. */ -static INLINE routerinfo_t * +static INLINE const node_t * entry_is_live(entry_guard_t *e, int need_uptime, int need_capacity, int assume_reachable, const char **msg) { - routerinfo_t *r; + const node_t *node; or_options_t *options = get_options(); tor_assert(msg); @@ -3335,33 +3355,36 @@ entry_is_live(entry_guard_t *e, int need_uptime, int need_capacity, *msg = "unreachable"; return NULL; } - r = router_get_by_digest(e->identity); - if (!r) { + node = node_get_by_id(e->identity); + if (!node || !node_has_descriptor(node)) { *msg = "no descriptor"; return NULL; } - if (get_options()->UseBridges && r->purpose != ROUTER_PURPOSE_BRIDGE) { - *msg = "not a bridge"; - return NULL; - } - if (!get_options()->UseBridges && r->purpose != ROUTER_PURPOSE_GENERAL) { - *msg = "not general-purpose"; - return NULL; + if (get_options()->UseBridges) { + if (node_get_purpose(node) != ROUTER_PURPOSE_BRIDGE) { + *msg = "not a bridge"; + return NULL; + } + } else { /* !get_options()->UseBridges */ + if (node_get_purpose(node) != ROUTER_PURPOSE_GENERAL) { + *msg = "not general-purpose"; + return NULL; + } } if (options->EntryNodes && - routerset_contains_router(options->EntryNodes, r)) { + routerset_contains_node(options->EntryNodes, node)) { /* they asked for it, they get it */ need_uptime = need_capacity = 0; } - if (router_is_unreliable(r, 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_or(r)) { + if (!fascist_firewall_allows_node(node)) { *msg = "unreachable by config"; return NULL; } - return r; + return node; } /** Return the number of entry guards that we think are usable. */ @@ -3459,15 +3482,15 @@ control_event_guard_deferred(void) * 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 routerinfo_t * -add_an_entry_guard(routerinfo_t *chosen, int reset_status) +static const node_t * +add_an_entry_guard(const node_t *chosen, int reset_status) { - routerinfo_t *router; + const node_t *node; entry_guard_t *entry; if (chosen) { - router = chosen; - entry = is_an_entry_guard(router->cache_info.identity_digest); + node = chosen; + entry = is_an_entry_guard(node->identity); if (entry) { if (reset_status) { entry->bad_since = 0; @@ -3476,14 +3499,15 @@ add_an_entry_guard(routerinfo_t *chosen, int reset_status) return NULL; } } else { - router = choose_good_entry_server(CIRCUIT_PURPOSE_C_GENERAL, NULL); - if (!router) + node = choose_good_entry_server(CIRCUIT_PURPOSE_C_GENERAL, NULL); + if (!node) return NULL; } entry = tor_malloc_zero(sizeof(entry_guard_t)); - log_info(LD_CIRC, "Chose '%s' as new entry guard.", router->nickname); - strlcpy(entry->nickname, router->nickname, sizeof(entry->nickname)); - memcpy(entry->identity, router->cache_info.identity_digest, DIGEST_LEN); + log_info(LD_CIRC, "Chose '%s' as new entry guard.", + node_get_nickname(node)); + strlcpy(entry->nickname, node_get_nickname(node), sizeof(entry->nickname)); + memcpy(entry->identity, node->identity, DIGEST_LEN); /* 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 @@ -3498,7 +3522,7 @@ add_an_entry_guard(routerinfo_t *chosen, int reset_status) control_event_guard(entry->nickname, entry->identity, "NEW"); control_event_guard_deferred(); log_entry_guards(LOG_INFO); - return router; + return node; } /** If the use of entry guards is configured, choose more entry guards @@ -3652,7 +3676,7 @@ entry_guards_compute_status(or_options_t *options, time_t now) reasons = digestmap_new(); SMARTLIST_FOREACH_BEGIN(entry_guards, entry_guard_t *, entry) { - routerinfo_t *r = router_get_by_digest(entry->identity); + 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; @@ -3673,7 +3697,7 @@ entry_guards_compute_status(or_options_t *options, time_t now) SMARTLIST_FOREACH_BEGIN(entry_guards, entry_guard_t *, entry) { const char *reason = digestmap_get(reasons, entry->identity); const char *live_msg = ""; - routerinfo_t *r = entry_is_live(entry, 0, 1, 0, &live_msg); + const node_t *r = entry_is_live(entry, 0, 1, 0, &live_msg); log_info(LD_CIRC, "Summary: Entry '%s' is %s, %s%s%s, and %s%s.", entry->nickname, entry->unreachable_since ? "unreachable" : "reachable", @@ -3790,7 +3814,7 @@ entry_guard_register_connect_status(const char *digest, int succeeded, break; if (e->made_contact) { const char *msg; - routerinfo_t *r = entry_is_live(e, 0, 1, 1, &msg); + const node_t *r = entry_is_live(e, 0, 1, 1, &msg); if (r && e->unreachable_since) { refuse_conn = 1; e->can_retry = 1; @@ -3831,7 +3855,7 @@ entry_nodes_should_be_added(void) static void entry_guards_prepend_from_config(or_options_t *options) { - smartlist_t *entry_routers, *entry_fps; + smartlist_t *entry_nodes, *entry_fps; smartlist_t *old_entry_guards_on_list, *old_entry_guards_not_on_list; tor_assert(entry_guards); @@ -3851,22 +3875,22 @@ entry_guards_prepend_from_config(or_options_t *options) tor_free(string); } - entry_routers = smartlist_create(); + entry_nodes = smartlist_create(); entry_fps = smartlist_create(); old_entry_guards_on_list = smartlist_create(); old_entry_guards_not_on_list = smartlist_create(); /* Split entry guards into those on the list and those not. */ - /* XXXX022 Now that we allow countries and IP ranges in EntryNodes, this is - * potentially an enormous list. For now, we disable such values for - * EntryNodes in options_validate(); really, this wants a better solution. - * Perhaps we should do this calculation once whenever the list of routers - * changes or the entrynodes setting changes. - */ - routerset_get_all_routers(entry_routers, options->EntryNodes, 0); - SMARTLIST_FOREACH(entry_routers, routerinfo_t *, ri, - smartlist_add(entry_fps,ri->cache_info.identity_digest)); + /* Now that we allow countries and IP ranges in EntryNodes, this is + * potentially an enormous list. It's not so bad though because we + * only call this function when a) we're making a new circuit, and b) + * we've called directory_info_has_arrived() or changed our EntryNodes + * since the last time we made a circuit. */ + routerset_get_all_nodes(entry_nodes, options->EntryNodes, 0); + SMARTLIST_FOREACH(entry_nodes, const node_t *,node, + smartlist_add(entry_fps, (void*)node->identity)); + SMARTLIST_FOREACH(entry_guards, entry_guard_t *, e, { if (smartlist_digest_isin(entry_fps, e->identity)) smartlist_add(old_entry_guards_on_list, e); @@ -3875,9 +3899,9 @@ entry_guards_prepend_from_config(or_options_t *options) }); /* Remove all currently configured entry guards from entry_routers. */ - SMARTLIST_FOREACH(entry_routers, routerinfo_t *, ri, { - if (is_an_entry_guard(ri->cache_info.identity_digest)) { - SMARTLIST_DEL_CURRENT(entry_routers, ri); + SMARTLIST_FOREACH(entry_nodes, const node_t *, node, { + if (is_an_entry_guard(node->identity)) { + SMARTLIST_DEL_CURRENT(entry_nodes, node); } }); @@ -3886,8 +3910,8 @@ entry_guards_prepend_from_config(or_options_t *options) /* First, the previously configured guards that are in EntryNodes. */ smartlist_add_all(entry_guards, old_entry_guards_on_list); /* Next, the rest of EntryNodes */ - SMARTLIST_FOREACH(entry_routers, routerinfo_t *, ri, { - add_an_entry_guard(ri, 0); + SMARTLIST_FOREACH(entry_nodes, const node_t *, node, { + add_an_entry_guard(node, 0); }); /* Finally, the remaining previously configured guards that are not in * EntryNodes, unless we're strict in which case we drop them */ @@ -3898,7 +3922,7 @@ entry_guards_prepend_from_config(or_options_t *options) smartlist_add_all(entry_guards, old_entry_guards_not_on_list); } - smartlist_free(entry_routers); + smartlist_free(entry_nodes); smartlist_free(entry_fps); smartlist_free(old_entry_guards_on_list); smartlist_free(old_entry_guards_not_on_list); @@ -3936,21 +3960,22 @@ entry_list_is_totally_static(or_options_t *options) * 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). */ -routerinfo_t * +const node_t * choose_random_entry(cpath_build_state_t *state) { or_options_t *options = get_options(); smartlist_t *live_entry_guards = smartlist_create(); smartlist_t *exit_family = smartlist_create(); - routerinfo_t *chosen_exit = state?build_state_get_exit_router(state) : NULL; - routerinfo_t *r = NULL; + 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, consider_exit_family = 0; if (chosen_exit) { - smartlist_add(exit_family, chosen_exit); - routerlist_add_family(exit_family, chosen_exit); + smartlist_add(exit_family, (void*) chosen_exit); + nodelist_add_node_family(exit_family, chosen_exit); consider_exit_family = 1; } @@ -3966,16 +3991,15 @@ choose_random_entry(cpath_build_state_t *state) retry: smartlist_clear(live_entry_guards); - SMARTLIST_FOREACH(entry_guards, entry_guard_t *, entry, - { + SMARTLIST_FOREACH_BEGIN(entry_guards, entry_guard_t *, entry) { const char *msg; - r = entry_is_live(entry, need_uptime, need_capacity, 0, &msg); - if (!r) + node = entry_is_live(entry, need_uptime, need_capacity, 0, &msg); + if (!node) continue; /* down, no point */ - if (consider_exit_family && smartlist_isin(exit_family, r)) + if (consider_exit_family && smartlist_isin(exit_family, node)) continue; /* avoid relays that are family members of our exit */ if (options->EntryNodes && - !routerset_contains_router(options->EntryNodes, r)) { + !routerset_contains_node(options->EntryNodes, node)) { /* We've come to the end of our preferred entry nodes. */ if (smartlist_len(live_entry_guards)) goto choose_and_finish; /* only choose from the ones we like */ @@ -3988,7 +4012,7 @@ choose_random_entry(cpath_build_state_t *state) "No relays from EntryNodes available. Using others."); } } - smartlist_add(live_entry_guards, r); + 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 @@ -3998,7 +4022,7 @@ choose_random_entry(cpath_build_state_t *state) } if (smartlist_len(live_entry_guards) >= options->NumEntryGuards) break; /* we have enough */ - }); + } SMARTLIST_FOREACH_END(entry); if (entry_list_is_constrained(options)) { /* If we prefer the entry nodes we've got, and we have at least @@ -4018,8 +4042,8 @@ choose_random_entry(cpath_build_state_t *state) /* 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 */ - r = add_an_entry_guard(NULL, 0); - if (r) { + node = add_an_entry_guard(NULL, 0); + if (node) { entry_guards_changed(); /* 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 @@ -4029,16 +4053,16 @@ choose_random_entry(cpath_build_state_t *state) goto retry; } } - if (!r && need_uptime) { + if (!node && need_uptime) { need_uptime = 0; /* try without that requirement */ goto retry; } - if (!r && need_capacity) { + if (!node && need_capacity) { /* still no? last attempt, try without requiring capacity */ need_capacity = 0; goto retry; } - if (!r && entry_list_is_constrained(options) && consider_exit_family) { + if (!node && entry_list_is_constrained(options) && consider_exit_family) { /* still no? if we're using bridges or have strictentrynodes * set, and our chosen exit is in the same family as all our * bridges/entry guards, then be flexible about families. */ @@ -4052,16 +4076,16 @@ choose_random_entry(cpath_build_state_t *state) 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. */ - r = routerlist_sl_choose_by_bandwidth(live_entry_guards, WEIGHT_FOR_GUARD); + 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. */ - r = smartlist_choose(live_entry_guards); + node = smartlist_choose(live_entry_guards); } smartlist_free(live_entry_guards); smartlist_free(exit_family); - return r; + return node; } /** Parse <b>state</b> and learn about the entry guards it describes. @@ -4308,7 +4332,7 @@ getinfo_helper_entry_guards(control_connection_t *conn, char *c = tor_malloc(len); const char *status = NULL; time_t when = 0; - routerinfo_t *ri; + const node_t *node; if (!e->made_contact) { status = "never-connected"; @@ -4319,9 +4343,9 @@ getinfo_helper_entry_guards(control_connection_t *conn, status = "up"; } - ri = router_get_by_digest(e->identity); - if (ri) { - router_get_verbose_nickname(nbuf, ri); + 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); @@ -4398,7 +4422,7 @@ get_configured_bridge_by_addr_port_digest(tor_addr_t *addr, uint16_t port, /** Wrapper around get_configured_bridge_by_addr_port_digest() to look * it up via router descriptor <b>ri</b>. */ static bridge_info_t * -get_configured_bridge_by_routerinfo(routerinfo_t *ri) +get_configured_bridge_by_routerinfo(const routerinfo_t *ri) { tor_addr_t addr; tor_addr_from_ipv4h(&addr, ri->addr); @@ -4408,7 +4432,7 @@ get_configured_bridge_by_routerinfo(routerinfo_t *ri) /** Return 1 if <b>ri</b> is one of our known bridges, else 0. */ int -routerinfo_is_a_configured_bridge(routerinfo_t *ri) +routerinfo_is_a_configured_bridge(const routerinfo_t *ri) { return get_configured_bridge_by_routerinfo(ri) ? 1 : 0; } @@ -4567,14 +4591,17 @@ learned_bridge_descriptor(routerinfo_t *ri, int from_cache) int first = !any_bridge_descriptors_known(); bridge_info_t *bridge = get_configured_bridge_by_routerinfo(ri); time_t now = time(NULL); - ri->is_running = 1; + router_set_status(ri->cache_info.identity_digest, 1); if (bridge) { /* if we actually want to use this one */ + const node_t *node; /* it's here; schedule its re-fetch for a long time from now. */ if (!from_cache) download_status_reset(&bridge->fetch_status); - add_an_entry_guard(ri, 1); + node = node_get_by_id(ri->cache_info.identity_digest); + tor_assert(node); + add_an_entry_guard(node, 1); log_notice(LD_DIR, "new bridge descriptor '%s' (%s)", ri->nickname, from_cache ? "cached" : "fresh"); /* set entry->made_contact so if it goes down we don't drop it from @@ -4628,19 +4655,18 @@ any_pending_bridge_descriptor_fetches(void) static int entries_retry_helper(or_options_t *options, int act) { - routerinfo_t *ri; + const node_t *node; int any_known = 0; int any_running = 0; - int purpose = options->UseBridges ? - ROUTER_PURPOSE_BRIDGE : ROUTER_PURPOSE_GENERAL; + int need_bridges = options->UseBridges != 0; if (!entry_guards) entry_guards = smartlist_create(); - SMARTLIST_FOREACH(entry_guards, entry_guard_t *, e, - { - ri = router_get_by_digest(e->identity); - if (ri && ri->purpose == purpose) { + SMARTLIST_FOREACH_BEGIN(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) { any_known = 1; - if (ri->is_running) + 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 @@ -4649,15 +4675,15 @@ entries_retry_helper(or_options_t *options, int act) * 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. */ - connection_or_set_bad_connections(ri->cache_info.identity_digest, 1); + connection_or_set_bad_connections(node->identity, 1); /* mark this entry node for retry */ - router_set_status(ri->cache_info.identity_digest, 1); + 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; diff --git a/src/or/circuitbuild.h b/src/or/circuitbuild.h index 888bf9d255..7c125e96b1 100644 --- a/src/or/circuitbuild.h +++ b/src/or/circuitbuild.h @@ -44,10 +44,11 @@ void onion_append_to_cpath(crypt_path_t **head_ptr, crypt_path_t *new_hop); extend_info_t *extend_info_alloc(const char *nickname, const char *digest, crypto_pk_env_t *onion_key, const tor_addr_t *addr, uint16_t port); -extend_info_t *extend_info_from_router(routerinfo_t *r); +extend_info_t *extend_info_from_router(const routerinfo_t *r); +extend_info_t *extend_info_from_node(const node_t *node); extend_info_t *extend_info_dup(extend_info_t *info); void extend_info_free(extend_info_t *info); -routerinfo_t *build_state_get_exit_router(cpath_build_state_t *state); +const node_t *build_state_get_exit_node(cpath_build_state_t *state); const char *build_state_get_exit_nickname(cpath_build_state_t *state); void entry_guards_compute_status(or_options_t *options, time_t now); @@ -55,7 +56,7 @@ int entry_guard_register_connect_status(const char *digest, int succeeded, int mark_relay_status, time_t now); void entry_nodes_should_be_added(void); int entry_list_is_constrained(or_options_t *options); -routerinfo_t *choose_random_entry(cpath_build_state_t *state); +const node_t *choose_random_entry(cpath_build_state_t *state); int entry_guards_parse_state(or_state_t *state, int set, char **msg); void entry_guards_update_state(or_state_t *state); int getinfo_helper_entry_guards(control_connection_t *conn, @@ -63,9 +64,9 @@ int getinfo_helper_entry_guards(control_connection_t *conn, const char **errmsg); void clear_bridge_list(void); -int routerinfo_is_a_configured_bridge(routerinfo_t *ri); -void -learned_router_identity(tor_addr_t *addr, uint16_t port, const char *digest); +int routerinfo_is_a_configured_bridge(const routerinfo_t *ri); +void learned_router_identity(tor_addr_t *addr, uint16_t port, + const char *digest); void bridge_add_from_config(const tor_addr_t *addr, uint16_t port, char *digest); void retry_bridge_descriptor_fetch_directly(const char *digest); diff --git a/src/or/circuitlist.c b/src/or/circuitlist.c index fb4b69be0d..205b0a89a7 100644 --- a/src/or/circuitlist.c +++ b/src/or/circuitlist.c @@ -19,6 +19,7 @@ #include "connection_or.h" #include "control.h" #include "networkstatus.h" +#include "nodelist.h" #include "onion.h" #include "relay.h" #include "rendclient.h" @@ -86,10 +87,7 @@ orconn_circid_circuit_map_t *_last_circid_orconn_ent = NULL; /** Implementation helper for circuit_set_{p,n}_circid_orconn: A circuit ID * and/or or_connection for circ has just changed from <b>old_conn, old_id</b> * to <b>conn, id</b>. Adjust the conn,circid map as appropriate, removing - * the old entry (if any) and adding a new one. If <b>active</b> is true, - * remove the circuit from the list of active circuits on old_conn and add it - * to the list of active circuits on conn. - * XXX "active" isn't an arg anymore */ + * the old entry (if any) and adding a new one. */ static void circuit_set_circid_orconn_helper(circuit_t *circ, int direction, circid_t id, @@ -396,8 +394,7 @@ circuit_initial_package_window(void) static void init_circuit_base(circuit_t *circ) { - circ->timestamp_created = time(NULL); - tor_gettimeofday(&circ->highres_created); + tor_gettimeofday(&circ->timestamp_created); circ->package_window = circuit_initial_package_window(); circ->deliver_window = CIRCWINDOW_START; @@ -609,7 +606,8 @@ circuit_dump_details(int severity, circuit_t *circ, int conn_array_index, log(severity, LD_CIRC, "Conn %d has %s circuit: circID %d (other side %d), " "state %d (%s), born %d:", conn_array_index, type, this_circid, other_circid, circ->state, - circuit_state_to_string(circ->state), (int)circ->timestamp_created); + circuit_state_to_string(circ->state), + (int)circ->timestamp_created.tv_sec); if (CIRCUIT_IS_ORIGIN(circ)) { /* circ starts at this node */ circuit_log_path(severity, LD_CIRC, TO_ORIGIN_CIRCUIT(circ)); } @@ -946,15 +944,15 @@ circuit_find_to_cannibalize(uint8_t purpose, extend_info_t *info, if (info) { /* need to make sure we don't duplicate hops */ crypt_path_t *hop = circ->cpath; - routerinfo_t *ri1 = router_get_by_digest(info->identity_digest); + const node_t *ri1 = node_get_by_id(info->identity_digest); do { - routerinfo_t *ri2; + const node_t *ri2; if (!memcmp(hop->extend_info->identity_digest, info->identity_digest, DIGEST_LEN)) goto next; if (ri1 && - (ri2 = router_get_by_digest(hop->extend_info->identity_digest)) - && routers_in_same_family(ri1, ri2)) + (ri2 = node_get_by_id(hop->extend_info->identity_digest)) + && nodes_in_same_family(ri1, ri2)) goto next; hop=hop->next; } while (hop!=circ->cpath); diff --git a/src/or/circuituse.c b/src/or/circuituse.c index 3af0fb642d..5426563507 100644 --- a/src/or/circuituse.c +++ b/src/or/circuituse.c @@ -17,6 +17,7 @@ #include "connection.h" #include "connection_edge.h" #include "control.h" +#include "nodelist.h" #include "policies.h" #include "rendclient.h" #include "rendcommon.h" @@ -43,7 +44,7 @@ circuit_is_acceptable(circuit_t *circ, edge_connection_t *conn, int need_uptime, int need_internal, time_t now) { - routerinfo_t *exitrouter; + const node_t *exitnode; cpath_build_state_t *build_state; tor_assert(circ); tor_assert(conn); @@ -85,7 +86,7 @@ circuit_is_acceptable(circuit_t *circ, edge_connection_t *conn, * of the one we meant to finish at. */ build_state = TO_ORIGIN_CIRCUIT(circ)->build_state; - exitrouter = build_state_get_exit_router(build_state); + exitnode = build_state_get_exit_node(build_state); if (need_uptime && !build_state->need_uptime) return 0; @@ -93,7 +94,7 @@ circuit_is_acceptable(circuit_t *circ, edge_connection_t *conn, return 0; if (purpose == CIRCUIT_PURPOSE_C_GENERAL) { - if (!exitrouter && !build_state->onehop_tunnel) { + if (!exitnode && !build_state->onehop_tunnel) { log_debug(LD_CIRC,"Not considering circuit with unknown router."); return 0; /* this circuit is screwed and doesn't know it yet, * or is a rendezvous circuit. */ @@ -127,7 +128,7 @@ circuit_is_acceptable(circuit_t *circ, edge_connection_t *conn, return 0; } } - if (exitrouter && !connection_ap_can_use_exit(conn, exitrouter, 0)) { + if (exitnode && !connection_ap_can_use_exit(conn, exitnode, 0)) { /* can't exit from this router */ return 0; } @@ -162,7 +163,7 @@ circuit_is_better(circuit_t *a, circuit_t *b, uint8_t purpose) return 1; } else { if (a->timestamp_dirty || - a->timestamp_created > b->timestamp_created) + tor_timercmp(&a->timestamp_created, &b->timestamp_created, >)) return 1; if (CIRCUIT_IS_ORIGIN(b) && TO_ORIGIN_CIRCUIT(b)->build_state->is_internal) @@ -222,8 +223,8 @@ circuit_get_best(edge_connection_t *conn, int must_be_open, uint8_t purpose, * seen lately, a la Fallon Chen's GSoC work -RD */ #define REND_PARALLEL_INTRO_DELAY 15 if (purpose == CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT && - !must_be_open && circ->state != CIRCUIT_STATE_OPEN && - circ->timestamp_created + REND_PARALLEL_INTRO_DELAY < now) { + !must_be_open && circ->state != CIRCUIT_STATE_OPEN && + circ->timestamp_created.tv_sec + REND_PARALLEL_INTRO_DELAY < now) { intro_going_on_but_too_old = 1; continue; } @@ -312,14 +313,14 @@ circuit_expire_building(time_t now) else cutoff = general_cutoff; - if (victim->timestamp_created > cutoff) + if (victim->timestamp_created.tv_sec > cutoff) continue; /* it's still young, leave it alone */ #if 0 /* some debug logs, to help track bugs */ if (victim->purpose == CIRCUIT_PURPOSE_C_INTRODUCING && - victim->timestamp_created <= introcirc_cutoff && - victim->timestamp_created > general_cutoff) + victim->timestamp_created.tv_sec <= introcirc_cutoff && + victim->timestamp_created.tv_sec > general_cutoff) log_info(LD_REND|LD_CIRC, "Timing out introduction circuit which we " "would not have done if it had been a general circuit."); @@ -407,15 +408,16 @@ circuit_expire_building(time_t now) * it off at, we probably had a suspend event along this codepath, * and we should discard the value. */ - if (now - victim->timestamp_created > 2*circ_times.close_ms/1000+1) { + if (now - victim->timestamp_created.tv_sec > + 2*circ_times.close_ms/1000+1) { log_notice(LD_CIRC, "Extremely large value for circuit build timeout: %lds. " "Assuming clock jump. Purpose %d", - (long)(now - victim->timestamp_created), + (long)(now - victim->timestamp_created.tv_sec), victim->purpose); } else if (circuit_build_times_count_close(&circ_times, - first_hop_succeeded, - victim->timestamp_created)) { + first_hop_succeeded, + victim->timestamp_created.tv_sec)) { circuit_build_times_set_timeout(&circ_times); } } @@ -473,7 +475,7 @@ circuit_stream_is_being_handled(edge_connection_t *conn, uint16_t port, int min) { circuit_t *circ; - routerinfo_t *exitrouter; + const node_t *exitnode; int num=0; time_t now = time(NULL); int need_uptime = smartlist_string_num_isin(get_options()->LongLivedPorts, @@ -489,14 +491,14 @@ circuit_stream_is_being_handled(edge_connection_t *conn, if (build_state->is_internal || build_state->onehop_tunnel) continue; - exitrouter = build_state_get_exit_router(build_state); - if (exitrouter && (!need_uptime || build_state->need_uptime)) { + exitnode = build_state_get_exit_node(build_state); + if (exitnode && (!need_uptime || build_state->need_uptime)) { int ok; if (conn) { - ok = connection_ap_can_use_exit(conn, exitrouter, 0); + ok = connection_ap_can_use_exit(conn, exitnode, 0); } else { - addr_policy_result_t r = compare_addr_to_addr_policy( - 0, port, exitrouter->exit_policy); + addr_policy_result_t r; + r = compare_addr_to_node_policy(0, port, exitnode); ok = r != ADDR_POLICY_REJECTED && r != ADDR_POLICY_PROBABLY_REJECTED; } if (ok) { @@ -563,7 +565,7 @@ circuit_predict_and_launch_new(void) log_info(LD_CIRC, "Have %d clean circs (%d internal), need another exit circ.", num, num_internal); - circuit_launch_by_router(CIRCUIT_PURPOSE_C_GENERAL, NULL, flags); + circuit_launch(CIRCUIT_PURPOSE_C_GENERAL, flags); return; } @@ -575,7 +577,7 @@ circuit_predict_and_launch_new(void) "Have %d clean circs (%d internal), need another internal " "circ for my hidden service.", num, num_internal); - circuit_launch_by_router(CIRCUIT_PURPOSE_C_GENERAL, NULL, flags); + circuit_launch(CIRCUIT_PURPOSE_C_GENERAL, flags); return; } @@ -593,7 +595,7 @@ circuit_predict_and_launch_new(void) "Have %d clean circs (%d uptime-internal, %d internal), need" " another hidden service circ.", num, num_uptime_internal, num_internal); - circuit_launch_by_router(CIRCUIT_PURPOSE_C_GENERAL, NULL, flags); + circuit_launch(CIRCUIT_PURPOSE_C_GENERAL, flags); return; } @@ -606,7 +608,7 @@ circuit_predict_and_launch_new(void) flags = CIRCLAUNCH_NEED_CAPACITY; log_info(LD_CIRC, "Have %d clean circs need another buildtime test circ.", num); - circuit_launch_by_router(CIRCUIT_PURPOSE_C_GENERAL, NULL, flags); + circuit_launch(CIRCUIT_PURPOSE_C_GENERAL, flags); return; } } @@ -642,9 +644,9 @@ circuit_build_needed_circs(time_t now) circ = circuit_get_youngest_clean_open(CIRCUIT_PURPOSE_C_GENERAL); if (get_options()->RunTesting && circ && - circ->timestamp_created + TESTING_CIRCUIT_INTERVAL < now) { + circ->timestamp_created.tv_sec + TESTING_CIRCUIT_INTERVAL < now) { log_fn(LOG_INFO,"Creating a new testing circuit."); - circuit_launch_by_router(CIRCUIT_PURPOSE_C_GENERAL, NULL, 0); + circuit_launch(CIRCUIT_PURPOSE_C_GENERAL, 0); } #endif } @@ -753,7 +755,7 @@ circuit_expire_old_circuits_clientside(time_t now) circ->purpose); circuit_mark_for_close(circ, END_CIRC_REASON_FINISHED); } else if (!circ->timestamp_dirty && circ->state == CIRCUIT_STATE_OPEN) { - if (circ->timestamp_created < cutoff) { + if (circ->timestamp_created.tv_sec < cutoff) { if (circ->purpose == CIRCUIT_PURPOSE_C_GENERAL || circ->purpose == CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT || circ->purpose == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO || @@ -763,7 +765,7 @@ circuit_expire_old_circuits_clientside(time_t now) circ->purpose == CIRCUIT_PURPOSE_S_CONNECT_REND) { log_debug(LD_CIRC, "Closing circuit that has been unused for %ld seconds.", - (long)(now - circ->timestamp_created)); + (long)(now - circ->timestamp_created.tv_sec)); circuit_mark_for_close(circ, END_CIRC_REASON_FINISHED); } else if (!TO_ORIGIN_CIRCUIT(circ)->is_ancient) { /* Server-side rend joined circuits can end up really old, because @@ -777,7 +779,7 @@ circuit_expire_old_circuits_clientside(time_t now) "Ancient non-dirty circuit %d is still around after " "%ld seconds. Purpose: %d", TO_ORIGIN_CIRCUIT(circ)->global_identifier, - (long)(now - circ->timestamp_created), + (long)(now - circ->timestamp_created.tv_sec), circ->purpose); /* FFFF implement a new circuit_purpose_to_string() so we don't * just print out a number for circ->purpose */ @@ -1076,17 +1078,9 @@ static int did_circs_fail_last_period = 0; /** Launch a new circuit; see circuit_launch_by_extend_info() for * details on arguments. */ origin_circuit_t * -circuit_launch_by_router(uint8_t purpose, - routerinfo_t *exit, int flags) +circuit_launch(uint8_t purpose, int flags) { - origin_circuit_t *circ; - extend_info_t *info = NULL; - if (exit) - info = extend_info_from_router(exit); - circ = circuit_launch_by_extend_info(purpose, info, flags); - - extend_info_free(info); - return circ; + return circuit_launch_by_extend_info(purpose, NULL, flags); } /** Launch a new circuit with purpose <b>purpose</b> and exit node @@ -1123,7 +1117,7 @@ circuit_launch_by_extend_info(uint8_t purpose, /* reset the birth date of this circ, else expire_building * will see it and think it's been trying to build since it * began. */ - circ->_base.timestamp_created = time(NULL); + tor_gettimeofday(&circ->_base.timestamp_created); switch (purpose) { case CIRCUIT_PURPOSE_C_ESTABLISH_REND: case CIRCUIT_PURPOSE_S_ESTABLISH_INTRO: @@ -1256,9 +1250,9 @@ circuit_get_open_circ_or_launch(edge_connection_t *conn, uint32_t addr = 0; if (tor_inet_aton(conn->socks_request->address, &in)) addr = ntohl(in.s_addr); - if (router_exit_policy_all_routers_reject(addr, - conn->socks_request->port, - need_uptime)) { + if (router_exit_policy_all_nodes_reject(addr, + conn->socks_request->port, + need_uptime)) { log_notice(LD_APP, "No Tor server allows exit to %s:%d. Rejecting.", safe_str_client(conn->socks_request->address), @@ -1267,9 +1261,9 @@ circuit_get_open_circ_or_launch(edge_connection_t *conn, } } else { /* XXXX022 Duplicates checks in connection_ap_handshake_attach_circuit */ - routerinfo_t *router = router_get_by_nickname(conn->chosen_exit_name, 1); + const node_t *node = node_get_by_nickname(conn->chosen_exit_name, 1); int opt = conn->chosen_exit_optional; - if (router && !connection_ap_can_use_exit(conn, router, 0)) { + if (node && !connection_ap_can_use_exit(conn, node, 0)) { log_fn(opt ? LOG_INFO : LOG_WARN, LD_APP, "Requested exit point '%s' would refuse request. %s.", conn->chosen_exit_name, opt ? "Trying others" : "Closing"); @@ -1317,11 +1311,11 @@ circuit_get_open_circ_or_launch(edge_connection_t *conn, */ if (desired_circuit_purpose == CIRCUIT_PURPOSE_C_GENERAL) { if (conn->chosen_exit_name) { - routerinfo_t *r; + const node_t *r; int opt = conn->chosen_exit_optional; - r = router_get_by_nickname(conn->chosen_exit_name, 1); - if (r) { - extend_info = extend_info_from_router(r); + r = node_get_by_nickname(conn->chosen_exit_name, 1); + if (r && node_has_descriptor(r)) { + extend_info = extend_info_from_node(r); } else { log_debug(LD_DIR, "considering %d, %s", want_onehop, conn->chosen_exit_name); @@ -1571,9 +1565,9 @@ connection_ap_handshake_attach_circuit(edge_connection_t *conn) origin_circuit_t *circ=NULL; if (conn->chosen_exit_name) { - routerinfo_t *router = router_get_by_nickname(conn->chosen_exit_name, 1); + const node_t *node = node_get_by_nickname(conn->chosen_exit_name, 1); int opt = conn->chosen_exit_optional; - if (!router && !want_onehop) { + if (!node && !want_onehop) { /* We ran into this warning when trying to extend a circuit to a * hidden service directory for which we didn't have a router * descriptor. See flyspray task 767 for more details. We should @@ -1589,7 +1583,7 @@ connection_ap_handshake_attach_circuit(edge_connection_t *conn) } return -1; } - if (router && !connection_ap_can_use_exit(conn, router, 0)) { + if (node && !connection_ap_can_use_exit(conn, node, 0)) { log_fn(opt ? LOG_INFO : LOG_WARN, LD_APP, "Requested exit point '%s' would refuse request. %s.", conn->chosen_exit_name, opt ? "Trying others" : "Closing"); diff --git a/src/or/circuituse.h b/src/or/circuituse.h index 269b6c5f8f..4e4cd1a4d9 100644 --- a/src/or/circuituse.h +++ b/src/or/circuituse.h @@ -41,8 +41,7 @@ void circuit_build_failed(origin_circuit_t *circ); origin_circuit_t *circuit_launch_by_extend_info(uint8_t purpose, extend_info_t *info, int flags); -origin_circuit_t *circuit_launch_by_router(uint8_t purpose, - routerinfo_t *exit, int flags); +origin_circuit_t *circuit_launch(uint8_t purpose, int flags); void circuit_reset_failure_count(int timeout); int connection_ap_handshake_attach_chosen_circuit(edge_connection_t *conn, origin_circuit_t *circ, diff --git a/src/or/command.c b/src/or/command.c index ea0bbea1e5..60c9184b57 100644 --- a/src/or/command.c +++ b/src/or/command.c @@ -25,6 +25,7 @@ #include "control.h" #include "cpuworker.h" #include "hibernate.h" +#include "nodelist.h" #include "onion.h" #include "relay.h" #include "router.h" @@ -267,15 +268,18 @@ command_process_create_cell(cell_t *cell, or_connection_t *conn) } if (circuit_id_in_use_on_orconn(cell->circ_id, conn)) { - routerinfo_t *router = router_get_by_digest(conn->identity_digest); + const node_t *node = node_get_by_id(conn->identity_digest); log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, "Received CREATE cell (circID %d) for known circ. " "Dropping (age %d).", cell->circ_id, (int)(time(NULL) - conn->_base.timestamp_created)); - if (router) + if (node) { + char *p = esc_for_log(node_get_platform(node)); log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, "Details: nickname \"%s\", platform %s.", - router->nickname, escaped(router->platform)); + node_get_nickname(node), p); + tor_free(p); + } return; } @@ -618,7 +622,7 @@ command_process_netinfo_cell(cell_t *cell, or_connection_t *conn) /** Warn when we get a netinfo skew with at least this value. */ #define NETINFO_NOTICE_SKEW 3600 if (labs(apparent_skew) > NETINFO_NOTICE_SKEW && - router_get_by_digest(conn->identity_digest)) { + router_get_by_id_digest(conn->identity_digest)) { char dbuf[64]; int severity; /*XXXX be smarter about when everybody says we are skewed. */ diff --git a/src/or/config.c b/src/or/config.c index 91c2f56148..afabf80696 100644 --- a/src/or/config.c +++ b/src/or/config.c @@ -691,6 +691,11 @@ or_options_free(or_options_t *options) return; routerset_free(options->_ExcludeExitNodesUnion); + if (options->NodeFamilySets) { + SMARTLIST_FOREACH(options->NodeFamilySets, routerset_t *, + rs, routerset_free(rs)); + smartlist_free(options->NodeFamilySets); + } config_free(&options_format, options); } @@ -3078,17 +3083,24 @@ options_validate(or_options_t *old_options, or_options_t *options, routerset_union(options->_ExcludeExitNodesUnion,options->ExcludeNodes); } + if (options->NodeFamilies) { + options->NodeFamilySets = smartlist_create(); + for (cl = options->NodeFamilies; cl; cl = cl->next) { + routerset_t *rs = routerset_new(); + if (routerset_parse(rs, cl->value, cl->key) == 0) { + smartlist_add(options->NodeFamilySets, rs); + } else { + routerset_free(rs); + } + } + } + if (options->ExcludeNodes && options->StrictNodes) { COMPLAIN("You have asked to exclude certain relays from all positions " "in your circuits. Expect hidden services and other Tor " "features to be broken in unpredictable ways."); } - if (options->EntryNodes && !routerset_is_list(options->EntryNodes)) { - /* XXXX fix this; see entry_guards_prepend_from_config(). */ - REJECT("IPs or countries are not yet supported in EntryNodes."); - } - if (options->AuthoritativeDir) { if (!options->ContactInfo && !options->TestingTorNetwork) REJECT("Authoritative directory servers must set ContactInfo"); @@ -3543,8 +3555,12 @@ options_validate(or_options_t *old_options, or_options_t *options, if (check_nickname_list(options->MyFamily, "MyFamily", msg)) return -1; for (cl = options->NodeFamilies; cl; cl = cl->next) { - if (check_nickname_list(cl->value, "NodeFamily", msg)) + routerset_t *rs = routerset_new(); + if (routerset_parse(rs, cl->value, cl->key)) { + routerset_free(rs); return -1; + } + routerset_free(rs); } if (validate_addr_policies(options, msg) < 0) diff --git a/src/or/connection.c b/src/or/connection.c index d1b079a97e..52996e8ea4 100644 --- a/src/or/connection.c +++ b/src/or/connection.c @@ -1281,7 +1281,7 @@ connection_connect(connection_t *conn, const char *address, int s, inprogress = 0; char addrbuf[256]; struct sockaddr *dest_addr = (struct sockaddr*) addrbuf; - socklen_t dest_addr_len; + int dest_addr_len; or_options_t *options = get_options(); int protocol_family; @@ -1337,7 +1337,7 @@ connection_connect(connection_t *conn, const char *address, log_debug(LD_NET, "Connecting to %s:%u.", escaped_safe_str_client(address), port); - if (connect(s, dest_addr, dest_addr_len) < 0) { + if (connect(s, dest_addr, (socklen_t)dest_addr_len) < 0) { int e = tor_socket_errno(s); if (!ERRNO_IS_CONN_EINPROGRESS(e)) { /* yuck. kill it. */ diff --git a/src/or/connection.h b/src/or/connection.h index 004ede5d04..dc8c5df812 100644 --- a/src/or/connection.h +++ b/src/or/connection.h @@ -34,15 +34,21 @@ void _connection_mark_for_close(connection_t *conn,int line, const char *file); #define connection_mark_for_close(c) \ _connection_mark_for_close((c), __LINE__, _SHORT_FILE_) -#define connection_mark_and_flush(c) \ +/** + * Mark 'c' for close, but try to hold it open until all the data is written. + */ +#define _connection_mark_and_flush(c,line,file) \ do { \ connection_t *tmp_conn_ = (c); \ - _connection_mark_for_close(tmp_conn_, __LINE__, _SHORT_FILE_); \ + _connection_mark_for_close(tmp_conn_, (line), (file)); \ tmp_conn_->hold_open_until_flushed = 1; \ IF_HAS_BUFFEREVENT(tmp_conn_, \ connection_start_writing(tmp_conn_)); \ } while (0) +#define connection_mark_and_flush(c) \ + _connection_mark_and_flush((c), __LINE__, _SHORT_FILE_) + void connection_expire_held_open(void); int connection_connect(connection_t *conn, const char *address, diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c index e89bc66541..d595e6b728 100644 --- a/src/or/connection_edge.c +++ b/src/or/connection_edge.c @@ -23,6 +23,7 @@ #include "dirserv.h" #include "hibernate.h" #include "main.h" +#include "nodelist.h" #include "policies.h" #include "reasons.h" #include "relay.h" @@ -90,9 +91,8 @@ _connection_mark_unattached_ap(edge_connection_t *conn, int endreason, conn->socks_request->has_finished = 1; } - _connection_mark_for_close(TO_CONN(conn), line, file); - conn->_base.hold_open_until_flushed = 1; - IF_HAS_BUFFEREVENT(TO_CONN(conn), connection_start_writing(TO_CONN(conn))); + _connection_mark_and_flush(TO_CONN(conn), line, file); + conn->end_reason = endreason; } @@ -587,7 +587,7 @@ void circuit_discard_optional_exit_enclaves(extend_info_t *info) { edge_connection_t *edge_conn; - routerinfo_t *r1, *r2; + const node_t *r1, *r2; smartlist_t *conns = get_connection_array(); SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) { @@ -599,8 +599,8 @@ circuit_discard_optional_exit_enclaves(extend_info_t *info) if (!edge_conn->chosen_exit_optional && !edge_conn->chosen_exit_retries) continue; - r1 = router_get_by_nickname(edge_conn->chosen_exit_name, 0); - r2 = router_get_by_nickname(info->nickname, 0); + r1 = node_get_by_nickname(edge_conn->chosen_exit_name, 0); + r2 = node_get_by_nickname(info->nickname, 0); if (!r1 || !r2 || r1 != r2) continue; tor_assert(edge_conn->socks_request); @@ -1572,12 +1572,12 @@ connection_ap_handshake_rewrite_and_attach(edge_connection_t *conn, return -1; } } else { - routerinfo_t *r; + const node_t *r; conn->chosen_exit_name = tor_strdup(socks->address); - r = router_get_by_nickname(conn->chosen_exit_name, 1); + r = node_get_by_nickname(conn->chosen_exit_name, 1); *socks->address = 0; if (r) { - strlcpy(socks->address, r->address, sizeof(socks->address)); + node_get_address_string(r, socks->address, sizeof(socks->address)); } else { log_warn(LD_APP, "Unrecognized server in exit address '%s.exit'. Refusing.", @@ -1628,16 +1628,16 @@ connection_ap_handshake_rewrite_and_attach(edge_connection_t *conn, if (!conn->use_begindir && !conn->chosen_exit_name && !circ) { /* see if we can find a suitable enclave exit */ - routerinfo_t *r = + const node_t *r = router_find_exact_exit_enclave(socks->address, socks->port); if (r) { log_info(LD_APP, "Redirecting address %s to exit at enclave router %s", - safe_str_client(socks->address), r->nickname); + safe_str_client(socks->address), node_get_nickname(r)); /* use the hex digest, not nickname, in case there are two routers with this nickname */ conn->chosen_exit_name = - tor_strdup(hex_str(r->cache_info.identity_digest, DIGEST_LEN)); + tor_strdup(hex_str(r->identity, DIGEST_LEN)); conn->chosen_exit_optional = 1; } } @@ -2891,7 +2891,7 @@ connection_edge_is_rendezvous_stream(edge_connection_t *conn) * this relay, return 0. */ int -connection_ap_can_use_exit(edge_connection_t *conn, routerinfo_t *exit, +connection_ap_can_use_exit(edge_connection_t *conn, const node_t *exit, int excluded_means_no) { or_options_t *options = get_options(); @@ -2905,10 +2905,10 @@ connection_ap_can_use_exit(edge_connection_t *conn, routerinfo_t *exit, * make sure the exit node of the existing circuit matches exactly. */ if (conn->chosen_exit_name) { - routerinfo_t *chosen_exit = - router_get_by_nickname(conn->chosen_exit_name, 1); - if (!chosen_exit || memcmp(chosen_exit->cache_info.identity_digest, - exit->cache_info.identity_digest, DIGEST_LEN)) { + const node_t *chosen_exit = + node_get_by_nickname(conn->chosen_exit_name, 1); + if (!chosen_exit || memcmp(chosen_exit->identity, + exit->identity, DIGEST_LEN)) { /* doesn't match */ // log_debug(LD_APP,"Requested node '%s', considering node '%s'. No.", // conn->chosen_exit_name, exit->nickname); @@ -2923,8 +2923,7 @@ connection_ap_can_use_exit(edge_connection_t *conn, routerinfo_t *exit, addr_policy_result_t r; if (tor_inet_aton(conn->socks_request->address, &in)) addr = ntohl(in.s_addr); - r = compare_addr_to_addr_policy(addr, conn->socks_request->port, - exit->exit_policy); + r = compare_addr_to_node_policy(addr, conn->socks_request->port, exit); if (r == ADDR_POLICY_REJECTED) return 0; /* We know the address, and the exit policy rejects it. */ if (r == ADDR_POLICY_PROBABLY_REJECTED && !conn->chosen_exit_name) @@ -2933,12 +2932,12 @@ connection_ap_can_use_exit(edge_connection_t *conn, routerinfo_t *exit, * this node, err on the side of caution. */ } else if (SOCKS_COMMAND_IS_RESOLVE(conn->socks_request->command)) { /* Don't send DNS requests to non-exit servers by default. */ - if (!conn->chosen_exit_name && policy_is_reject_star(exit->exit_policy)) + if (!conn->chosen_exit_name && node_exit_policy_rejects_all(exit)) return 0; } if (options->_ExcludeExitNodesUnion && (options->StrictNodes || excluded_means_no) && - routerset_contains_router(options->_ExcludeExitNodesUnion, exit)) { + routerset_contains_node(options->_ExcludeExitNodesUnion, exit)) { /* If we are trying to avoid this node as exit, and we have StrictNodes * set, then this is not a suitable exit. Refuse it. * diff --git a/src/or/connection_edge.h b/src/or/connection_edge.h index 0f7bf07809..f54d7a44ec 100644 --- a/src/or/connection_edge.h +++ b/src/or/connection_edge.h @@ -47,7 +47,8 @@ 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_ap_can_use_exit(edge_connection_t *conn, routerinfo_t *exit, +int connection_ap_can_use_exit(edge_connection_t *conn, + const node_t *exit, int excluded_means_no); void connection_ap_expire_beginning(void); void connection_ap_attach_pending(void); diff --git a/src/or/connection_or.c b/src/or/connection_or.c index 069c3e133d..9f979f086e 100644 --- a/src/or/connection_or.c +++ b/src/or/connection_or.c @@ -22,6 +22,7 @@ #include "geoip.h" #include "main.h" #include "networkstatus.h" +#include "nodelist.h" #include "reasons.h" #include "relay.h" #include "rephist.h" @@ -41,6 +42,8 @@ static int connection_or_check_valid_tls_handshake(or_connection_t *conn, int started_here, char *digest_rcvd_out); +static void connection_or_tls_renegotiated_cb(tor_tls_t *tls, void *_conn); + #ifdef USE_BUFFEREVENTS static void connection_or_handle_event_cb(struct bufferevent *bufev, short event, void *arg); @@ -237,6 +240,12 @@ connection_or_process_inbuf(or_connection_t *conn) } return ret; + case OR_CONN_STATE_TLS_SERVER_RENEGOTIATING: + if (tor_tls_server_got_renegotiate(conn->tls)) + connection_or_tls_renegotiated_cb(conn->tls, conn); + if (conn->_base.marked_for_close) + return 0; + /* fall through. */ case OR_CONN_STATE_OPEN: case OR_CONN_STATE_OR_HANDSHAKING: return connection_or_process_cells_from_inbuf(conn); @@ -351,7 +360,7 @@ connection_or_digest_is_known_relay(const char *id_digest) { if (router_get_consensus_status_by_id(id_digest)) return 1; /* It's in the consensus: "yes" */ - if (router_get_by_digest(id_digest)) + if (router_get_by_id_digest(id_digest)) return 1; /* Not in the consensus, but we have a descriptor for * it. Probably it was in a recent consensus. "Yes". */ return 0; @@ -438,7 +447,7 @@ connection_or_init_conn_from_address(or_connection_t *conn, const char *id_digest, int started_here) { - routerinfo_t *r = router_get_by_digest(id_digest); + const node_t *r = node_get_by_id(id_digest); connection_or_set_identity_digest(conn, id_digest); connection_or_update_token_buckets_helper(conn, 1, get_options()); @@ -446,8 +455,10 @@ connection_or_init_conn_from_address(or_connection_t *conn, tor_addr_copy(&conn->_base.addr, addr); tor_addr_copy(&conn->real_addr, addr); if (r) { + tor_addr_t node_addr; + node_get_addr(r, &node_addr); /* XXXX proposal 118 will make this more complex. */ - if (tor_addr_eq_ipv4h(&conn->_base.addr, r->addr)) + if (tor_addr_eq(&conn->_base.addr, &node_addr)) conn->is_canonical = 1; if (!started_here) { /* Override the addr/port, so our log messages will make sense. @@ -460,12 +471,12 @@ connection_or_init_conn_from_address(or_connection_t *conn, * right IP address and port 56244, that wouldn't be as helpful. now we * log the "right" port too, so we know if it's moria1 or moria2. */ - tor_addr_from_ipv4h(&conn->_base.addr, r->addr); - conn->_base.port = r->or_port; + tor_addr_copy(&conn->_base.addr, &node_addr); + conn->_base.port = node_get_orport(r); } - conn->nickname = tor_strdup(r->nickname); + conn->nickname = tor_strdup(node_get_nickname(r)); tor_free(conn->_base.address); - conn->_base.address = tor_strdup(r->address); + conn->_base.address = tor_dup_addr(&node_addr); } else { const char *n; /* If we're an authoritative directory server, we may know a @@ -906,9 +917,12 @@ connection_tls_start_handshake(or_connection_t *conn, int receiving) if (conn->bucket_cfg) bufferevent_set_rate_limit(conn->_base.bufev, conn->bucket_cfg); connection_enable_rate_limiting(TO_CONN(conn)); - bufferevent_setcb(b, connection_handle_read_cb, + + connection_configure_bufferevent_callbacks(TO_CONN(conn)); + bufferevent_setcb(b, + connection_handle_read_cb, connection_handle_write_cb, - connection_or_handle_event_cb, + connection_or_handle_event_cb,/* overriding this one*/ TO_CONN(conn)); } #endif @@ -1034,14 +1048,29 @@ connection_or_handle_event_cb(struct bufferevent *bufev, short event, tor_tls_unblock_renegotiation(conn->tls); return; /* ???? */ } - } else { - /* improved handshake, but not a client. */ + } else if (tor_tls_get_num_server_handshakes(conn->tls) == 1) { + /* improved handshake, as a server. Only got one handshake, so + * wait for the next one. */ tor_tls_set_renegotiate_callback(conn->tls, connection_or_tls_renegotiated_cb, conn); conn->_base.state = OR_CONN_STATE_TLS_SERVER_RENEGOTIATING; /* return 0; */ return; /* ???? */ + } else { + const int handshakes = tor_tls_get_num_server_handshakes(conn->tls); + tor_assert(handshakes >= 2); + if (handshakes == 2) { + /* improved handshake, as a server. Two handshakes happened already, + * so we treat renegotiation as done. + */ + connection_or_tls_renegotiated_cb(conn->tls, conn); + } else { + log_warn(LD_OR, "More than two handshakes done on connection. " + "Closing."); + connection_mark_for_close(TO_CONN(conn)); + } + return; } } connection_watch_events(TO_CONN(conn), READ_EVENT|WRITE_EVENT); @@ -1050,6 +1079,14 @@ connection_or_handle_event_cb(struct bufferevent *bufev, short event, return; } + if (event & BEV_EVENT_ERROR) { + unsigned long err; + while ((err = bufferevent_get_openssl_error(bufev))) { + tor_tls_log_one_error(conn->tls, err, LOG_WARN, LD_OR, + "handshaking (with bufferevent)"); + } + } + connection_handle_event_cb(bufev, event, arg); } #endif @@ -1222,7 +1259,9 @@ connection_tls_finish_handshake(or_connection_t *conn) char digest_rcvd[DIGEST_LEN]; int started_here = connection_or_nonopen_was_started_here(conn); - log_debug(LD_HANDSHAKE,"tls handshake with %s done. verifying.", + log_debug(LD_HANDSHAKE,"%s tls handshake on %p with %s done. verifying.", + started_here?"outgoing":"incoming", + conn, safe_str_client(conn->_base.address)); directory_set_dirty(); @@ -1303,7 +1342,7 @@ connection_or_set_state_open(or_connection_t *conn) router_set_status(conn->identity_digest, 1); } else { /* only report it to the geoip module if it's not a known router */ - if (!router_get_by_digest(conn->identity_digest)) { + if (!router_get_by_id_digest(conn->identity_digest)) { if (tor_addr_family(&TO_CONN(conn)->addr) == AF_INET) { /*XXXX IP6 support ipv6 geoip.*/ uint32_t a = tor_addr_to_ipv4h(&TO_CONN(conn)->addr); @@ -1491,7 +1530,7 @@ connection_or_send_netinfo(or_connection_t *conn) { cell_t cell; time_t now = time(NULL); - routerinfo_t *me; + const routerinfo_t *me; int len; char *out; diff --git a/src/or/control.c b/src/or/control.c index 37ebfd88dc..a2c9e467f5 100644 --- a/src/or/control.c +++ b/src/or/control.c @@ -26,6 +26,7 @@ #include "hibernate.h" #include "main.h" #include "networkstatus.h" +#include "nodelist.h" #include "policies.h" #include "reasons.h" #include "router.h" @@ -1344,7 +1345,7 @@ getinfo_helper_misc(control_connection_t *conn, const char *question, } else if (!strcmp(question, "dir-usage")) { *answer = directory_dump_request_log(); } else if (!strcmp(question, "fingerprint")) { - routerinfo_t *me = router_get_my_routerinfo(); + const routerinfo_t *me = router_get_my_routerinfo(); if (!me) { *errmsg = "No routerdesc known; am I really a server?"; return -1; @@ -1366,8 +1367,9 @@ getinfo_helper_misc(control_connection_t *conn, const char *question, * NOTE: <b>ri_body</b> is as returned by signed_descriptor_get_body: it might * not be NUL-terminated. */ static char * -munge_extrainfo_into_routerinfo(const char *ri_body, signed_descriptor_t *ri, - signed_descriptor_t *ei) +munge_extrainfo_into_routerinfo(const char *ri_body, + const signed_descriptor_t *ri, + const signed_descriptor_t *ei) { char *out = NULL, *outp; int i; @@ -1412,16 +1414,17 @@ getinfo_helper_dir(control_connection_t *control_conn, const char *question, char **answer, const char **errmsg) { + const routerinfo_t *ri; (void) control_conn; if (!strcmpstart(question, "desc/id/")) { - routerinfo_t *ri = router_get_by_hexdigest(question+strlen("desc/id/")); + ri = router_get_by_hexdigest(question+strlen("desc/id/")); if (ri) { const char *body = signed_descriptor_get_body(&ri->cache_info); if (body) *answer = tor_strndup(body, ri->cache_info.signed_descriptor_len); } } else if (!strcmpstart(question, "desc/name/")) { - routerinfo_t *ri = router_get_by_nickname(question+strlen("desc/name/"),1); + ri = router_get_by_nickname(question+strlen("desc/name/"),1); if (ri) { const char *body = signed_descriptor_get_body(&ri->cache_info); if (body) @@ -1431,7 +1434,7 @@ getinfo_helper_dir(control_connection_t *control_conn, routerlist_t *routerlist = router_get_routerlist(); smartlist_t *sl = smartlist_create(); if (routerlist && routerlist->routers) { - SMARTLIST_FOREACH(routerlist->routers, routerinfo_t *, ri, + SMARTLIST_FOREACH(routerlist->routers, const routerinfo_t *, ri, { const char *body = signed_descriptor_get_body(&ri->cache_info); if (body) @@ -1447,7 +1450,7 @@ getinfo_helper_dir(control_connection_t *control_conn, routerlist_t *routerlist = router_get_routerlist(); smartlist_t *sl = smartlist_create(); if (routerlist && routerlist->routers) { - SMARTLIST_FOREACH(routerlist->routers, routerinfo_t *, ri, + SMARTLIST_FOREACH(routerlist->routers, const routerinfo_t *, ri, { const char *body = signed_descriptor_get_body(&ri->cache_info); signed_descriptor_t *ei = extrainfo_get_by_descriptor_digest( @@ -1465,8 +1468,8 @@ getinfo_helper_dir(control_connection_t *control_conn, SMARTLIST_FOREACH(sl, char *, c, tor_free(c)); smartlist_free(sl); } else if (!strcmpstart(question, "desc-annotations/id/")) { - routerinfo_t *ri = router_get_by_hexdigest(question+ - strlen("desc-annotations/id/")); + ri = router_get_by_hexdigest(question+ + strlen("desc-annotations/id/")); if (ri) { const char *annotations = signed_descriptor_get_annotations(&ri->cache_info); @@ -2105,7 +2108,7 @@ static int handle_control_extendcircuit(control_connection_t *conn, uint32_t len, const char *body) { - smartlist_t *router_nicknames=NULL, *routers=NULL; + smartlist_t *router_nicknames=NULL, *nodes=NULL; origin_circuit_t *circ = NULL; int zero_circ; uint8_t intended_purpose = CIRCUIT_PURPOSE_C_GENERAL; @@ -2136,8 +2139,7 @@ handle_control_extendcircuit(control_connection_t *conn, uint32_t len, if ((smartlist_len(args) == 1) || (smartlist_len(args) >= 2 && is_keyval_pair(smartlist_get(args, 1)))) { // "EXTENDCIRCUIT 0" || EXTENDCIRCUIT 0 foo=bar" - circ = circuit_launch_by_router(intended_purpose, NULL, - CIRCLAUNCH_NEED_CAPACITY); + circ = circuit_launch(intended_purpose, CIRCLAUNCH_NEED_CAPACITY); if (!circ) { connection_write_str_to_buf("551 Couldn't start circuit\r\n", conn); } else { @@ -2165,17 +2167,21 @@ handle_control_extendcircuit(control_connection_t *conn, uint32_t len, SMARTLIST_FOREACH(args, char *, cp, tor_free(cp)); smartlist_free(args); - routers = smartlist_create(); + nodes = smartlist_create(); SMARTLIST_FOREACH(router_nicknames, const char *, n, { - routerinfo_t *r = router_get_by_nickname(n, 1); - if (!r) { + const node_t *node = node_get_by_nickname(n, 1); + if (!node) { connection_printf_to_buf(conn, "552 No such router \"%s\"\r\n", n); goto done; } - smartlist_add(routers, r); + if (!node_has_descriptor(node)) { + connection_printf_to_buf(conn, "552 descriptor for \"%s\"\r\n", n); + goto done; + } + smartlist_add(nodes, (void*)node); }); - if (!smartlist_len(routers)) { + if (!smartlist_len(nodes)) { connection_write_str_to_buf("512 No router names provided\r\n", conn); goto done; } @@ -2186,9 +2192,10 @@ handle_control_extendcircuit(control_connection_t *conn, uint32_t len, } /* now circ refers to something that is ready to be extended */ - SMARTLIST_FOREACH(routers, routerinfo_t *, r, + SMARTLIST_FOREACH(nodes, const node_t *, node, { - extend_info_t *info = extend_info_from_router(r); + extend_info_t *info = extend_info_from_node(node); + tor_assert(info); /* True, since node_has_descriptor(node) == true */ circuit_append_new_exit(circ, info); extend_info_free(info); }); @@ -2222,7 +2229,7 @@ handle_control_extendcircuit(control_connection_t *conn, uint32_t len, done: SMARTLIST_FOREACH(router_nicknames, char *, n, tor_free(n)); smartlist_free(router_nicknames); - smartlist_free(routers); + smartlist_free(nodes); return 0; } @@ -2338,16 +2345,17 @@ handle_control_attachstream(control_connection_t *conn, uint32_t len, } /* Is this a single hop circuit? */ if (circ && (circuit_get_cpath_len(circ)<2 || hop==1)) { - routerinfo_t *r = NULL; - char* exit_digest; + const node_t *node = NULL; + char *exit_digest; if (circ->build_state && circ->build_state->chosen_exit && !tor_digest_is_zero(circ->build_state->chosen_exit->identity_digest)) { exit_digest = circ->build_state->chosen_exit->identity_digest; - r = router_get_by_digest(exit_digest); + node = node_get_by_id(exit_digest); } /* Do both the client and relay allow one-hop exit circuits? */ - if (!r || !r->allow_single_hop_exits || + if (!node || + !node_allows_single_hop_exits(node) || !get_options()->AllowSingleHopCircuits) { connection_write_str_to_buf( "551 Can't attach stream to this one-hop circuit.\r\n", conn); @@ -2798,8 +2806,8 @@ connection_control_process_inbuf(control_connection_t *conn) body_len = 2+strlen(buf+6)+2; /* code, msg, nul. */ set_uint16(buf+0, htons(body_len)); connection_write_to_buf(buf, 4+body_len, TO_CONN(conn)); - connection_mark_for_close(TO_CONN(conn)); - conn->_base.hold_open_until_flushed = 1; + + connection_mark_and_flush(TO_CONN(conn)); return 0; } @@ -2820,8 +2828,7 @@ connection_control_process_inbuf(control_connection_t *conn) if (data_len + conn->incoming_cmd_cur_len > MAX_COMMAND_LINE_LENGTH) { connection_write_str_to_buf("500 Line too long.\r\n", conn); connection_stop_reading(TO_CONN(conn)); - connection_mark_for_close(TO_CONN(conn)); - conn->_base.hold_open_until_flushed = 1; + connection_mark_and_flush(TO_CONN(conn)); } while (conn->incoming_cmd_len < data_len+conn->incoming_cmd_cur_len) conn->incoming_cmd_len *= 2; @@ -2880,8 +2887,7 @@ connection_control_process_inbuf(control_connection_t *conn) /* Otherwise, Quit is always valid. */ if (!strcasecmp(conn->incoming_cmd, "QUIT")) { connection_write_str_to_buf("250 closing connection\r\n", conn); - connection_mark_for_close(TO_CONN(conn)); - conn->_base.hold_open_until_flushed = 1; + connection_mark_and_flush(TO_CONN(conn)); return 0; } @@ -3175,10 +3181,10 @@ control_event_stream_status(edge_connection_t *conn, stream_status_event_t tp, static void orconn_target_get_name(char *name, size_t len, or_connection_t *conn) { - routerinfo_t *ri = router_get_by_digest(conn->identity_digest); - if (ri) { + const node_t *node = node_get_by_id(conn->identity_digest); + if (node) { tor_assert(len > MAX_VERBOSE_NICKNAME_LEN); - router_get_verbose_nickname(name, ri); + node_get_verbose_nickname(node, name); } else if (! tor_digest_is_zero(conn->identity_digest)) { name[0] = '$'; base16_encode(name+1, len-1, conn->identity_digest, @@ -3495,7 +3501,7 @@ control_event_networkstatus_changed_helper(smartlist_t *statuses, smartlist_add(strs, tor_strdup("650+")); smartlist_add(strs, tor_strdup(event_string)); smartlist_add(strs, tor_strdup("\r\n")); - SMARTLIST_FOREACH(statuses, routerstatus_t *, rs, + SMARTLIST_FOREACH(statuses, const routerstatus_t *, rs, { s = networkstatus_getinfo_helper_single(rs); if (!s) continue; @@ -3586,7 +3592,7 @@ control_event_buildtimeout_set(const circuit_build_times_t *cbt, /** Called when a single local_routerstatus_t has changed: Sends an NS event * to any controller that cares. */ int -control_event_networkstatus_changed_single(routerstatus_t *rs) +control_event_networkstatus_changed_single(const routerstatus_t *rs) { smartlist_t *statuses; int r; @@ -3595,7 +3601,7 @@ control_event_networkstatus_changed_single(routerstatus_t *rs) return 0; statuses = smartlist_create(); - smartlist_add(statuses, rs); + smartlist_add(statuses, (void*)rs); r = control_event_networkstatus_changed(statuses); smartlist_free(statuses); return r; @@ -3720,9 +3726,9 @@ control_event_guard(const char *nickname, const char *digest, { char buf[MAX_VERBOSE_NICKNAME_LEN+1]; - routerinfo_t *ri = router_get_by_digest(digest); - if (ri) { - router_get_verbose_nickname(buf, ri); + const node_t *node = node_get_by_id(digest); + if (node) { + node_get_verbose_nickname(node, buf); } else { tor_snprintf(buf, sizeof(buf), "$%s~%s", hbuf, nickname); } diff --git a/src/or/control.h b/src/or/control.h index 27ef5c37f7..275c6de8e1 100644 --- a/src/or/control.h +++ b/src/or/control.h @@ -53,7 +53,7 @@ int control_event_my_descriptor_changed(void); int control_event_networkstatus_changed(smartlist_t *statuses); int control_event_newconsensus(const networkstatus_t *consensus); -int control_event_networkstatus_changed_single(routerstatus_t *rs); +int control_event_networkstatus_changed_single(const routerstatus_t *rs); int control_event_general_status(int severity, const char *format, ...) CHECK_PRINTF(2,3); int control_event_client_status(int severity, const char *format, ...) diff --git a/src/or/directory.c b/src/or/directory.c index 657b210b5f..a4d123d64e 100644 --- a/src/or/directory.c +++ b/src/or/directory.c @@ -17,6 +17,7 @@ #include "main.h" #include "microdesc.h" #include "networkstatus.h" +#include "nodelist.h" #include "policies.h" #include "rendclient.h" #include "rendcommon.h" @@ -219,17 +220,19 @@ dir_conn_purpose_to_string(int purpose) int router_supports_extrainfo(const char *identity_digest, int is_authority) { - routerinfo_t *ri = router_get_by_digest(identity_digest); + const node_t *node = node_get_by_id(identity_digest); - if (ri) { - if (ri->caches_extra_info) + if (node && node->ri) { + if (node->ri->caches_extra_info) return 1; - if (is_authority && ri->platform && - tor_version_as_new_as(ri->platform, "Tor 0.2.0.0-alpha-dev (r10070)")) + if (is_authority && node->ri->platform && + tor_version_as_new_as(node->ri->platform, + "Tor 0.2.0.0-alpha-dev (r10070)")) return 1; } if (is_authority) { - routerstatus_t *rs = router_get_consensus_status_by_id(identity_digest); + const routerstatus_t *rs = + router_get_consensus_status_by_id(identity_digest); if (rs && rs->version_supports_extrainfo_upload) return 1; } @@ -328,7 +331,7 @@ void directory_get_from_dirserver(uint8_t dir_purpose, uint8_t router_purpose, const char *resource, int pds_flags) { - routerstatus_t *rs = NULL; + const routerstatus_t *rs = NULL; or_options_t *options = get_options(); int prefer_authority = directory_fetches_from_authorities(options); int get_via_tor = purpose_needs_anonymity(dir_purpose, router_purpose); @@ -400,10 +403,12 @@ directory_get_from_dirserver(uint8_t dir_purpose, uint8_t router_purpose, * possible directory question. This won't be true forever. -RD */ /* It certainly is not true with conditional consensus downloading, * so, for now, never assume the server supports that. */ - routerinfo_t *ri = choose_random_entry(NULL); - if (ri) { + const node_t *node = choose_random_entry(NULL); + if (node && node->ri) { + /* every bridge has a routerinfo. */ tor_addr_t addr; - tor_addr_from_ipv4h(&addr, ri->addr); + routerinfo_t *ri = node->ri; + node_get_addr(node, &addr); directory_initiate_command(ri->address, &addr, ri->or_port, 0, 0, /* don't use conditional consensus url */ @@ -512,7 +517,7 @@ directory_get_from_all_authorities(uint8_t dir_purpose, /** Same as directory_initiate_command_routerstatus(), but accepts * rendezvous data to fetch a hidden service descriptor. */ void -directory_initiate_command_routerstatus_rend(routerstatus_t *status, +directory_initiate_command_routerstatus_rend(const routerstatus_t *status, uint8_t dir_purpose, uint8_t router_purpose, int anonymized_connection, @@ -522,18 +527,19 @@ directory_initiate_command_routerstatus_rend(routerstatus_t *status, time_t if_modified_since, const rend_data_t *rend_query) { - routerinfo_t *router; + const node_t *node; char address_buf[INET_NTOA_BUF_LEN+1]; struct in_addr in; const char *address; tor_addr_t addr; - router = router_get_by_digest(status->identity_digest); - if (!router && anonymized_connection) { + node = node_get_by_id(status->identity_digest); + if (!node && anonymized_connection) { log_info(LD_DIR, "Not sending anonymized request to directory '%s'; we " "don't have its router descriptor.", status->nickname); return; - } else if (router) { - address = router->address; + } else if (node) { + node_get_address_string(node, address_buf, sizeof(address_buf)); + address = address_buf; } else { in.s_addr = htonl(status->addr); tor_inet_ntoa(&in, address_buf, sizeof(address_buf)); @@ -566,7 +572,7 @@ directory_initiate_command_routerstatus_rend(routerstatus_t *status, * want to fetch. */ void -directory_initiate_command_routerstatus(routerstatus_t *status, +directory_initiate_command_routerstatus(const routerstatus_t *status, uint8_t dir_purpose, uint8_t router_purpose, int anonymized_connection, @@ -590,7 +596,7 @@ directory_conn_is_self_reachability_test(dir_connection_t *conn) { if (conn->requested_resource && !strcmpstart(conn->requested_resource,"authority")) { - routerinfo_t *me = router_get_my_routerinfo(); + const routerinfo_t *me = router_get_my_routerinfo(); if (me && router_digest_is_me(conn->identity_digest) && tor_addr_eq_ipv4h(&conn->_base.addr, me->addr) && /*XXXX prop 118*/ @@ -1157,7 +1163,7 @@ directory_send_command(dir_connection_t *conn, case DIR_PURPOSE_FETCH_MICRODESC: tor_assert(resource); httpcommand = "GET"; - tor_asprintf(&url, "/tor/micro/%s.z", resource); + tor_asprintf(&url, "/tor/micro/%s", resource); break; case DIR_PURPOSE_UPLOAD_DIR: tor_assert(!resource); @@ -1597,7 +1603,8 @@ connection_dir_client_reached_eof(dir_connection_t *conn) "'%s:%d'. I'll try again soon.", status_code, escaped(reason), conn->_base.address, conn->_base.port); - if ((rs = router_get_consensus_status_by_id(conn->identity_digest))) + rs = router_get_mutable_consensus_status_by_id(conn->identity_digest); + if (rs) rs->last_dir_503_at = now; if ((ds = router_get_trusteddirserver_by_digest(conn->identity_digest))) ds->fake_status.last_dir_503_at = now; @@ -3692,7 +3699,7 @@ dir_microdesc_download_failed(smartlist_t *failed, if (! consensus) return; SMARTLIST_FOREACH_BEGIN(failed, const char *, d) { - rs = router_get_consensus_status_by_descriptor_digest(consensus, d); + rs = router_get_mutable_consensus_status_by_descriptor_digest(consensus,d); if (!rs) continue; dls = &rs->dl_status; diff --git a/src/or/directory.h b/src/or/directory.h index 6fd2c0beff..5782df9267 100644 --- a/src/or/directory.h +++ b/src/or/directory.h @@ -23,7 +23,7 @@ void directory_get_from_dirserver(uint8_t dir_purpose, uint8_t router_purpose, void directory_get_from_all_authorities(uint8_t dir_purpose, uint8_t router_purpose, const char *resource); -void directory_initiate_command_routerstatus(routerstatus_t *status, +void directory_initiate_command_routerstatus(const routerstatus_t *status, uint8_t dir_purpose, uint8_t router_purpose, int anonymized_connection, @@ -31,7 +31,7 @@ void directory_initiate_command_routerstatus(routerstatus_t *status, const char *payload, size_t payload_len, time_t if_modified_since); -void directory_initiate_command_routerstatus_rend(routerstatus_t *status, +void directory_initiate_command_routerstatus_rend(const routerstatus_t *status, uint8_t dir_purpose, uint8_t router_purpose, int anonymized_connection, diff --git a/src/or/dirserv.c b/src/or/dirserv.c index 5f94cebe1c..650d6a57c1 100644 --- a/src/or/dirserv.c +++ b/src/or/dirserv.c @@ -16,6 +16,7 @@ #include "hibernate.h" #include "microdesc.h" #include "networkstatus.h" +#include "nodelist.h" #include "policies.h" #include "rephist.h" #include "router.h" @@ -65,8 +66,6 @@ static char *format_versions_list(config_line_t *ln); struct authdir_config_t; static int add_fingerprint_to_dir(const char *nickname, const char *fp, struct authdir_config_t *list); -static uint32_t dirserv_router_get_status(const routerinfo_t *router, - const char **msg); static uint32_t dirserv_get_status_impl(const char *fp, const char *nickname, const char *address, @@ -74,7 +73,8 @@ dirserv_get_status_impl(const char *fp, const char *nickname, const char *platform, const char *contact, const char **msg, int should_log); static void clear_cached_dir(cached_dir_t *d); -static signed_descriptor_t *get_signed_descriptor_by_fp(const char *fp, +static const signed_descriptor_t *get_signed_descriptor_by_fp( + const char *fp, int extrainfo, time_t publish_cutoff); static int dirserv_add_extrainfo(extrainfo_t *ei, const char **msg); @@ -303,7 +303,7 @@ dirserv_load_fingerprint_file(void) * * If the status is 'FP_REJECT' and <b>msg</b> is provided, set * *<b>msg</b> to an explanation of why. */ -static uint32_t +uint32_t dirserv_router_get_status(const routerinfo_t *router, const char **msg) { char d[DIGEST_LEN]; @@ -325,7 +325,7 @@ dirserv_router_get_status(const routerinfo_t *router, const char **msg) /** Return true if there is no point in downloading the router described by * <b>rs</b> because this directory would reject it. */ int -dirserv_would_reject_router(routerstatus_t *rs) +dirserv_would_reject_router(const routerstatus_t *rs) { uint32_t res; @@ -360,7 +360,7 @@ dirserv_get_name_status(const char *id_digest, const char *nickname) return 0; } -/** Helper: As dirserv_get_router_status, but takes the router fingerprint +/** Helper: As dirserv_router_get_status, but takes the router fingerprint * (hex, no spaces), nickname, address (used for logging only), IP address, OR * port, platform (logging only) and contact info (logging only) as arguments. * @@ -375,7 +375,7 @@ dirserv_get_status_impl(const char *id_digest, const char *nickname, const char **msg, int should_log) { int reject_unlisted = get_options()->AuthDirRejectUnlisted; - uint32_t result = 0; + uint32_t result; router_status_t *status_by_digest; if (!fingerprint_list) @@ -533,7 +533,7 @@ dirserv_router_has_valid_address(routerinfo_t *ri) */ int authdir_wants_to_reject_router(routerinfo_t *ri, const char **msg, - int complain) + int complain, int *valid_out) { /* Okay. Now check whether the fingerprint is recognized. */ uint32_t status = dirserv_router_get_status(ri, msg); @@ -574,15 +574,24 @@ authdir_wants_to_reject_router(routerinfo_t *ri, const char **msg, *msg = "Rejected: Address is not an IP, or IP is a private address."; return -1; } - /* Okay, looks like we're willing to accept this one. */ - ri->is_named = (status & FP_NAMED) ? 1 : 0; - ri->is_valid = (status & FP_INVALID) ? 0 : 1; - ri->is_bad_directory = (status & FP_BADDIR) ? 1 : 0; - ri->is_bad_exit = (status & FP_BADEXIT) ? 1 : 0; + + *valid_out = ! (status & FP_INVALID); return 0; } +/** Update the relevant flags of <b>node</b> based on our opinion as a + * directory authority in <b>authstatus</b>, as returned by + * dirserv_router_get_status or equivalent. */ +void +dirserv_set_node_flags_from_authoritative_status(node_t *node, + uint32_t authstatus) +{ + node->is_valid = (authstatus & FP_INVALID) ? 0 : 1; + node->is_bad_directory = (authstatus & FP_BADDIR) ? 1 : 0; + node->is_bad_exit = (authstatus & FP_BADEXIT) ? 1 : 0; +} + /** True iff <b>a</b> is more severe than <b>b</b>. */ static int WRA_MORE_SEVERE(was_router_added_t a, was_router_added_t b) @@ -707,7 +716,7 @@ dirserv_add_descriptor(routerinfo_t *ri, const char **msg, const char *source) * from this server. (We do this here and not in router_add_to_routerlist * because we want to be able to accept the newest router descriptor that * another authority has, so we all converge on the same one.) */ - ri_old = router_get_by_digest(ri->cache_info.identity_digest); + ri_old = router_get_mutable_by_digest(ri->cache_info.identity_digest); if (ri_old && ri_old->cache_info.published_on < ri->cache_info.published_on && router_differences_are_cosmetic(ri_old, ri) && !router_is_me(ri)) { @@ -751,8 +760,7 @@ dirserv_add_descriptor(routerinfo_t *ri, const char **msg, const char *source) routerlist_descriptors_added(changed, 0); smartlist_free(changed); if (!*msg) { - *msg = ri->is_valid ? "Descriptor for valid server accepted" : - "Descriptor for invalid server accepted"; + *msg = "Descriptor accepted"; } log_info(LD_DIRSERV, "Added descriptor from '%s' (source: %s): %s.", @@ -767,12 +775,12 @@ dirserv_add_descriptor(routerinfo_t *ri, const char **msg, const char *source) static was_router_added_t dirserv_add_extrainfo(extrainfo_t *ei, const char **msg) { - routerinfo_t *ri; + const routerinfo_t *ri; int r; tor_assert(msg); *msg = NULL; - ri = router_get_by_digest(ei->cache_info.identity_digest); + ri = router_get_by_id_digest(ei->cache_info.identity_digest); if (!ri) { *msg = "No corresponding router descriptor for extra-info descriptor"; extrainfo_free(ei); @@ -807,50 +815,60 @@ dirserv_add_extrainfo(extrainfo_t *ei, const char **msg) static void directory_remove_invalid(void) { - int i; int changed = 0; routerlist_t *rl = router_get_routerlist(); + smartlist_t *nodes = smartlist_create(); + smartlist_add_all(nodes, nodelist_get_list()); - routerlist_assert_ok(rl); - - for (i = 0; i < smartlist_len(rl->routers); ++i) { + SMARTLIST_FOREACH_BEGIN(nodes, node_t *, node) { const char *msg; - routerinfo_t *ent = smartlist_get(rl->routers, i); - uint32_t r = dirserv_router_get_status(ent, &msg); + routerinfo_t *ent = node->ri; + uint32_t r; + if (!ent) + continue; + r = dirserv_router_get_status(ent, &msg); if (r & FP_REJECT) { log_info(LD_DIRSERV, "Router '%s' is now rejected: %s", ent->nickname, msg?msg:""); routerlist_remove(rl, ent, 0, time(NULL)); - i--; changed = 1; continue; } - if (bool_neq((r & FP_NAMED), ent->is_named)) { +#if 0 + if (bool_neq((r & FP_NAMED), ent->auth_says_is_named)) { log_info(LD_DIRSERV, "Router '%s' is now %snamed.", ent->nickname, (r&FP_NAMED)?"":"un"); ent->is_named = (r&FP_NAMED)?1:0; changed = 1; } - if (bool_neq((r & FP_INVALID), !ent->is_valid)) { + if (bool_neq((r & FP_UNNAMED), ent->auth_says_is_unnamed)) { + log_info(LD_DIRSERV, + "Router '%s' is now %snamed. (FP_UNNAMED)", ent->nickname, + (r&FP_NAMED)?"":"un"); + ent->is_named = (r&FP_NUNAMED)?0:1; + changed = 1; + } +#endif + if (bool_neq((r & FP_INVALID), !node->is_valid)) { log_info(LD_DIRSERV, "Router '%s' is now %svalid.", ent->nickname, (r&FP_INVALID) ? "in" : ""); - ent->is_valid = (r&FP_INVALID)?0:1; + node->is_valid = (r&FP_INVALID)?0:1; changed = 1; } - if (bool_neq((r & FP_BADDIR), ent->is_bad_directory)) { + if (bool_neq((r & FP_BADDIR), node->is_bad_directory)) { log_info(LD_DIRSERV, "Router '%s' is now a %s directory", ent->nickname, (r & FP_BADDIR) ? "bad" : "good"); - ent->is_bad_directory = (r&FP_BADDIR) ? 1: 0; + node->is_bad_directory = (r&FP_BADDIR) ? 1: 0; changed = 1; } - if (bool_neq((r & FP_BADEXIT), ent->is_bad_exit)) { + if (bool_neq((r & FP_BADEXIT), node->is_bad_exit)) { log_info(LD_DIRSERV, "Router '%s' is now a %s exit", ent->nickname, (r & FP_BADEXIT) ? "bad" : "good"); - ent->is_bad_exit = (r&FP_BADEXIT) ? 1: 0; + node->is_bad_exit = (r&FP_BADEXIT) ? 1: 0; changed = 1; } - } + } SMARTLIST_FOREACH_END(node); if (changed) directory_set_dirty(); @@ -893,10 +911,11 @@ directory_set_dirty(void) * as running iff <b>is_live</b> is true. */ static char * -list_single_server_status(routerinfo_t *desc, int is_live) +list_single_server_status(const routerinfo_t *desc, int is_live) { char buf[MAX_NICKNAME_LEN+HEX_DIGEST_LEN+4]; /* !nickname=$hexdigest\0 */ char *cp; + const node_t *node; tor_assert(desc); @@ -904,7 +923,8 @@ list_single_server_status(routerinfo_t *desc, int is_live) if (!is_live) { *cp++ = '!'; } - if (desc->is_valid) { + node = node_get_by_id(desc->cache_info.identity_digest); + if (node && node->is_valid) { strlcpy(cp, desc->nickname, sizeof(buf)-(cp-buf)); cp += strlen(cp); *cp++ = '='; @@ -943,6 +963,8 @@ dirserv_set_router_is_running(routerinfo_t *router, time_t now) unreachable. */ int answer; + node_t *node = node_get_mutable_by_id(router->cache_info.identity_digest); + tor_assert(node); if (router_is_me(router)) { /* We always know if we are down ourselves. */ @@ -967,7 +989,7 @@ dirserv_set_router_is_running(routerinfo_t *router, time_t now) rep_hist_note_router_unreachable(router->cache_info.identity_digest, now); } - router->is_running = answer; + node->is_running = answer; } /** Based on the routerinfo_ts in <b>routers</b>, allocate the @@ -995,6 +1017,8 @@ list_server_status_v1(smartlist_t *routers, char **router_status_out, rs_entries = smartlist_create(); SMARTLIST_FOREACH_BEGIN(routers, routerinfo_t *, ri) { + const node_t *node = node_get_by_id(ri->cache_info.identity_digest); + tor_assert(node); if (authdir) { /* Update router status in routerinfo_t. */ dirserv_set_router_is_running(ri, now); @@ -1002,12 +1026,13 @@ list_server_status_v1(smartlist_t *routers, char **router_status_out, if (for_controller) { char name_buf[MAX_VERBOSE_NICKNAME_LEN+2]; char *cp = name_buf; - if (!ri->is_running) + if (!node->is_running) *cp++ = '!'; router_get_verbose_nickname(cp, ri); smartlist_add(rs_entries, tor_strdup(name_buf)); } else if (ri->cache_info.published_on >= cutoff) { - smartlist_add(rs_entries, list_single_server_status(ri, ri->is_running)); + smartlist_add(rs_entries, list_single_server_status(ri, + node->is_running)); } } SMARTLIST_FOREACH_END(ri); @@ -1045,12 +1070,12 @@ format_versions_list(config_line_t *ln) * not hibernating, and not too old. Else return 0. */ static int -router_is_active(routerinfo_t *ri, time_t now) +router_is_active(const routerinfo_t *ri, const node_t *node, time_t now) { time_t cutoff = now - ROUTER_MAX_AGE_TO_PUBLISH; if (ri->cache_info.published_on < cutoff) return 0; - if (!ri->is_running || !ri->is_valid || ri->is_hibernating) + if (!node->is_running || !node->is_valid || ri->is_hibernating) return 0; return 1; } @@ -1151,7 +1176,7 @@ dirserv_dump_directory_to_string(char **dir_out, int directory_fetches_from_authorities(or_options_t *options) { - routerinfo_t *me; + const routerinfo_t *me; uint32_t addr; int refuseunknown; if (options->FetchDirInfoEarly) @@ -1716,7 +1741,7 @@ static uint64_t total_exit_bandwidth = 0; /** Helper: estimate the uptime of a router given its stated uptime and the * amount of time since it last stated its stated uptime. */ static INLINE long -real_uptime(routerinfo_t *router, time_t now) +real_uptime(const routerinfo_t *router, time_t now) { if (now < router->cache_info.published_on) return router->uptime; @@ -1767,7 +1792,8 @@ dirserv_thinks_router_is_unreliable(time_t now, * been set. */ static int -dirserv_thinks_router_is_hs_dir(routerinfo_t *router, time_t now) +dirserv_thinks_router_is_hs_dir(const routerinfo_t *router, + const node_t *node, time_t now) { long uptime = real_uptime(router, now); @@ -1777,7 +1803,7 @@ dirserv_thinks_router_is_hs_dir(routerinfo_t *router, time_t now) * version is too old. */ return (router->wants_to_be_hs_dir && router->dir_port && uptime > get_options()->MinUptimeHidServDirectoryV2 && - router->is_running); + node->is_running); } /** Look through the routerlist, the Mean Time Between Failure history, and @@ -1825,19 +1851,22 @@ dirserv_compute_performance_thresholds(routerlist_t *rl) /* Weighted fractional uptime for each active router. */ wfus = tor_malloc(sizeof(double)*smartlist_len(rl->routers)); + nodelist_assert_ok(); + /* Now, fill in the arrays. */ - SMARTLIST_FOREACH(rl->routers, routerinfo_t *, ri, { - if (router_is_active(ri, now)) { + SMARTLIST_FOREACH_BEGIN(nodelist_get_list(), node_t *, node) { + routerinfo_t *ri = node->ri; + if (ri && router_is_active(ri, node, now)) { const char *id = ri->cache_info.identity_digest; uint32_t bw; - ri->is_exit = (!router_exit_policy_rejects_all(ri) && - exit_policy_is_general_exit(ri->exit_policy)); + node->is_exit = (!router_exit_policy_rejects_all(ri) && + exit_policy_is_general_exit(ri->exit_policy)); uptimes[n_active] = (uint32_t)real_uptime(ri, now); mtbfs[n_active] = rep_hist_get_stability(id, now); tks [n_active] = rep_hist_get_weighted_time_known(id, now); bandwidths[n_active] = bw = router_get_advertised_bandwidth(ri); total_bandwidth += bw; - if (ri->is_exit && !ri->is_bad_exit) { + if (node->is_exit && !node->is_bad_exit) { total_exit_bandwidth += bw; } else { bandwidths_excluding_exits[n_active_nonexit] = bw; @@ -1845,7 +1874,7 @@ dirserv_compute_performance_thresholds(routerlist_t *rl) } ++n_active; } - }); + } SMARTLIST_FOREACH_END(node); /* Now, compute thresholds. */ if (n_active) { @@ -1871,15 +1900,17 @@ dirserv_compute_performance_thresholds(routerlist_t *rl) /* Now that we have a time-known that 7/8 routers are known longer than, * fill wfus with the wfu of every such "familiar" router. */ n_familiar = 0; - SMARTLIST_FOREACH(rl->routers, routerinfo_t *, ri, { - if (router_is_active(ri, now)) { + + SMARTLIST_FOREACH_BEGIN(nodelist_get_list(), node_t *, node) { + routerinfo_t *ri = node->ri; + if (ri && router_is_active(ri, node, now)) { const char *id = ri->cache_info.identity_digest; long tk = rep_hist_get_weighted_time_known(id, now); if (tk < guard_tk) continue; wfus[n_familiar++] = rep_hist_get_weighted_fractional_uptime(id, now); } - }); + } SMARTLIST_FOREACH_END(node); if (n_familiar) guard_wfu = median_double(wfus, n_familiar); if (guard_wfu > WFU_TO_GUARANTEE_GUARD) @@ -1950,7 +1981,7 @@ version_from_platform(const char *platform) */ int routerstatus_format_entry(char *buf, size_t buf_len, - routerstatus_t *rs, const char *version, + const routerstatus_t *rs, const char *version, routerstatus_format_type_t format) { int r; @@ -2000,7 +2031,7 @@ routerstatus_format_entry(char *buf, size_t buf_len, rs->is_possible_guard?" Guard":"", rs->is_hs_dir?" HSDir":"", rs->is_named?" Named":"", - rs->is_running?" Running":"", + rs->is_flagged_running?" Running":"", rs->is_stable?" Stable":"", rs->is_unnamed?" Unnamed":"", rs->is_v2_dir?" V2Dir":"", @@ -2022,7 +2053,7 @@ routerstatus_format_entry(char *buf, size_t buf_len, } if (format != NS_V2) { - routerinfo_t* desc = router_get_by_digest(rs->identity_digest); + const routerinfo_t* desc = router_get_by_id_digest(rs->identity_digest); uint32_t bw; if (format != NS_CONTROL_PORT) { @@ -2118,6 +2149,8 @@ _compare_routerinfo_by_ip_and_bw(const void **a, const void **b) routerinfo_t *first = *(routerinfo_t **)a, *second = *(routerinfo_t **)b; int first_is_auth, second_is_auth; uint32_t bw_first, bw_second; + const node_t *node_first, *node_second; + int first_is_running, second_is_running; /* we return -1 if first should appear before second... that is, * if first is a better router. */ @@ -2140,9 +2173,14 @@ _compare_routerinfo_by_ip_and_bw(const void **a, const void **b) else if (!first_is_auth && second_is_auth) return 1; - else if (first->is_running && !second->is_running) + node_first = node_get_by_id(first->cache_info.identity_digest); + node_second = node_get_by_id(second->cache_info.identity_digest); + first_is_running = node_first && node_first->is_running; + second_is_running = node_second && node_second->is_running; + + if (first_is_running && !second_is_running) return -1; - else if (!first->is_running && second->is_running) + else if (!first_is_running && second_is_running) return 1; bw_first = router_get_advertised_bandwidth(first); @@ -2211,7 +2249,9 @@ get_possible_sybil_list(const smartlist_t *routers) */ void set_routerstatus_from_routerinfo(routerstatus_t *rs, - routerinfo_t *ri, time_t now, + node_t *node, + routerinfo_t *ri, + time_t now, int naming, int listbadexits, int listbaddirs) { @@ -2223,48 +2263,46 @@ set_routerstatus_from_routerinfo(routerstatus_t *rs, router_digest_is_trusted_dir(ri->cache_info.identity_digest); /* Already set by compute_performance_thresholds. */ - rs->is_exit = ri->is_exit; - rs->is_stable = ri->is_stable = - router_is_active(ri, now) && + rs->is_exit = node->is_exit; + rs->is_stable = node->is_stable = + router_is_active(ri, node, now) && !dirserv_thinks_router_is_unreliable(now, ri, 1, 0) && !unstable_version; - rs->is_fast = ri->is_fast = - router_is_active(ri, now) && + rs->is_fast = node->is_fast = + router_is_active(ri, node, now) && !dirserv_thinks_router_is_unreliable(now, ri, 0, 1); - rs->is_running = ri->is_running; /* computed above */ + rs->is_flagged_running = node->is_running; /* computed above */ if (naming) { uint32_t name_status = dirserv_get_name_status( - ri->cache_info.identity_digest, ri->nickname); + node->identity, ri->nickname); rs->is_named = (naming && (name_status & FP_NAMED)) ? 1 : 0; rs->is_unnamed = (naming && (name_status & FP_UNNAMED)) ? 1 : 0; } - rs->is_valid = ri->is_valid; + rs->is_valid = node->is_valid; - if (rs->is_fast && + if (node->is_fast && (router_get_advertised_bandwidth(ri) >= BANDWIDTH_TO_GUARANTEE_GUARD || router_get_advertised_bandwidth(ri) >= MIN(guard_bandwidth_including_exits, guard_bandwidth_excluding_exits))) { - long tk = rep_hist_get_weighted_time_known( - ri->cache_info.identity_digest, now); - double wfu = rep_hist_get_weighted_fractional_uptime( - ri->cache_info.identity_digest, now); + long tk = rep_hist_get_weighted_time_known(node->identity, now); + double wfu = rep_hist_get_weighted_fractional_uptime(node->identity, now); rs->is_possible_guard = (wfu >= guard_wfu && tk >= guard_tk) ? 1 : 0; } else { rs->is_possible_guard = 0; } - rs->is_bad_directory = listbaddirs && ri->is_bad_directory; - rs->is_bad_exit = listbadexits && ri->is_bad_exit; - ri->is_hs_dir = dirserv_thinks_router_is_hs_dir(ri, now); - rs->is_hs_dir = ri->is_hs_dir; + rs->is_bad_directory = listbaddirs && node->is_bad_directory; + rs->is_bad_exit = listbadexits && node->is_bad_exit; + node->is_hs_dir = dirserv_thinks_router_is_hs_dir(ri, node, now); + rs->is_hs_dir = node->is_hs_dir; rs->is_v2_dir = ri->dir_port != 0; if (!strcasecmp(ri->nickname, UNNAMED_ROUTER_NICKNAME)) rs->is_named = rs->is_unnamed = 0; rs->published_on = ri->cache_info.published_on; - memcpy(rs->identity_digest, ri->cache_info.identity_digest, DIGEST_LEN); + memcpy(rs->identity_digest, node->identity, DIGEST_LEN); memcpy(rs->descriptor_digest, ri->cache_info.signed_descriptor_digest, DIGEST_LEN); rs->addr = ri->addr; @@ -2281,7 +2319,7 @@ static void clear_status_flags_on_sybil(routerstatus_t *rs) { rs->is_authority = rs->is_exit = rs->is_stable = rs->is_fast = - rs->is_running = rs->is_named = rs->is_valid = rs->is_v2_dir = + rs->is_flagged_running = rs->is_named = rs->is_valid = rs->is_v2_dir = rs->is_hs_dir = rs->is_possible_guard = rs->is_bad_exit = rs->is_bad_directory = 0; /* FFFF we might want some mechanism to check later on if we @@ -2289,18 +2327,6 @@ clear_status_flags_on_sybil(routerstatus_t *rs) * forget to add it to this clause. */ } -/** Clear all the status flags in routerinfo <b>router</b>. We put this - * function here because it's eerily similar to - * clear_status_flags_on_sybil() above. One day we should merge them. */ -void -router_clear_status_flags(routerinfo_t *router) -{ - router->is_valid = router->is_running = router->is_hs_dir = - router->is_fast = router->is_stable = - router->is_possible_guard = router->is_exit = - router->is_bad_exit = router->is_bad_directory = 0; -} - /** * Helper function to parse out a line in the measured bandwidth file * into a measured_bw_line_t output structure. Returns -1 on failure @@ -2548,17 +2574,20 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_env_t *private_key, routerstatus_t *rs; vote_routerstatus_t *vrs; microdesc_t *md; + node_t *node = node_get_mutable_by_id(ri->cache_info.identity_digest); + if (!node) + continue; vrs = tor_malloc_zero(sizeof(vote_routerstatus_t)); rs = &vrs->status; - set_routerstatus_from_routerinfo(rs, ri, now, + set_routerstatus_from_routerinfo(rs, node, ri, now, naming, listbadexits, listbaddirs); if (digestmap_get(omit_as_sybil, ri->cache_info.identity_digest)) clear_status_flags_on_sybil(rs); if (!vote_on_reachability) - rs->is_running = 0; + rs->is_flagged_running = 0; vrs->version = version_from_platform(ri->platform); md = dirvote_create_microdescriptor(ri); @@ -2787,8 +2816,12 @@ generate_v2_networkstatus_opinion(void) if (ri->cache_info.published_on >= cutoff) { routerstatus_t rs; char *version = version_from_platform(ri->platform); - - set_routerstatus_from_routerinfo(&rs, ri, now, + node_t *node = node_get_mutable_by_id(ri->cache_info.identity_digest); + if (!node) { + tor_free(version); + continue; + } + set_routerstatus_from_routerinfo(&rs, node, ri, now, naming, listbadexits, listbaddirs); if (digestmap_get(omit_as_sybil, ri->cache_info.identity_digest)) @@ -2871,7 +2904,7 @@ dirserv_get_networkstatus_v2_fingerprints(smartlist_t *result, if (!strcmp(key,"authority")) { if (authdir_mode_v2(get_options())) { - routerinfo_t *me = router_get_my_routerinfo(); + const routerinfo_t *me = router_get_my_routerinfo(); if (me) smartlist_add(result, tor_memdup(me->cache_info.identity_digest, DIGEST_LEN)); @@ -2957,7 +2990,7 @@ dirserv_get_routerdesc_fingerprints(smartlist_t *fps_out, const char *key, smartlist_add(fps_out, tor_memdup(r->cache_info.identity_digest, DIGEST_LEN))); } else if (!strcmp(key, "authority")) { - routerinfo_t *ri = router_get_my_routerinfo(); + const routerinfo_t *ri = router_get_my_routerinfo(); if (ri) smartlist_add(fps_out, tor_memdup(ri->cache_info.identity_digest, DIGEST_LEN)); @@ -2977,8 +3010,8 @@ dirserv_get_routerdesc_fingerprints(smartlist_t *fps_out, const char *key, if (for_unencrypted_conn) { /* Remove anything that insists it not be sent unencrypted. */ - SMARTLIST_FOREACH(fps_out, char *, cp, { - signed_descriptor_t *sd; + SMARTLIST_FOREACH_BEGIN(fps_out, char *, cp) { + const signed_descriptor_t *sd; if (by_id) sd = get_signed_descriptor_by_fp(cp,is_extrainfo,0); else if (is_extrainfo) @@ -2989,7 +3022,7 @@ dirserv_get_routerdesc_fingerprints(smartlist_t *fps_out, const char *key, tor_free(cp); SMARTLIST_DEL_CURRENT(fps_out, cp); } - }); + } SMARTLIST_FOREACH_END(cp); } if (!smartlist_len(fps_out)) { @@ -3028,9 +3061,9 @@ dirserv_get_routerdescs(smartlist_t *descs_out, const char *key, SMARTLIST_FOREACH(rl->routers, routerinfo_t *, r, smartlist_add(descs_out, &(r->cache_info))); } else if (!strcmp(key, "/tor/server/authority")) { - routerinfo_t *ri = router_get_my_routerinfo(); + const routerinfo_t *ri = router_get_my_routerinfo(); if (ri) - smartlist_add(descs_out, &(ri->cache_info)); + smartlist_add(descs_out, (void*) &(ri->cache_info)); } else if (!strcmpstart(key, "/tor/server/d/")) { smartlist_t *digests = smartlist_create(); key += strlen("/tor/server/d/"); @@ -3054,17 +3087,17 @@ dirserv_get_routerdescs(smartlist_t *descs_out, const char *key, { if (router_digest_is_me(d)) { /* make sure desc_routerinfo exists */ - routerinfo_t *ri = router_get_my_routerinfo(); + const routerinfo_t *ri = router_get_my_routerinfo(); if (ri) - smartlist_add(descs_out, &(ri->cache_info)); + smartlist_add(descs_out, (void*) &(ri->cache_info)); } else { - routerinfo_t *ri = router_get_by_digest(d); + const routerinfo_t *ri = router_get_by_id_digest(d); /* Don't actually serve a descriptor that everyone will think is * expired. This is an (ugly) workaround to keep buggy 0.1.1.10 * Tors from downloading descriptors that they will throw away. */ if (ri && ri->cache_info.published_on > cutoff) - smartlist_add(descs_out, &(ri->cache_info)); + smartlist_add(descs_out, (void*) &(ri->cache_info)); } }); SMARTLIST_FOREACH(digests, char *, d, tor_free(d)); @@ -3113,6 +3146,7 @@ dirserv_orconn_tls_done(const char *address, } } }); + /* FFFF Maybe we should reinstate the code that dumps routers with the same * addr/port but with nonmatching keys, but instead of dumping, we should * skip testing. */ @@ -3122,7 +3156,8 @@ dirserv_orconn_tls_done(const char *address, * an upload or a download. Used to decide whether to relaunch reachability * testing for the server. */ int -dirserv_should_launch_reachability_test(routerinfo_t *ri, routerinfo_t *ri_old) +dirserv_should_launch_reachability_test(const routerinfo_t *ri, + const routerinfo_t *ri_old) { if (!authdir_mode_handles_descs(get_options(), ri->purpose)) return 0; @@ -3246,7 +3281,7 @@ dirserv_remove_old_statuses(smartlist_t *fps, time_t cutoff) * its extra-info document if <b>extrainfo</b> is true. Return * NULL if not found or if the descriptor is older than * <b>publish_cutoff</b>. */ -static signed_descriptor_t * +static const signed_descriptor_t * get_signed_descriptor_by_fp(const char *fp, int extrainfo, time_t publish_cutoff) { @@ -3256,7 +3291,7 @@ get_signed_descriptor_by_fp(const char *fp, int extrainfo, else return &(router_get_my_routerinfo()->cache_info); } else { - routerinfo_t *ri = router_get_by_digest(fp); + const routerinfo_t *ri = router_get_by_id_digest(fp); if (ri && ri->cache_info.published_on > publish_cutoff) { if (extrainfo) @@ -3324,7 +3359,7 @@ dirserv_estimate_data_size(smartlist_t *fps, int is_serverdescs, tor_assert(fps); if (is_serverdescs) { int n = smartlist_len(fps); - routerinfo_t *me = router_get_my_routerinfo(); + const routerinfo_t *me = router_get_my_routerinfo(); result = (me?me->cache_info.signed_descriptor_len:2048) * n; if (compressed) result /= 2; /* observed compressibility is between 35 and 55%. */ @@ -3391,7 +3426,7 @@ connection_dirserv_add_servers_to_outbuf(dir_connection_t *conn) connection_get_outbuf_len(TO_CONN(conn)) < DIRSERV_BUFFER_MIN) { const char *body; char *fp = smartlist_pop_last(conn->fingerprint_stack); - signed_descriptor_t *sd = NULL; + const signed_descriptor_t *sd = NULL; if (by_fp) { sd = get_signed_descriptor_by_fp(fp, extra, publish_cutoff); } else { @@ -3449,7 +3484,7 @@ connection_dirserv_add_microdescs_to_outbuf(dir_connection_t *conn) { microdesc_cache_t *cache = get_microdesc_cache(); while (smartlist_len(conn->fingerprint_stack) && - buf_datalen(conn->_base.outbuf) < DIRSERV_BUFFER_MIN) { + connection_get_outbuf_len(TO_CONN(conn)) < DIRSERV_BUFFER_MIN) { char *fp256 = smartlist_pop_last(conn->fingerprint_stack); microdesc_t *md = microdesc_cache_lookup_by_digest256(cache, fp256); tor_free(fp256); diff --git a/src/or/dirserv.h b/src/or/dirserv.h index 94e4e811d6..a779632430 100644 --- a/src/or/dirserv.h +++ b/src/or/dirserv.h @@ -40,8 +40,6 @@ MAX_V_LINE_LEN \ ) -#define UNNAMED_ROUTER_NICKNAME "Unnamed" - int connection_dirserv_flushed_some(dir_connection_t *conn); int dirserv_add_own_fingerprint(const char *nickname, crypto_pk_env_t *pk); @@ -99,13 +97,19 @@ void dirserv_orconn_tls_done(const char *address, uint16_t or_port, const char *digest_rcvd, int as_advertised); -int dirserv_should_launch_reachability_test(routerinfo_t *ri, - routerinfo_t *ri_old); +int dirserv_should_launch_reachability_test(const routerinfo_t *ri, + const routerinfo_t *ri_old); void dirserv_single_reachability_test(time_t now, routerinfo_t *router); void dirserv_test_reachability(time_t now); int authdir_wants_to_reject_router(routerinfo_t *ri, const char **msg, - int complain); -int dirserv_would_reject_router(routerstatus_t *rs); + int complain, + int *valid_out); +uint32_t dirserv_router_get_status(const routerinfo_t *router, + const char **msg); +void dirserv_set_node_flags_from_authoritative_status(node_t *node, + uint32_t authstatus); + +int dirserv_would_reject_router(const routerstatus_t *rs); int dirserv_remove_old_statuses(smartlist_t *fps, time_t cutoff); int dirserv_have_any_serverdesc(smartlist_t *fps, int spool_src); int dirserv_have_any_microdesc(const smartlist_t *fps); @@ -114,7 +118,7 @@ size_t dirserv_estimate_data_size(smartlist_t *fps, int is_serverdescs, size_t dirserv_estimate_microdesc_size(const smartlist_t *fps, int compressed); int routerstatus_format_entry(char *buf, size_t buf_len, - routerstatus_t *rs, const char *platform, + const routerstatus_t *rs, const char *platform, routerstatus_format_type_t format); void dirserv_free_all(void); void cached_dir_decref(cached_dir_t *d); diff --git a/src/or/dirvote.h b/src/or/dirvote.h index e384dc53b3..33213a88c6 100644 --- a/src/or/dirvote.h +++ b/src/or/dirvote.h @@ -63,6 +63,7 @@ const char *dirvote_get_pending_detached_signatures(void); #define DGV_INCLUDE_PREVIOUS 4 const cached_dir_t *dirvote_get_vote(const char *fp, int flags); void set_routerstatus_from_routerinfo(routerstatus_t *rs, + node_t *node, routerinfo_t *ri, time_t now, int naming, int listbadexits, int listbaddirs); diff --git a/src/or/dns.c b/src/or/dns.c index 4e319b7d83..83d47914e4 100644 --- a/src/or/dns.c +++ b/src/or/dns.c @@ -668,7 +668,7 @@ dns_resolve_impl(edge_connection_t *exitconn, int is_resolve, cached_resolve_t *resolve; cached_resolve_t search; pending_connection_t *pending_connection; - routerinfo_t *me; + const routerinfo_t *me; tor_addr_t addr; time_t now = time(NULL); uint8_t is_reverse = 0; diff --git a/src/or/main.c b/src/or/main.c index ddd5da3643..eb5a27a5ee 100644 --- a/src/or/main.c +++ b/src/or/main.c @@ -33,6 +33,7 @@ #include "main.h" #include "microdesc.h" #include "networkstatus.h" +#include "nodelist.h" #include "ntmain.h" #include "onion.h" #include "policies.h" @@ -160,7 +161,7 @@ int can_complete_circuit=0; * ****************************************************************************/ -#ifdef USE_BUFFEREVENTS +#if 0 && defined(USE_BUFFEREVENTS) static void free_old_inbuf(connection_t *conn) { @@ -210,7 +211,12 @@ connection_add_impl(connection_t *conn, int is_connecting) tor_libevent_get_base(), conn->s, BEV_OPT_DEFER_CALLBACKS); - /* XXXX CHECK FOR NULL RETURN! */ + if (!conn->bufev) { + log_warn(LD_BUG, "Unable to create socket bufferevent"); + smartlist_del(connection_array, conn->conn_array_index); + conn->conn_array_index = -1; + return -1; + } if (is_connecting) { /* Put the bufferevent into a "connecting" state so that we'll get * a "connected" event callback on successful write. */ @@ -222,29 +228,28 @@ connection_add_impl(connection_t *conn, int is_connecting) tor_assert(conn->s < 0); if (!conn->bufev) { struct bufferevent *pair[2] = { NULL, NULL }; - /* XXXX CHECK FOR ERROR RETURN! */ - bufferevent_pair_new(tor_libevent_get_base(), - BEV_OPT_DEFER_CALLBACKS, - pair); + if (bufferevent_pair_new(tor_libevent_get_base(), + BEV_OPT_DEFER_CALLBACKS, + pair) < 0) { + log_warn(LD_BUG, "Unable to create bufferevent pair"); + smartlist_del(connection_array, conn->conn_array_index); + conn->conn_array_index = -1; + return -1; + } tor_assert(pair[0]); conn->bufev = pair[0]; conn->linked_conn->bufev = pair[1]; } /* else the other side already was added, and got a bufferevent_pair */ connection_configure_bufferevent_callbacks(conn); + } else { + tor_assert(!conn->linked); } - if (conn->bufev && conn->inbuf) { - /* XXX Instead we should assert that there is no inbuf, once we - * have linked connections using bufferevents. */ - free_old_inbuf(conn); - } + if (conn->bufev) + tor_assert(conn->inbuf == NULL); - if (conn->linked_conn && conn->linked_conn->bufev && - conn->linked_conn->inbuf) { - /* XXX Instead we should assert that there is no inbuf, once we - * have linked connections using bufferevents. */ - free_old_inbuf(conn->linked_conn); - } + if (conn->linked_conn && conn->linked_conn->bufev) + tor_assert(conn->linked_conn->inbuf == NULL); } #else (void) is_connecting; @@ -722,14 +727,17 @@ conn_close_if_marked(int i) /* assert_all_pending_dns_resolves_ok(); */ #ifdef USE_BUFFEREVENTS - if (conn->bufev && conn->hold_open_until_flushed) { - if (conn->linked) { + if (conn->bufev) { + if (conn->hold_open_until_flushed && + evbuffer_get_length(bufferevent_get_output(conn->bufev))) { + /* don't close yet. */ + return 0; + } + if (conn->linked_conn && ! conn->linked_conn->marked_for_close) { /* We need to do this explicitly so that the linked connection * notices that there was an EOF. */ bufferevent_flush(conn->bufev, EV_WRITE, BEV_FINISHED); } - if (evbuffer_get_length(bufferevent_get_output(conn->bufev))) - return 0; } #endif @@ -949,8 +957,7 @@ run_connection_housekeeping(int i, time_t now) connection_or_connect_failed(TO_OR_CONN(conn), END_OR_CONN_REASON_TIMEOUT, "Tor gave up on the connection"); - connection_mark_for_close(conn); - conn->hold_open_until_flushed = 1; + connection_mark_and_flush(conn); } else if (!connection_state_is_open(conn)) { if (past_keepalive) { /* We never managed to actually get this connection open and happy. */ @@ -1039,6 +1046,16 @@ run_scheduled_events(time_t now) */ consider_hibernation(now); +#if 0 + { + static time_t nl_check_time = 0; + if (nl_check_time <= now) { + nodelist_assert_ok(); + nl_check_time = now + 30; + } + } +#endif + /* 0b. If we've deferred a signewnym, make sure it gets handled * eventually. */ if (signewnym_is_pending && @@ -1263,7 +1280,7 @@ run_scheduled_events(time_t now) /* If we haven't checked for 12 hours and our bandwidth estimate is * low, do another bandwidth test. This is especially important for * bridges, since they might go long periods without much use. */ - routerinfo_t *me = router_get_my_routerinfo(); + const routerinfo_t *me = router_get_my_routerinfo(); if (time_to_recheck_bandwidth && me && me->bandwidthcapacity < me->bandwidthrate && me->bandwidthcapacity < 51200) { @@ -1464,7 +1481,7 @@ second_elapsed_callback(periodic_timer_t *timer, void *arg) (stats_n_seconds_working+seconds_elapsed) / TIMEOUT_UNTIL_UNREACHABILITY_COMPLAINT) { /* every 20 minutes, check and complain if necessary */ - routerinfo_t *me = router_get_my_routerinfo(); + const routerinfo_t *me = router_get_my_routerinfo(); if (me && !check_whether_orport_reachable()) { log_warn(LD_CONFIG,"Your server (%s:%d) has not managed to confirm that " "its ORPort is reachable. Please check your firewalls, ports, " @@ -2205,6 +2222,7 @@ tor_free_all(int postfork) connection_free_all(); buf_shrink_freelists(1); memarea_clear_freelist(); + nodelist_free_all(); microdesc_free_all(); if (!postfork) { config_free_all(); diff --git a/src/or/microdesc.c b/src/or/microdesc.c index 2752d15c8c..e014cd0761 100644 --- a/src/or/microdesc.c +++ b/src/or/microdesc.c @@ -4,11 +4,13 @@ #include "or.h" #include "config.h" #include "directory.h" +#include "dirserv.h" #include "microdesc.h" -#include "routerparse.h" #include "networkstatus.h" +#include "nodelist.h" +#include "policies.h" #include "routerlist.h" -#include "dirserv.h" +#include "routerparse.h" /** A data structure to hold a bunch of cached microdescriptors. There are * two active files in the cache: a "cache file" that we mmap, and a "journal @@ -249,6 +251,12 @@ microdescs_add_list_to_cache(microdesc_cache_t *cache, microdesc_cache_rebuild(cache); } + { + networkstatus_t *ns = networkstatus_get_latest_consensus(); + if (ns && ns->flavor == FLAV_MICRODESC) + SMARTLIST_FOREACH(added, microdesc_t *, md, nodelist_add_microdesc(md)); + } + return added; } @@ -311,26 +319,32 @@ microdesc_cache_reload(microdesc_cache_t *cache) return 0; } -/** DOCDOC */ +/** By default, we remove any microdescriptors that have gone at least this + * long without appearing in a current consensus. */ #define TOLERATE_MICRODESC_AGE (7*24*60*60) -/** DOCDOC */ +/** Remove all microdescriptors from <b>cache</b> that haven't been listed for + * a long time. Does not rebuild the cache on disk. If <b>cutoff</b> is + * positive, specifically remove microdescriptors that have been unlisted + * since <b>cutoff</b>. If <b>force</b> is true, remove microdescriptors even + * if we have no current live microdescriptor consensus. + */ void -microdesc_cache_clean(microdesc_cache_t *cache) +microdesc_cache_clean(microdesc_cache_t *cache, time_t cutoff, int force) { - networkstatus_t *consensus; - time_t cutoff; microdesc_t **mdp, *victim; int dropped=0, kept=0; size_t bytes_dropped = 0; time_t now = time(NULL); - /* If we don't know a consensus, never believe last_listed values */ - consensus = networkstatus_get_reasonably_live_consensus(now, FLAV_MICRODESC); - if (consensus == NULL) - return; + /* If we don't know a live consensus, don't believe last_listed values: we + * might be starting up after being down for a while. */ + if (! force && + ! networkstatus_get_reasonably_live_consensus(now, FLAV_MICRODESC)) + return; - cutoff = now - TOLERATE_MICRODESC_AGE; + if (cutoff <= 0) + cutoff = now - TOLERATE_MICRODESC_AGE; for (mdp = HT_START(microdesc_map, &cache->map); mdp != NULL; ) { if ((*mdp)->last_listed < cutoff) { @@ -368,8 +382,10 @@ microdesc_cache_rebuild(microdesc_cache_t *cache) log_info(LD_DIR, "Rebuilding the microdescriptor cache..."); - microdesc_cache_clean(cache); + /* Remove dead descriptors */ + microdesc_cache_clean(cache, 0/*cutoff*/, 0/*force*/); + /* Calculate starting disk usage */ orig_size = (int)(cache->cache_content ? cache->cache_content->size : 0); orig_size += (int)cache->journal_len; @@ -393,6 +409,7 @@ microdesc_cache_rebuild(microdesc_cache_t *cache) /* log? return -1? die? coredump the universe? */ continue; } + tor_assert(((size_t)size) == annotation_len + md->bodylen); md->off = off + annotation_len; off += size; if (md->saved_location != SAVED_IN_CACHE) { @@ -417,7 +434,21 @@ microdesc_cache_rebuild(microdesc_cache_t *cache) SMARTLIST_FOREACH_BEGIN(wrote, microdesc_t *, md) { tor_assert(md->saved_location == SAVED_IN_CACHE); md->body = (char*)cache->cache_content->data + md->off; - tor_assert(!memcmp(md->body, "onion-key", 9)); + if (PREDICT_UNLIKELY( + md->bodylen < 9 || memcmp(md->body, "onion-key", 9) != 0)) { + /* XXXX023 once bug 2022 is solved, we can kill this block and turn it + * into just the tor_assert(!memcmp) */ + off_t avail = cache->cache_content->size - md->off; + char *bad_str; + tor_assert(avail >= 0); + bad_str = tor_strndup(md->body, MIN(128, (size_t)avail)); + log_err(LD_BUG, "After rebuilding microdesc cache, offsets seem wrong. " + " At offset %d, I expected to find a microdescriptor starting " + " with \"onion-key\". Instead I got %s.", + (int)md->off, escaped(bad_str)); + tor_free(bad_str); + tor_assert(!memcmp(md->body, "onion-key", 9)); + } } SMARTLIST_FOREACH_END(md); smartlist_free(wrote); @@ -451,7 +482,7 @@ microdesc_free(microdesc_t *md) SMARTLIST_FOREACH(md->family, char *, cp, tor_free(cp)); smartlist_free(md->family); } - tor_free(md->exitsummary); + short_policy_free(md->exit_policy); tor_free(md); } @@ -521,7 +552,13 @@ microdesc_list_missing_digest256(networkstatus_t *ns, microdesc_cache_t *cache, return result; } -/** DOCDOC */ +/** Launch download requests for mircodescriptors as appropriate. + * + * Specifically, we should launch download requests if we are configured to + * download mirodescriptors, and there are some microdescriptors listed the + * current microdesc consensus that we don't have, and either we never asked + * for them, or we failed to download them but we're willing to retry. + */ void update_microdesc_downloads(time_t now) { @@ -560,7 +597,10 @@ update_microdesc_downloads(time_t now) smartlist_free(missing); } -/** DOCDOC */ +/** For every microdescriptor listed in the current microdecriptor consensus, + * update its last_listed field to be at least as recent as the publication + * time of the current microdescriptor consensus. + */ void update_microdescs_from_networkstatus(time_t now) { @@ -580,3 +620,4 @@ update_microdescs_from_networkstatus(time_t now) md->last_listed = ns->valid_after; } SMARTLIST_FOREACH_END(rs); } + diff --git a/src/or/microdesc.h b/src/or/microdesc.h index 1dfe3ae826..eda7008b91 100644 --- a/src/or/microdesc.h +++ b/src/or/microdesc.h @@ -22,7 +22,7 @@ smartlist_t *microdescs_add_list_to_cache(microdesc_cache_t *cache, smartlist_t *descriptors, saved_location_t where, int no_save); -void microdesc_cache_clean(microdesc_cache_t *cache); +void microdesc_cache_clean(microdesc_cache_t *cache, time_t cutoff, int force); int microdesc_cache_rebuild(microdesc_cache_t *cache); int microdesc_cache_reload(microdesc_cache_t *cache); void microdesc_cache_clear(microdesc_cache_t *cache); diff --git a/src/or/networkstatus.c b/src/or/networkstatus.c index cba02f3709..a99893f4ee 100644 --- a/src/or/networkstatus.c +++ b/src/or/networkstatus.c @@ -22,6 +22,7 @@ #include "main.h" #include "microdesc.h" #include "networkstatus.h" +#include "nodelist.h" #include "relay.h" #include "router.h" #include "routerlist.h" @@ -106,9 +107,8 @@ void networkstatus_reset_warnings(void) { if (current_consensus) { - SMARTLIST_FOREACH(current_consensus->routerstatus_list, - routerstatus_t *, rs, - rs->name_lookup_warned = 0); + SMARTLIST_FOREACH(nodelist_get_list(), node_t *, node, + node->name_lookup_warned = 0); } have_warned_about_old_version = 0; @@ -939,10 +939,9 @@ compare_digest_to_routerstatus_entry(const void *_key, const void **_member) return memcmp(key, rs->identity_digest, DIGEST_LEN); } -/** Return the entry in <b>ns</b> for the identity digest <b>digest</b>, or - * NULL if none was found. */ +/** As networkstatus_v2_find_entry, but do not return a const pointer */ routerstatus_t * -networkstatus_v2_find_entry(networkstatus_v2_t *ns, const char *digest) +networkstatus_v2_find_mutable_entry(networkstatus_v2_t *ns, const char *digest) { return smartlist_bsearch(ns->entries, digest, compare_digest_to_routerstatus_entry); @@ -950,14 +949,29 @@ networkstatus_v2_find_entry(networkstatus_v2_t *ns, const char *digest) /** Return the entry in <b>ns</b> for the identity digest <b>digest</b>, or * NULL if none was found. */ +const routerstatus_t * +networkstatus_v2_find_entry(networkstatus_v2_t *ns, const char *digest) +{ + return networkstatus_v2_find_mutable_entry(ns, digest); +} + +/** As networkstatus_find_entry, but do not return a const pointer */ routerstatus_t * -networkstatus_vote_find_entry(networkstatus_t *ns, const char *digest) +networkstatus_vote_find_mutable_entry(networkstatus_t *ns, const char *digest) { return smartlist_bsearch(ns->routerstatus_list, digest, compare_digest_to_routerstatus_entry); } -/*XXXX make this static once functions are moved into this file. */ +/** Return the entry in <b>ns</b> for the identity digest <b>digest</b>, or + * NULL if none was found. */ +const routerstatus_t * +networkstatus_vote_find_entry(networkstatus_t *ns, const char *digest) +{ + return networkstatus_vote_find_mutable_entry(ns, digest); +} + +/*XXXX MOVE make this static once functions are moved into this file. */ /** Search the routerstatuses in <b>ns</b> for one whose identity digest is * <b>digest</b>. Return value and set *<b>found_out</b> as for * smartlist_bsearch_idx(). */ @@ -979,11 +993,11 @@ networkstatus_get_v2_list(void) return networkstatus_v2_list; } -/** Return the consensus view of the status of the router whose current - * <i>descriptor</i> digest in <b>consensus</b> is <b>digest</b>, or NULL if - * no such router is known. */ +/* As router_get_consensus_status_by_descriptor_digest, but does not return + * a const pointer */ routerstatus_t * -router_get_consensus_status_by_descriptor_digest(networkstatus_t *consensus, +router_get_mutable_consensus_status_by_descriptor_digest( + networkstatus_t *consensus, const char *digest) { if (!consensus) @@ -1001,6 +1015,17 @@ router_get_consensus_status_by_descriptor_digest(networkstatus_t *consensus, return digestmap_get(consensus->desc_digest_map, digest); } +/** Return the consensus view of the status of the router whose current + * <i>descriptor</i> digest in <b>consensus</b> is <b>digest</b>, or NULL if + * no such router is known. */ +const routerstatus_t * +router_get_consensus_status_by_descriptor_digest(networkstatus_t *consensus, + const char *digest) +{ + return router_get_mutable_consensus_status_by_descriptor_digest( + consensus, digest); +} + /** Given the digest of a router descriptor, return its current download * status, or NULL if the digest is unrecognized. */ download_status_t * @@ -1009,8 +1034,8 @@ router_get_dl_status_by_descriptor_digest(const char *d) routerstatus_t *rs; if (!current_ns_consensus) return NULL; - if ((rs = router_get_consensus_status_by_descriptor_digest( - current_ns_consensus, d))) + if ((rs = router_get_mutable_consensus_status_by_descriptor_digest( + current_ns_consensus, d))) return &rs->dl_status; if (v2_download_status_map) return digestmap_get(v2_download_status_map, d); @@ -1018,10 +1043,9 @@ router_get_dl_status_by_descriptor_digest(const char *d) return NULL; } -/** Return the consensus view of the status of the router whose identity - * digest is <b>digest</b>, or NULL if we don't know about any such router. */ +/** As router_get_consensus_status_by_id, but do not return a const pointer */ routerstatus_t * -router_get_consensus_status_by_id(const char *digest) +router_get_mutable_consensus_status_by_id(const char *digest) { if (!current_consensus) return NULL; @@ -1029,100 +1053,27 @@ router_get_consensus_status_by_id(const char *digest) compare_digest_to_routerstatus_entry); } +/** Return the consensus view of the status of the router whose identity + * digest is <b>digest</b>, or NULL if we don't know about any such router. */ +const routerstatus_t * +router_get_consensus_status_by_id(const char *digest) +{ + return router_get_mutable_consensus_status_by_id(digest); +} + /** Given a nickname (possibly verbose, possibly a hexadecimal digest), return * the corresponding routerstatus_t, or NULL if none exists. Warn the * user if <b>warn_if_unnamed</b> is set, and they have specified a router by * nickname, but the Named flag isn't set for that router. */ -routerstatus_t * +const routerstatus_t * router_get_consensus_status_by_nickname(const char *nickname, int warn_if_unnamed) { - char digest[DIGEST_LEN]; - routerstatus_t *best=NULL; - smartlist_t *matches=NULL; - const char *named_id=NULL; - - if (!current_consensus || !nickname) - return NULL; - - /* Is this name really a hexadecimal identity digest? */ - if (nickname[0] == '$') { - if (base16_decode(digest, DIGEST_LEN, nickname+1, strlen(nickname+1))<0) - return NULL; - return networkstatus_vote_find_entry(current_consensus, digest); - } else if (strlen(nickname) == HEX_DIGEST_LEN && - (base16_decode(digest, DIGEST_LEN, nickname, strlen(nickname))==0)) { - return networkstatus_vote_find_entry(current_consensus, digest); - } - - /* Is there a server that is Named with this name? */ - if (named_server_map) - named_id = strmap_get_lc(named_server_map, nickname); - if (named_id) - return networkstatus_vote_find_entry(current_consensus, named_id); - - /* Okay; is this name listed as Unnamed? */ - if (unnamed_server_map && - strmap_get_lc(unnamed_server_map, nickname)) { - log_info(LD_GENERAL, "The name %s is listed as Unnamed; it is not the " - "canonical name of any server we know.", escaped(nickname)); + const node_t *node = node_get_by_nickname(nickname, warn_if_unnamed); + if (node) + return node->rs; + else return NULL; - } - - /* This name is not canonical for any server; go through the list and - * see who it matches. */ - /*XXXX This is inefficient; optimize it if it matters. */ - matches = smartlist_create(); - SMARTLIST_FOREACH(current_consensus->routerstatus_list, - routerstatus_t *, lrs, - { - if (!strcasecmp(lrs->nickname, nickname)) { - if (lrs->is_named) { - tor_fragile_assert() /* This should never happen. */ - smartlist_free(matches); - return lrs; - } else { - if (lrs->is_unnamed) { - tor_fragile_assert(); /* nor should this. */ - smartlist_clear(matches); - best=NULL; - break; - } - smartlist_add(matches, lrs); - best = lrs; - } - } - }); - - if (smartlist_len(matches)>1 && warn_if_unnamed) { - int any_unwarned=0; - SMARTLIST_FOREACH(matches, routerstatus_t *, lrs, - { - if (! lrs->name_lookup_warned) { - lrs->name_lookup_warned=1; - any_unwarned=1; - } - }); - if (any_unwarned) { - log_warn(LD_CONFIG,"There are multiple matches for the nickname \"%s\"," - " but none is listed as named by the directory authorities. " - "Choosing one arbitrarily.", nickname); - } - } else if (warn_if_unnamed && best && !best->name_lookup_warned) { - char fp[HEX_DIGEST_LEN+1]; - base16_encode(fp, sizeof(fp), - best->identity_digest, DIGEST_LEN); - log_warn(LD_CONFIG, - "When looking up a status, you specified a server \"%s\" by name, " - "but the directory authorities do not have any key registered for " - "this nickname -- so it could be used by any server, " - "not just the one you meant. " - "To make sure you get the same server in the future, refer to " - "it by key, as \"$%s\".", nickname, fp); - best->name_lookup_warned = 1; - } - smartlist_free(matches); - return best; } /** Return the identity digest that's mapped to officially by @@ -1524,7 +1475,7 @@ routerstatus_has_changed(const routerstatus_t *a, const routerstatus_t *b) a->is_exit != b->is_exit || a->is_stable != b->is_stable || a->is_fast != b->is_fast || - a->is_running != b->is_running || + a->is_flagged_running != b->is_flagged_running || a->is_named != b->is_named || a->is_unnamed != b->is_unnamed || a->is_valid != b->is_valid || @@ -1565,13 +1516,14 @@ notify_control_networkstatus_changed(const networkstatus_t *old_c, } changed = smartlist_create(); - SMARTLIST_FOREACH_JOIN(old_c->routerstatus_list, routerstatus_t *, rs_old, - new_c->routerstatus_list, routerstatus_t *, rs_new, - memcmp(rs_old->identity_digest, - rs_new->identity_digest, DIGEST_LEN), - smartlist_add(changed, rs_new)) { + SMARTLIST_FOREACH_JOIN( + old_c->routerstatus_list, const routerstatus_t *, rs_old, + new_c->routerstatus_list, const routerstatus_t *, rs_new, + memcmp(rs_old->identity_digest, + rs_new->identity_digest, DIGEST_LEN), + smartlist_add(changed, (void*) rs_new)) { if (routerstatus_has_changed(rs_old, rs_new)) - smartlist_add(changed, rs_new); + smartlist_add(changed, (void*)rs_new); } SMARTLIST_FOREACH_JOIN_END(rs_old, rs_new); control_event_networkstatus_changed(changed); @@ -1595,7 +1547,6 @@ networkstatus_copy_old_consensus_info(networkstatus_t *new_c, rs_new->identity_digest, DIGEST_LEN), STMT_NIL) { /* Okay, so we're looking at the same identity. */ - rs_new->name_lookup_warned = rs_old->name_lookup_warned; rs_new->last_dir_503_at = rs_old->last_dir_503_at; if (!memcmp(rs_old->descriptor_digest, rs_new->descriptor_digest, @@ -1833,6 +1784,8 @@ networkstatus_set_current_consensus(const char *consensus, /* XXXXNM Microdescs: needs a non-ns variant. */ update_consensus_networkstatus_fetch_time(now); + nodelist_set_consensus(current_consensus); + dirvote_recalculate_timing(options, now); routerstatus_list_update_named_server_map(); cell_ewma_set_scale_factor(options, current_consensus); @@ -1847,7 +1800,7 @@ networkstatus_set_current_consensus(const char *consensus, write_str_to_file(consensus_fname, consensus, 0); } - if (ftime_definitely_before(now, c->valid_after)) { + if (time_definitely_before(now, c->valid_after, 60)) { char tbuf[ISO_TIME_LEN+1]; char dbuf[64]; long delta = now - c->valid_after; @@ -1975,7 +1928,7 @@ download_status_map_update_from_v2_networkstatus(void) dl_status = digestmap_new(); SMARTLIST_FOREACH_BEGIN(networkstatus_v2_list, networkstatus_v2_t *, ns) { - SMARTLIST_FOREACH_BEGIN(ns->entries, routerstatus_t *, rs) { + SMARTLIST_FOREACH_BEGIN(ns->entries, const routerstatus_t *, rs) { const char *d = rs->descriptor_digest; download_status_t *s; if (digestmap_get(dl_status, d)) @@ -2003,7 +1956,8 @@ routerstatus_list_update_named_server_map(void) named_server_map = strmap_new(); strmap_free(unnamed_server_map, NULL); unnamed_server_map = strmap_new(); - SMARTLIST_FOREACH(current_consensus->routerstatus_list, routerstatus_t *, rs, + SMARTLIST_FOREACH(current_consensus->routerstatus_list, + const routerstatus_t *, rs, { if (rs->is_named) { strmap_set_lc(named_server_map, rs->nickname, @@ -2025,7 +1979,6 @@ routers_update_status_from_consensus_networkstatus(smartlist_t *routers, trusted_dir_server_t *ds; or_options_t *options = get_options(); int authdir = authdir_mode_v2(options) || authdir_mode_v3(options); - int namingdir = authdir && options->NamingAuthoritativeDir; networkstatus_t *ns = current_consensus; if (!ns || !smartlist_len(ns->routerstatus_list)) return; @@ -2039,25 +1992,19 @@ routers_update_status_from_consensus_networkstatus(smartlist_t *routers, memcmp(rs->identity_digest, router->cache_info.identity_digest, DIGEST_LEN), { +#if 0 /* We have no routerstatus for this router. Clear flags and skip it. */ - if (!namingdir) - router->is_named = 0; if (!authdir) { if (router->purpose == ROUTER_PURPOSE_GENERAL) router_clear_status_flags(router); } +#endif }) { /* We have a routerstatus for this router. */ const char *digest = router->cache_info.identity_digest; ds = router_get_trusteddirserver_by_digest(digest); - if (!namingdir) { - if (rs->is_named && !strcasecmp(router->nickname, rs->nickname)) - router->is_named = 1; - else - router->is_named = 0; - } /* Is it the same descriptor, or only the same identity? */ if (!memcmp(router->cache_info.signed_descriptor_digest, rs->descriptor_digest, DIGEST_LEN)) { @@ -2065,28 +2012,17 @@ routers_update_status_from_consensus_networkstatus(smartlist_t *routers, router->cache_info.last_listed_as_valid_until = ns->valid_until; } - if (!authdir) { - /* If we're not an authdir, believe others. */ - router->is_valid = rs->is_valid; - router->is_running = rs->is_running; - router->is_fast = rs->is_fast; - router->is_stable = rs->is_stable; - router->is_possible_guard = rs->is_possible_guard; - router->is_exit = rs->is_exit; - router->is_bad_directory = rs->is_bad_directory; - router->is_bad_exit = rs->is_bad_exit; - router->is_hs_dir = rs->is_hs_dir; - } else { + if (authdir) { /* If we _are_ an authority, we should check whether this router * is one that will cause us to need a reachability test. */ routerinfo_t *old_router = - router_get_by_digest(router->cache_info.identity_digest); + router_get_mutable_by_digest(router->cache_info.identity_digest); if (old_router != router) { router->needs_retest_if_added = dirserv_should_launch_reachability_test(router, old_router); } } - if (router->is_running && ds) { + if (rs->is_flagged_running && ds) { download_status_reset(&ds->v2_ns_dl_status); } if (reset_failures) { @@ -2095,10 +2031,9 @@ routers_update_status_from_consensus_networkstatus(smartlist_t *routers, } SMARTLIST_FOREACH_JOIN_END(rs, router); /* Now update last_listed_as_valid_until from v2 networkstatuses. */ - /* XXXX If this is slow, we need to rethink the code. */ SMARTLIST_FOREACH(networkstatus_v2_list, networkstatus_v2_t *, ns, { time_t live_until = ns->published_on + V2_NETWORKSTATUS_ROUTER_LIFETIME; - SMARTLIST_FOREACH_JOIN(ns->entries, routerstatus_t *, rs, + SMARTLIST_FOREACH_JOIN(ns->entries, const routerstatus_t *, rs, routers, routerinfo_t *, ri, memcmp(rs->identity_digest, ri->cache_info.identity_digest, DIGEST_LEN), @@ -2131,7 +2066,7 @@ signed_descs_update_status_from_consensus_networkstatus(smartlist_t *descs) } SMARTLIST_FOREACH(descs, signed_descriptor_t *, d, { - routerstatus_t *rs = digestmap_get(ns->desc_digest_map, + const routerstatus_t *rs = digestmap_get(ns->desc_digest_map, d->signed_descriptor_digest); if (rs) { if (ns->valid_until > d->last_listed_as_valid_until) @@ -2144,7 +2079,7 @@ signed_descs_update_status_from_consensus_networkstatus(smartlist_t *descs) * return the result in a newly allocated string. Used only by controller * interface (for now.) */ char * -networkstatus_getinfo_helper_single(routerstatus_t *rs) +networkstatus_getinfo_helper_single(const routerstatus_t *rs) { char buf[RS_ENTRY_LEN+1]; routerstatus_format_entry(buf, sizeof(buf), rs, NULL, NS_CONTROL_PORT); @@ -2177,6 +2112,9 @@ networkstatus_getinfo_by_purpose(const char *purpose_string, time_t now) statuses = smartlist_create(); SMARTLIST_FOREACH(rl->routers, routerinfo_t *, ri, { + node_t *node = node_get_mutable_by_id(ri->cache_info.identity_digest); + if (!node) + continue; if (ri->cache_info.published_on < cutoff) continue; if (ri->purpose != purpose) @@ -2184,7 +2122,7 @@ networkstatus_getinfo_by_purpose(const char *purpose_string, time_t now) if (bridge_auth && ri->purpose == ROUTER_PURPOSE_BRIDGE) dirserv_set_router_is_running(ri, now); /* then generate and write out status lines for each of them */ - set_routerstatus_from_routerinfo(&rs, ri, now, 0, 0, 0); + set_routerstatus_from_routerinfo(&rs, node, ri, now, 0, 0, 0); smartlist_add(statuses, networkstatus_getinfo_helper_single(&rs)); }); @@ -2300,7 +2238,7 @@ getinfo_helper_networkstatus(control_connection_t *conn, const char *question, char **answer, const char **errmsg) { - routerstatus_t *status; + const routerstatus_t *status; (void) conn; if (!current_consensus) { @@ -2311,7 +2249,7 @@ getinfo_helper_networkstatus(control_connection_t *conn, if (!strcmp(question, "ns/all")) { smartlist_t *statuses = smartlist_create(); SMARTLIST_FOREACH(current_consensus->routerstatus_list, - routerstatus_t *, rs, + const routerstatus_t *, rs, { smartlist_add(statuses, networkstatus_getinfo_helper_single(rs)); }); diff --git a/src/or/networkstatus.h b/src/or/networkstatus.h index adaddc4982..aa5496e2b1 100644 --- a/src/or/networkstatus.h +++ b/src/or/networkstatus.h @@ -38,20 +38,30 @@ int router_set_networkstatus_v2(const char *s, time_t arrived_at, void networkstatus_v2_list_clean(time_t now); int compare_digest_to_routerstatus_entry(const void *_key, const void **_member); -routerstatus_t *networkstatus_v2_find_entry(networkstatus_v2_t *ns, +const routerstatus_t *networkstatus_v2_find_entry(networkstatus_v2_t *ns, const char *digest); -routerstatus_t *networkstatus_vote_find_entry(networkstatus_t *ns, +const routerstatus_t *networkstatus_vote_find_entry(networkstatus_t *ns, + const char *digest); +routerstatus_t *networkstatus_v2_find_mutable_entry(networkstatus_v2_t *ns, + const char *digest); +routerstatus_t *networkstatus_vote_find_mutable_entry(networkstatus_t *ns, const char *digest); int networkstatus_vote_find_entry_idx(networkstatus_t *ns, const char *digest, int *found_out); const smartlist_t *networkstatus_get_v2_list(void); download_status_t *router_get_dl_status_by_descriptor_digest(const char *d); -routerstatus_t *router_get_consensus_status_by_id(const char *digest); -routerstatus_t *router_get_consensus_status_by_descriptor_digest( +const routerstatus_t *router_get_consensus_status_by_id(const char *digest); +routerstatus_t *router_get_mutable_consensus_status_by_id( + const char *digest); +const routerstatus_t *router_get_consensus_status_by_descriptor_digest( + networkstatus_t *consensus, + const char *digest); +routerstatus_t *router_get_mutable_consensus_status_by_descriptor_digest( networkstatus_t *consensus, const char *digest); -routerstatus_t *router_get_consensus_status_by_nickname(const char *nickname, - int warn_if_unnamed); +const routerstatus_t *router_get_consensus_status_by_nickname( + const char *nickname, + int warn_if_unnamed); const char *networkstatus_get_router_digest_by_nickname(const char *nickname); int networkstatus_nickname_is_unnamed(const char *nickname); void networkstatus_consensus_download_failed(int status_code, @@ -83,7 +93,7 @@ void routers_update_status_from_consensus_networkstatus(smartlist_t *routers, void signed_descs_update_status_from_consensus_networkstatus( smartlist_t *descs); -char *networkstatus_getinfo_helper_single(routerstatus_t *rs); +char *networkstatus_getinfo_helper_single(const routerstatus_t *rs); char *networkstatus_getinfo_by_purpose(const char *purpose_string, time_t now); void networkstatus_dump_bridge_status_to_file(time_t now); int32_t get_net_param_from_list(smartlist_t *net_params, const char *name, diff --git a/src/or/nodelist.c b/src/or/nodelist.c new file mode 100644 index 0000000000..a8df308851 --- /dev/null +++ b/src/or/nodelist.c @@ -0,0 +1,728 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "or.h" +#include "config.h" +#include "dirserv.h" +#include "microdesc.h" +#include "networkstatus.h" +#include "nodelist.h" +#include "policies.h" +#include "router.h" +#include "routerlist.h" + +#include <string.h> + +static void nodelist_drop_node(node_t *node, int remove_from_ht); +static void node_free(node_t *node); + +/** A nodelist_t holds a node_t object for every router we're "willing to use + * for something". Specifically, it should hold a node_t for every node that + * is currently in the routerlist, or currently in the consensus we're using. + */ +typedef struct nodelist_t { + /* A list of all the nodes. */ + smartlist_t *nodes; + /* Hash table to map from node ID digest to node. */ + HT_HEAD(nodelist_map, node_t) nodes_by_id; + +} nodelist_t; + +static INLINE unsigned int +node_id_hash(const node_t *node) +{ +#if SIZEOF_INT == 4 + const uint32_t *p = (const uint32_t*)node->identity; + return p[0] ^ p[1] ^ p[2] ^ p[3] ^ p[4]; +#elif SIZEOF_INT == 8 + const uint64_t *p = (const uint32_t*)node->identity; + const uint32_t *p32 = (const uint32_t*)node->identity; + return p[0] ^ p[1] ^ p32[4]; +#endif +} + +static INLINE unsigned int +node_id_eq(const node_t *node1, const node_t *node2) +{ + return 0 == memcmp(node1->identity, node2->identity, DIGEST_LEN); +} + +HT_PROTOTYPE(nodelist_map, node_t, ht_ent, node_id_hash, node_id_eq); +HT_GENERATE(nodelist_map, node_t, ht_ent, node_id_hash, node_id_eq, + 0.6, malloc, realloc, free); + +/** The global nodelist. */ +static nodelist_t *the_nodelist=NULL; + +/** Create an empty nodelist if we haven't done so already. */ +static void +init_nodelist(void) +{ + if (PREDICT_UNLIKELY(the_nodelist == NULL)) { + the_nodelist = tor_malloc_zero(sizeof(nodelist_t)); + HT_INIT(nodelist_map, &the_nodelist->nodes_by_id); + the_nodelist->nodes = smartlist_create(); + } +} + +/** As node_get_by_id, but returns a non-const pointer */ +node_t * +node_get_mutable_by_id(const char *identity_digest) +{ + node_t search, *node; + if (PREDICT_UNLIKELY(the_nodelist == NULL)) + return NULL; + + memcpy(&search.identity, identity_digest, DIGEST_LEN); + node = HT_FIND(nodelist_map, &the_nodelist->nodes_by_id, &search); + return node; +} + +/** Return the node_t whose identity is <b>identity_digest</b>, or NULL + * if no such node exists. */ +const node_t * +node_get_by_id(const char *identity_digest) +{ + return node_get_mutable_by_id(identity_digest); +} + +/** Internal: return the node_t whose identity_digest is + * <b>identity_digest</b>. If none exists, create a new one, add it to the + * nodelist, and return it. + * + * Requires that the nodelist be initialized. + */ +static node_t * +node_get_or_create(const char *identity_digest) +{ + node_t *node; + + if ((node = node_get_mutable_by_id(identity_digest))) + return node; + + node = tor_malloc_zero(sizeof(node_t)); + memcpy(node->identity, identity_digest, DIGEST_LEN); + HT_INSERT(nodelist_map, &the_nodelist->nodes_by_id, node); + + smartlist_add(the_nodelist->nodes, node); + node->nodelist_idx = smartlist_len(the_nodelist->nodes) - 1; + + node->country = -1; + + return node; +} + +/** Add <b>ri</b> to the nodelist. */ +node_t * +nodelist_add_routerinfo(routerinfo_t *ri) +{ + node_t *node; + init_nodelist(); + node = node_get_or_create(ri->cache_info.identity_digest); + node->ri = ri; + + if (node->country == -1) + node_set_country(node); + + if (authdir_mode(get_options())) { + const char *discard=NULL; + uint32_t status = dirserv_router_get_status(ri, &discard); + dirserv_set_node_flags_from_authoritative_status(node, status); + } + + return node; +} + +/** Set the appropriate node_t to use <b>md</b> as its microdescriptor. + * + * Called when a new microdesc has arrived and the usable consensus flavor + * is "microdesc". + **/ +node_t * +nodelist_add_microdesc(microdesc_t *md) +{ + networkstatus_t *ns = + networkstatus_get_latest_consensus_by_flavor(FLAV_MICRODESC); + const routerstatus_t *rs; + node_t *node; + if (ns == NULL) + return NULL; + init_nodelist(); + + /* Microdescriptors don't carry an identity digest, so we need to figure + * it out by looking up the routerstatus. */ + rs = router_get_consensus_status_by_descriptor_digest(ns, md->digest); + if (rs == NULL) + return NULL; + node = node_get_mutable_by_id(rs->identity_digest); + if (node) + node->md = md; + return node; +} + +/** Tell the nodelist that the current usable consensus to <b>ns</b>. + * This makes the nodelist change all of the routerstatus entries for + * the nodes, drop nodes that no longer have enough info to get used, + * and grab microdescriptors into nodes as appropriate. + */ +void +nodelist_set_consensus(networkstatus_t *ns) +{ + or_options_t *options = get_options(); + int authdir = authdir_mode_v2(options) || authdir_mode_v3(options); + init_nodelist(); + + SMARTLIST_FOREACH(the_nodelist->nodes, node_t *, node, + node->rs = NULL); + + SMARTLIST_FOREACH_BEGIN(ns->routerstatus_list, routerstatus_t *, rs) { + node_t *node = node_get_or_create(rs->identity_digest); + node->rs = rs; + if (ns->flavor == FLAV_MICRODESC) { + if (node->md == NULL || + 0!=memcmp(node->md->digest,rs->descriptor_digest,DIGEST256_LEN)) { + node->md = microdesc_cache_lookup_by_digest256(NULL, + rs->descriptor_digest); + } + } + + node_set_country(node); + + /* If we're not an authdir, believe others. */ + if (!authdir) { + node->is_valid = rs->is_valid; + node->is_running = rs->is_flagged_running; + node->is_fast = rs->is_fast; + node->is_stable = rs->is_stable; + node->is_possible_guard = rs->is_possible_guard; + node->is_exit = rs->is_exit; + node->is_bad_directory = rs->is_bad_directory; + node->is_bad_exit = rs->is_bad_exit; + node->is_hs_dir = rs->is_hs_dir; + } + + } SMARTLIST_FOREACH_END(rs); + + nodelist_purge(); + + if (! authdir) { + SMARTLIST_FOREACH_BEGIN(the_nodelist->nodes, node_t *, node) { + /* We have no routerstatus for this router. Clear flags so we can skip + * it, maybe.*/ + if (!node->rs) { + tor_assert(node->ri); /* if it had only an md, or nothing, purge + * would have removed it. */ + if (node->ri->purpose == ROUTER_PURPOSE_GENERAL) { + /* Clear all flags. */ + node->is_valid = node->is_running = node->is_hs_dir = + node->is_fast = node->is_stable = + node->is_possible_guard = node->is_exit = + node->is_bad_exit = node->is_bad_directory = 0; + } + } + } SMARTLIST_FOREACH_END(node); + } +} + +/** Helper: return true iff a node has a usable amount of information*/ +static INLINE int +node_is_usable(const node_t *node) +{ + return (node->rs) || (node->ri); +} + +/** Tell the nodelist that <b>md</b> is no longer a microdescriptor for the + * node with <b>identity_digest</b>. */ +void +nodelist_remove_microdesc(const char *identity_digest, microdesc_t *md) +{ + node_t *node = node_get_mutable_by_id(identity_digest); + if (node && node->md == md) + node->md = NULL; +} + +/** Tell the nodelist that <b>ri</b> is no longer in the routerlist. */ +void +nodelist_remove_routerinfo(routerinfo_t *ri) +{ + node_t *node = node_get_mutable_by_id(ri->cache_info.identity_digest); + if (node && node->ri == ri) { + node->ri = NULL; + if (! node_is_usable(node)) { + nodelist_drop_node(node, 1); + node_free(node); + } + } +} + +/** Remove <b>node</b> from the nodelist. (Asserts that it was there to begin + * with.) */ +static void +nodelist_drop_node(node_t *node, int remove_from_ht) +{ + node_t *tmp; + int idx; + if (remove_from_ht) { + tmp = HT_REMOVE(nodelist_map, &the_nodelist->nodes_by_id, node); + tor_assert(tmp == node); + } + + idx = node->nodelist_idx; + tor_assert(idx >= 0); + + tor_assert(node == smartlist_get(the_nodelist->nodes, idx)); + smartlist_del(the_nodelist->nodes, idx); + if (idx < smartlist_len(the_nodelist->nodes)) { + tmp = smartlist_get(the_nodelist->nodes, idx); + tmp->nodelist_idx = idx; + } + node->nodelist_idx = -1; +} + +/** Release storage held by <b>node</b> */ +static void +node_free(node_t *node) +{ + if (!node) + return; + tor_assert(node->nodelist_idx == -1); + tor_free(node); +} + +/** Remove all entries from the nodelist that don't have enough info to be + * usable for anything. */ +void +nodelist_purge(void) +{ + node_t **iter; + if (PREDICT_UNLIKELY(the_nodelist == NULL)) + return; + + /* Remove the non-usable nodes. */ + for (iter = HT_START(nodelist_map, &the_nodelist->nodes_by_id); iter; ) { + node_t *node = *iter; + + if (node_is_usable(node)) { + iter = HT_NEXT(nodelist_map, &the_nodelist->nodes_by_id, iter); + } else { + iter = HT_NEXT_RMV(nodelist_map, &the_nodelist->nodes_by_id, iter); + nodelist_drop_node(node, 0); + node_free(node); + } + } + nodelist_assert_ok(); +} + +/** Release all storage held by the nodelist. */ +void +nodelist_free_all(void) +{ + if (PREDICT_UNLIKELY(the_nodelist == NULL)) + return; + + HT_CLEAR(nodelist_map, &the_nodelist->nodes_by_id); + SMARTLIST_FOREACH_BEGIN(the_nodelist->nodes, node_t *, node) { + node->nodelist_idx = -1; + node_free(node); + } SMARTLIST_FOREACH_END(node); + + smartlist_free(the_nodelist->nodes); + + tor_free(the_nodelist); +} + +/** Check that the nodelist is internally consistent, and consistent with + * the directory info it's derived from. + */ +void +nodelist_assert_ok(void) +{ + routerlist_t *rl = router_get_routerlist(); + networkstatus_t *ns = networkstatus_get_latest_consensus(); + digestmap_t *dm = digestmap_new(); + + if (!the_nodelist) + return; + + /* every routerinfo in rl->routers should be in the nodelist. */ + if (rl) { + SMARTLIST_FOREACH_BEGIN(rl->routers, routerinfo_t *, ri) { + const node_t *node = node_get_by_id(ri->cache_info.identity_digest); + tor_assert(node && node->ri == ri); + tor_assert(0 == memcmp(ri->cache_info.identity_digest, + node->identity, DIGEST_LEN)); + tor_assert(! digestmap_get(dm, node->identity)); + digestmap_set(dm, node->identity, (void*)node); + } SMARTLIST_FOREACH_END(ri); + } + + /* every routerstatus in ns should be in the nodelist */ + if (ns) { + SMARTLIST_FOREACH_BEGIN(ns->routerstatus_list, routerstatus_t *, rs) { + const node_t *node = node_get_by_id(rs->identity_digest); + tor_assert(node && node->rs == rs); + tor_assert(0 == memcmp(rs->identity_digest, node->identity, DIGEST_LEN)); + digestmap_set(dm, node->identity, (void*)node); + if (ns->flavor == FLAV_MICRODESC) { + /* If it's a microdesc consensus, every entry that has a + * microdescriptor should be in the nodelist. + */ + microdesc_t *md = + microdesc_cache_lookup_by_digest256(NULL, rs->descriptor_digest); + tor_assert(md == node->md); + } + } SMARTLIST_FOREACH_END(rs); + } + + /* The nodelist should have no other entries, and its entries should be + * well-formed. */ + SMARTLIST_FOREACH_BEGIN(the_nodelist->nodes, node_t *, node) { + tor_assert(digestmap_get(dm, node->identity) != NULL); + tor_assert(node_sl_idx == node->nodelist_idx); + } SMARTLIST_FOREACH_END(node); + + tor_assert((long)smartlist_len(the_nodelist->nodes) == + (long)HT_SIZE(&the_nodelist->nodes_by_id)); + + digestmap_free(dm, NULL); +} + +/** Return a list of a node_t * for every node we know about. The caller + * MUST NOT modify the list. (You can set and clear flags in the nodes if + * you must, but you must not add or remove nodes.) */ +smartlist_t * +nodelist_get_list(void) +{ + init_nodelist(); + return the_nodelist->nodes; +} + +/** Given a nickname (possibly verbose, possibly a hexadecimal digest), return + * the corresponding node_t, or NULL if none exists. Warn the user if + * <b>warn_if_unnamed</b> is set, and they have specified a router by + * nickname, but the Named flag isn't set for that router. */ +const node_t * +node_get_by_nickname(const char *nickname, int warn_if_unnamed) +{ + char digest_buf[DIGEST_LEN]; + char nn_buf[MAX_NICKNAME_LEN+1]; + char nn_char='\0'; + + if (!the_nodelist) + return NULL; + + /* ???? NM Naming authorities had an additional weird behavior here where + they would treat their own namings as slightly authoritative in a + strange and inconsistent way. I think that this way is better, but we + could get the old behavior back if we wanted to by adding a function + to look in the fp_by_name table in fingerprint_list, and using this + function to override the name-to-digest lookup below if we are a + naming server. -NM + */ + + /* Handle these cases: DIGEST, $DIGEST, $DIGEST=name, $DIGEST~name. */ + if (hex_digest_nickname_decode(nickname, digest_buf, &nn_char, nn_buf)==0) { + const node_t *node = node_get_by_id(digest_buf); + if (!node) + return NULL; + if (nn_char) { + const char *real_name = node_get_nickname(node); + if (!real_name || strcasecmp(real_name, nn_buf)) + return NULL; + if (nn_char == '=') { + const char *named_id = + networkstatus_get_router_digest_by_nickname(nn_buf); + if (!named_id || memcmp(named_id, digest_buf, DIGEST_LEN)) + return NULL; + } + } + return node; + } + + if (!strcasecmp(nickname, UNNAMED_ROUTER_NICKNAME)) + return NULL; + + /* Okay, so if we get here, the nickname is just a nickname. Is there + * a binding for it in the consensus? */ + { + const char *named_id = + networkstatus_get_router_digest_by_nickname(nickname); + if (named_id) + return node_get_by_id(named_id); + } + + /* Is it marked as owned-by-someone-else? */ + if (networkstatus_nickname_is_unnamed(nickname)) { + log_info(LD_GENERAL, "The name %s is listed as Unnamed: there is some " + "router that holds it, but not one listed in the current " + "consensus.", escaped(nickname)); + return NULL; + } + + /* Okay, so the name is not canonical for anybody. */ + { + smartlist_t *matches = smartlist_create(); + const node_t *choice = NULL; + + SMARTLIST_FOREACH_BEGIN(the_nodelist->nodes, node_t *, node) { + if (!strcasecmp(node_get_nickname(node), nickname)) + smartlist_add(matches, node); + } SMARTLIST_FOREACH_END(node); + + if (smartlist_len(matches)>1 && warn_if_unnamed) { + int any_unwarned = 0; + SMARTLIST_FOREACH_BEGIN(matches, node_t *, node) { + if (!node->name_lookup_warned) { + node->name_lookup_warned = 1; + any_unwarned = 1; + } + } SMARTLIST_FOREACH_END(node); + + if (any_unwarned) { + log_warn(LD_CONFIG, "There are multiple matches for the name %s, " + "but none is listed as Named in the directory consensus. " + "Choosing one arbitrarily.", nickname); + } + } else if (smartlist_len(matches)>1 && warn_if_unnamed) { + char fp[HEX_DIGEST_LEN+1]; + node_t *node = smartlist_get(matches, 0); + if (node->name_lookup_warned) { + base16_encode(fp, sizeof(fp), node->identity, DIGEST_LEN); + log_warn(LD_CONFIG, + "You specified a server \"%s\" by name, but the directory " + "authorities do not have any key registered for this " + "nickname -- so it could be used by any server, not just " + "the one you meant. " + "To make sure you get the same server in the future, refer " + "to it by key, as \"$%s\".", nickname, fp); + node->name_lookup_warned = 1; + } + } + + if (smartlist_len(matches)) + choice = smartlist_get(matches, 0); + + smartlist_free(matches); + return choice; + } +} + +/** Return the nickname of <b>node</b>, or NULL if we can't find one. */ +const char * +node_get_nickname(const node_t *node) +{ + tor_assert(node); + if (node->rs) + return node->rs->nickname; + else if (node->ri) + return node->ri->nickname; + else + return NULL; +} + +/** Return true iff the nickname of <b>node</b> is canonical, based on the + * latest consensus. */ +int +node_is_named(const node_t *node) +{ + const char *named_id; + const char *nickname = node_get_nickname(node); + if (!nickname) + return 0; + named_id = networkstatus_get_router_digest_by_nickname(nickname); + if (!named_id) + return 0; + return !memcmp(named_id, node->identity, DIGEST_LEN); +} + +/** Return true iff <b>node</b> appears to be a directory authority or + * directory cache */ +int +node_is_dir(const node_t *node) +{ + if (node->rs) + return node->rs->dir_port != 0; + else if (node->ri) + return node->ri->dir_port != 0; + else + return 0; +} + +/** Return true iff <b>node</b> has either kind of usable descriptor -- that + * is, a routerdecriptor or a microdescriptor. */ +int +node_has_descriptor(const node_t *node) +{ + return (node->ri || + (node->rs && node->md)); +} + +/** Return the router_purpose of <b>node</b>. */ +int +node_get_purpose(const node_t *node) +{ + if (node->ri) + return node->ri->purpose; + else + return ROUTER_PURPOSE_GENERAL; +} + +/** Compute the verbose ("extended") nickname of <b>node</b> and store it + * into the MAX_VERBOSE_NICKNAME_LEN+1 character buffer at + * <b>verbose_nickname_out</b> */ +void +node_get_verbose_nickname(const node_t *node, + char *verbose_name_out) +{ + const char *nickname = node_get_nickname(node); + int is_named = node_is_named(node); + verbose_name_out[0] = '$'; + base16_encode(verbose_name_out+1, HEX_DIGEST_LEN+1, node->identity, + DIGEST_LEN); + if (!nickname) + return; + verbose_name_out[1+HEX_DIGEST_LEN] = is_named ? '=' : '~'; + strlcpy(verbose_name_out+1+HEX_DIGEST_LEN+1, nickname, MAX_NICKNAME_LEN+1); +} + +/** Return true iff it seems that <b>node</b> allows circuits to exit + * through it directlry from the client. */ +int +node_allows_single_hop_exits(const node_t *node) +{ + if (node && node->ri) + return node->ri->allow_single_hop_exits; + else + return 0; +} + +/** Return true iff it seems that <b>node</b> has an exit policy that doesn't + * actually permit anything to exit, or we don't know its exit policy */ +int +node_exit_policy_rejects_all(const node_t *node) +{ + if (node->rejects_all) + return 1; + + if (node->ri) + return node->ri->policy_is_reject_star; + else if (node->md) + return node->md->exit_policy == NULL || + short_policy_is_reject_star(node->md->exit_policy); + else + return 1; +} + +/** Copy the address for <b>node</b> into *<b>addr_out</b>. */ +int +node_get_addr(const node_t *node, tor_addr_t *addr_out) +{ + if (node->ri) { + tor_addr_from_ipv4h(addr_out, node->ri->addr); + return 0; + } else if (node->rs) { + tor_addr_from_ipv4h(addr_out, node->rs->addr); + return 0; + } + return -1; +} + +/** Return the host-order IPv4 address for <b>node</b>, or 0 if it doesn't + * seem to have one. */ +uint32_t +node_get_addr_ipv4h(const node_t *node) +{ + if (node->ri) { + return node->ri->addr; + } else if (node->rs) { + return node->rs->addr; + } + return 0; +} + +/** Copy a string representation of the IP address for <b>node</b> into the + * <b>len</b>-byte buffer at <b>buf</b>. + */ +void +node_get_address_string(const node_t *node, char *buf, size_t len) +{ + if (node->ri) { + strlcpy(buf, node->ri->address, len); + } else if (node->rs) { + tor_addr_t addr; + tor_addr_from_ipv4h(&addr, node->rs->addr); + tor_addr_to_str(buf, &addr, len, 0); + } else { + buf[0] = '\0'; + } +} + +/** Return <b>node</b>'s declared uptime, or -1 if it doesn't seem to have + * one. */ +long +node_get_declared_uptime(const node_t *node) +{ + if (node->ri) + return node->ri->uptime; + else + return -1; +} + +/** Return <b>node</b>'s declared or_port */ +uint16_t +node_get_orport(const node_t *node) +{ + if (node->ri) + return node->ri->or_port; + else if (node->rs) + return node->rs->or_port; + else + return 0; +} + +/** Return <b>node</b>'s platform string, or NULL if we don't know it. */ +const char * +node_get_platform(const node_t *node) +{ + /* If we wanted, we could record the version in the routerstatus_t, since + * the consensus lists it. We don't, though, so this function just won't + * work with microdescriptors. */ + if (node->ri) + return node->ri->platform; + else + return NULL; +} + +/** Return <b>node</b>'s time of publication, or 0 if we don't have one. */ +time_t +node_get_published_on(const node_t *node) +{ + if (node->ri) + return node->ri->cache_info.published_on; + else + return 0; +} + +/** Return true iff <b>node</b> is one representing this router. */ +int +node_is_me(const node_t *node) +{ + return router_digest_is_me(node->identity); +} + +/** Return <b>node</b> declared family (as a list of names), or NULL if + * the node didn't declare a family. */ +const smartlist_t * +node_get_declared_family(const node_t *node) +{ + if (node->ri && node->ri->declared_family) + return node->ri->declared_family; + else if (node->md && node->md->family) + return node->md->family; + else + return NULL; +} + diff --git a/src/or/nodelist.h b/src/or/nodelist.h new file mode 100644 index 0000000000..23f4a16427 --- /dev/null +++ b/src/or/nodelist.h @@ -0,0 +1,59 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file microdesc.h + * \brief Header file for microdesc.c. + **/ + +#ifndef _TOR_NODELIST_H +#define _TOR_NODELIST_H + +node_t *node_get_mutable_by_id(const char *identity_digest); +const node_t *node_get_by_id(const char *identity_digest); +node_t *nodelist_add_routerinfo(routerinfo_t *ri); +node_t *nodelist_add_microdesc(microdesc_t *md); +void nodelist_set_consensus(networkstatus_t *ns); + +void nodelist_remove_microdesc(const char *identity_digest, microdesc_t *md); +void nodelist_remove_routerinfo(routerinfo_t *ri); +void nodelist_purge(void); + +void nodelist_free_all(void); +void nodelist_assert_ok(void); + +const node_t *node_get_by_nickname(const char *nickname, int warn_if_unnamed); +void node_get_verbose_nickname(const node_t *node, + char *verbose_name_out); +int node_is_named(const node_t *node); +int node_is_dir(const node_t *node); +int node_has_descriptor(const node_t *node); +int node_get_purpose(const node_t *node); +#define node_is_bridge(node) \ + (node_get_purpose((node)) == ROUTER_PURPOSE_BRIDGE) +int node_is_me(const node_t *node); +int node_exit_policy_rejects_all(const node_t *node); +int node_get_addr(const node_t *node, tor_addr_t *addr_out); +uint32_t node_get_addr_ipv4h(const node_t *node); +int node_allows_single_hop_exits(const node_t *node); +uint16_t node_get_orport(const node_t *node); +const char *node_get_nickname(const node_t *node); +const char *node_get_platform(const node_t *node); +void node_get_address_string(const node_t *node, char *cp, size_t len); +long node_get_declared_uptime(const node_t *node); +time_t node_get_published_on(const node_t *node); +const smartlist_t *node_get_declared_family(const node_t *node); + +smartlist_t *nodelist_get_list(void); + +/* XXXX These need to move out of routerlist.c */ +void nodelist_refresh_countries(void); +void node_set_country(node_t *node); +void nodelist_add_node_family(smartlist_t *nodes, const node_t *node); +int nodes_in_same_family(const node_t *node1, const node_t *node2); + +#endif + diff --git a/src/or/ntmain.c b/src/or/ntmain.c index 46e7afb78b..c5c6a58bbe 100644 --- a/src/or/ntmain.c +++ b/src/or/ntmain.c @@ -183,7 +183,6 @@ nt_service_loadlibrary(void) */ int nt_service_is_stopping(void) -/* XXXX this function would probably _love_ to be inline, in 0.2.0. */ { /* If we haven't loaded the function pointers, we can't possibly be an NT * service trying to shut down. */ diff --git a/src/or/or.h b/src/or/or.h index 673a3920cf..2f0b778e7b 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -809,6 +809,9 @@ typedef enum { * Tor 0.1.2.x is obsolete, we can remove this. */ #define DEFAULT_CLIENT_NICKNAME "client" +/** Name chosen by routers that don't configure nicknames */ +#define UNNAMED_ROUTER_NICKNAME "Unnamed" + /** Number of bytes in a SOCKS4 header. */ #define SOCKS4_NETWORK_LEN 8 @@ -1510,52 +1513,44 @@ typedef struct { unsigned int allow_single_hop_exits:1; /**< Whether the router says * it allows single hop exits. */ - /* local info */ - unsigned int is_running:1; /**< As far as we know, is this OR currently - * running? */ - unsigned int is_valid:1; /**< Has a trusted dirserver validated this OR? - * (For Authdir: Have we validated this OR?) - */ - unsigned int is_named:1; /**< Do we believe the nickname that this OR gives - * us? */ - unsigned int is_fast:1; /** Do we think this is a fast OR? */ - unsigned int is_stable:1; /** Do we think this is a stable OR? */ - unsigned int is_possible_guard:1; /**< Do we think this is an OK guard? */ - unsigned int is_exit:1; /**< Do we think this is an OK exit? */ - unsigned int is_bad_exit:1; /**< Do we think this exit is censored, borked, - * or otherwise nasty? */ - unsigned int is_bad_directory:1; /**< Do we think this directory is junky, - * underpowered, or otherwise useless? */ unsigned int wants_to_be_hs_dir:1; /**< True iff this router claims to be * a hidden service directory. */ - unsigned int is_hs_dir:1; /**< True iff this router is a hidden service - * directory according to the authorities. */ unsigned int policy_is_reject_star:1; /**< True iff the exit policy for this * router rejects everything. */ /** True if, after we have added this router, we should re-launch * tests for it. */ unsigned int needs_retest_if_added:1; -/** Tor can use this router for general positions in circuits. */ +/** Tor can use this router for general positions in circuits; we got it + * from a directory server as usual, or we're an authority and a server + * uploaded it. */ #define ROUTER_PURPOSE_GENERAL 0 -/** Tor should avoid using this router for circuit-building. */ +/** Tor should avoid using this router for circuit-building: we got it + * from a crontroller. If the controller wants to use it, it'll have to + * ask for it by identity. */ #define ROUTER_PURPOSE_CONTROLLER 1 -/** Tor should use this router only for bridge positions in circuits. */ +/** Tor should use this router only for bridge positions in circuits: we got + * it via a directory request from the bridge itself, or a bridge + * authority. x*/ #define ROUTER_PURPOSE_BRIDGE 2 /** Tor should not use this router; it was marked in cached-descriptors with * a purpose we didn't recognize. */ #define ROUTER_PURPOSE_UNKNOWN 255 - uint8_t purpose; /** What positions in a circuit is this router good for? */ + /* In what way did we find out about this router? One of ROUTER_PURPOSE_*. + * Routers of different purposes are kept segregated and used for different + * things; see notes on ROUTER_PURPOSE_* macros above. + */ + uint8_t purpose; /* The below items are used only by authdirservers for * reachability testing. */ + /** When was the last time we could reach this OR? */ time_t last_reachable; /** When did we start testing reachability for this OR? */ time_t testing_since; - /** According to the geoip db what country is this router in? */ - country_t country; + } routerinfo_t; /** Information needed to keep and cache a signed extra-info document. */ @@ -1591,7 +1586,11 @@ typedef struct routerstatus_t { unsigned int is_exit:1; /**< True iff this router is a good exit. */ unsigned int is_stable:1; /**< True iff this router stays up a long time. */ unsigned int is_fast:1; /**< True iff this router has good bandwidth. */ - unsigned int is_running:1; /**< True iff this router is up. */ + /** True iff this router is called 'running' in the consensus. We give it + * this funny name so that we don't accidentally use this bit as a view of + * whether we think the router is *currently* running. If that's what you + * want to know, look at is_running in node_t. */ + unsigned int is_flagged_running:1; unsigned int is_named:1; /**< True iff "nickname" belongs to this router. */ unsigned int is_unnamed:1; /**< True iff "nickname" belongs to another * router. */ @@ -1643,15 +1642,31 @@ typedef struct routerstatus_t { * from this authority.) Applies in v2 networkstatus document only. */ unsigned int need_to_mirror:1; - unsigned int name_lookup_warned:1; /**< Have we warned the user for referring - * to this (unnamed) router by nickname? - */ time_t last_dir_503_at; /**< When did this router last tell us that it * was too busy to serve directory info? */ download_status_t dl_status; } routerstatus_t; +/** A single entry in a parsed policy summary, describing a range of ports. */ +typedef struct short_policy_entry_t { + uint16_t min_port, max_port; +} short_policy_entry_t; + +/** A short_poliy_t is the parsed version of a policy summary. */ +typedef struct short_policy_t { + /** True if the members of 'entries' are port ranges to accept; false if + * they are port ranges to reject */ + unsigned int is_accept : 1; + /** The actual number of values in 'entries'. */ + unsigned int n_entries : 31; + /** An array of (probably more than 1!) short_policy_entry_t values, + * each descriping a range of ports that this policy accepts or rejects + * (depending on the value of is_accept). + */ + short_policy_entry_t entries[1]; +} short_policy_t; + /** A microdescriptor is the smallest amount of information needed to build a * circuit through a router. They are generated by the directory authorities, * using information from the uploaded routerinfo documents. They are not @@ -1693,11 +1708,75 @@ typedef struct microdesc_t { crypto_pk_env_t *onion_pkey; /** As routerinfo_t.family */ smartlist_t *family; - /** Encoded exit policy summary */ - char *exitsummary; /**< exit policy summary - - * XXX this probably should not stay a string. */ + /** Exit policy summary */ + short_policy_t *exit_policy; } microdesc_t; +/** A node_t represents a Tor router. + * + * Specifically, a node_t is a Tor router as we are using it: a router that + * we are considering for circuits, connections, and so on. A node_t is a + * thin wrapper around the routerstatus, routerinfo, and microdesc for a + * single wrapper, and provides a consistent interface for all of them. + * + * Also, a node_t has mutable state. While a routerinfo, a routerstatus, + * and a microdesc have[*] only the information read from a router + * descriptor, a consensus entry, and a microdescriptor (respectively)... + * a node_t has flags based on *our own current opinion* of the node. + * + * [*] Actually, there is some leftover information in each that is mutable. + * We should try to excise that. + */ +typedef struct node_t { + /* Indexing information */ + + /** Used to look up the node_t by its identity digest. */ + HT_ENTRY(node_t) ht_ent; + /** Position of the node within the list of nodes */ + int nodelist_idx; + + /** The identity digest of this node_t. No more than one node_t per + * identity may exist at a time. */ + char identity[DIGEST_LEN]; + + microdesc_t *md; + routerinfo_t *ri; + routerstatus_t *rs; + + /* local info: copied from routerstatus, then possibly frobbed based + * on experience. Authorities set this stuff directly. */ + + unsigned int is_running:1; /**< As far as we know, is this OR currently + * running? */ + unsigned int is_valid:1; /**< Has a trusted dirserver validated this OR? + * (For Authdir: Have we validated this OR?) + */ + unsigned int is_fast:1; /** Do we think this is a fast OR? */ + unsigned int is_stable:1; /** Do we think this is a stable OR? */ + unsigned int is_possible_guard:1; /**< Do we think this is an OK guard? */ + unsigned int is_exit:1; /**< Do we think this is an OK exit? */ + unsigned int is_bad_exit:1; /**< Do we think this exit is censored, borked, + * or otherwise nasty? */ + unsigned int is_bad_directory:1; /**< Do we think this directory is junky, + * underpowered, or otherwise useless? */ + unsigned int is_hs_dir:1; /**< True iff this router is a hidden service + * directory according to the authorities. */ + + /* Local info: warning state. */ + + unsigned int name_lookup_warned:1; /**< Have we warned the user for referring + * to this (unnamed) router by nickname? + */ + + /** Local info: we treat this node as if it rejects everything */ + unsigned int rejects_all:1; + + /* Local info: derived. */ + + /** According to the geoip db what country is this router in? */ + country_t country; +} node_t; + /** How many times will we try to download a router's descriptor before giving * up? */ #define MAX_ROUTERDESC_DOWNLOAD_FAILURES 8 @@ -2181,10 +2260,12 @@ typedef struct circuit_t { * length ONIONSKIN_CHALLENGE_LEN. */ char *n_conn_onionskin; - time_t timestamp_created; /**< When was this circuit created? */ + /** When was this circuit created? We keep this timestamp with a higher + * resolution than most so that the circuit-build-time tracking code can + * get millisecond resolution. */ + struct timeval timestamp_created; time_t timestamp_dirty; /**< When the circuit was first used, or 0 if the * circuit is clean. */ - struct timeval highres_created; /**< When exactly was the circuit created? */ uint16_t marked_for_close; /**< Should we close this circuit at the end of * the main loop? (If true, holds the line number @@ -2667,7 +2748,8 @@ typedef struct { char *MyFamily; /**< Declared family for this OR. */ config_line_t *NodeFamilies; /**< List of config lines for - * node families */ + * node families */ + smartlist_t *NodeFamilySets; /**< List of parsed NodeFamilies values. */ config_line_t *AuthDirBadDir; /**< Address policy for descriptors to * mark as bad dir mirrors. */ config_line_t *AuthDirBadExit; /**< Address policy for descriptors to @@ -3385,7 +3467,7 @@ typedef enum { ADDR_POLICY_PROBABLY_ACCEPTED=1, /** Part of the address was unknown, but as far as we can tell, it was * rejected. */ - ADDR_POLICY_PROBABLY_REJECTED=2 + ADDR_POLICY_PROBABLY_REJECTED=2, } addr_policy_result_t; /********************************* rephist.c ***************************/ @@ -3535,7 +3617,8 @@ typedef enum { CRN_NEED_GUARD = 1<<2, CRN_ALLOW_INVALID = 1<<3, /* XXXX not used, apparently. */ - CRN_WEIGHT_AS_EXIT = 1<<5 + CRN_WEIGHT_AS_EXIT = 1<<5, + CRN_NEED_DESC = 1<<6 } router_crn_flags_t; /** Return value for router_add_to_routerlist() and dirserv_add_descriptor() */ diff --git a/src/or/policies.c b/src/or/policies.c index 4fd0904152..8d8de11828 100644 --- a/src/or/policies.c +++ b/src/or/policies.c @@ -11,6 +11,7 @@ #include "or.h" #include "config.h" #include "dirserv.h" +#include "nodelist.h" #include "policies.h" #include "routerparse.h" #include "ht.h" @@ -261,7 +262,7 @@ fascist_firewall_allows_address_or(const tor_addr_t *addr, uint16_t port) /** Return true iff we think our firewall will let us make an OR connection to * <b>ri</b>. */ int -fascist_firewall_allows_or(routerinfo_t *ri) +fascist_firewall_allows_or(const routerinfo_t *ri) { /* XXXX proposal 118 */ tor_addr_t addr; @@ -269,6 +270,22 @@ fascist_firewall_allows_or(routerinfo_t *ri) return fascist_firewall_allows_address_or(&addr, ri->or_port); } +/** Return true iff we think our firewall will let us make an OR connection to + * <b>node</b>. */ +int +fascist_firewall_allows_node(const node_t *node) +{ + if (node->ri) { + return fascist_firewall_allows_or(node->ri); + } else if (node->rs) { + tor_addr_t addr; + tor_addr_from_ipv4h(&addr, node->rs->addr); + return fascist_firewall_allows_address_or(&addr, node->rs->or_port); + } else { + return 1; + } +} + /** Return true iff we think our firewall will let us make a directory * connection to addr:port. */ int @@ -858,15 +875,11 @@ policies_parse_exit_policy(config_line_t *cfg, smartlist_t **dest, return 0; } -/** Replace the exit policy of <b>r</b> with reject *:*. */ +/** Replace the exit policy of <b>node</b> with reject *:* */ void -policies_set_router_exitpolicy_to_reject_all(routerinfo_t *r) +policies_set_node_exitpolicy_to_reject_all(node_t *node) { - addr_policy_t *item; - addr_policy_list_free(r->exit_policy); - r->exit_policy = smartlist_create(); - item = router_parse_addr_policy_item_from_string("reject *:*", -1); - smartlist_add(r->exit_policy, item); + node->rejects_all = 1; } /** Return 1 if there is at least one /8 subnet in <b>policy</b> that @@ -1075,7 +1088,7 @@ policy_summary_split(smartlist_t *summary, int start_at_index; int i = 0; - /* XXXX Do a binary search if run time matters */ + while (AT(i)->prt_max < prt_min) i++; if (AT(i)->prt_min != prt_min) { @@ -1288,6 +1301,195 @@ policy_summarize(smartlist_t *policy) return result; } +/** Convert a summarized policy string into a short_policy_t. Return NULL + * if the string is not well-formed. */ +short_policy_t * +parse_short_policy(const char *summary) +{ + const char *orig_summary = summary; + short_policy_t *result; + int is_accept; + int n_entries; + short_policy_entry_t entries[MAX_EXITPOLICY_SUMMARY_LEN]; /* overkill */ + const char *next; + + if (!strcmpstart(summary, "accept ")) { + is_accept = 1; + summary += strlen("accept "); + } else if (!strcmpstart(summary, "reject ")) { + is_accept = 0; + summary += strlen("reject "); + } else { + log_fn(LOG_PROTOCOL_WARN, LD_DIR, "Unrecognized policy summary keyword"); + return NULL; + } + + n_entries = 0; + for ( ; *summary; summary = next) { + const char *comma = strchr(summary, ','); + unsigned low, high; + char dummy; + char ent_buf[32]; + + next = comma ? comma+1 : strchr(summary, '\0'); + + if (n_entries == MAX_EXITPOLICY_SUMMARY_LEN) { + log_fn(LOG_PROTOCOL_WARN, LD_DIR, "Impossibly long policy summary %s", + escaped(orig_summary)); + return NULL; + } + + if (! TOR_ISDIGIT(*summary) || next-summary > (int)(sizeof(ent_buf)-1)) { + /* unrecognized entry format. skip it. */ + continue; + } + if (next-summary < 2) { + /* empty; skip it. */ + continue; + } + + memcpy(ent_buf, summary, next-summary-1); + ent_buf[next-summary-1] = '\0'; + + if (tor_sscanf(ent_buf, "%u-%u%c", &low, &high, &dummy) == 2) { + if (low<1 || low>65535 || high<1 || high>65535) { + log_fn(LOG_PROTOCOL_WARN, LD_DIR, + "Found bad entry in policy summary %s", escaped(orig_summary)); + return NULL; + } + } else if (tor_sscanf(ent_buf, "%u%c", &low, &dummy) == 1) { + if (low<1 || low>65535) { + log_fn(LOG_PROTOCOL_WARN, LD_DIR, + "Found bad entry in policy summary %s", escaped(orig_summary)); + return NULL; + } + high = low; + } else { + log_fn(LOG_PROTOCOL_WARN, LD_DIR,"Found bad entry in policy summary %s", + escaped(orig_summary)); + return NULL; + } + + entries[n_entries].min_port = low; + entries[n_entries].max_port = high; + n_entries++; + } + + if (n_entries == 0) { + log_fn(LOG_PROTOCOL_WARN, LD_DIR, + "Found no port-range entries in summary %s", escaped(orig_summary)); + return NULL; + } + + { + size_t size = sizeof(short_policy_t) + + sizeof(short_policy_entry_t)*(n_entries-1); + result = tor_malloc_zero(size); + + tor_assert( (char*)&result->entries[n_entries-1] < ((char*)result)+size); + } + + result->is_accept = is_accept; + result->n_entries = n_entries; + memcpy(result->entries, entries, sizeof(short_policy_entry_t)*n_entries); + return result; +} + +/** Release all storage held in <b>policy</b>. */ +void +short_policy_free(short_policy_t *policy) +{ + tor_free(policy); +} + +/** See whether the <b>addr</b>:<b>port</b> address is likely to be accepted + * or rejected by the summarized policy <b>policy</b>. Return values are as + * for compare_tor_addr_to_addr_policy. Unlike the regular addr_policy + * functions, requires the <b>port</b> be specified. */ +addr_policy_result_t +compare_tor_addr_to_short_policy(const tor_addr_t *addr, uint16_t port, + const short_policy_t *policy) +{ + int i; + int found_match = 0; + int accept; + (void)addr; + + tor_assert(port != 0); + + if (addr && (tor_addr_is_internal(addr, 0) || + tor_addr_is_null(addr) || + tor_addr_is_loopback(addr))) + return ADDR_POLICY_REJECTED; + + for (i=0; i < policy->n_entries; ++i) { + const short_policy_entry_t *e = &policy->entries[i]; + if (e->min_port <= port && port <= e->max_port) { + found_match = 1; + break; + } + } + + if (found_match) + accept = policy->is_accept; + else + accept = ! policy->is_accept; + + /* ???? are these right? */ + if (accept) + return ADDR_POLICY_PROBABLY_ACCEPTED; + else + return ADDR_POLICY_REJECTED; +} + +/** Return true iff <b>policy</b> seems reject all ports */ +int +short_policy_is_reject_star(const short_policy_t *policy) +{ + /* This doesn't need to be as much on the lookout as policy_is_reject_star, + * since policy summaries are from the consensus or from consensus + * microdescs. + */ + tor_assert(policy); + /* Check for an exact match of "reject 1-65535". */ + return (policy->is_accept == 0 && policy->n_entries == 1 && + policy->entries[0].min_port == 1 && + policy->entries[0].max_port == 65535); +} + +/** Decides whether addr:port is probably or definitely accepted or rejcted by + * <b>node</b>. See compare_tor_addr_to_addr_policy for details on addr/port + * interpretation. */ +addr_policy_result_t +compare_addr_to_node_policy(uint32_t addr, uint16_t port, const node_t *node) +{ + tor_addr_t a; + tor_addr_from_ipv4h(&a, addr); + return compare_tor_addr_to_node_policy(&a, port, node); +} + +/** Decides whether addr:port is probably or definitely accepted or rejcted by + * <b>node</b>. See compare_tor_addr_to_addr_policy for details on addr/port + * interpretation. */ +addr_policy_result_t +compare_tor_addr_to_node_policy(const tor_addr_t *addr, uint16_t port, + const node_t *node) +{ + if (node->rejects_all) + return ADDR_POLICY_REJECTED; + + if (node->ri) + return compare_tor_addr_to_addr_policy(addr, port, node->ri->exit_policy); + else if (node->md && node->md) { + if (node->md->exit_policy == NULL) + return ADDR_POLICY_REJECTED; + else + return compare_tor_addr_to_short_policy(addr, port, + node->md->exit_policy); + } else + return ADDR_POLICY_PROBABLY_REJECTED; +} + /** Implementation for GETINFO control command: knows the answer for questions * about "exit-policy/..." */ int diff --git a/src/or/policies.h b/src/or/policies.h index dd46f4de9c..5c1113e75a 100644 --- a/src/or/policies.h +++ b/src/or/policies.h @@ -19,7 +19,8 @@ int firewall_is_fascist_or(void); int fascist_firewall_allows_address_or(const tor_addr_t *addr, uint16_t port); -int fascist_firewall_allows_or(routerinfo_t *ri); +int fascist_firewall_allows_or(const routerinfo_t *ri); +int fascist_firewall_allows_node(const node_t *node); int fascist_firewall_allows_address_dir(const tor_addr_t *addr, uint16_t port); int dir_policy_permits_address(const tor_addr_t *addr); int socks_policy_permits_address(const tor_addr_t *addr); @@ -38,10 +39,16 @@ addr_policy_result_t compare_tor_addr_to_addr_policy(const tor_addr_t *addr, uint16_t port, const smartlist_t *policy); addr_policy_result_t compare_addr_to_addr_policy(uint32_t addr, uint16_t port, const smartlist_t *policy); + +addr_policy_result_t compare_addr_to_node_policy(uint32_t addr, + uint16_t port, const node_t *node); +addr_policy_result_t compare_tor_addr_to_node_policy(const tor_addr_t *addr, + uint16_t port, const node_t *node); + int policies_parse_exit_policy(config_line_t *cfg, smartlist_t **dest, int rejectprivate, const char *local_address, int add_default_policy); -void policies_set_router_exitpolicy_to_reject_all(routerinfo_t *exitrouter); +void policies_set_node_exitpolicy_to_reject_all(node_t *exitrouter); int exit_policy_is_general_exit(smartlist_t *policy); int policy_is_reject_star(const smartlist_t *policy); int getinfo_helper_policies(control_connection_t *conn, @@ -56,5 +63,12 @@ void policies_free_all(void); char *policy_summarize(smartlist_t *policy); +short_policy_t *parse_short_policy(const char *summary); +void short_policy_free(short_policy_t *policy); +int short_policy_is_reject_star(const short_policy_t *policy); +addr_policy_result_t compare_tor_addr_to_short_policy( + const tor_addr_t *addr, uint16_t port, + const short_policy_t *policy); + #endif diff --git a/src/or/relay.c b/src/or/relay.c index 05af38e700..767ea79c17 100644 --- a/src/or/relay.c +++ b/src/or/relay.c @@ -24,6 +24,7 @@ #include "main.h" #include "mempool.h" #include "networkstatus.h" +#include "nodelist.h" #include "policies.h" #include "reasons.h" #include "relay.h" @@ -712,7 +713,7 @@ connection_ap_process_end_not_open( edge_connection_t *conn, crypt_path_t *layer_hint) { struct in_addr in; - routerinfo_t *exitrouter; + node_t *exitrouter; int reason = *(cell->payload+RELAY_HEADER_SIZE); int control_reason = reason | END_STREAM_REASON_FLAG_REMOTE; (void) layer_hint; /* unused */ @@ -720,11 +721,12 @@ connection_ap_process_end_not_open( if (rh->length > 0 && edge_reason_is_retriable(reason) && !connection_edge_is_rendezvous_stream(conn) /* avoid retry if rend */ ) { + const char *chosen_exit_digest = + circ->build_state->chosen_exit->identity_digest; log_info(LD_APP,"Address '%s' refused due to '%s'. Considering retrying.", safe_str(conn->socks_request->address), stream_end_reason_to_string(reason)); - exitrouter = - router_get_by_digest(circ->build_state->chosen_exit->identity_digest); + exitrouter = node_get_mutable_by_id(chosen_exit_digest); switch (reason) { case END_STREAM_REASON_EXITPOLICY: if (rh->length >= 5) { @@ -759,8 +761,8 @@ connection_ap_process_end_not_open( log_info(LD_APP, "Exitrouter '%s' seems to be more restrictive than its exit " "policy. Not using this router as exit for now.", - exitrouter->nickname); - policies_set_router_exitpolicy_to_reject_all(exitrouter); + node_get_nickname(exitrouter)); + policies_set_node_exitpolicy_to_reject_all(exitrouter); } /* rewrite it to an IP if we learned one. */ if (addressmap_rewrite(conn->socks_request->address, @@ -823,7 +825,7 @@ connection_ap_process_end_not_open( case END_STREAM_REASON_HIBERNATING: case END_STREAM_REASON_RESOURCELIMIT: if (exitrouter) { - policies_set_router_exitpolicy_to_reject_all(exitrouter); + policies_set_node_exitpolicy_to_reject_all(exitrouter); } if (conn->chosen_exit_optional) { /* stop wanting a specific exit */ @@ -1503,7 +1505,7 @@ circuit_resume_edge_reading_helper(edge_connection_t *first_conn, if (!layer_hint || conn->cpath_layer == layer_hint) { connection_start_reading(TO_CONN(conn)); - if (buf_datalen(conn->_base.inbuf) > 0) + if (connection_get_inbuf_len(TO_CONN(conn)) > 0) ++n_streams; } } @@ -1542,7 +1544,7 @@ circuit_resume_edge_reading_helper(edge_connection_t *first_conn, } /* If there's still data to read, we'll be coming back to this stream. */ - if (buf_datalen(conn->_base.inbuf)) + if (connection_get_inbuf_len(TO_CONN(conn))) ++n_streams_left; /* If the circuit won't accept any more data, return without looking diff --git a/src/or/rendclient.c b/src/or/rendclient.c index 68abb886a8..848b02d3a0 100644 --- a/src/or/rendclient.c +++ b/src/or/rendclient.c @@ -16,6 +16,7 @@ #include "connection_edge.h" #include "directory.h" #include "main.h" +#include "nodelist.h" #include "relay.h" #include "rendclient.h" #include "rendcommon.h" @@ -414,7 +415,7 @@ directory_get_from_hs_dir(const char *desc_id, const rend_data_t *rend_query) SMARTLIST_FOREACH(responsible_dirs, routerstatus_t *, dir, { if (lookup_last_hid_serv_request(dir, desc_id_base32, 0, 0) + REND_HID_SERV_DIR_REQUERY_PERIOD >= now || - !router_get_by_digest(dir->identity_digest)) + !router_get_by_id_digest(dir->identity_digest)) SMARTLIST_DEL_CURRENT(responsible_dirs, dir); }); @@ -738,7 +739,6 @@ rend_client_get_random_intro(const rend_data_t *rend_query) int i; rend_cache_entry_t *entry; rend_intro_point_t *intro; - routerinfo_t *router; if (rend_cache_lookup_entry(rend_query->onion_address, -1, &entry) < 1) { log_warn(LD_REND, @@ -755,8 +755,8 @@ rend_client_get_random_intro(const rend_data_t *rend_query) intro = smartlist_get(entry->parsed->intro_nodes, i); /* Do we need to look up the router or is the extend info complete? */ if (!intro->extend_info->onion_key) { - router = router_get_by_nickname(intro->extend_info->nickname, 0); - if (!router) { + const node_t *node = node_get_by_nickname(intro->extend_info->nickname, 0); + if (!node) { log_info(LD_REND, "Unknown router with nickname '%s'; trying another.", intro->extend_info->nickname); rend_intro_point_free(intro); @@ -764,7 +764,7 @@ rend_client_get_random_intro(const rend_data_t *rend_query) goto again; } extend_info_free(intro->extend_info); - intro->extend_info = extend_info_from_router(router); + intro->extend_info = extend_info_from_node(node); } return extend_info_dup(intro->extend_info); } diff --git a/src/or/rendservice.c b/src/or/rendservice.c index b0d791529b..0f63776ef2 100644 --- a/src/or/rendservice.c +++ b/src/or/rendservice.c @@ -14,6 +14,7 @@ #include "config.h" #include "directory.h" #include "networkstatus.h" +#include "nodelist.h" #include "rendclient.h" #include "rendcommon.h" #include "rendservice.h" @@ -1001,7 +1002,7 @@ rend_service_introduce(origin_circuit_t *circuit, const char *request, } else { char *rp_nickname; size_t nickname_field_len; - routerinfo_t *router; + const node_t *node; int version; if (*buf == 1) { rp_nickname = buf+1; @@ -1028,8 +1029,8 @@ rend_service_introduce(origin_circuit_t *circuit, const char *request, len -= nickname_field_len; len -= rp_nickname - buf; /* also remove header space used by version, if * any */ - router = router_get_by_nickname(rp_nickname, 0); - if (!router) { + node = node_get_by_nickname(rp_nickname, 0); + if (!node) { log_info(LD_REND, "Couldn't find router %s named in introduce2 cell.", escaped_safe_str_client(rp_nickname)); /* XXXX Add a no-such-router reason? */ @@ -1037,7 +1038,7 @@ rend_service_introduce(origin_circuit_t *circuit, const char *request, goto err; } - extend_info = extend_info_from_router(router); + extend_info = extend_info_from_node(node); } if (len != REND_COOKIE_LEN+DH_KEY_LEN) { @@ -1577,7 +1578,7 @@ directory_post_to_hs_dir(rend_service_descriptor_t *renddesc, hs_dir->identity_digest)) /* Don't upload descriptor if we succeeded in doing so last time. */ continue; - if (!router_get_by_digest(hs_dir->identity_digest)) { + if (!router_get_by_id_digest(hs_dir->identity_digest)) { log_info(LD_REND, "Not sending publish request for v2 descriptor to " "hidden service directory '%s'; we don't have its " "router descriptor. Queuing for later upload.", @@ -1754,19 +1755,19 @@ void rend_services_introduce(void) { int i,j,r; - routerinfo_t *router; + const node_t *node; rend_service_t *service; rend_intro_point_t *intro; int changed, prev_intro_nodes; - smartlist_t *intro_routers; + smartlist_t *intro_nodes; time_t now; or_options_t *options = get_options(); - intro_routers = smartlist_create(); + intro_nodes = smartlist_create(); now = time(NULL); for (i=0; i < smartlist_len(rend_service_list); ++i) { - smartlist_clear(intro_routers); + smartlist_clear(intro_nodes); service = smartlist_get(rend_service_list, i); tor_assert(service); @@ -1786,8 +1787,8 @@ rend_services_introduce(void) service. */ for (j=0; j < smartlist_len(service->intro_nodes); ++j) { intro = smartlist_get(service->intro_nodes, j); - router = router_get_by_digest(intro->extend_info->identity_digest); - if (!router || !find_intro_circuit(intro, service->pk_digest)) { + node = node_get_by_id(intro->extend_info->identity_digest); + if (!node || !find_intro_circuit(intro, service->pk_digest)) { log_info(LD_REND,"Giving up on %s as intro point for %s.", intro->extend_info->nickname, service->service_id); if (service->desc) { @@ -1806,8 +1807,8 @@ rend_services_introduce(void) smartlist_del(service->intro_nodes,j--); changed = 1; } - if (router) - smartlist_add(intro_routers, router); + if (node) + smartlist_add(intro_nodes, (void*)node); } /* We have enough intro points, and the intro points we thought we had were @@ -1836,26 +1837,26 @@ rend_services_introduce(void) #define NUM_INTRO_POINTS_INIT (NUM_INTRO_POINTS + 2) for (j=prev_intro_nodes; j < (prev_intro_nodes == 0 ? NUM_INTRO_POINTS_INIT : NUM_INTRO_POINTS); ++j) { - router_crn_flags_t flags = CRN_NEED_UPTIME; + router_crn_flags_t flags = CRN_NEED_UPTIME|CRN_NEED_DESC; if (get_options()->_AllowInvalid & ALLOW_INVALID_INTRODUCTION) flags |= CRN_ALLOW_INVALID; - router = router_choose_random_node(intro_routers, - options->ExcludeNodes, flags); - if (!router) { + node = router_choose_random_node(intro_nodes, + options->ExcludeNodes, flags); + if (!node) { log_warn(LD_REND, "Could only establish %d introduction points for %s.", smartlist_len(service->intro_nodes), service->service_id); break; } changed = 1; - smartlist_add(intro_routers, router); + smartlist_add(intro_nodes, (void*)node); intro = tor_malloc_zero(sizeof(rend_intro_point_t)); - intro->extend_info = extend_info_from_router(router); + intro->extend_info = extend_info_from_node(node); intro->intro_key = crypto_new_pk_env(); tor_assert(!crypto_pk_generate_key(intro->intro_key)); smartlist_add(service->intro_nodes, intro); log_info(LD_REND, "Picked router %s as an intro point for %s.", - router->nickname, service->service_id); + node_get_nickname(node), service->service_id); } /* If there's no need to launch new circuits, stop here. */ @@ -1872,7 +1873,7 @@ rend_services_introduce(void) } } } - smartlist_free(intro_routers); + smartlist_free(intro_nodes); } /** Regenerate and upload rendezvous service descriptors for all diff --git a/src/or/rephist.c b/src/or/rephist.c index 056fc5cc12..a18b2cebcc 100644 --- a/src/or/rephist.c +++ b/src/or/rephist.c @@ -14,6 +14,7 @@ #include "circuitlist.h" #include "circuituse.h" #include "config.h" +#include "nodelist.h" #include "rephist.h" #include "router.h" #include "routerlist.h" @@ -579,7 +580,7 @@ rep_hist_dump_stats(time_t now, int severity) size_t len; int ret; unsigned long upt, downt; - routerinfo_t *r; + const node_t *node; rep_history_clean(now - get_options()->RephistTrackTime); @@ -593,8 +594,8 @@ rep_hist_dump_stats(time_t now, int severity) digestmap_iter_get(orhist_it, &digest1, &or_history_p); or_history = (or_history_t*) or_history_p; - if ((r = router_get_by_digest(digest1))) - name1 = r->nickname; + if ((node = node_get_by_id(digest1)) && node_get_nickname(node)) + name1 = node_get_nickname(node); else name1 = "(unknown)"; base16_encode(hexdigest1, sizeof(hexdigest1), digest1, DIGEST_LEN); @@ -624,8 +625,8 @@ rep_hist_dump_stats(time_t now, int severity) lhist_it = digestmap_iter_next(or_history->link_history_map, lhist_it)) { digestmap_iter_get(lhist_it, &digest2, &link_history_p); - if ((r = router_get_by_digest(digest2))) - name2 = r->nickname; + if ((node = node_get_by_id(digest2)) && node_get_nickname(node)) + name2 = node_get_nickname(node); else name2 = "(unknown)"; @@ -756,7 +757,7 @@ rep_hist_record_mtbf_data(time_t now, int missing_means_down) base16_encode(dbuf, sizeof(dbuf), digest, DIGEST_LEN); if (missing_means_down && hist->start_of_run && - !router_get_by_digest(digest)) { + !router_get_by_id_digest(digest)) { /* We think this relay is running, but it's not listed in our * routerlist. Somehow it fell out without telling us it went * down. Complain and also correct it. */ @@ -871,28 +872,32 @@ rep_hist_get_router_stability_doc(time_t now) } DIGESTMAP_FOREACH(history_map, id, or_history_t *, hist) { - routerinfo_t *ri; + const node_t *node; char dbuf[BASE64_DIGEST_LEN+1]; char header_buf[512]; char *info; digest_to_base64(dbuf, id); - ri = router_get_by_digest(id); - if (ri) { - char *ip = tor_dup_ip(ri->addr); + node = node_get_by_id(id); + if (node) { + char ip[INET_NTOA_BUF_LEN+1]; char tbuf[ISO_TIME_LEN+1]; - format_iso_time(tbuf, ri->cache_info.published_on); + time_t published = node_get_published_on(node); + node_get_address_string(node,ip,sizeof(ip)); + if (published > 0) + format_iso_time(tbuf, published); + else + strlcpy(tbuf, "???", sizeof(tbuf)); tor_snprintf(header_buf, sizeof(header_buf), "router %s %s %s\n" "published %s\n" "relevant-flags %s%s%s\n" "declared-uptime %ld\n", - dbuf, ri->nickname, ip, + dbuf, node_get_nickname(node), ip, tbuf, - ri->is_running ? "Running " : "", - ri->is_valid ? "Valid " : "", - ri->is_hibernating ? "Hibernating " : "", - ri->uptime); - tor_free(ip); + node->is_running ? "Running " : "", + node->is_valid ? "Valid " : "", + node->ri && node->ri->is_hibernating ? "Hibernating " : "", + node_get_declared_uptime(node)); } else { tor_snprintf(header_buf, sizeof(header_buf), "router %s {no descriptor}\n", dbuf); @@ -2184,7 +2189,6 @@ typedef struct circ_buffer_stats_t { uint32_t processed_cells; double mean_num_cells_in_queue; double mean_time_cells_in_queue; - uint32_t local_circ_id; } circ_buffer_stats_t; /** Holds stats. */ @@ -2207,9 +2211,9 @@ rep_hist_buffer_stats_add_circ(circuit_t *circ, time_t end_of_interval) return; if (!circuits_for_buffer_stats) circuits_for_buffer_stats = smartlist_create(); - start_of_interval = circ->timestamp_created > - start_of_buffer_stats_interval ? - circ->timestamp_created : + start_of_interval = (circ->timestamp_created.tv_sec > + start_of_buffer_stats_interval) ? + circ->timestamp_created.tv_sec : start_of_buffer_stats_interval; interval_length = (int) (end_of_interval - start_of_interval); stat = tor_malloc_zero(sizeof(circ_buffer_stats_t)); diff --git a/src/or/router.c b/src/or/router.c index 3fc16907b8..df4d679b97 100644 --- a/src/or/router.c +++ b/src/or/router.c @@ -7,6 +7,7 @@ #define ROUTER_PRIVATE #include "or.h" +#include "circuitbuild.h" #include "circuitlist.h" #include "circuituse.h" #include "config.h" @@ -19,6 +20,7 @@ #include "hibernate.h" #include "main.h" #include "networkstatus.h" +#include "nodelist.h" #include "policies.h" #include "relay.h" #include "rephist.h" @@ -773,18 +775,21 @@ decide_to_advertise_dirport(or_options_t *options, uint16_t dir_port) void consider_testing_reachability(int test_or, int test_dir) { - routerinfo_t *me = router_get_my_routerinfo(); + const routerinfo_t *me = router_get_my_routerinfo(); int orport_reachable = check_whether_orport_reachable(); tor_addr_t addr; if (!me) return; if (test_or && (!orport_reachable || !circuit_enough_testing_circs())) { + extend_info_t *ei; log_info(LD_CIRC, "Testing %s of my ORPort: %s:%d.", !orport_reachable ? "reachability" : "bandwidth", me->address, me->or_port); - circuit_launch_by_router(CIRCUIT_PURPOSE_TESTING, me, - CIRCLAUNCH_NEED_CAPACITY|CIRCLAUNCH_IS_INTERNAL); + ei = extend_info_from_router(me); + circuit_launch_by_extend_info(CIRCUIT_PURPOSE_TESTING, ei, + CIRCLAUNCH_NEED_CAPACITY|CIRCLAUNCH_IS_INTERNAL); + extend_info_free(ei); } tor_addr_from_ipv4h(&addr, me->addr); @@ -808,7 +813,7 @@ void router_orport_found_reachable(void) { if (!can_reach_or_port) { - routerinfo_t *me = router_get_my_routerinfo(); + const routerinfo_t *me = router_get_my_routerinfo(); log_notice(LD_OR,"Self-testing indicates your ORPort is reachable from " "the outside. Excellent.%s", get_options()->_PublishServerDescriptor != NO_AUTHORITY ? @@ -831,7 +836,7 @@ void router_dirport_found_reachable(void) { if (!can_reach_dir_port) { - routerinfo_t *me = router_get_my_routerinfo(); + const routerinfo_t *me = router_get_my_routerinfo(); log_notice(LD_DIRSERV,"Self-testing indicates your DirPort is reachable " "from the outside. Excellent."); can_reach_dir_port = 1; @@ -1093,7 +1098,7 @@ static int desc_needs_upload = 0; void router_upload_dir_desc_to_dirservers(int force) { - routerinfo_t *ri; + const routerinfo_t *ri; extrainfo_t *ei; char *msg; size_t desc_len, extra_len = 0, total_len; @@ -1186,7 +1191,7 @@ router_extrainfo_digest_is_me(const char *digest) /** A wrapper around router_digest_is_me(). */ int -router_is_me(routerinfo_t *router) +router_is_me(const routerinfo_t *router) { return router_digest_is_me(router->cache_info.identity_digest); } @@ -1205,7 +1210,7 @@ router_fingerprint_is_me(const char *fp) /** Return a routerinfo for this OR, rebuilding a fresh one if * necessary. Return NULL on error, or if called on an OP. */ -routerinfo_t * +const routerinfo_t * router_get_my_routerinfo(void) { if (!server_mode(get_options())) @@ -1329,13 +1334,12 @@ router_rebuild_descriptor(int force) ri->policy_is_reject_star = policy_is_reject_star(ri->exit_policy); - if (desc_routerinfo) { /* inherit values */ - ri->is_valid = desc_routerinfo->is_valid; - ri->is_running = desc_routerinfo->is_running; - ri->is_named = desc_routerinfo->is_named; - } +#if 0 + /* XXXX NM NM I belive this is safe to remove */ if (authdir_mode(options)) ri->is_valid = ri->is_named = 1; /* believe in yourself */ +#endif + if (options->MyFamily) { smartlist_t *family; if (!warned_nonexistent_family) @@ -1344,13 +1348,12 @@ router_rebuild_descriptor(int force) ri->declared_family = smartlist_create(); smartlist_split_string(family, options->MyFamily, ",", SPLIT_SKIP_SPACE|SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - SMARTLIST_FOREACH(family, char *, name, - { - routerinfo_t *member; + SMARTLIST_FOREACH_BEGIN(family, char *, name) { + const node_t *member; if (!strcasecmp(name, options->Nickname)) - member = ri; + goto skip; /* Don't list ourself, that's redundant */ else - member = router_get_by_nickname(name, 1); + member = node_get_by_nickname(name, 1); if (!member) { int is_legal = is_legal_nickname_or_hexdigest(name); if (!smartlist_string_isin(warned_nonexistent_family, name) && @@ -1370,19 +1373,21 @@ router_rebuild_descriptor(int force) smartlist_add(ri->declared_family, name); name = NULL; } - } else if (router_is_me(member)) { + } else if (router_digest_is_me(member->identity)) { /* Don't list ourself in our own family; that's redundant */ + /* XXX shouldn't be possible */ } else { char *fp = tor_malloc(HEX_DIGEST_LEN+2); fp[0] = '$'; base16_encode(fp+1,HEX_DIGEST_LEN+1, - member->cache_info.identity_digest, DIGEST_LEN); + member->identity, DIGEST_LEN); smartlist_add(ri->declared_family, fp); if (smartlist_string_isin(warned_nonexistent_family, name)) smartlist_string_remove(warned_nonexistent_family, name); } + skip: tor_free(name); - }); + } SMARTLIST_FOREACH_END(name); /* remove duplicates from the list */ smartlist_sort_strings(ri->declared_family); @@ -1440,8 +1445,6 @@ router_rebuild_descriptor(int force) strlen(ri->cache_info.signed_descriptor_body), ri->cache_info.signed_descriptor_digest); - routerinfo_set_country(ri); - tor_assert(! routerinfo_incompatible_with_extrainfo(ri, ei, NULL, NULL)); routerinfo_free(desc_routerinfo); @@ -2095,10 +2098,15 @@ is_legal_hexdigest(const char *s) void router_get_verbose_nickname(char *buf, const routerinfo_t *router) { + const char *good_digest = networkstatus_get_router_digest_by_nickname( + router->nickname); + int is_named = good_digest && !memcmp(good_digest, + router->cache_info.identity_digest, + DIGEST_LEN); buf[0] = '$'; base16_encode(buf+1, HEX_DIGEST_LEN+1, router->cache_info.identity_digest, DIGEST_LEN); - buf[1+HEX_DIGEST_LEN] = router->is_named ? '=' : '~'; + buf[1+HEX_DIGEST_LEN] = is_named ? '=' : '~'; strlcpy(buf+1+HEX_DIGEST_LEN+1, router->nickname, MAX_NICKNAME_LEN+1); } diff --git a/src/or/router.h b/src/or/router.h index c17fc78bd0..13ea6f80e6 100644 --- a/src/or/router.h +++ b/src/or/router.h @@ -62,12 +62,12 @@ void router_new_address_suggestion(const char *suggestion, const dir_connection_t *d_conn); int router_compare_to_my_exit_policy(edge_connection_t *conn); int router_my_exit_policy_is_reject_star(void); -routerinfo_t *router_get_my_routerinfo(void); +const routerinfo_t *router_get_my_routerinfo(void); extrainfo_t *router_get_my_extrainfo(void); const char *router_get_my_descriptor(void); int router_digest_is_me(const char *digest); int router_extrainfo_digest_is_me(const char *digest); -int router_is_me(routerinfo_t *router); +int router_is_me(const routerinfo_t *router); int router_fingerprint_is_me(const char *fp); int router_pick_published_address(or_options_t *options, uint32_t *addr); int router_rebuild_descriptor(int force); diff --git a/src/or/routerlist.c b/src/or/routerlist.c index 43be8346cc..ab647539f6 100644 --- a/src/or/routerlist.c +++ b/src/or/routerlist.c @@ -24,6 +24,7 @@ #include "main.h" #include "microdesc.h" #include "networkstatus.h" +#include "nodelist.h" #include "policies.h" #include "reasons.h" #include "rendcommon.h" @@ -38,17 +39,21 @@ /****************************************************************************/ /* static function prototypes */ -static routerstatus_t *router_pick_directory_server_impl( +static const routerstatus_t *router_pick_directory_server_impl( authority_type_t auth, int flags); -static routerstatus_t *router_pick_trusteddirserver_impl( +static const routerstatus_t *router_pick_trusteddirserver_impl( authority_type_t auth, int flags, int *n_busy_out); static void mark_all_trusteddirservers_up(void); -static int router_nickname_matches(routerinfo_t *router, const char *nickname); +static int router_nickname_matches(const routerinfo_t *router, + const char *nickname); +static int node_nickname_matches(const node_t *router, + const char *nickname); static void trusted_dir_server_free(trusted_dir_server_t *ds); static int signed_desc_digest_is_recognized(signed_descriptor_t *desc); static void update_router_have_minimum_dir_info(void); -static const char *signed_descriptor_get_body_impl(signed_descriptor_t *desc, - int with_annotations); +static const char *signed_descriptor_get_body_impl( + const signed_descriptor_t *desc, + int with_annotations); static void list_pending_downloads(digestmap_t *result, int purpose, const char *prefix); @@ -310,6 +315,7 @@ trusted_dirs_remove_old_certs(void) time_t now = time(NULL); #define DEAD_CERT_LIFETIME (2*24*60*60) #define OLD_CERT_LIFETIME (7*24*60*60) +#define CERT_EXPIRY_SKEW (60*60) if (!trusted_dir_certs) return; @@ -326,7 +332,7 @@ trusted_dirs_remove_old_certs(void) time_t cert_published; if (newest == cert) continue; - expired = ftime_definitely_after(now, cert->expires); + expired = time_definitely_after(now, cert->expires, CERT_EXPIRY_SKEW); cert_published = cert->cache_info.published_on; /* Store expired certs for 48 hours after a newer arrives; */ @@ -518,7 +524,7 @@ authority_certs_fetch_missing(networkstatus_t *status, time_t now) continue; cl = get_cert_list(ds->v3_identity_digest); SMARTLIST_FOREACH(cl->certs, authority_cert_t *, cert, { - if (!ftime_definitely_after(now, cert->expires)) { + if (! time_definitely_after(now, cert->expires, CERT_EXPIRY_SKEW)) { /* It's not expired, and we weren't looking for something to * verify a consensus with. Call it done. */ download_status_reset(&cl->dl_status); @@ -598,7 +604,7 @@ router_should_rebuild_store(desc_store_t *store) /** Return the desc_store_t in <b>rl</b> that should be used to store * <b>sd</b>. */ static INLINE desc_store_t * -desc_get_store(routerlist_t *rl, signed_descriptor_t *sd) +desc_get_store(routerlist_t *rl, const signed_descriptor_t *sd) { if (sd->is_extrainfo) return &rl->extrainfo_store; @@ -924,10 +930,10 @@ router_get_trusted_dir_servers(void) * Don't pick an authority if any non-authority is viable; try to avoid using * servers that have returned 503 recently. */ -routerstatus_t * +const routerstatus_t * router_pick_directory_server(authority_type_t type, int flags) { - routerstatus_t *choice; + const routerstatus_t *choice; if (get_options()->PreferTunneledDirConns) flags |= _PDS_PREFER_TUNNELED_DIR_CONNS; @@ -956,8 +962,8 @@ int router_get_my_share_of_directory_requests(double *v2_share_out, double *v3_share_out) { - routerinfo_t *me = router_get_my_routerinfo(); - routerstatus_t *rs; + const routerinfo_t *me = router_get_my_routerinfo(); + const routerstatus_t *rs; const int pds_flags = PDS_ALLOW_SELF|PDS_IGNORE_FASCISTFIREWALL; *v2_share_out = *v3_share_out = 0.0; if (!me) @@ -1030,10 +1036,10 @@ trusteddirserver_get_by_v3_auth_digest(const char *digest) /** Try to find a running trusted dirserver. Flags are as for * router_pick_directory_server. */ -routerstatus_t * +const routerstatus_t * router_pick_trusteddirserver(authority_type_t type, int flags) { - routerstatus_t *choice; + const routerstatus_t *choice; int busy = 0; if (get_options()->PreferTunneledDirConns) flags |= _PDS_PREFER_TUNNELED_DIR_CONNS; @@ -1066,10 +1072,10 @@ router_pick_trusteddirserver(authority_type_t type, int flags) * If the _PDS_PREFER_TUNNELED_DIR_CONNS flag is set, prefer directory servers * that we can use with BEGINDIR. */ -static routerstatus_t * +static const routerstatus_t * router_pick_directory_server_impl(authority_type_t type, int flags) { - routerstatus_t *result; + const node_t *result; smartlist_t *direct, *tunnel; smartlist_t *trusted_direct, *trusted_tunnel; smartlist_t *overloaded_direct, *overloaded_tunnel; @@ -1090,49 +1096,54 @@ router_pick_directory_server_impl(authority_type_t type, int flags) overloaded_tunnel = smartlist_create(); /* Find all the running dirservers we know about. */ - SMARTLIST_FOREACH_BEGIN(consensus->routerstatus_list, routerstatus_t *, - status) { + SMARTLIST_FOREACH_BEGIN(nodelist_get_list(), const node_t *, node) { int is_trusted; - int is_overloaded = status->last_dir_503_at + DIR_503_TIMEOUT > now; + int is_overloaded; tor_addr_t addr; - if (!status->is_running || !status->dir_port || !status->is_valid) + const routerstatus_t *status = node->rs; + if (!status) continue; - if (status->is_bad_directory) + + if (!node->is_running || !status->dir_port || !node->is_valid) + continue; + if (node->is_bad_directory) continue; - if (requireother && router_digest_is_me(status->identity_digest)) + if (requireother && router_digest_is_me(node->identity)) continue; if (type & V3_AUTHORITY) { if (!(status->version_supports_v3_dir || - router_digest_is_trusted_dir_type(status->identity_digest, + router_digest_is_trusted_dir_type(node->identity, V3_AUTHORITY))) continue; } - is_trusted = router_digest_is_trusted_dir(status->identity_digest); - if ((type & V2_AUTHORITY) && !(status->is_v2_dir || is_trusted)) + is_trusted = router_digest_is_trusted_dir(node->identity); + if ((type & V2_AUTHORITY) && !(node->rs->is_v2_dir || is_trusted)) continue; if ((type & EXTRAINFO_CACHE) && - !router_supports_extrainfo(status->identity_digest, 0)) + !router_supports_extrainfo(node->identity, 0)) continue; /* XXXX IP6 proposal 118 */ - tor_addr_from_ipv4h(&addr, status->addr); + tor_addr_from_ipv4h(&addr, node->rs->addr); + + is_overloaded = status->last_dir_503_at + DIR_503_TIMEOUT > now; if (prefer_tunnel && status->version_supports_begindir && (!fascistfirewall || fascist_firewall_allows_address_or(&addr, status->or_port))) smartlist_add(is_trusted ? trusted_tunnel : - is_overloaded ? overloaded_tunnel : tunnel, status); + is_overloaded ? overloaded_tunnel : tunnel, (void*)node); else if (!fascistfirewall || fascist_firewall_allows_address_dir(&addr, status->dir_port)) smartlist_add(is_trusted ? trusted_direct : - is_overloaded ? overloaded_direct : direct, status); - } SMARTLIST_FOREACH_END(status); + is_overloaded ? overloaded_direct : direct, (void*)node); + } SMARTLIST_FOREACH_END(node); if (smartlist_len(tunnel)) { - result = routerstatus_sl_choose_by_bandwidth(tunnel, WEIGHT_FOR_DIR); + result = node_sl_choose_by_bandwidth(tunnel, WEIGHT_FOR_DIR); } else if (smartlist_len(overloaded_tunnel)) { - result = routerstatus_sl_choose_by_bandwidth(overloaded_tunnel, + result = node_sl_choose_by_bandwidth(overloaded_tunnel, WEIGHT_FOR_DIR); } else if (smartlist_len(trusted_tunnel)) { /* FFFF We don't distinguish between trusteds and overloaded trusteds @@ -1141,10 +1152,10 @@ router_pick_directory_server_impl(authority_type_t type, int flags) * is a feature, but it could easily be a bug. -RD */ result = smartlist_choose(trusted_tunnel); } else if (smartlist_len(direct)) { - result = routerstatus_sl_choose_by_bandwidth(direct, WEIGHT_FOR_DIR); + result = node_sl_choose_by_bandwidth(direct, WEIGHT_FOR_DIR); } else if (smartlist_len(overloaded_direct)) { - result = routerstatus_sl_choose_by_bandwidth(overloaded_direct, - WEIGHT_FOR_DIR); + result = node_sl_choose_by_bandwidth(overloaded_direct, + WEIGHT_FOR_DIR); } else { result = smartlist_choose(trusted_direct); } @@ -1154,20 +1165,20 @@ router_pick_directory_server_impl(authority_type_t type, int flags) smartlist_free(trusted_tunnel); smartlist_free(overloaded_direct); smartlist_free(overloaded_tunnel); - return result; + return result ? result->rs : NULL; } /** Choose randomly from among the trusted dirservers that are up. Flags * are as for router_pick_directory_server_impl(). */ -static routerstatus_t * +static const routerstatus_t * router_pick_trusteddirserver_impl(authority_type_t type, int flags, int *n_busy_out) { smartlist_t *direct, *tunnel; smartlist_t *overloaded_direct, *overloaded_tunnel; - routerinfo_t *me = router_get_my_routerinfo(); - routerstatus_t *result; + const routerinfo_t *me = router_get_my_routerinfo(); + const routerstatus_t *result; time_t now = time(NULL); const int requireother = ! (flags & PDS_ALLOW_SELF); const int fascistfirewall = ! (flags & PDS_IGNORE_FASCISTFIREWALL); @@ -1257,22 +1268,18 @@ router_pick_trusteddirserver_impl(authority_type_t type, int flags, static void mark_all_trusteddirservers_up(void) { - if (routerlist) { - SMARTLIST_FOREACH(routerlist->routers, routerinfo_t *, router, - if (router_digest_is_trusted_dir(router->cache_info.identity_digest) && - router->dir_port > 0) { - router->is_running = 1; - }); - } + SMARTLIST_FOREACH(nodelist_get_list(), node_t *, node, { + if (router_digest_is_trusted_dir(node->identity)) + node->is_running = 1; + }); if (trusted_dir_servers) { SMARTLIST_FOREACH(trusted_dir_servers, trusted_dir_server_t *, dir, { routerstatus_t *rs; dir->is_running = 1; download_status_reset(&dir->v2_ns_dl_status); - rs = router_get_consensus_status_by_id(dir->digest); - if (rs && !rs->is_running) { - rs->is_running = 1; + rs = router_get_mutable_consensus_status_by_id(dir->digest); + if (rs) { rs->last_dir_503_at = 0; control_event_networkstatus_changed_single(rs); } @@ -1296,25 +1303,14 @@ router_reset_status_download_failures(void) mark_all_trusteddirservers_up(); } -/** Return true iff router1 and router2 have the same /16 network. */ +/** Return true iff router1 and router2 have similar enough network addresses + * that we should treat them as being in the same family */ static INLINE int -routers_in_same_network_family(routerinfo_t *r1, routerinfo_t *r2) -{ - return (r1->addr & 0xffff0000) == (r2->addr & 0xffff0000); -} - -/** Look through the routerlist and identify routers that - * advertise the same /16 network address as <b>router</b>. - * Add each of them to <b>sl</b>. - */ -static void -routerlist_add_network_family(smartlist_t *sl, routerinfo_t *router) +addrs_in_same_network_family(const tor_addr_t *a1, + const tor_addr_t *a2) { - SMARTLIST_FOREACH(routerlist->routers, routerinfo_t *, r, - { - if (router != r && routers_in_same_network_family(router, r)) - smartlist_add(sl, r); - }); + /* XXXX MOVE ? */ + return 0 == tor_addr_compare_masked(a1, a2, 16, CMP_SEMANTIC); } /** Add all the family of <b>router</b> to the smartlist <b>sl</b>. @@ -1322,122 +1318,132 @@ routerlist_add_network_family(smartlist_t *sl, routerinfo_t *router) * or pick more than one relay from a family for our entry guard list. */ void -routerlist_add_family(smartlist_t *sl, routerinfo_t *router) +nodelist_add_node_family(smartlist_t *sl, const node_t *node) { - routerinfo_t *r; - config_line_t *cl; + /* XXXX MOVE */ + const smartlist_t *all_nodes = nodelist_get_list(); + const smartlist_t *declared_family; or_options_t *options = get_options(); - /* First, add any routers with similar network addresses. */ - if (options->EnforceDistinctSubnets) - routerlist_add_network_family(sl, router); + tor_assert(node); - if (router->declared_family) { - /* Add every r such that router declares familyness with r, and r + declared_family = node_get_declared_family(node); + + /* First, add any nodes with similar network addresses. */ + if (options->EnforceDistinctSubnets) { + tor_addr_t node_addr; + node_get_addr(node, &node_addr); + + SMARTLIST_FOREACH_BEGIN(all_nodes, const node_t *, node2) { + tor_addr_t a; + node_get_addr(node2, &a); + if (addrs_in_same_network_family(&a, &node_addr)) + smartlist_add(sl, (void*)node2); + } SMARTLIST_FOREACH_END(node2); + } + + /* Now, add all nodes in the declared_family of this node, if they + * also declare this node to be in their family. */ + if (declared_family) { + /* Add every r such that router declares familyness with node, and node * declares familyhood with router. */ - SMARTLIST_FOREACH(router->declared_family, const char *, n, - { - if (!(r = router_get_by_nickname(n, 0))) - continue; - if (!r->declared_family) - continue; - SMARTLIST_FOREACH(r->declared_family, const char *, n2, - { - if (router_nickname_matches(router, n2)) - smartlist_add(sl, r); - }); - }); + SMARTLIST_FOREACH_BEGIN(declared_family, const char *, name) { + const node_t *node2; + const smartlist_t *family2; + if (!(node2 = node_get_by_nickname(name, 0))) + continue; + if (!(family2 = node_get_declared_family(node2))) + continue; + SMARTLIST_FOREACH_BEGIN(family2, const char *, name2) { + if (node_nickname_matches(node, name2)) { + smartlist_add(sl, (void*)node2); + break; + } + } SMARTLIST_FOREACH_END(name2); + } SMARTLIST_FOREACH_END(name); } /* If the user declared any families locally, honor those too. */ - for (cl = options->NodeFamilies; cl; cl = cl->next) { - if (router_nickname_is_in_list(router, cl->value)) { - add_nickname_list_to_smartlist(sl, cl->value, 0); - } + if (options->NodeFamilySets) { + SMARTLIST_FOREACH(options->NodeFamilySets, const routerset_t *, rs, { + if (routerset_contains_node(rs, node)) { + routerset_get_all_nodes(sl, rs, 0); + } + }); } } -/** Return true iff r is named by some nickname in <b>lst</b>. */ +/** Given a <b>router</b>, add every node_t in its family to <b>sl</b>. + * + * Note the type mismatch: This function takes a routerinfo, but adds nodes + * to the smartlist! + */ +static void +routerlist_add_nodes_in_family(smartlist_t *sl, const routerinfo_t *router) +{ + /* XXXX MOVE ? */ + node_t fake_node; + const node_t *node = node_get_by_id(router->cache_info.identity_digest);; + if (node == NULL) { + memset(&fake_node, 0, sizeof(fake_node)); + fake_node.ri = (routerinfo_t *)router; + memcpy(fake_node.identity, router->cache_info.identity_digest, DIGEST_LEN); + node = &fake_node; + } + nodelist_add_node_family(sl, node); +} + +/** Return true iff <b>node</b> is named by some nickname in <b>lst</b>. */ static INLINE int -router_in_nickname_smartlist(smartlist_t *lst, routerinfo_t *r) +node_in_nickname_smartlist(const smartlist_t *lst, const node_t *node) { + /* XXXX MOVE */ if (!lst) return 0; - SMARTLIST_FOREACH(lst, const char *, name, - if (router_nickname_matches(r, name)) - return 1;); + SMARTLIST_FOREACH(lst, const char *, name, { + if (node_nickname_matches(node, name)) + return 1; + }); return 0; } /** Return true iff r1 and r2 are in the same family, but not the same * router. */ int -routers_in_same_family(routerinfo_t *r1, routerinfo_t *r2) +nodes_in_same_family(const node_t *node1, const node_t *node2) { + /* XXXX MOVE */ or_options_t *options = get_options(); - config_line_t *cl; - - if (options->EnforceDistinctSubnets && routers_in_same_network_family(r1,r2)) - return 1; - if (router_in_nickname_smartlist(r1->declared_family, r2) && - router_in_nickname_smartlist(r2->declared_family, r1)) - return 1; - - for (cl = options->NodeFamilies; cl; cl = cl->next) { - if (router_nickname_is_in_list(r1, cl->value) && - router_nickname_is_in_list(r2, cl->value)) + /* Are they in the same family because of their addresses? */ + if (options->EnforceDistinctSubnets) { + tor_addr_t a1, a2; + node_get_addr(node1, &a1); + node_get_addr(node2, &a2); + if (addrs_in_same_network_family(&a1, &a2)) return 1; } - return 0; -} -/** Given a (possibly NULL) comma-and-whitespace separated list of nicknames, - * see which nicknames in <b>list</b> name routers in our routerlist, and add - * the routerinfos for those routers to <b>sl</b>. If <b>must_be_running</b>, - * only include routers that we think are running. - * Warn if any non-Named routers are specified by nickname. - */ -void -add_nickname_list_to_smartlist(smartlist_t *sl, const char *list, - int must_be_running) -{ - routerinfo_t *router; - smartlist_t *nickname_list; - int have_dir_info = router_have_minimum_dir_info(); - - if (!list) - return; /* nothing to do */ - tor_assert(sl); - - nickname_list = smartlist_create(); - if (!warned_nicknames) - warned_nicknames = smartlist_create(); + /* Are they in the same family because the agree they are? */ + { + const smartlist_t *f1, *f2; + f1 = node_get_declared_family(node1); + f2 = node_get_declared_family(node2); + if (f1 && f2 && + node_in_nickname_smartlist(f1, node2) && + node_in_nickname_smartlist(f2, node1)) + return 1; + } - smartlist_split_string(nickname_list, list, ",", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); + /* Are they in the same option because the user says they are? */ + if (options->NodeFamilySets) { + SMARTLIST_FOREACH(options->NodeFamilySets, const routerset_t *, rs, { + if (routerset_contains_node(rs, node1) && + routerset_contains_node(rs, node2)) + return 1; + }); + } - SMARTLIST_FOREACH(nickname_list, const char *, nick, { - int warned; - if (!is_legal_nickname_or_hexdigest(nick)) { - log_warn(LD_CONFIG, "Nickname '%s' is misformed; skipping", nick); - continue; - } - router = router_get_by_nickname(nick, 1); - warned = smartlist_string_isin(warned_nicknames, nick); - if (router) { - if (!must_be_running || router->is_running) { - smartlist_add(sl,router); - } - } else if (!router_get_consensus_status_by_nickname(nick,1)) { - if (!warned) { - log_fn(have_dir_info ? LOG_WARN : LOG_INFO, LD_CONFIG, - "Nickname list includes '%s' which isn't a known router.",nick); - smartlist_add(warned_nicknames, tor_strdup(nick)); - } - } - }); - SMARTLIST_FOREACH(nickname_list, char *, nick, tor_free(nick)); - smartlist_free(nickname_list); + return 0; } /** Return 1 iff any member of the (possibly NULL) comma-separated list @@ -1445,7 +1451,7 @@ add_nickname_list_to_smartlist(smartlist_t *sl, const char *list, * return 0. */ int -router_nickname_is_in_list(routerinfo_t *router, const char *list) +router_nickname_is_in_list(const routerinfo_t *router, const char *list) { smartlist_t *nickname_list; int v = 0; @@ -1464,34 +1470,32 @@ router_nickname_is_in_list(routerinfo_t *router, const char *list) return v; } -/** Add every suitable router from our routerlist to <b>sl</b>, so that +/** Add every suitable node from our nodelist to <b>sl</b>, so that * we can pick a node for a circuit. */ static void -router_add_running_routers_to_smartlist(smartlist_t *sl, int allow_invalid, - int need_uptime, int need_capacity, - int need_guard) -{ - if (!routerlist) - return; +router_add_running_nodes_to_smartlist(smartlist_t *sl, int allow_invalid, + int need_uptime, int need_capacity, + int need_guard, int need_desc) +{ /* XXXX MOVE */ + SMARTLIST_FOREACH_BEGIN(nodelist_get_list(), const node_t *, node) { + if (!node->is_running || + (!node->is_valid && !allow_invalid)) + continue; + if (need_desc && !(node->ri || (node->rs && node->md))) + continue; + if (node->ri && node->ri->purpose != ROUTER_PURPOSE_GENERAL) + continue; + if (node_is_unreliable(node, need_uptime, need_capacity, need_guard)) + continue; - SMARTLIST_FOREACH(routerlist->routers, routerinfo_t *, router, - { - if (router->is_running && - router->purpose == ROUTER_PURPOSE_GENERAL && - (router->is_valid || allow_invalid) && - !router_is_unreliable(router, need_uptime, - need_capacity, need_guard)) { - /* If it's running, and it's suitable according to the - * other flags we had in mind */ - smartlist_add(sl, router); - } - }); + smartlist_add(sl, (void *)node); + } SMARTLIST_FOREACH_END(node); } /** Look through the routerlist until we find a router that has my key. Return it. */ -routerinfo_t * +const routerinfo_t * routerlist_find_my_routerinfo(void) { if (!routerlist) @@ -1509,9 +1513,9 @@ routerlist_find_my_routerinfo(void) * that allows exit to this address:port, or return NULL if there * isn't a good one. */ -routerinfo_t * +const node_t * router_find_exact_exit_enclave(const char *address, uint16_t port) -{ +{/*XXXX MOVE*/ uint32_t addr; struct in_addr in; tor_addr_t a; @@ -1522,13 +1526,12 @@ router_find_exact_exit_enclave(const char *address, uint16_t port) tor_addr_from_ipv4h(&a, addr); - SMARTLIST_FOREACH(routerlist->routers, routerinfo_t *, router, - { - if (router->addr == addr && - router->is_running && - compare_tor_addr_to_addr_policy(&a, port, router->exit_policy) == + SMARTLIST_FOREACH(nodelist_get_list(), const node_t *, node, { + if (node_get_addr_ipv4h(node) == addr && + node->is_running && + compare_tor_addr_to_node_policy(&a, port, node) == ADDR_POLICY_ACCEPTED) - return router; + return node; }); return NULL; } @@ -1540,14 +1543,14 @@ router_find_exact_exit_enclave(const char *address, uint16_t port) * If <b>need_guard</b>, we require that the router is a possible entry guard. */ int -router_is_unreliable(routerinfo_t *router, int need_uptime, - int need_capacity, int need_guard) +node_is_unreliable(const node_t *node, int need_uptime, + int need_capacity, int need_guard) { - if (need_uptime && !router->is_stable) + if (need_uptime && !node->is_stable) return 1; - if (need_capacity && !router->is_fast) + if (need_capacity && !node->is_fast) return 1; - if (need_guard && !router->is_possible_guard) + if (need_guard && !node->is_possible_guard) return 1; return 0; } @@ -1555,7 +1558,7 @@ router_is_unreliable(routerinfo_t *router, int need_uptime, /** Return the smaller of the router's configured BandwidthRate * and its advertised capacity. */ uint32_t -router_get_advertised_bandwidth(routerinfo_t *router) +router_get_advertised_bandwidth(const routerinfo_t *router) { if (router->bandwidthcapacity < router->bandwidthrate) return router->bandwidthcapacity; @@ -1569,7 +1572,7 @@ router_get_advertised_bandwidth(routerinfo_t *router) /** Return the smaller of the router's configured BandwidthRate * and its advertised capacity, capped by max-believe-bw. */ uint32_t -router_get_advertised_bandwidth_capped(routerinfo_t *router) +router_get_advertised_bandwidth_capped(const routerinfo_t *router) { uint32_t result = router->bandwidthcapacity; if (result > router->bandwidthrate) @@ -1611,13 +1614,10 @@ kb_to_bytes(uint32_t bw) } /** Helper function: - * choose a random element of smartlist <b>sl</b>, weighted by + * choose a random element of smartlist <b>sl</b> of nodes, weighted by * the advertised bandwidth of each element using the consensus * bandwidth weights. * - * If <b>statuses</b> is zero, then <b>sl</b> is a list of - * routerinfo_t's. Otherwise it's a list of routerstatus_t's. - * * If <b>rule</b>==WEIGHT_FOR_EXIT. we're picking an exit node: consider all * nodes' bandwidth equally regardless of their Exit status, since there may * be some in the list because they exit to obscure ports. If @@ -1627,10 +1627,9 @@ kb_to_bytes(uint32_t bw) * guard node: consider all guard's bandwidth equally. Otherwise, weight * guards proportionally less. */ -static void * -smartlist_choose_by_bandwidth_weights(smartlist_t *sl, - bandwidth_weight_rule_t rule, - int statuses) +static const node_t * +smartlist_choose_node_by_bandwidth_weights(smartlist_t *sl, + bandwidth_weight_rule_t rule) { int64_t weight_scale; int64_t rand_bw; @@ -1725,15 +1724,14 @@ smartlist_choose_by_bandwidth_weights(smartlist_t *sl, bandwidths = tor_malloc_zero(sizeof(double)*smartlist_len(sl)); // Cycle through smartlist and total the bandwidth. - for (i = 0; i < (unsigned)smartlist_len(sl); ++i) { + SMARTLIST_FOREACH_BEGIN(sl, const node_t *, node) { int is_exit = 0, is_guard = 0, is_dir = 0, this_bw = 0, is_me = 0; double weight = 1; - if (statuses) { - routerstatus_t *status = smartlist_get(sl, i); - is_exit = status->is_exit; - is_guard = status->is_possible_guard; - is_dir = (status->dir_port != 0); - if (!status->has_bandwidth) { + is_exit = node->is_exit; + is_guard = node->is_possible_guard; + is_dir = node_is_dir(node); + if (node->rs) { + if (!node->rs->has_bandwidth) { tor_free(bandwidths); /* This should never happen, unless all the authorites downgrade * to 0.2.0 or rogue routerstatuses get inserted into our consensus. */ @@ -1742,26 +1740,17 @@ smartlist_choose_by_bandwidth_weights(smartlist_t *sl, "old router selection algorithm."); return NULL; } - this_bw = kb_to_bytes(status->bandwidth); - if (router_digest_is_me(status->identity_digest)) - is_me = 1; + this_bw = kb_to_bytes(node->rs->bandwidth); + } else if (node->ri) { + /* bridge or other descriptor not in our consensus */ + this_bw = bridge_get_advertised_bandwidth_bounded(node->ri); + have_unknown = 1; } else { - routerstatus_t *rs; - routerinfo_t *router = smartlist_get(sl, i); - rs = router_get_consensus_status_by_id( - router->cache_info.identity_digest); - is_exit = router->is_exit; - is_guard = router->is_possible_guard; - is_dir = (router->dir_port != 0); - if (rs && rs->has_bandwidth) { - this_bw = kb_to_bytes(rs->bandwidth); - } else { /* bridge or other descriptor not in our consensus */ - this_bw = bridge_get_advertised_bandwidth_bounded(router); - have_unknown = 1; - } - if (router_digest_is_me(router->cache_info.identity_digest)) - is_me = 1; + /* We can't use this one. */ + continue; } + is_me = router_digest_is_me(node->identity); + if (is_guard && is_exit) { weight = (is_dir ? Wdb*Wd : Wd); } else if (is_guard) { @@ -1772,11 +1761,11 @@ smartlist_choose_by_bandwidth_weights(smartlist_t *sl, weight = (is_dir ? Wmb*Wm : Wm); } - bandwidths[i] = weight*this_bw; + bandwidths[node_sl_idx] = weight*this_bw; weighted_bw += weight*this_bw; if (is_me) sl_last_weighted_bw_of_me = weight*this_bw; - } + } SMARTLIST_FOREACH_END(node); /* XXXX022 this is a kludge to expose these values. */ sl_last_total_weighted_bw = weighted_bw; @@ -1824,12 +1813,9 @@ smartlist_choose_by_bandwidth_weights(smartlist_t *sl, } /** Helper function: - * choose a random element of smartlist <b>sl</b>, weighted by + * choose a random node_t element of smartlist <b>sl</b>, weighted by * the advertised bandwidth of each element. * - * If <b>statuses</b> is zero, then <b>sl</b> is a list of - * routerinfo_t's. Otherwise it's a list of routerstatus_t's. - * * If <b>rule</b>==WEIGHT_FOR_EXIT. we're picking an exit node: consider all * nodes' bandwidth equally regardless of their Exit status, since there may * be some in the list because they exit to obscure ports. If @@ -1839,13 +1825,11 @@ smartlist_choose_by_bandwidth_weights(smartlist_t *sl, * guard node: consider all guard's bandwidth equally. Otherwise, weight * guards proportionally less. */ -static void * -smartlist_choose_by_bandwidth(smartlist_t *sl, bandwidth_weight_rule_t rule, - int statuses) +static const node_t * +smartlist_choose_node_by_bandwidth(smartlist_t *sl, + bandwidth_weight_rule_t rule) { - unsigned int i; - routerinfo_t *router; - routerstatus_t *status=NULL; + unsigned i; int32_t *bandwidths; int is_exit; int is_guard; @@ -1886,49 +1870,34 @@ smartlist_choose_by_bandwidth(smartlist_t *sl, bandwidth_weight_rule_t rule, guard_bits = bitarray_init_zero(smartlist_len(sl)); /* Iterate over all the routerinfo_t or routerstatus_t, and */ - for (i = 0; i < (unsigned)smartlist_len(sl); ++i) { + SMARTLIST_FOREACH_BEGIN(sl, const node_t *, node) { /* first, learn what bandwidth we think i has */ int is_known = 1; int32_t flags = 0; uint32_t this_bw = 0; - if (statuses) { - status = smartlist_get(sl, i); - if (router_digest_is_me(status->identity_digest)) - me_idx = i; - router = router_get_by_digest(status->identity_digest); - is_exit = status->is_exit; - is_guard = status->is_possible_guard; - if (status->has_bandwidth) { - this_bw = kb_to_bytes(status->bandwidth); + i = node_sl_idx; + + if (router_digest_is_me(node->identity)) + me_idx = node_sl_idx; + + is_exit = node->is_exit; + is_guard = node->is_possible_guard; + if (node->rs) { + if (node->rs->has_bandwidth) { + this_bw = kb_to_bytes(node->rs->bandwidth); } else { /* guess */ /* XXX022 once consensuses always list bandwidths, we can take * this guessing business out. -RD */ is_known = 0; - flags = status->is_fast ? 1 : 0; + flags = node->rs->is_fast ? 1 : 0; flags |= is_exit ? 2 : 0; flags |= is_guard ? 4 : 0; } - } else { - routerstatus_t *rs; - router = smartlist_get(sl, i); - rs = router_get_consensus_status_by_id( - router->cache_info.identity_digest); - if (router_digest_is_me(router->cache_info.identity_digest)) - me_idx = i; - is_exit = router->is_exit; - is_guard = router->is_possible_guard; - if (rs && rs->has_bandwidth) { - this_bw = kb_to_bytes(rs->bandwidth); - } else if (rs) { /* guess; don't trust the descriptor */ - /* XXX022 once consensuses always list bandwidths, we can take - * this guessing business out. -RD */ - is_known = 0; - flags = router->is_fast ? 1 : 0; - flags |= is_exit ? 2 : 0; - flags |= is_guard ? 4 : 0; - } else /* bridge or other descriptor not in our consensus */ - this_bw = bridge_get_advertised_bandwidth_bounded(router); + } else if (node->ri) { + /* Must be a bridge if we're willing to use it */ + this_bw = bridge_get_advertised_bandwidth_bounded(node->ri); } + if (is_exit) bitarray_set(exit_bits, i); if (is_guard) @@ -1948,9 +1917,9 @@ smartlist_choose_by_bandwidth(smartlist_t *sl, bandwidth_weight_rule_t rule, total_nonexit_bw += this_bw; } else { ++n_unknown; - bandwidths[i] = -flags; + bandwidths[node_sl_idx] = -flags; } - } + } SMARTLIST_FOREACH_END(node); /* Now, fill in the unknown values. */ if (n_unknown) { @@ -2092,40 +2061,23 @@ smartlist_choose_by_bandwidth(smartlist_t *sl, bandwidth_weight_rule_t rule, return smartlist_get(sl, i); } -/** Choose a random element of router list <b>sl</b>, weighted by - * the advertised bandwidth of each router. - */ -routerinfo_t * -routerlist_sl_choose_by_bandwidth(smartlist_t *sl, - bandwidth_weight_rule_t rule) -{ - routerinfo_t *ret; - if ((ret = smartlist_choose_by_bandwidth_weights(sl, rule, 0))) { - return ret; - } else { - return smartlist_choose_by_bandwidth(sl, rule, 0); - } -} - /** Choose a random element of status list <b>sl</b>, weighted by - * the advertised bandwidth of each status. - */ -routerstatus_t * -routerstatus_sl_choose_by_bandwidth(smartlist_t *sl, - bandwidth_weight_rule_t rule) -{ - /* We are choosing neither exit nor guard here. Weight accordingly. */ - routerstatus_t *ret; - if ((ret = smartlist_choose_by_bandwidth_weights(sl, rule, 1))) { + * the advertised bandwidth of each node */ +const node_t * +node_sl_choose_by_bandwidth(smartlist_t *sl, + bandwidth_weight_rule_t rule) +{ /*XXXX MOVE */ + const node_t *ret; + if ((ret = smartlist_choose_node_by_bandwidth_weights(sl, rule))) { return ret; } else { - return smartlist_choose_by_bandwidth(sl, rule, 1); + return smartlist_choose_node_by_bandwidth(sl, rule); } } -/** Return a random running router from the routerlist. Never - * pick a node whose routerinfo is in - * <b>excludedsmartlist</b>, or whose routerinfo matches <b>excludedset</b>, +/** Return a random running node from the nodelist. Never + * pick a node that is in + * <b>excludedsmartlist</b>, or which matches <b>excludedset</b>, * even if they are the only nodes available. * If <b>CRN_NEED_UPTIME</b> is set in flags and any router has more than * a minimum uptime, return one of those. @@ -2137,21 +2089,26 @@ routerstatus_sl_choose_by_bandwidth(smartlist_t *sl, * If <b>CRN_WEIGHT_AS_EXIT</b> is set in flags, we weight bandwidths as if * picking an exit node, otherwise we weight bandwidths for picking a relay * node (that is, possibly discounting exit nodes). + * If <b>CRN_NEED_DESC</b> is set in flags, we only consider nodes that + * have a routerinfo or microdescriptor -- that is, enough info to be + * used to build a circuit. */ -routerinfo_t * +const node_t * router_choose_random_node(smartlist_t *excludedsmartlist, routerset_t *excludedset, router_crn_flags_t flags) -{ +{ /* XXXX MOVE */ const int need_uptime = (flags & CRN_NEED_UPTIME) != 0; const int need_capacity = (flags & CRN_NEED_CAPACITY) != 0; const int need_guard = (flags & CRN_NEED_GUARD) != 0; const int allow_invalid = (flags & CRN_ALLOW_INVALID) != 0; const int weight_for_exit = (flags & CRN_WEIGHT_AS_EXIT) != 0; + const int need_desc = (flags & CRN_NEED_DESC) != 0; smartlist_t *sl=smartlist_create(), - *excludednodes=smartlist_create(); - routerinfo_t *choice = NULL, *r; + *excludednodes=smartlist_create(); + const node_t *choice = NULL; + const routerinfo_t *r; bandwidth_weight_rule_t rule; tor_assert(!(weight_for_exit && need_guard)); @@ -2161,29 +2118,30 @@ router_choose_random_node(smartlist_t *excludedsmartlist, /* Exclude relays that allow single hop exit circuits, if the user * wants to (such relays might be risky) */ if (get_options()->ExcludeSingleHopRelays) { - routerlist_t *rl = router_get_routerlist(); - SMARTLIST_FOREACH(rl->routers, routerinfo_t *, r, - if (r->allow_single_hop_exits) { - smartlist_add(excludednodes, r); + SMARTLIST_FOREACH(nodelist_get_list(), node_t *, node, + if (node_allows_single_hop_exits(node)) { + smartlist_add(excludednodes, node); }); } if ((r = routerlist_find_my_routerinfo())) { - smartlist_add(excludednodes, r); - routerlist_add_family(excludednodes, r); + const node_t *me = node_get_by_id(r->cache_info.identity_digest); + if (me) + smartlist_add(excludednodes, (void *)me); + routerlist_add_nodes_in_family(excludednodes, r); } - router_add_running_routers_to_smartlist(sl, allow_invalid, - need_uptime, need_capacity, - need_guard); + router_add_running_nodes_to_smartlist(sl, allow_invalid, + need_uptime, need_capacity, + need_guard, need_desc); smartlist_subtract(sl,excludednodes); if (excludedsmartlist) smartlist_subtract(sl,excludedsmartlist); if (excludedset) - routerset_subtract_routers(sl,excludedset); + routerset_subtract_nodes(sl,excludedset); // Always weight by bandwidth - choice = routerlist_sl_choose_by_bandwidth(sl, rule); + choice = node_sl_choose_by_bandwidth(sl, rule); smartlist_free(sl); if (!choice && (need_uptime || need_capacity || need_guard)) { @@ -2206,35 +2164,88 @@ router_choose_random_node(smartlist_t *excludedsmartlist, return choice; } -/** Helper: Return true iff the <b>identity_digest</b> and <b>nickname</b> - * combination of a router, encoded in hexadecimal, matches <b>hexdigest</b> - * (which is optionally prefixed with a single dollar sign). Return false if - * <b>hexdigest</b> is malformed, or it doesn't match. */ -static INLINE int -hex_digest_matches(const char *hexdigest, const char *identity_digest, - const char *nickname, int is_named) +/** Helper: given an extended nickname in <b>hexdigest</b> try to decode it. + * Return 0 on success, -1 on failure. Store the result into the + * DIGEST_LEN-byte buffer at <b>digest_out</b>, the single character at + * <b>nickname_qualifier_char_out</b>, and the MAXNICKNAME_LEN+1-byte buffer + * at <b>nickname_out</b>. + * + * The recognized format is: + * HexName = Dollar? HexDigest NamePart? + * Dollar = '?' + * HexDigest = HexChar*20 + * HexChar = 'a'..'f' | 'A'..'F' | '0'..'9' + * NamePart = QualChar Name + * QualChar = '=' | '~' + * Name = NameChar*(1..MAX_NICKNAME_LEN) + * NameChar = Any ASCII alphanumeric character + */ +int +hex_digest_nickname_decode(const char *hexdigest, + char *digest_out, + char *nickname_qualifier_char_out, + char *nickname_out) { - char digest[DIGEST_LEN]; size_t len; + tor_assert(hexdigest); if (hexdigest[0] == '$') ++hexdigest; len = strlen(hexdigest); - if (len < HEX_DIGEST_LEN) + if (len < HEX_DIGEST_LEN) { + return -1; + } else if (len > HEX_DIGEST_LEN && (hexdigest[HEX_DIGEST_LEN] == '=' || + hexdigest[HEX_DIGEST_LEN] == '~') && + len <= HEX_DIGEST_LEN+1+MAX_NICKNAME_LEN) { + *nickname_qualifier_char_out = hexdigest[HEX_DIGEST_LEN]; + strlcpy(nickname_out, hexdigest+HEX_DIGEST_LEN+1 , MAX_NICKNAME_LEN+1); + } else if (len == HEX_DIGEST_LEN) { + ; + } else { + return -1; + } + + if (base16_decode(digest_out, DIGEST_LEN, hexdigest, HEX_DIGEST_LEN)<0) + return -1; + return 0; +} + +/** Helper: Return true iff the <b>identity_digest</b> and <b>nickname</b> + * combination of a router, encoded in hexadecimal, matches <b>hexdigest</b> + * (which is optionally prefixed with a single dollar sign). Return false if + * <b>hexdigest</b> is malformed, or it doesn't match. */ +static int +hex_digest_nickname_matches(const char *hexdigest, const char *identity_digest, + const char *nickname, int is_named) +{ + char digest[DIGEST_LEN]; + char nn_char='\0'; + char nn_buf[MAX_NICKNAME_LEN+1]; + + if (hex_digest_nickname_decode(hexdigest, digest, &nn_char, nn_buf) == -1) return 0; - else if (len > HEX_DIGEST_LEN && - (hexdigest[HEX_DIGEST_LEN] == '=' || - hexdigest[HEX_DIGEST_LEN] == '~')) { - if (strcasecmp(hexdigest+HEX_DIGEST_LEN+1, nickname)) + + if (nn_char == '=' || nn_char == '~') { + if (strcasecmp(nn_buf, nickname)) return 0; - if (hexdigest[HEX_DIGEST_LEN] == '=' && !is_named) + if (nn_char == '=' && !is_named) return 0; } - if (base16_decode(digest, DIGEST_LEN, hexdigest, HEX_DIGEST_LEN)<0) - return 0; - return (!memcmp(digest, identity_digest, DIGEST_LEN)); + return !memcmp(digest, identity_digest, DIGEST_LEN); +} + +/* Return true iff <b>router</b> is listed as named in the current + * consensus. */ +static int +router_is_named(const routerinfo_t *router) +{ + const char *digest = + networkstatus_get_router_digest_by_nickname(router->nickname); + + return (digest && + !memcmp(digest, router->cache_info.identity_digest, DIGEST_LEN)); } /** Return true iff the digest of <b>router</b>'s identity key, @@ -2242,10 +2253,12 @@ hex_digest_matches(const char *hexdigest, const char *identity_digest, * optionally prefixed with a single dollar sign). Return false if * <b>hexdigest</b> is malformed, or it doesn't match. */ static INLINE int -router_hex_digest_matches(routerinfo_t *router, const char *hexdigest) +router_hex_digest_matches(const routerinfo_t *router, const char *hexdigest) { - return hex_digest_matches(hexdigest, router->cache_info.identity_digest, - router->nickname, router->is_named); + return hex_digest_nickname_matches(hexdigest, + router->cache_info.identity_digest, + router->nickname, + router_is_named(router)); } /** Return true if <b>router</b>'s nickname matches <b>nickname</b> @@ -2253,20 +2266,43 @@ router_hex_digest_matches(routerinfo_t *router, const char *hexdigest) * matches a hexadecimal value stored in <b>nickname</b>. Return * false otherwise. */ static int -router_nickname_matches(routerinfo_t *router, const char *nickname) +router_nickname_matches(const routerinfo_t *router, const char *nickname) { if (nickname[0]!='$' && !strcasecmp(router->nickname, nickname)) return 1; return router_hex_digest_matches(router, nickname); } +/** Return true if <b>node</b>'s nickname matches <b>nickname</b> + * (case-insensitive), or if <b>node's</b> identity key digest + * matches a hexadecimal value stored in <b>nickname</b>. Return + * false otherwise. */ +static int +node_nickname_matches(const node_t *node, const char *nickname) +{ + const char *n = node_get_nickname(node); + if (n && nickname[0]!='$' && !strcasecmp(n, nickname)) + return 1; + return hex_digest_nickname_matches(nickname, + node->identity, + n, + node_is_named(node)); +} + /** Return the router in our routerlist whose (case-insensitive) * nickname or (case-sensitive) hexadecimal key digest is * <b>nickname</b>. Return NULL if no such router is known. */ -routerinfo_t * +const routerinfo_t * router_get_by_nickname(const char *nickname, int warn_if_unnamed) { +#if 1 + const node_t *node = node_get_by_nickname(nickname, warn_if_unnamed); + if (node) + return node->ri; + else + return NULL; +#else int maybedigest; char digest[DIGEST_LEN]; routerinfo_t *best_match=NULL; @@ -2315,15 +2351,14 @@ router_get_by_nickname(const char *nickname, int warn_if_unnamed) if (warn_if_unnamed && n_matches > 1) { smartlist_t *fps = smartlist_create(); int any_unwarned = 0; - SMARTLIST_FOREACH(routerlist->routers, routerinfo_t *, router, - { + SMARTLIST_FOREACH_BEGIN(routerlist->routers, routerinfo_t *, router) { routerstatus_t *rs; char *desc; size_t dlen; char fp[HEX_DIGEST_LEN+1]; if (strcasecmp(router->nickname, nickname)) continue; - rs = router_get_consensus_status_by_id( + rs = router_get_mutable_consensus_status_by_id( router->cache_info.identity_digest); if (rs && !rs->name_lookup_warned) { rs->name_lookup_warned = 1; @@ -2336,7 +2371,7 @@ router_get_by_nickname(const char *nickname, int warn_if_unnamed) tor_snprintf(desc, dlen, "\"$%s\" for the one at %s:%d", fp, router->address, router->or_port); smartlist_add(fps, desc); - }); + } SMARTLIST_FOREACH_END(router); if (any_unwarned) { char *alternatives = smartlist_join_strings(fps, "; ",0,NULL); log_warn(LD_CONFIG, @@ -2349,7 +2384,7 @@ router_get_by_nickname(const char *nickname, int warn_if_unnamed) SMARTLIST_FOREACH(fps, char *, cp, tor_free(cp)); smartlist_free(fps); } else if (warn_if_unnamed) { - routerstatus_t *rs = router_get_consensus_status_by_id( + routerstatus_t *rs = router_get_mutable_consensus_status_by_id( best_match->cache_info.identity_digest); if (rs && !rs->name_lookup_warned) { char fp[HEX_DIGEST_LEN+1]; @@ -2365,8 +2400,8 @@ router_get_by_nickname(const char *nickname, int warn_if_unnamed) } return best_match; } - return NULL; +#endif } /** Try to find a routerinfo for <b>digest</b>. If we don't have one, @@ -2375,7 +2410,7 @@ router_get_by_nickname(const char *nickname, int warn_if_unnamed) int router_digest_version_as_new_as(const char *digest, const char *cutoff) { - routerinfo_t *router = router_get_by_digest(digest); + const routerinfo_t *router = router_get_by_id_digest(digest); if (!router) return 1; return tor_version_as_new_as(router->platform, cutoff); @@ -2429,44 +2464,20 @@ hexdigest_to_digest(const char *hexdigest, char *digest) /** Return the router in our routerlist whose hexadecimal key digest * is <b>hexdigest</b>. Return NULL if no such router is known. */ -routerinfo_t * +const routerinfo_t * router_get_by_hexdigest(const char *hexdigest) { - char digest[DIGEST_LEN]; - size_t len; - routerinfo_t *ri; - - tor_assert(hexdigest); - if (!routerlist) + if (is_legal_nickname(hexdigest)) return NULL; - if (hexdigest[0]=='$') - ++hexdigest; - len = strlen(hexdigest); - if (hexdigest_to_digest(hexdigest, digest) < 0) - return NULL; - - ri = router_get_by_digest(digest); - if (ri && len > HEX_DIGEST_LEN) { - if (hexdigest[HEX_DIGEST_LEN] == '=') { - if (strcasecmp(ri->nickname, hexdigest+HEX_DIGEST_LEN+1) || - !ri->is_named) - return NULL; - } else if (hexdigest[HEX_DIGEST_LEN] == '~') { - if (strcasecmp(ri->nickname, hexdigest+HEX_DIGEST_LEN+1)) - return NULL; - } else { - return NULL; - } - } - - return ri; + /* It's not a legal nickname, so it must be a hexdigest or nothing. */ + return router_get_by_nickname(hexdigest, 1); } -/** Return the router in our routerlist whose 20-byte key digest - * is <b>digest</b>. Return NULL if no such router is known. */ +/** As router_get_by_id_digest,but return a pointer that you're allowed to + * modify */ routerinfo_t * -router_get_by_digest(const char *digest) +router_get_mutable_by_digest(const char *digest) { tor_assert(digest); @@ -2477,6 +2488,14 @@ router_get_by_digest(const char *digest) return rimap_get(routerlist->identity_map, digest); } +/** Return the router in our routerlist whose 20-byte key digest + * is <b>digest</b>. Return NULL if no such router is known. */ +const routerinfo_t * +router_get_by_id_digest(const char *digest) +{ + return router_get_mutable_by_digest(digest); +} + /** Return the router in our routerlist whose 20-byte descriptor * is <b>digest</b>. Return NULL if no such router is known. */ signed_descriptor_t * @@ -2527,7 +2546,7 @@ extrainfo_get_by_descriptor_digest(const char *digest) * The caller must not free the string returned. */ static const char * -signed_descriptor_get_body_impl(signed_descriptor_t *desc, +signed_descriptor_get_body_impl(const signed_descriptor_t *desc, int with_annotations) { const char *r = NULL; @@ -2576,7 +2595,7 @@ signed_descriptor_get_body_impl(signed_descriptor_t *desc, * The caller must not free the string returned. */ const char * -signed_descriptor_get_body(signed_descriptor_t *desc) +signed_descriptor_get_body(const signed_descriptor_t *desc) { return signed_descriptor_get_body_impl(desc, 0); } @@ -2584,7 +2603,7 @@ signed_descriptor_get_body(signed_descriptor_t *desc) /** As signed_descriptor_get_body(), but points to the beginning of the * annotations section rather than the beginning of the descriptor. */ const char * -signed_descriptor_get_annotations(signed_descriptor_t *desc) +signed_descriptor_get_annotations(const signed_descriptor_t *desc) { return signed_descriptor_get_body_impl(desc, 1); } @@ -2637,7 +2656,6 @@ routerinfo_free(routerinfo_t *router) } addr_policy_list_free(router->exit_policy); - /* XXXX Remove if this turns out to affect performance. */ memset(router, 77, sizeof(routerinfo_t)); tor_free(router); @@ -2652,7 +2670,6 @@ extrainfo_free(extrainfo_t *extrainfo) tor_free(extrainfo->cache_info.signed_descriptor_body); tor_free(extrainfo->pending_sig); - /* XXXX remove this if it turns out to slow us down. */ memset(extrainfo, 88, sizeof(extrainfo_t)); /* debug bad memory usage */ tor_free(extrainfo); } @@ -2666,7 +2683,6 @@ signed_descriptor_free(signed_descriptor_t *sd) tor_free(sd->signed_descriptor_body); - /* XXXX remove this once more bugs go away. */ memset(sd, 99, sizeof(signed_descriptor_t)); /* Debug bad mem usage */ tor_free(sd); } @@ -2768,8 +2784,7 @@ routerlist_insert(routerlist_t *rl, routerinfo_t *ri) { routerinfo_t *ri_old; { - /* XXXX Remove if this slows us down. */ - routerinfo_t *ri_generated = router_get_my_routerinfo(); + const routerinfo_t *ri_generated = router_get_my_routerinfo(); tor_assert(ri_generated != ri); } tor_assert(ri->cache_info.routerlist_index == -1); @@ -2783,6 +2798,7 @@ routerlist_insert(routerlist_t *rl, routerinfo_t *ri) &ri->cache_info); smartlist_add(rl->routers, ri); ri->cache_info.routerlist_index = smartlist_len(rl->routers) - 1; + nodelist_add_routerinfo(ri); router_dir_info_changed(); #ifdef DEBUG_ROUTERLIST routerlist_assert_ok(rl); @@ -2803,7 +2819,6 @@ extrainfo_insert(routerlist_t *rl, extrainfo_t *ei) extrainfo_t *ei_tmp; { - /* XXXX remove this code if it slows us down. */ extrainfo_t *ei_generated = router_get_my_extrainfo(); tor_assert(ei_generated != ei); } @@ -2849,8 +2864,7 @@ static void routerlist_insert_old(routerlist_t *rl, routerinfo_t *ri) { { - /* XXXX remove this code if it slows us down. */ - routerinfo_t *ri_generated = router_get_my_routerinfo(); + const routerinfo_t *ri_generated = router_get_my_routerinfo(); tor_assert(ri_generated != ri); } tor_assert(ri->cache_info.routerlist_index == -1); @@ -2890,6 +2904,8 @@ routerlist_remove(routerlist_t *rl, routerinfo_t *ri, int make_old, time_t now) tor_assert(0 <= idx && idx < smartlist_len(rl->routers)); tor_assert(smartlist_get(rl->routers, idx) == ri); + nodelist_remove_routerinfo(ri); + /* make sure the rephist module knows that it's not running */ rep_hist_note_router_unreachable(ri->cache_info.identity_digest, now); @@ -3000,8 +3016,7 @@ routerlist_replace(routerlist_t *rl, routerinfo_t *ri_old, routerinfo_t *ri_tmp; extrainfo_t *ei_tmp; { - /* XXXX Remove this if it turns out to slow us down. */ - routerinfo_t *ri_generated = router_get_my_routerinfo(); + const routerinfo_t *ri_generated = router_get_my_routerinfo(); tor_assert(ri_generated != ri_new); } tor_assert(ri_old != ri_new); @@ -3011,6 +3026,9 @@ routerlist_replace(routerlist_t *rl, routerinfo_t *ri_old, tor_assert(0 <= idx && idx < smartlist_len(rl->routers)); tor_assert(smartlist_get(rl->routers, idx) == ri_old); + nodelist_remove_routerinfo(ri_old); + nodelist_add_routerinfo(ri_new); + router_dir_info_changed(); if (idx >= 0) { smartlist_set(rl->routers, idx, ri_new); @@ -3147,28 +3165,27 @@ routerlist_reset_warnings(void) void router_set_status(const char *digest, int up) { - routerinfo_t *router; - routerstatus_t *status; + node_t *node; tor_assert(digest); SMARTLIST_FOREACH(trusted_dir_servers, trusted_dir_server_t *, d, if (!memcmp(d->digest, digest, DIGEST_LEN)) d->is_running = up); - router = router_get_by_digest(digest); - if (router) { - log_debug(LD_DIR,"Marking router '%s/%s' as %s.", - router->nickname, router->address, up ? "up" : "down"); - if (!up && router_is_me(router) && !we_are_hibernating()) + node = node_get_mutable_by_id(digest); + if (node) { +#if 0 + char buf[MAX_VERBOSE_NICKNAME_LEN+1]; + node_get_verbose_nickname(node,buf); + log_debug(LD_DIR,"Marking router %s as %s.", + buf, up ? "up" : "down"); +#endif + if (!up && node_is_me(node) && !we_are_hibernating()) log_warn(LD_NET, "We just marked ourself as down. Are your external " "addresses reachable?"); - router->is_running = up; - } - status = router_get_consensus_status_by_id(digest); - if (status && status->is_running != up) { - status->is_running = up; - control_event_networkstatus_changed_single(status); + node->is_running = up; } + router_dir_info_changed(); } @@ -3211,7 +3228,7 @@ router_add_to_routerlist(routerinfo_t *router, const char **msg, id_digest = router->cache_info.identity_digest; - old_router = router_get_by_digest(id_digest); + old_router = router_get_mutable_by_digest(id_digest); /* Make sure that we haven't already got this exact descriptor. */ if (sdmap_get(routerlist->desc_digest_map, @@ -3234,12 +3251,12 @@ router_add_to_routerlist(routerinfo_t *router, const char **msg, if (authdir) { if (authdir_wants_to_reject_router(router, msg, - !from_cache && !from_fetch)) { + !from_cache && !from_fetch, + &authdir_believes_valid)) { tor_assert(*msg); routerinfo_free(router); return ROUTER_AUTHDIR_REJECTS; } - authdir_believes_valid = router->is_valid; } else if (from_fetch) { /* Only check the descriptor digest against the network statuses when * we are receiving in response to a fetch. */ @@ -3266,14 +3283,15 @@ router_add_to_routerlist(routerinfo_t *router, const char **msg, SMARTLIST_FOREACH(networkstatus_v2_list, networkstatus_v2_t *, ns, { routerstatus_t *rs = - networkstatus_v2_find_entry(ns, id_digest); + networkstatus_v2_find_mutable_entry(ns, id_digest); if (rs && !memcmp(rs->descriptor_digest, router->cache_info.signed_descriptor_digest, DIGEST_LEN)) rs->need_to_mirror = 0; }); if (consensus) { - routerstatus_t *rs = networkstatus_vote_find_entry(consensus, id_digest); + routerstatus_t *rs = networkstatus_vote_find_mutable_entry( + consensus, id_digest); if (rs && !memcmp(rs->descriptor_digest, router->cache_info.signed_descriptor_digest, DIGEST_LEN)) { @@ -3873,7 +3891,7 @@ router_load_extrainfo_from_string(const char *s, const char *eos, static int signed_desc_digest_is_recognized(signed_descriptor_t *desc) { - routerstatus_t *rs; + const routerstatus_t *rs; networkstatus_t *consensus = networkstatus_get_latest_consensus(); int caches = directory_caches_dir_info(get_options()); const smartlist_t *networkstatus_v2_list = networkstatus_get_v2_list(); @@ -3909,31 +3927,31 @@ routerlist_retry_directory_downloads(time_t now) update_microdesc_downloads(now); } -/** Return 1 if all running sufficiently-stable routers will reject +/** Return 1 if all running sufficiently-stable routers we can use will reject * addr:port, return 0 if any might accept it. */ int -router_exit_policy_all_routers_reject(uint32_t addr, uint16_t port, - int need_uptime) -{ +router_exit_policy_all_nodes_reject(uint32_t addr, uint16_t port, + int need_uptime) +{ /* XXXX MOVE */ addr_policy_result_t r; - if (!routerlist) return 1; - SMARTLIST_FOREACH(routerlist->routers, routerinfo_t *, router, - { - if (router->is_running && - !router_is_unreliable(router, need_uptime, 0, 0)) { - r = compare_addr_to_addr_policy(addr, port, router->exit_policy); + SMARTLIST_FOREACH_BEGIN(nodelist_get_list(), const node_t *, node) { + if (node->is_running && + !node_is_unreliable(node, need_uptime, 0, 0)) { + + r = compare_addr_to_node_policy(addr, port, node); + if (r != ADDR_POLICY_REJECTED && r != ADDR_POLICY_PROBABLY_REJECTED) return 0; /* this one could be ok. good enough. */ } - }); + } SMARTLIST_FOREACH_END(node); return 1; /* all will reject. */ } /** Return true iff <b>router</b> does not permit exit streams. */ int -router_exit_policy_rejects_all(routerinfo_t *router) +router_exit_policy_rejects_all(const routerinfo_t *router) { return router->policy_is_reject_star; } @@ -4128,7 +4146,7 @@ list_pending_microdesc_downloads(digestmap_t *result) * otherwise, download from an appropriate random directory server. */ static void -initiate_descriptor_downloads(routerstatus_t *source, +initiate_descriptor_downloads(const routerstatus_t *source, int purpose, smartlist_t *digests, int lo, int hi, int pds_flags) @@ -4192,7 +4210,7 @@ initiate_descriptor_downloads(routerstatus_t *source, static INLINE int client_would_use_router(routerstatus_t *rs, time_t now, or_options_t *options) { - if (!rs->is_running && !options->FetchUselessDescriptors) { + if (!rs->is_flagged_running && !options->FetchUselessDescriptors) { /* If we had this router descriptor, we wouldn't even bother using it. * But, if we want to have a complete list, fetch it anyway. */ return 0; @@ -4240,7 +4258,7 @@ client_would_use_router(routerstatus_t *rs, time_t now, or_options_t *options) void launch_descriptor_downloads(int purpose, smartlist_t *downloadable, - routerstatus_t *source, time_t now) + const routerstatus_t *source, time_t now) { int should_delay = 0, n_downloadable; or_options_t *options = get_options(); @@ -4517,15 +4535,14 @@ update_consensus_router_descriptor_downloads(time_t now, int is_vote, map = digestmap_new(); list_pending_descriptor_downloads(map, 0); - SMARTLIST_FOREACH(consensus->routerstatus_list, void *, rsp, - { + SMARTLIST_FOREACH_BEGIN(consensus->routerstatus_list, void *, rsp) { routerstatus_t *rs = is_vote ? &(((vote_routerstatus_t *)rsp)->status) : rsp; signed_descriptor_t *sd; if ((sd = router_get_by_descriptor_digest(rs->descriptor_digest))) { - routerinfo_t *ri; + const routerinfo_t *ri; ++n_have; - if (!(ri = router_get_by_digest(rs->identity_digest)) || + if (!(ri = router_get_by_id_digest(rs->identity_digest)) || memcmp(ri->cache_info.signed_descriptor_digest, sd->signed_descriptor_digest, DIGEST_LEN)) { /* We have a descriptor with this digest, but either there is no @@ -4558,7 +4575,8 @@ update_consensus_router_descriptor_downloads(time_t now, int is_vote, if (is_vote && source) { char time_bufnew[ISO_TIME_LEN+1]; char time_bufold[ISO_TIME_LEN+1]; - routerinfo_t *oldrouter = router_get_by_digest(rs->identity_digest); + const routerinfo_t *oldrouter; + oldrouter = router_get_by_id_digest(rs->identity_digest); format_iso_time(time_bufnew, rs->published_on); if (oldrouter) format_iso_time(time_bufold, oldrouter->cache_info.published_on); @@ -4568,7 +4586,7 @@ update_consensus_router_descriptor_downloads(time_t now, int is_vote, source->nickname, oldrouter ? "known" : "unknown"); } smartlist_add(downloadable, rs->descriptor_digest); - }); + } SMARTLIST_FOREACH_END(rsp); if (!authdir_mode_handles_descs(options, ROUTER_PURPOSE_GENERAL) && smartlist_len(no_longer_old)) { @@ -4679,7 +4697,7 @@ update_extrainfo_downloads(time_t now) sd = &((routerinfo_t*)smartlist_get(lst, i))->cache_info; if (sd->is_extrainfo) continue; /* This should never happen. */ - if (old_routers && !router_get_by_digest(sd->identity_digest)) + if (old_routers && !router_get_by_id_digest(sd->identity_digest)) continue; /* Couldn't check the signature if we got it. */ if (sd->extrainfo_is_bogus) continue; @@ -4780,7 +4798,7 @@ count_usable_descriptors(int *num_present, int *num_usable, SMARTLIST_FOREACH(consensus->routerstatus_list, routerstatus_t *, rs, { - if (in_set && ! routerset_contains_routerstatus(in_set, rs)) + if (in_set && ! routerset_contains_routerstatus(in_set, rs, -1)) continue; if (client_would_use_router(rs, now, options)) { ++*num_usable; /* the consensus says we want it. */ @@ -4943,7 +4961,7 @@ router_reset_descriptor_download_failures(void) * would not cause a recent (post 0.1.1.6) dirserver to republish. */ int -router_differences_are_cosmetic(routerinfo_t *r1, routerinfo_t *r2) +router_differences_are_cosmetic(const routerinfo_t *r1, const routerinfo_t *r2) { time_t r1pub, r2pub; long time_difference; @@ -4951,7 +4969,7 @@ router_differences_are_cosmetic(routerinfo_t *r1, routerinfo_t *r2) /* r1 should be the one that was published first. */ if (r1->cache_info.published_on > r2->cache_info.published_on) { - routerinfo_t *ri_tmp = r2; + const routerinfo_t *ri_tmp = r2; r2 = r1; r1 = ri_tmp; } @@ -5024,7 +5042,8 @@ router_differences_are_cosmetic(routerinfo_t *r1, routerinfo_t *r2) * incompatibility (if any). **/ int -routerinfo_incompatible_with_extrainfo(routerinfo_t *ri, extrainfo_t *ei, +routerinfo_incompatible_with_extrainfo(const routerinfo_t *ri, + extrainfo_t *ei, signed_descriptor_t *sd, const char **msg) { @@ -5032,7 +5051,7 @@ routerinfo_incompatible_with_extrainfo(routerinfo_t *ri, extrainfo_t *ei, tor_assert(ri); tor_assert(ei); if (!sd) - sd = &ri->cache_info; + sd = (signed_descriptor_t*)&ri->cache_info; if (ei->bad_sig) { if (msg) *msg = "Extrainfo signature was bad, or signed with wrong key."; @@ -5095,7 +5114,7 @@ routerinfo_incompatible_with_extrainfo(routerinfo_t *ri, extrainfo_t *ei, /** Assert that the internal representation of <b>rl</b> is * self-consistent. */ void -routerlist_assert_ok(routerlist_t *rl) +routerlist_assert_ok(const routerlist_t *rl) { routerinfo_t *r2; signed_descriptor_t *sd2; @@ -5185,7 +5204,7 @@ routerlist_assert_ok(routerlist_t *rl) * If <b>router</b> is NULL, it just frees its internal memory and returns. */ const char * -esc_router_info(routerinfo_t *router) +esc_router_info(const routerinfo_t *router) { static char *info=NULL; char *esc_contact, *esc_platform; @@ -5287,38 +5306,6 @@ routerset_get_countryname(const char *c) return country; } -#if 0 -/** Add the GeoIP database's integer index (+1) of a valid two-character - * country code to the routerset's <b>countries</b> bitarray. Return the - * integer index if the country code is valid, -1 otherwise.*/ -static int -routerset_add_country(const char *c) -{ - char country[3]; - country_t cc; - - /* XXXX: Country codes must be of the form \{[a-z\?]{2}\} but this accepts - \{[.]{2}\}. Do we need to be strict? -RH */ - /* Nope; if the country code is bad, we'll get 0 when we look it up. */ - - if (!geoip_is_loaded()) { - log(LOG_WARN, LD_CONFIG, "GeoIP database not loaded: Cannot add country" - "entry %s, ignoring.", c); - return -1; - } - - memcpy(country, c+1, 2); - country[2] = '\0'; - tor_strlower(country); - - if ((cc=geoip_get_country(country))==-1) { - log(LOG_WARN, LD_CONFIG, "Country code '%s' is not valid, ignoring.", - country); - } - return cc; -} -#endif - /** Update the routerset's <b>countries</b> bitarray_t. Called whenever * the GeoIP database is reloaded. */ @@ -5420,7 +5407,7 @@ refresh_all_country_info(void) if (options->_ExcludeExitNodesUnion) routerset_refresh_countries(options->_ExcludeExitNodesUnion); - routerlist_refresh_countries(); + nodelist_refresh_countries(); } /** Add all members of the set <b>source</b> to <b>target</b>. */ @@ -5470,11 +5457,10 @@ routerset_is_empty(const routerset_t *set) static int routerset_contains(const routerset_t *set, const tor_addr_t *addr, uint16_t orport, - const char *nickname, const char *id_digest, int is_named, + const char *nickname, const char *id_digest, country_t country) { if (!set || !set->list) return 0; - (void) is_named; /* not supported */ if (nickname && strmap_get_lc(set->names, nickname)) return 4; if (id_digest && digestmap_get(set->digests, id_digest)) @@ -5502,13 +5488,14 @@ routerset_contains_extendinfo(const routerset_t *set, const extend_info_t *ei) ei->port, ei->nickname, ei->identity_digest, - -1, /*is_named*/ -1 /*country*/); } -/** Return true iff <b>ri</b> is in <b>set</b>. */ +/** Return true iff <b>ri</b> is in <b>set</b>. If country is <b>-1</b>, we + * look up the country. */ int -routerset_contains_router(const routerset_t *set, routerinfo_t *ri) +routerset_contains_router(const routerset_t *set, const routerinfo_t *ri, + country_t country) { tor_addr_t addr; tor_addr_from_ipv4h(&addr, ri->addr); @@ -5517,13 +5504,15 @@ routerset_contains_router(const routerset_t *set, routerinfo_t *ri) ri->or_port, ri->nickname, ri->cache_info.identity_digest, - ri->is_named, - ri->country); + country); } -/** Return true iff <b>rs</b> is in <b>set</b>. */ +/** Return true iff <b>rs</b> is in <b>set</b>. If country is <b>-1</b>, we + * look up the country. */ int -routerset_contains_routerstatus(const routerset_t *set, routerstatus_t *rs) +routerset_contains_routerstatus(const routerset_t *set, + const routerstatus_t *rs, + country_t country) { tor_addr_t addr; tor_addr_from_ipv4h(&addr, rs->addr); @@ -5532,46 +5521,55 @@ routerset_contains_routerstatus(const routerset_t *set, routerstatus_t *rs) rs->or_port, rs->nickname, rs->identity_digest, - rs->is_named, - -1); + country); } -/** Add every known routerinfo_t that is a member of <b>routerset</b> to +/** Return true iff <b>node</b> is in <b>set</b>. */ +int +routerset_contains_node(const routerset_t *set, const node_t *node) +{ + if (node->rs) + return routerset_contains_routerstatus(set, node->rs, node->country); + else if (node->ri) + return routerset_contains_router(set, node->ri, node->country); + else + return 0; +} + +/** Add every known node_t that is a member of <b>routerset</b> to * <b>out</b>. If <b>running_only</b>, only add the running ones. */ void -routerset_get_all_routers(smartlist_t *out, const routerset_t *routerset, - int running_only) -{ +routerset_get_all_nodes(smartlist_t *out, const routerset_t *routerset, + int running_only) +{ /* XXXX MOVE */ tor_assert(out); if (!routerset || !routerset->list) return; - if (!warned_nicknames) - warned_nicknames = smartlist_create(); - if (routerset_is_list(routerset)) { + if (routerset_is_list(routerset)) { /* No routers are specified by type; all are given by name or digest. * we can do a lookup in O(len(list)). */ SMARTLIST_FOREACH(routerset->list, const char *, name, { - routerinfo_t *router = router_get_by_nickname(name, 1); - if (router) { - if (!running_only || router->is_running) - smartlist_add(out, router); + const node_t *node = node_get_by_nickname(name, 1); + if (node) { + if (!running_only || node->is_running) + smartlist_add(out, (void*)node); } }); } else { /* We need to iterate over the routerlist to get all the ones of the * right kind. */ - routerlist_t *rl = router_get_routerlist(); - SMARTLIST_FOREACH(rl->routers, routerinfo_t *, router, { - if (running_only && !router->is_running) + smartlist_t *nodes = nodelist_get_list(); + SMARTLIST_FOREACH(nodes, const node_t *, node, { + if (running_only && !node->is_running) continue; - if (routerset_contains_router(routerset, router)) - smartlist_add(out, router); + if (routerset_contains_node(routerset, node)) + smartlist_add(out, (void*)node); }); } } -/** Add to <b>target</b> every routerinfo_t from <b>source</b> except: +/** Add to <b>target</b> every node_t from <b>source</b> except: * * 1) Don't add it if <b>include</b> is non-empty and the relay isn't in * <b>include</b>; and @@ -5580,39 +5578,39 @@ routerset_get_all_routers(smartlist_t *out, const routerset_t *routerset, * 3) If <b>running_only</b>, don't add non-running routers. */ void -routersets_get_disjunction(smartlist_t *target, +routersets_get_node_disjunction(smartlist_t *target, const smartlist_t *source, const routerset_t *include, const routerset_t *exclude, int running_only) { - SMARTLIST_FOREACH(source, routerinfo_t *, router, { + SMARTLIST_FOREACH(source, const node_t *, node, { int include_result; - if (running_only && !router->is_running) + if (running_only && !node->is_running) continue; if (!routerset_is_empty(include)) - include_result = routerset_contains_router(include, router); + include_result = routerset_contains_node(include, node); else include_result = 1; if (include_result) { - int exclude_result = routerset_contains_router(exclude, router); + int exclude_result = routerset_contains_node(exclude, node); if (include_result >= exclude_result) - smartlist_add(target, router); + smartlist_add(target, (void*)node); } }); } -/** Remove every routerinfo_t from <b>lst</b> that is in <b>routerset</b>. */ +/** Remove every node_t from <b>lst</b> that is in <b>routerset</b>. */ void -routerset_subtract_routers(smartlist_t *lst, const routerset_t *routerset) -{ +routerset_subtract_nodes(smartlist_t *lst, const routerset_t *routerset) +{ /*XXXX MOVE ? */ tor_assert(lst); if (!routerset) return; - SMARTLIST_FOREACH(lst, routerinfo_t *, r, { - if (routerset_contains_router(routerset, r)) { + SMARTLIST_FOREACH(lst, const node_t *, node, { + if (routerset_contains_node(routerset, node)) { //log_debug(LD_DIR, "Subtracting %s",r->nickname); - SMARTLIST_DEL_CURRENT(lst, r); + SMARTLIST_DEL_CURRENT(lst, node); } }); } @@ -5673,18 +5671,23 @@ routerset_free(routerset_t *routerset) /** Refresh the country code of <b>ri</b>. This function MUST be called on * each router when the GeoIP database is reloaded, and on all new routers. */ void -routerinfo_set_country(routerinfo_t *ri) +node_set_country(node_t *node) { - ri->country = geoip_get_country_by_ip(ri->addr); + if (node->rs) + node->country = geoip_get_country_by_ip(node->rs->addr); + else if (node->ri) + node->country = geoip_get_country_by_ip(node->ri->addr); + else + node->country = -1; } /** Set the country code of all routers in the routerlist. */ void -routerlist_refresh_countries(void) +nodelist_refresh_countries(void) /* MOVE */ { - routerlist_t *rl = router_get_routerlist(); - SMARTLIST_FOREACH(rl->routers, routerinfo_t *, ri, - routerinfo_set_country(ri)); + smartlist_t *nodes = nodelist_get_list(); + SMARTLIST_FOREACH(nodes, node_t *, node, + node_set_country(node)); } /** Determine the routers that are responsible for <b>id</b> (binary) and @@ -5733,9 +5736,9 @@ hid_serv_get_responsible_directories(smartlist_t *responsible_dirs, int hid_serv_acting_as_directory(void) { - routerinfo_t *me = router_get_my_routerinfo(); + const routerinfo_t *me = router_get_my_routerinfo(); networkstatus_t *c; - routerstatus_t *rs; + const routerstatus_t *rs; if (!me) return 0; if (!get_options()->HidServDirectoryV2) { @@ -5767,7 +5770,7 @@ hid_serv_acting_as_directory(void) int hid_serv_responsible_for_desc_id(const char *query) { - routerinfo_t *me; + const routerinfo_t *me; routerstatus_t *last_rs; const char *my_id, *last_id; int result; diff --git a/src/or/routerlist.h b/src/or/routerlist.h index 804be2abaa..b69ef70f6e 100644 --- a/src/or/routerlist.h +++ b/src/or/routerlist.h @@ -27,37 +27,34 @@ int router_reload_router_list(void); int authority_cert_dl_looks_uncertain(const char *id_digest); smartlist_t *router_get_trusted_dir_servers(void); -routerstatus_t *router_pick_directory_server(authority_type_t type, int flags); +const routerstatus_t *router_pick_directory_server(authority_type_t type, + int flags); trusted_dir_server_t *router_get_trusteddirserver_by_digest(const char *d); trusted_dir_server_t *trusteddirserver_get_by_v3_auth_digest(const char *d); -routerstatus_t *router_pick_trusteddirserver(authority_type_t type, int flags); +const routerstatus_t *router_pick_trusteddirserver(authority_type_t type, + int flags); int router_get_my_share_of_directory_requests(double *v2_share_out, double *v3_share_out); void router_reset_status_download_failures(void); -void routerlist_add_family(smartlist_t *sl, routerinfo_t *router); -int routers_in_same_family(routerinfo_t *r1, routerinfo_t *r2); +void routerlist_add_family(smartlist_t *sl, const routerinfo_t *router); int routers_have_same_or_addr(const routerinfo_t *r1, const routerinfo_t *r2); -void add_nickname_list_to_smartlist(smartlist_t *sl, const char *list, - int must_be_running); -int router_nickname_is_in_list(routerinfo_t *router, const char *list); -routerinfo_t *routerlist_find_my_routerinfo(void); -routerinfo_t *router_find_exact_exit_enclave(const char *address, +int router_nickname_is_in_list(const routerinfo_t *router, const char *list); +const routerinfo_t *routerlist_find_my_routerinfo(void); +const node_t *router_find_exact_exit_enclave(const char *address, uint16_t port); -int router_is_unreliable(routerinfo_t *router, int need_uptime, +int node_is_unreliable(const node_t *router, int need_uptime, int need_capacity, int need_guard); -uint32_t router_get_advertised_bandwidth(routerinfo_t *router); -uint32_t router_get_advertised_bandwidth_capped(routerinfo_t *router); +uint32_t router_get_advertised_bandwidth(const routerinfo_t *router); +uint32_t router_get_advertised_bandwidth_capped(const routerinfo_t *router); -routerinfo_t *routerlist_sl_choose_by_bandwidth(smartlist_t *sl, - bandwidth_weight_rule_t rule); -routerstatus_t *routerstatus_sl_choose_by_bandwidth(smartlist_t *sl, - bandwidth_weight_rule_t rule); +const node_t *node_sl_choose_by_bandwidth(smartlist_t *sl, + bandwidth_weight_rule_t rule); -routerinfo_t *router_choose_random_node(smartlist_t *excludedsmartlist, +const node_t *router_choose_random_node(smartlist_t *excludedsmartlist, struct routerset_t *excludedset, router_crn_flags_t flags); -routerinfo_t *router_get_by_nickname(const char *nickname, +const routerinfo_t *router_get_by_nickname(const char *nickname, int warn_if_unnamed); int router_digest_version_as_new_as(const char *digest, const char *cutoff); int router_digest_is_trusted_dir_type(const char *digest, @@ -67,13 +64,14 @@ int router_digest_is_trusted_dir_type(const char *digest, int router_addr_is_trusted_dir(uint32_t addr); int hexdigest_to_digest(const char *hexdigest, char *digest); -routerinfo_t *router_get_by_hexdigest(const char *hexdigest); -routerinfo_t *router_get_by_digest(const char *digest); +const routerinfo_t *router_get_by_hexdigest(const char *hexdigest); +const routerinfo_t *router_get_by_id_digest(const char *digest); +routerinfo_t *router_get_mutable_by_digest(const char *digest); signed_descriptor_t *router_get_by_descriptor_digest(const char *digest); signed_descriptor_t *router_get_by_extrainfo_digest(const char *digest); signed_descriptor_t *extrainfo_get_by_descriptor_digest(const char *digest); -const char *signed_descriptor_get_body(signed_descriptor_t *desc); -const char *signed_descriptor_get_annotations(signed_descriptor_t *desc); +const char *signed_descriptor_get_body(const signed_descriptor_t *desc); +const char *signed_descriptor_get_annotations(const signed_descriptor_t *desc); routerlist_t *router_get_routerlist(void); void routerinfo_free(routerinfo_t *router); void extrainfo_free(extrainfo_t *extrainfo); @@ -132,9 +130,10 @@ void router_load_extrainfo_from_string(const char *s, const char *eos, int descriptor_digests); void routerlist_retry_directory_downloads(time_t now); -int router_exit_policy_all_routers_reject(uint32_t addr, uint16_t port, - int need_uptime); -int router_exit_policy_rejects_all(routerinfo_t *router); +int router_exit_policy_all_nodes_reject(uint32_t addr, uint16_t port, + int need_uptime); + +int router_exit_policy_rejects_all(const routerinfo_t *router); trusted_dir_server_t *add_trusted_dir_server(const char *nickname, const char *address, uint16_t dir_port, uint16_t or_port, @@ -152,39 +151,43 @@ void router_dir_info_changed(void); const char *get_dir_info_status_string(void); int count_loading_descriptors_progress(void); void router_reset_descriptor_download_failures(void); -int router_differences_are_cosmetic(routerinfo_t *r1, routerinfo_t *r2); -int routerinfo_incompatible_with_extrainfo(routerinfo_t *ri, extrainfo_t *ei, +int router_differences_are_cosmetic(const routerinfo_t *r1, + const routerinfo_t *r2); +int routerinfo_incompatible_with_extrainfo(const routerinfo_t *ri, + extrainfo_t *ei, signed_descriptor_t *sd, const char **msg); -void routerlist_assert_ok(routerlist_t *rl); -const char *esc_router_info(routerinfo_t *router); +void routerlist_assert_ok(const routerlist_t *rl); +const char *esc_router_info(const routerinfo_t *router); void routers_sort_by_identity(smartlist_t *routers); routerset_t *routerset_new(void); +void routerset_refresh_countries(routerset_t *rs); int routerset_parse(routerset_t *target, const char *s, const char *description); void routerset_union(routerset_t *target, const routerset_t *source); int routerset_is_list(const routerset_t *set); int routerset_needs_geoip(const routerset_t *set); -int routerset_contains_router(const routerset_t *set, routerinfo_t *ri); +int routerset_contains_router(const routerset_t *set, const routerinfo_t *ri, + country_t country); int routerset_contains_routerstatus(const routerset_t *set, - routerstatus_t *rs); + const routerstatus_t *rs, + country_t country); int routerset_contains_extendinfo(const routerset_t *set, const extend_info_t *ei); -void routerset_get_all_routers(smartlist_t *out, const routerset_t *routerset, - int running_only); -void routersets_get_disjunction(smartlist_t *target, const smartlist_t *source, +int routerset_contains_node(const routerset_t *set, const node_t *node); +void routerset_get_all_nodes(smartlist_t *out, const routerset_t *routerset, + int running_only); +void routersets_get_node_disjunction(smartlist_t *target, + const smartlist_t *source, const routerset_t *include, const routerset_t *exclude, int running_only); -void routerset_subtract_routers(smartlist_t *out, - const routerset_t *routerset); +void routerset_subtract_nodes(smartlist_t *out, + const routerset_t *routerset); char *routerset_to_string(const routerset_t *routerset); -void routerset_refresh_countries(routerset_t *target); int routerset_equal(const routerset_t *old, const routerset_t *new); void routerset_free(routerset_t *routerset); -void routerinfo_set_country(routerinfo_t *ri); -void routerlist_refresh_countries(void); void refresh_all_country_info(void); int hid_serv_get_responsible_directories(smartlist_t *responsible_dirs, @@ -195,8 +198,13 @@ int hid_serv_responsible_for_desc_id(const char *id); void list_pending_microdesc_downloads(digestmap_t *result); void launch_descriptor_downloads(int purpose, smartlist_t *downloadable, - routerstatus_t *source, + const routerstatus_t *source, time_t now); +int hex_digest_nickname_decode(const char *hexdigest, + char *digest_out, + char *nickname_qualifier_out, + char *nickname_out); + #endif diff --git a/src/or/routerparse.c b/src/or/routerparse.c index f7e645e8fd..2b82e9828f 100644 --- a/src/or/routerparse.c +++ b/src/or/routerparse.c @@ -1344,7 +1344,6 @@ router_parse_entry_from_string(const char *s, const char *end, tor_assert(tok->n_args >= 5); router = tor_malloc_zero(sizeof(routerinfo_t)); - router->country = -1; router->cache_info.routerlist_index = -1; router->cache_info.annotations_len = s-start_of_annotations + prepend_len; router->cache_info.signed_descriptor_len = end-s; @@ -1543,8 +1542,6 @@ router_parse_entry_from_string(const char *s, const char *end, "router descriptor") < 0) goto err; - routerinfo_set_country(router); - if (!router->or_port) { log_warn(LD_DIR,"or_port unreadable or 0. Failing."); goto err; @@ -2030,7 +2027,7 @@ routerstatus_parse_entry_from_string(memarea_t *area, else if (!strcmp(tok->args[i], "Fast")) rs->is_fast = 1; else if (!strcmp(tok->args[i], "Running")) - rs->is_running = 1; + rs->is_flagged_running = 1; else if (!strcmp(tok->args[i], "Named")) rs->is_named = 1; else if (!strcmp(tok->args[i], "Valid")) @@ -4305,7 +4302,7 @@ microdescs_parse_from_string(const char *s, const char *eos, } if ((tok = find_opt_by_keyword(tokens, K_P))) { - md->exitsummary = tor_strdup(tok->args[0]); + md->exit_policy = parse_short_policy(tok->args[0]); } crypto_digest256(md->digest, md->body, md->bodylen, DIGEST_SHA256); diff --git a/src/test/Makefile.am b/src/test/Makefile.am index cfe330c744..16ea66583b 100644 --- a/src/test/Makefile.am +++ b/src/test/Makefile.am @@ -1,6 +1,6 @@ TESTS = test -noinst_PROGRAMS = test +noinst_PROGRAMS = test test-child AM_CPPFLAGS = -DSHARE_DATADIR="\"$(datadir)\"" \ -DLOCALSTATEDIR="\"$(localstatedir)\"" \ @@ -19,6 +19,7 @@ test_SOURCES = \ test_dir.c \ test_containers.c \ test_util.c \ + test_microdesc.c \ tinytest.c if USE_BUFFEREVENTS diff --git a/src/test/test-child.c b/src/test/test-child.c new file mode 100644 index 0000000000..ca52750c2f --- /dev/null +++ b/src/test/test-child.c @@ -0,0 +1,18 @@ +#include <stdio.h> + +/** Trivial test program which prints out its command line arguments so we can + * check if tor_spawn_background() works */ +int +main(int argc, char **argv) +{ + int i; + + fprintf(stdout, "OUT\n"); + fprintf(stderr, "ERR\n"); + for (i = 1; i < argc; i++) + fprintf(stdout, "%s\n", argv[i]); + fprintf(stdout, "DONE\n"); + + return 0; +} + diff --git a/src/test/test.c b/src/test/test.c index 8d8c46fca2..3f014186a0 100644 --- a/src/test/test.c +++ b/src/test/test.c @@ -113,30 +113,46 @@ get_fname(const char *name) return buf; } -/** Remove all files stored under the temporary directory, and the directory - * itself. Called by atexit(). */ +/* Remove a directory and all of its subdirectories */ static void -remove_directory(void) +rm_rf(const char *dir) { + struct stat st; smartlist_t *elements; - if (getpid() != temp_dir_setup_in_pid) { - /* Only clean out the tempdir when the main process is exiting. */ - return; - } - elements = tor_listdir(temp_dir); + + elements = tor_listdir(dir); if (elements) { SMARTLIST_FOREACH(elements, const char *, cp, { - size_t len = strlen(cp)+strlen(temp_dir)+16; - char *tmp = tor_malloc(len); - tor_snprintf(tmp, len, "%s"PATH_SEPARATOR"%s", temp_dir, cp); - unlink(tmp); + char *tmp = NULL; + tor_asprintf(&tmp, "%s"PATH_SEPARATOR"%s", dir, cp); + if (0 == stat(tmp,&st) && (st.st_mode & S_IFDIR)) { + rm_rf(tmp); + } else { + if (unlink(tmp)) { + fprintf(stderr, "Error removing %s: %s\n", tmp, strerror(errno)); + } + } tor_free(tmp); }); SMARTLIST_FOREACH(elements, char *, cp, tor_free(cp)); smartlist_free(elements); } - rmdir(temp_dir); + if (rmdir(dir)) + fprintf(stderr, "Error removing directory %s: %s\n", dir, strerror(errno)); +} + +/** Remove all files stored under the temporary directory, and the directory + * itself. Called by atexit(). */ +static void +remove_directory(void) +{ + if (getpid() != temp_dir_setup_in_pid) { + /* Only clean out the tempdir when the main process is exiting. */ + return; + } + + rm_rf(temp_dir); } /** Define this if unit tests spend too much time generating public keys*/ @@ -560,6 +576,7 @@ test_policy_summary_helper(const char *policy_str, smartlist_t *policy = smartlist_create(); char *summary = NULL; int r; + short_policy_t *short_policy = NULL; line.key = (char*)"foo"; line.value = (char *)policy_str; @@ -572,10 +589,14 @@ test_policy_summary_helper(const char *policy_str, test_assert(summary != NULL); test_streq(summary, expected_summary); + short_policy = parse_short_policy(summary); + tt_assert(short_policy); + done: tor_free(summary); if (policy) addr_policy_list_free(policy); + short_policy_free(short_policy); } /** Run unit tests for generating summary lines of exit policies */ @@ -1180,6 +1201,7 @@ extern struct testcase_t crypto_tests[]; extern struct testcase_t container_tests[]; extern struct testcase_t util_tests[]; extern struct testcase_t dir_tests[]; +extern struct testcase_t microdesc_tests[]; static struct testgroup_t testgroups[] = { { "", test_array }, @@ -1188,6 +1210,7 @@ static struct testgroup_t testgroups[] = { { "container/", container_tests }, { "util/", util_tests }, { "dir/", dir_tests }, + { "dir/md/", microdesc_tests }, END_OF_GROUPS }; diff --git a/src/test/test_dir.c b/src/test/test_dir.c index 80d2379de6..3c660a7575 100644 --- a/src/test/test_dir.c +++ b/src/test/test_dir.c @@ -801,7 +801,7 @@ test_dir_v3_networkstatus(void) rs->or_port = 443; rs->dir_port = 8000; /* all flags but running cleared */ - rs->is_running = 1; + rs->is_flagged_running = 1; smartlist_add(vote->routerstatus_list, vrs); test_assert(router_add_to_routerlist(generate_ri_from_rs(vrs), &msg,0,0)>=0); @@ -816,7 +816,7 @@ test_dir_v3_networkstatus(void) rs->addr = 0x99009901; rs->or_port = 443; rs->dir_port = 0; - rs->is_exit = rs->is_stable = rs->is_fast = rs->is_running = + rs->is_exit = rs->is_stable = rs->is_fast = rs->is_flagged_running = rs->is_valid = rs->is_v2_dir = rs->is_possible_guard = 1; smartlist_add(vote->routerstatus_list, vrs); test_assert(router_add_to_routerlist(generate_ri_from_rs(vrs), &msg,0,0)>=0); @@ -833,7 +833,8 @@ test_dir_v3_networkstatus(void) rs->or_port = 400; rs->dir_port = 9999; rs->is_authority = rs->is_exit = rs->is_stable = rs->is_fast = - rs->is_running = rs->is_valid = rs->is_v2_dir = rs->is_possible_guard = 1; + rs->is_flagged_running = rs->is_valid = rs->is_v2_dir = + rs->is_possible_guard = 1; smartlist_add(vote->routerstatus_list, vrs); test_assert(router_add_to_routerlist(generate_ri_from_rs(vrs), &msg,0,0)>=0); @@ -1073,7 +1074,8 @@ test_dir_v3_networkstatus(void) test_assert(!rs->is_fast); test_assert(!rs->is_possible_guard); test_assert(!rs->is_stable); - test_assert(rs->is_running); /* If it wasn't running it wouldn't be here */ + /* (If it wasn't running it wouldn't be here) */ + test_assert(rs->is_flagged_running); test_assert(!rs->is_v2_dir); test_assert(!rs->is_valid); test_assert(!rs->is_named); @@ -1095,7 +1097,7 @@ test_dir_v3_networkstatus(void) test_assert(rs->is_fast); test_assert(rs->is_possible_guard); test_assert(rs->is_stable); - test_assert(rs->is_running); + test_assert(rs->is_flagged_running); test_assert(rs->is_v2_dir); test_assert(rs->is_valid); test_assert(!rs->is_named); diff --git a/src/test/test_microdesc.c b/src/test/test_microdesc.c new file mode 100644 index 0000000000..57e894e2e9 --- /dev/null +++ b/src/test/test_microdesc.c @@ -0,0 +1,233 @@ +/* Copyright (c) 2010, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" +#include "or.h" + +#include "config.h" +#include "microdesc.h" + +#include "test.h" + +#ifdef MS_WINDOWS +/* For mkdir() */ +#include <direct.h> +#else +#include <dirent.h> +#endif + +static const char test_md1[] = + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAMjlHH/daN43cSVRaHBwgUfnszzAhg98EvivJ9Qxfv51mvQUxPjQ07es\n" + "gV/3n8fyh3Kqr/ehi9jxkdgSRfSnmF7giaHL1SLZ29kA7KtST+pBvmTpDtHa3ykX\n" + "Xorc7hJvIyTZoc1HU+5XSynj3gsBE5IGK1ZRzrNS688LnuZMVp1tAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n"; + +static const char test_md2[] = + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAMIixIowh2DyPmDNMDwBX2DHcYcqdcH1zdIQJZkyV6c6rQHnvbcaDoSg\n" + "jgFSLJKpnGmh71FVRqep+yVB0zI1JY43kuEnXry2HbZCD9UDo3d3n7t015X5S7ON\n" + "bSSYtQGPwOr6Epf96IF6DoQxy4iDnPUAlejuhAG51s1y6/rZQ3zxAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n"; + +static const char test_md3[] = + "@last-listed 2009-06-22\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAMH3340d4ENNGrqx7UxT+lB7x6DNUKOdPEOn4teceE11xlMyZ9TPv41c\n" + "qj2fRZzfxlc88G/tmiaHshmdtEpklZ740OFqaaJVj4LjPMKFNE+J7Xc1142BE9Ci\n" + "KgsbjGYe2RY261aADRWLetJ8T9QDMm+JngL4288hc8pq1uB/3TAbAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "p accept 1-700,800-1000\n" + "family nodeX nodeY nodeZ\n"; + +static void +test_md_cache(void *data) +{ + or_options_t *options = NULL; + microdesc_cache_t *mc = NULL ; + smartlist_t *added = NULL, *wanted = NULL; + microdesc_t *md1, *md2, *md3; + char d1[DIGEST256_LEN], d2[DIGEST256_LEN], d3[DIGEST256_LEN]; + const char *test_md3_noannotation = strchr(test_md3, '\n')+1; + time_t time1, time2, time3; + char *fn = NULL, *s = NULL; + (void)data; + + options = get_options(); + tt_assert(options); + + time1 = time(NULL); + time2 = time(NULL) - 2*24*60*60; + time3 = time(NULL) - 15*24*60*60; + + /* Possibly, turn this into a test setup/cleanup pair */ + tor_free(options->DataDirectory); + options->DataDirectory = tor_strdup(get_fname("md_datadir_test")); +#ifdef MS_WINDOWS + tt_int_op(0, ==, mkdir(options->DataDirectory)); +#else + tt_int_op(0, ==, mkdir(options->DataDirectory, 0700)); +#endif + + tt_assert(!strcmpstart(test_md3_noannotation, "onion-key")); + + crypto_digest256(d1, test_md1, strlen(test_md1), DIGEST_SHA256); + crypto_digest256(d2, test_md2, strlen(test_md1), DIGEST_SHA256); + crypto_digest256(d3, test_md3_noannotation, strlen(test_md3_noannotation), + DIGEST_SHA256); + + mc = get_microdesc_cache(); + + added = microdescs_add_to_cache(mc, test_md1, NULL, SAVED_NOWHERE, 0, + time1, NULL); + tt_int_op(1, ==, smartlist_len(added)); + md1 = smartlist_get(added, 0); + smartlist_free(added); + added = NULL; + + wanted = smartlist_create(); + added = microdescs_add_to_cache(mc, test_md2, NULL, SAVED_NOWHERE, 0, + time2, wanted); + /* Should fail, since we didn't list test_md2's digest in wanted */ + tt_int_op(0, ==, smartlist_len(added)); + smartlist_free(added); + added = NULL; + + smartlist_add(wanted, tor_memdup(d2, DIGEST256_LEN)); + smartlist_add(wanted, tor_memdup(d3, DIGEST256_LEN)); + added = microdescs_add_to_cache(mc, test_md2, NULL, SAVED_NOWHERE, 0, + time2, wanted); + /* Now it can work. md2 should have been added */ + tt_int_op(1, ==, smartlist_len(added)); + md2 = smartlist_get(added, 0); + /* And it should have gotten removed from 'wanted' */ + tt_int_op(smartlist_len(wanted), ==, 1); + test_mem_op(smartlist_get(wanted, 0), ==, d3, DIGEST256_LEN); + smartlist_free(added); + added = NULL; + + added = microdescs_add_to_cache(mc, test_md3, NULL, + SAVED_NOWHERE, 0, -1, NULL); + /* Must fail, since SAVED_NOWHERE precludes annotations */ + tt_int_op(0, ==, smartlist_len(added)); + smartlist_free(added); + added = NULL; + + added = microdescs_add_to_cache(mc, test_md3_noannotation, NULL, + SAVED_NOWHERE, 0, time3, NULL); + /* Now it can work */ + tt_int_op(1, ==, smartlist_len(added)); + md3 = smartlist_get(added, 0); + smartlist_free(added); + added = NULL; + + /* Okay. We added 1...3. Let's poke them to see how they look, and make + * sure they're really in the journal. */ + tt_ptr_op(md1, ==, microdesc_cache_lookup_by_digest256(mc, d1)); + tt_ptr_op(md2, ==, microdesc_cache_lookup_by_digest256(mc, d2)); + tt_ptr_op(md3, ==, microdesc_cache_lookup_by_digest256(mc, d3)); + + tt_int_op(md1->last_listed, ==, time1); + tt_int_op(md2->last_listed, ==, time2); + tt_int_op(md3->last_listed, ==, time3); + + tt_int_op(md1->saved_location, ==, SAVED_IN_JOURNAL); + tt_int_op(md2->saved_location, ==, SAVED_IN_JOURNAL); + tt_int_op(md3->saved_location, ==, SAVED_IN_JOURNAL); + + tt_int_op(md1->bodylen, ==, strlen(test_md1)); + tt_int_op(md2->bodylen, ==, strlen(test_md2)); + tt_int_op(md3->bodylen, ==, strlen(test_md3_noannotation)); + test_mem_op(md1->body, ==, test_md1, strlen(test_md1)); + test_mem_op(md2->body, ==, test_md2, strlen(test_md2)); + test_mem_op(md3->body, ==, test_md3_noannotation, + strlen(test_md3_noannotation)); + + tor_asprintf(&fn, "%s"PATH_SEPARATOR"cached-microdescs.new", + options->DataDirectory); + s = read_file_to_str(fn, RFTS_BIN, NULL); + tt_assert(s); + test_mem_op(md1->body, ==, s + md1->off, md1->bodylen); + test_mem_op(md2->body, ==, s + md2->off, md2->bodylen); + test_mem_op(md3->body, ==, s + md3->off, md3->bodylen); + + tt_ptr_op(md1->family, ==, NULL); + tt_ptr_op(md3->family, !=, NULL); + tt_int_op(smartlist_len(md3->family), ==, 3); + tt_str_op(smartlist_get(md3->family, 0), ==, "nodeX"); + + /* Now rebuild the cache! */ + tt_int_op(microdesc_cache_rebuild(mc), ==, 0); + + tt_int_op(md1->saved_location, ==, SAVED_IN_CACHE); + tt_int_op(md2->saved_location, ==, SAVED_IN_CACHE); + tt_int_op(md3->saved_location, ==, SAVED_IN_CACHE); + + /* The journal should be empty now */ + tor_free(s); + s = read_file_to_str(fn, RFTS_BIN, NULL); + tt_str_op(s, ==, ""); + tor_free(s); + tor_free(fn); + + /* read the cache. */ + tor_asprintf(&fn, "%s"PATH_SEPARATOR"cached-microdescs", + options->DataDirectory); + s = read_file_to_str(fn, RFTS_BIN, NULL); + test_mem_op(md1->body, ==, s + md1->off, strlen(test_md1)); + test_mem_op(md2->body, ==, s + md2->off, strlen(test_md2)); + test_mem_op(md3->body, ==, s + md3->off, strlen(test_md3_noannotation)); + + /* Okay, now we are going to forget about the cache entirely, and reload it + * from the disk. */ + microdesc_free_all(); + mc = get_microdesc_cache(); + md1 = microdesc_cache_lookup_by_digest256(mc, d1); + md2 = microdesc_cache_lookup_by_digest256(mc, d2); + md3 = microdesc_cache_lookup_by_digest256(mc, d3); + test_assert(md1); + test_assert(md2); + test_assert(md3); + test_mem_op(md1->body, ==, s + md1->off, strlen(test_md1)); + test_mem_op(md2->body, ==, s + md2->off, strlen(test_md2)); + test_mem_op(md3->body, ==, s + md3->off, strlen(test_md3_noannotation)); + + tt_int_op(md1->last_listed, ==, time1); + tt_int_op(md2->last_listed, ==, time2); + tt_int_op(md3->last_listed, ==, time3); + + /* Okay, now we are going to clear out everything older than a week old. + * In practice, that means md3 */ + microdesc_cache_clean(mc, time(NULL)-7*24*60*60, 1/*force*/); + tt_ptr_op(md1, ==, microdesc_cache_lookup_by_digest256(mc, d1)); + tt_ptr_op(md2, ==, microdesc_cache_lookup_by_digest256(mc, d2)); + tt_ptr_op(NULL, ==, microdesc_cache_lookup_by_digest256(mc, d3)); + md3 = NULL; /* it's history now! */ + + /* rebuild again, make sure it stays gone. */ + microdesc_cache_rebuild(mc); + tt_ptr_op(md1, ==, microdesc_cache_lookup_by_digest256(mc, d1)); + tt_ptr_op(md2, ==, microdesc_cache_lookup_by_digest256(mc, d2)); + tt_ptr_op(NULL, ==, microdesc_cache_lookup_by_digest256(mc, d3)); + + done: + if (options) + tor_free(options->DataDirectory); + microdesc_free_all(); + + smartlist_free(added); + if (wanted) + SMARTLIST_FOREACH(wanted, char *, cp, tor_free(cp)); + smartlist_free(wanted); + tor_free(s); + tor_free(fn); +} + +struct testcase_t microdesc_tests[] = { + { "cache", test_md_cache, TT_FORK, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/test/test_util.c b/src/test/test_util.c index 68a0ca2984..c4428f5ea9 100644 --- a/src/test/test_util.c +++ b/src/test/test_util.c @@ -833,6 +833,18 @@ test_util_sscanf(void) test_eq(u2, 3u); test_eq(u3, 99u); + /* %x should work. */ + r = tor_sscanf("1234 02aBcdEf", "%x %x", &u1, &u2); + test_eq(r, 2); + test_eq(u1, 0x1234); + test_eq(u2, 0x2ABCDEF); + /* Width works on %x */ + r = tor_sscanf("f00dcafe444", "%4x%4x%u", &u1, &u2, &u3); + test_eq(r, 3); + test_eq(u1, 0xf00d); + test_eq(u2, 0xcafe); + test_eq(u3, 444); + r = tor_sscanf("99% fresh", "%3u%% fresh", &u1); /* percents are scannable.*/ test_eq(r, 1); test_eq(u1, 99); @@ -1212,14 +1224,13 @@ test_util_load_win_lib(void *ptr) static void clear_hex_errno(char *hex_errno) { - memset(hex_errno, ' ', HEX_ERRNO_SIZE - 2); - hex_errno[HEX_ERRNO_SIZE - 1] = '\n'; - hex_errno[HEX_ERRNO_SIZE] = '\0'; + memset(hex_errno, '\0', HEX_ERRNO_SIZE + 1); } static void test_util_exit_status(void *ptr) { + /* Leave an extra byte for a \0 so we can do string comparison */ char hex_errno[HEX_ERRNO_SIZE + 1]; (void)ptr; @@ -1248,6 +1259,164 @@ test_util_exit_status(void *ptr) ; } +#ifndef MS_WINDOWS +/** Check that fgets waits until a full line, and not return a partial line, on + * a EAGAIN with a non-blocking pipe */ +static void +test_util_fgets_eagain(void *ptr) +{ + int test_pipe[2] = {-1, -1}; + int retval; + ssize_t retlen; + char *retptr; + FILE *test_stream = NULL; + char buf[10]; + + (void)ptr; + + /* Set up a pipe to test on */ + retval = pipe(test_pipe); + tt_int_op(retval, >=, 0); + + /* Set up the read-end to be non-blocking */ + retval = fcntl(test_pipe[0], F_SETFL, O_NONBLOCK); + tt_int_op(retval, >=, 0); + + /* Open it as a stdio stream */ + test_stream = fdopen(test_pipe[0], "r"); + tt_ptr_op(test_stream, !=, NULL); + + /* Send in a partial line */ + retlen = write(test_pipe[1], "A", 1); + tt_int_op(retlen, ==, 1); + retptr = fgets(buf, sizeof(buf), test_stream); + tt_want(retptr == NULL); + tt_int_op(errno, ==, EAGAIN); + + /* Send in the rest */ + retlen = write(test_pipe[1], "B\n", 2); + tt_int_op(retlen, ==, 2); + retptr = fgets(buf, sizeof(buf), test_stream); + tt_ptr_op(retptr, ==, buf); + tt_str_op(buf, ==, "AB\n"); + + /* Send in a full line */ + retlen = write(test_pipe[1], "CD\n", 3); + tt_int_op(retlen, ==, 3); + retptr = fgets(buf, sizeof(buf), test_stream); + tt_ptr_op(retptr, ==, buf); + tt_str_op(buf, ==, "CD\n"); + + /* Send in a partial line */ + retlen = write(test_pipe[1], "E", 1); + tt_int_op(retlen, ==, 1); + retptr = fgets(buf, sizeof(buf), test_stream); + tt_ptr_op(retptr, ==, NULL); + tt_int_op(errno, ==, EAGAIN); + + /* Send in the rest */ + retlen = write(test_pipe[1], "F\n", 2); + tt_int_op(retlen, ==, 2); + retptr = fgets(buf, sizeof(buf), test_stream); + tt_ptr_op(retptr, ==, buf); + tt_str_op(buf, ==, "EF\n"); + + /* Send in a full line and close */ + retlen = write(test_pipe[1], "GH", 2); + tt_int_op(retlen, ==, 2); + retval = close(test_pipe[1]); + test_pipe[1] = -1; + tt_int_op(retval, ==, 0); + retptr = fgets(buf, sizeof(buf), test_stream); + tt_ptr_op(retptr, ==, buf); + tt_str_op(buf, ==, "GH"); + + /* Check for EOF */ + retptr = fgets(buf, sizeof(buf), test_stream); + tt_ptr_op(retptr, ==, NULL); + tt_int_op(feof(test_stream), >, 0); + + done: + if (test_stream != NULL) + fclose(test_stream); + if (test_pipe[0] != -1) + close(test_pipe[0]); + if (test_pipe[1] != -1) + close(test_pipe[1]); +} +#endif + +#ifndef MS_WINDOWS +/** Helper function for testing tor_spawn_background */ +static void +run_util_spawn_background(const char *argv[], const char *expected_out, + const char *expected_err, int expected_exit) +{ + int stdout_pipe=-1, stderr_pipe=-1; + int retval, stat_loc; + pid_t pid; + ssize_t pos; + char stdout_buf[100], stderr_buf[100]; + + /* Start the program */ + retval = tor_spawn_background(argv[0], &stdout_pipe, &stderr_pipe, argv); + tt_int_op(retval, >, 0); + tt_int_op(stdout_pipe, >, 0); + tt_int_op(stderr_pipe, >, 0); + pid = retval; + + /* Check stdout */ + pos = read(stdout_pipe, stdout_buf, sizeof(stdout_buf) - 1); + stdout_buf[pos] = '\0'; + tt_int_op(pos, ==, strlen(expected_out)); + tt_str_op(stdout_buf, ==, expected_out); + + /* Check it terminated correctly */ + retval = waitpid(pid, &stat_loc, 0); + tt_int_op(retval, ==, pid); + tt_assert(WIFEXITED(stat_loc)); + tt_int_op(WEXITSTATUS(stat_loc), ==, expected_exit); + tt_assert(!WIFSIGNALED(stat_loc)); + tt_assert(!WIFSTOPPED(stat_loc)); + + /* Check stderr */ + pos = read(stderr_pipe, stderr_buf, sizeof(stderr_buf) - 1); + stderr_buf[pos] = '\0'; + tt_int_op(pos, ==, strlen(expected_err)); + tt_str_op(stderr_buf, ==, expected_err); + + done: + ; +} + +/** Check that we can launch a process and read the output */ +static void +test_util_spawn_background_ok(void *ptr) +{ + const char *argv[] = {BUILDDIR "/src/test/test-child", "--test", NULL}; + const char *expected_out = "OUT\n--test\nDONE\n"; + const char *expected_err = "ERR\n"; + + (void)ptr; + + run_util_spawn_background(argv, expected_out, expected_err, 0); +} + +/** Check that failing to find the executable works as expected */ +static void +test_util_spawn_background_fail(void *ptr) +{ + const char *argv[] = {BUILDDIR "/src/test/no-such-file", "--test", NULL}; + const char *expected_out = "ERR: Failed to spawn background process " + "- code 9/2\n"; + const char *expected_err = ""; + + (void)ptr; + + run_util_spawn_background(argv, expected_out, expected_err, 255); +} +#endif + #define UTIL_LEGACY(name) \ { #name, legacy_test_helper, 0, &legacy_setup, test_util_ ## name } @@ -1275,6 +1444,11 @@ struct testcase_t util_tests[] = { UTIL_TEST(load_win_lib, 0), #endif UTIL_TEST(exit_status, 0), +#ifndef MS_WINDOWS + UTIL_TEST(fgets_eagain, TT_SKIP), + UTIL_TEST(spawn_background_ok, 0), + UTIL_TEST(spawn_background_fail, 0), +#endif END_OF_TESTCASES }; |