summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--acinclude.m48
-rw-r--r--changes/bug19825
-rw-r--r--changes/bug19946
-rw-r--r--changes/bug20205
-rw-r--r--changes/geoip-oct20103
-rw-r--r--changes/nodelist10
-rw-r--r--configure.in67
-rw-r--r--doc/nodefamily_routerset4
-rw-r--r--doc/tor.1.txt23
-rw-r--r--src/common/address.c6
-rw-r--r--src/common/address.h4
-rw-r--r--src/common/aes.c19
-rw-r--r--src/common/compat.h7
-rw-r--r--src/common/compat_libevent.c26
-rw-r--r--src/common/container.c1
-rw-r--r--src/common/memarea.c5
-rw-r--r--src/common/tortls.c119
-rw-r--r--src/common/tortls.h5
-rw-r--r--src/common/util.c202
-rw-r--r--src/common/util.h26
-rw-r--r--src/config/geoip5404
-rw-r--r--src/or/Makefile.am3
-rw-r--r--src/or/buffers.c10
-rw-r--r--src/or/circuitbuild.c496
-rw-r--r--src/or/circuitbuild.h13
-rw-r--r--src/or/circuitlist.c20
-rw-r--r--src/or/circuituse.c98
-rw-r--r--src/or/circuituse.h3
-rw-r--r--src/or/command.c12
-rw-r--r--src/or/config.c28
-rw-r--r--src/or/connection.c4
-rw-r--r--src/or/connection.h10
-rw-r--r--src/or/connection_edge.c41
-rw-r--r--src/or/connection_edge.h3
-rw-r--r--src/or/connection_or.c67
-rw-r--r--src/or/control.c84
-rw-r--r--src/or/control.h2
-rw-r--r--src/or/directory.c49
-rw-r--r--src/or/directory.h4
-rw-r--r--src/or/dirserv.c257
-rw-r--r--src/or/dirserv.h18
-rw-r--r--src/or/dirvote.h1
-rw-r--r--src/or/dns.c2
-rw-r--r--src/or/main.c68
-rw-r--r--src/or/microdesc.c75
-rw-r--r--src/or/microdesc.h2
-rw-r--r--src/or/networkstatus.c226
-rw-r--r--src/or/networkstatus.h24
-rw-r--r--src/or/nodelist.c728
-rw-r--r--src/or/nodelist.h59
-rw-r--r--src/or/ntmain.c1
-rw-r--r--src/or/or.h155
-rw-r--r--src/or/policies.c220
-rw-r--r--src/or/policies.h18
-rw-r--r--src/or/relay.c18
-rw-r--r--src/or/rendclient.c10
-rw-r--r--src/or/rendservice.c43
-rw-r--r--src/or/rephist.c46
-rw-r--r--src/or/router.c56
-rw-r--r--src/or/router.h4
-rw-r--r--src/or/routerlist.c1031
-rw-r--r--src/or/routerlist.h88
-rw-r--r--src/or/routerparse.c7
-rw-r--r--src/test/Makefile.am3
-rw-r--r--src/test/test-child.c18
-rw-r--r--src/test/test.c49
-rw-r--r--src/test/test_dir.c12
-rw-r--r--src/test/test_microdesc.c233
-rw-r--r--src/test/test_util.c180
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
};